Nyelveken beszélünk

Ha valami értelme van annak a sorozatnak, amit itt elindítottam, akkor nem a szakértők számára van értelme, hanem a teljesen laikusok számára. Aki ért ezekhez a dolgokhoz, az szerintem hagyja ki, mert úgyis csak hibákat találna benne. Nem úgy értem, hogy tárgyi tévedéseket, bár még az is lehet, főleg olyan formában, hogy „nem bontom ki az igazság minden részletét”. Szerintem mindenki így tenne a helyemben (ha nem, akkor nem hiszem, hogy tényleg közérthetően el tudná mondani), de az biztos, hogy mindenki másképp csinálná, más sorrendben haladna, mást hallgatna el, és így tovább. Ezért mondom, hogy aki ért hozzá, az inkább ne bosszantsa magát rajta. Most például azon, amit a programozási nyelvekről készülök, nagyon felületesen, elmondani.

Beszéltünk arról, hogy a programok adatszerkezetekből és algoritmusokból (eljárásokból) állnak. Mutattam példát arra, hogy az adatszerkezetekkel hogyan ábrázoljuk az általunk kitalált (vagy a valóságról mintázott) „lényeket”, mint amilyen egy kártyapakli, és arra is, hogy milyen egy algoritmus, például az, amelyik megkever egy pakli kártyát. Mindezt anélkül, hogy egyetlen sor programot is leírtunk volna. Mindenki tudja, hogy a programozás sajátos nyelvek segítségével történik, olyan jelrendszerekkel, amiket a számítógép fel tud dolgozni (persze valójában erre a célra írt programok tudják feldolgozni), és le tud futtatni. Az ember által írt programok feldolgozása és lefuttatása elég bonyolult folyamat, amibe nem megyünk bele addig, amíg nem muszáj. A lényeg az, hogy a programozási nyelveken megírt programokat más programok először jó alaposan átgyúrják, míg azok a végén a gép számára végrehajtható utasításokká válnak.

Grafika: Tóth Róbert Jónás

Végső soron minden programozási nyelvvel ugyanazt tudjuk megtenni, és bármilyen nyelven írjuk a programot, az végső soron ugyanolyan utasításokká válik. Akkor nem tökmindegy, hogy milyen nyelvet használunk? Van jó sok szempont, ami számíthat, és amibe érdemes belegondolni, mielőtt választunk. Most a saját magam által legfontosabbnak tartottakról fogok beszélni. Hozzá kell tenni, hogy a nyelv nem is minden: a használhatósága attól is függ, hogy milyen fejlesztő környezetet használunk, milyen egyéb segédeszközöket kapunk a programozáshoz. (Sok programozási nyelvnek több implementációja is van, különböző segédeszközökkel.)

Hibakeresés

A programozók idejének jelentős része megy el hibakeresésre. Mindenki elkövet mindenféle hibákat, az elütésektől kezdve a kihagyásokon át egészen a téves koncepciókig. Sok ilyen hibát (például a téves koncepciókat) alapos előkészítéssel, tervezéssel meg lehet előzni, de ennek ellenére mindig rengeteg dolog becsúszik.

Nagyon fontos, hogy a programnyelv minél jobban segítse a hibák gyors megtalálását és megértését. (Persze nem fogalmaztam pontosan, nem maga a nyelv segíti ezt, hanem azok a programok, amik az illető nyelven írt programjainkat feldolgozzák.) Hallatlanul nagy különbségek vannak a programozó rendszerek között abban, hogy a feldolgozás melyik fázisában csípik el a hibákat, és mennyire tudnak eligazítani a lehetséges okaikat illetően. Kezdőknek én azt javaslom, hogy ezt a szempontot tekintsék elsőrendűnek a választásban.

Modularitás

A programozásnak nagyon fontos része, hogy apró darabokból, modulokból szőjük össze a programokat. Ez elvileg bármely programnyelvben megvalósítható, de a gyakorlatban mégis nagy különbségek vannak. Az az ideális, ha meg tudjuk csinálni, hogy egy nagy programnak valahol az elején egy szót kicserélünk egy másikra, és ettől egy egész más modul szövődik bele az egész programba. Ezt már kevés nyelven lehet egyszerűen megtenni. A kis modulok használata a hibakeresést is megkönnyíti, könnyebb megtalálni a hibát, és ha kell, könnyebb lecserélni akár egy egész modult. És persze könnyebb egymástól függetlenül többen dolgozni ugyanazon a programon.

Felszereltség

Ha komolyabb, nagyobb terjedelmű programot akarunk írni, nem árt, ha olyan nyelvet választunk, amihez jó sok programcsomag (könyvtár, angolul library) áll a rendelkezésünkre, hiszen nagyon sok egész bonyolult programot mások már megírtak, és jó, ha azokat csak le kell emelni a polcról. De különböző programnyelvekhez különböző tartalmú és nagyságú polcokat fogunk találni.

Hordozhatóság

Különböző esetekben különböző mértékben fontos, de néha igen, hogy bármilyen gépen különösebb előkészületek nélkül futhasson a programunk.

Akkor most milyen nyelv legyen?

Erre így nehéz válaszolni, és rengetegen vitatkoznak netszerte ugyanezeken a kérdéseken. Szerintem senki sem tagadja, hogy a hibakeresést a Rust nyelv és fejlesztő környezet könnyíti meg a legjobban, de más okokból mégsem ezt ajánlanám kezdőknek. A második legjobb választás az ML nyelvcsalád nyelvei, rokonai és üzletfelei, például Standard ML (SML, számos implementációja ismert), és közvetlen leszármazottja, az OCaml vagy a Haskell. Ezek is elég sok hibát korán elcsípnek, és jól használható hibaüzeneteket adnak, de nem mindegyik (és nem minden implementációjuk) ajánlható kezdőknek.

Modularitás szempontjából ugyanezek a nyelvek a legjobbak. Bevallom őszintén, én ennek ellenére sok más nyelvet használok (főleg ha muszáj), de úgy, hogy jó sok munkával kialakítottam azokat a technikákat, amikkel az egyes nyelveken kényelmesen tudom modulárissá tenni a programjaimat.

A felszereltség, a sokféle könyvtár elérhetősége szempontjából azok a nyelvek a legjobbak, amik a legnépszerűbbek, mert ezekhez készítik a legtöbb segédeszközt: a fentiek közül főleg az OCaml ilyen, de úgy általában a Python, a Ruby, a Perl, a C, a C++, a Java és a Clojure nyelveket feltétlenül ide sorolnám. Ezeket szokták egyébként a leggyakrabban kezdőknek ajánlani és programozási kurzusokon használni.

Végül a kezdőknek nem kell sokat foglalkozniuk a hordozhatósággal, de a rend kedvéért tisztázzuk, hogy például ha webes alkalmazást akarunk írni, akkor azokhoz a programokhoz, amik a távoli szerveren futnak, a PHP nyelv a természetes választás, mert ez az, ami ma már bármelyik szerveren hozzáférhető, akárhol bérelünk is például tárhelyet, ott számíthatunk rá. Ami pedig a klienseknél futó programokat illeti (vagyis a felhasználóknál, akik egy böngészővel felkeresik az oldalunkat), a JavaScript nyelv használata kézenfekvő, hiszen ezt ma már minden böngésző ismeri. Ha pedig nem webes alkalmazásról van szó, akkor ma a standard megoldás a Java nyelv használata. Különböző okokból szinte minden felhasználó telepítette már a Java programok futtatásához szükséges környezetet (úgy is, hogy esetleg nem is tud róla), és ha nem, akkor is könnyűszerrel meg tudja tenni.

A sorozatom következő részeiben én következetesen össze-vissza fogok különböző nyelveket használni. Részben azért, mert a példákat mindig úgy mutatom meg, ahogy a legjobban el lehet őket magyarázni, részben pedig azért, mert célszerű minél több nyelvről megtudni a legalapvetőbbeket.

A szerző nyelvész, az MTA Nyelvtudományi Intézetének főmunkatársa.