Procedurális nyelv, amelyben a programozó megadja az utasítások sorrendét, tehát ő határozza meg. Bármely adatszerkezeten végrehajtható bármely nyelvi utasítás a szintaktikai szabályok szerint. Az adatok és az utasítások közötti kapcsolat esetleges, a programozó feladata, hogy a kapcsolatot megteremtse. Ha hibás kapcsolatot hoz létre a programozó, akkor előfordulhat, hogy a típusok nem megfelelősége miatt futásidejű hibákkal áll le a program. Ebben az esetben a meghívott programrészleteket szubrutinnak (BASIC) , függvénynek (function - C, Pascal, PHP) vagy eljárásnak ( function - C, PHP, procedure - Pascal) hívjuk.
Ilyen nyelvek: Pascal, Basic, C, stb...
Objektumorientált nyelvekben az adatok és a rajtuk végrehajtható utasítások egy egységet képviselnek. Az objektum csak paramétereken keresztül kommunikál az objektumon kívüli kóddal. A függvényeket és eljárásokat egységesen metódusnak hívjuk (C, PHP, C#, Java). Az adatok és a metódusok külső kódból való elérhetősége lehetséges, akkor publikus (public) vagy korlátozott is lehet (private).
Az ilyen nyelvekben bevezették az osztály (class) fogalmát. Ez egyfajta adattípust jelent. Az adattípus neve az osztály neve. Az osztályból futás közben jön létre a memóriában a megfelelő adatszerkezet, akkor azt mondjuk, hogy az osztályt példányosítottuk. Egy osztályból tetszőleges példányt lehet létrehozni. Ha a futás közben egy időben csak egy példány lehet azt általában statikus osztálynak hívjuk (static). Azt nem kell példányosítani.
Vannak olyan nyelvek, amelyeknek a programozása lehet procedurális és/vagy objektum orientált is (PHP, Javascript )
Eseményvezérelt programozási nyelvek nem lineáris szerkezetűek. Általában az utasítások végrehajtása bizonyos eseményekhez kötődik. az események lehetnek billentyűzet, egér, képernyő változása, file megjelenése, törlődése, stb... egyéb esemény. Ilyenkor az események hívják meg a megfelelő kódot. A web-en és a desktop grafikus alkalmazások esetén gyakoriak az ilyen megoldások (javascript, C#, Delphi, Java stb.)
A programozási nyelvek másik csoportosítása szerint vannak imperatív nyelvek, amelyek utasítások sorozatából állnak. Az utasítások a vezérlési szerkezetek által meghatározott sorrendben hajtódnak végre.
A deklaratív jellegű nyelvekben nincsen utasítás. Ebben az esetben a problémát fogalmazzuk meg valamilyen előre megadott szintaktika szerint és a nyelvben lévő algoritmus találja meg a megfelelő megoldást (Prolog)
A létrehozott kód alapján is csoportosíthatjuk a nyelveket
Compileres nyelvek: Ebben az esetben a forráskód, a program szövege, amelyet szövegszerkesztővel vagy valamilyen IDE (Integrated Development Environment) szoftver segítségével hozunk létre a nyelv szabályai szerint. Ezt egy megfelelő compilerrel tárgykóddá fordítja egy fordítóprogram (C, C++, C#, Pascal). A programban lévő szintaktikai hibák a fordítás közben kiderülnek.
A tárgykódból az előre megadott programkönyvtárak (library) segítségével egy szerkesztő hozza létre a futtatható gépi kódú programot ( .com, .exe, .jar). Ezt lehet indítani vagy az operációs rendszer saját felületéről vagy egy betöltő programmal (Java). A hibákat debuggerrel lehet megkeresni.
Interpreteres nyelvek esetén a forráskódot a szövegszerkesztő vagy egy IDE hozza létre. A program indítása valamilyen segédprogrammal, úgynevezett interpreter programmal kezdődik. A program futása során az interpreter az utasítások végrehajtásának sorrendjében értelmezi a kódot és ha szintaktikai hibát talál, akkor a futás leáll.
Itt is használhatunk programkönyvtárakat (library), amelyek a program lehetőségeit bővítik. Ezek a könyvtárak vagy előre megírt más nyelvű modulok lefordítva vagy az aktuális nyelven megírt kódok leshetnek.
Az interpreteres nyelvek előnye
- A fejlesztés során a párbeszédes munka gyorsítja a fejlesztést és a tesztelést.
- A fordításhoz nem kell idő.
Interpreteres nyelvek hátránya
- Nem minden hiba derül ki, mert nem minden ágra kerül rá a vezérlés
- Az interpreteres nyelvek lassabbak, mert a futás közben van az értelmezés
- Az értelmezőnek a memóriában kell lennie végig.
Az interpreteres nyelvek hátrányainak kiküszöbölése
- A forráskódot az első futtatáskor egy köztes kóddá fordítja egy compiler (JIT - Just In Time Jitter - PHP, Java ). Ez a köztes kód már a szintaktikai ellenőrzésen átesik és addig ezt hajtja végre a futtató, amíg a forráskód változatlan marad - gyorsítja a futtatást és a memóriafelhasználás is csökken.
- A forráskód betöltését memóriában lévő gyorsítótárakkal (cache) oldják meg, amivel lecsökkenthető a fájlok betöltési ideje - amíg a file változatlan.
- Az ilyen módon futtatott kód kb fele olyan gyors, mint a gépi kód.
- Tesztelt, éles rendszeren érdemes használni a gyorsítási technikákat.