@t[A multinyelv]~~META:date created = 2009-02-15~~ Egy régi cikket olvasgatva eszembe jutott egy gondolatom, amit már meg akartam írni egy ideje, de sose jutottam hozzá. Az ősi programozómondás szerint a programozó erénye a lustaság. (Ha az olvasó nem érti, hogy miért, akkor nyilván nem programozó, és nem biztos, hogy a cikk további részében örömét leli.) De nekem sokszor úgy tűnik, hogy ezt az erényt nem hasznosítjuk eléggé, vagy nem szolgáljuk ki eléggé, vagy tudomisén mit. Itt vannak például a különböző nyelvek. Gyakorta megesik, hogy ráakad az ember egy klassz algoritmusra valahol már lekódolva, föl is használná, de – másik nyelven van. A programozó ilyenkor mit tehet, lefordítja. Csak hát ez ellentmond az ősi alapelvnek, hiszen a fordításnál elkövethetünk olyan hibákat, amiket a copy-paste technikával biztosan nem. De voltaképpen mi a különbség a programnyelvek között? Ha lecsupaszítjuk a dolgot, akkor annyi, hogy minden nyelvet és nyelvjárást egy-egy szoftver valósít meg, és mindegyiknek megvannak a saját szintaktikai és szemantikai szabályai. Egyik sem tűnik olyasminek, ami visszavonhatatlanul megakadályozza a nyelvek egyesítését. Ha egy nyelv, mondjuk a PHP 6 értelmezésére már megírtak egy programot (a PHP programot, ami letölthető a [[http://php.net|PHP.net]]ről), akkor ugyanígy meg lehet írni még egy programot. És ha egy nyelv, mondjuk a Spectrum BASIC szintaxisa és szemantikája különbözik a PHP-étől, akkor lehet írni olyan programot, ami összehozza a kettőt. Ez nyilvánvaló. Tessék egy forrásszöveg példa gyanánt. 10 PRINT "Hello, world!" #include int main() {   std::cout << "Hello, world!n"; } : HELLO ( -- ) ." Hello, world!" CR ;   HELLO print [Hello, world!] program hello; begin   writeln('Hello, world!'); end. echo "Hello, world!"; A programozó olvasó ránézésre fel fogja ismerni, hogy a forrásszöveg valójában hat forrásszöveg, éspedig ugyanazt a //Hello, world!// programot másoltam ide öt nyelven. Sőt azt is ránézésre fel fogja ismerni, hogy a nyelvek sorban: sorszámozott BASIC, C+`+, Forth, Logo, Pascal és PHP. A programozó olvasó olyan forrásszöveget is kitűnően meg fog érteni, aminek nyelvét nem vagy hibásan azonosítja, például ezt: function main() {   message("Hello, world!") } Az olvasó tudja ebből, hogy Baan Tools nyelven van, 3GL formátumban? Én nem tudnám, mégis minden betűjét hibátlanul megértem. (A példák természetesen a Wikibooks [[http://en.wikibooks.org/wiki/List_of_hello_world_programs|listájából]] valók.) Én még azt se gondolom, hogy a gépet meg kellene tanítani //felismerni// a programnyelvet, ámbár ha ezt tennénk, az se lenne csoda. A számítástechnika történetének egyik folyamata arról szól, hogy a gépeket megtanítjuk olyan dolgokra, amiket mi mindig is tudtunk. Tudnak papírra írni, olvasni (OCR), sakkozni, zenélni – de volt idő, amikor ezeket még nem tudták. De programnyelvet felismerni nem feltétlenül kellene megtanítani őket. Én a következőt képzeltem el. Lehetne írni egy olyan fejlesztőkörnyezetet, ami Minden Nyelven Tud. Hiszen a nyelvek végeredményben csak a szintaxisban és a mögötte levő szemantikában különböznek. (Ez így nem igaz, de momentán megteszi.) A mai programnyelvek már mind parsert használnak, egy külön programot, ami elolvassa a forráskódot és lefordítja egy köztes kódra, amit aztán a fordító vagy az értelmező feldolgoz. Akkor mi lenne, ha több parser lenne a fejlesztőkörnyezetben? Egy olyan parsert képzeltem el, ami egy központi részből és sok-sok pluginból áll. Minden nyelvhez, nyelvjáráshoz egy plugin jár, és a központi rész választja ki, hogy mikor melyiket válassza. Például így: #BASIC 10 PRINT "Hello, world!" #C #include int main() {   std::cout << "Hello, world!n"; } #FORTH : HELLO ( -- ) ." Hello, world!" CR ;   HELLO #LOGO print [Hello, world!] #PASCAL program hello; begin   writeln('Hello, world!'); end. #PHP echo "Hello, world!"; Például így. A parser központi része látja a nyelveket jelölő direktívákat és meghívogatja a pluginokat. Azok lefordítják a nyelvükön írt részeket, és //egyetlen// köztes kódot (Pascal-terminológiával P-kódot) kapunk, amit aztán egyetlen fordítónak vagy értelmezőnek lehet föltálalni. Miért jó ez? Több okból. Ha találunk a neten egy alkalmas algoritmust, azt fordítgatás nélkül beilleszthetjük a programunkba. Ugyanazon a projekten úgy dolgozhat több programozó, hogy mindenki a neki legjobban megfelelő nyelven írhatja a neki jutó részeket. És a különböző nyelvek profitálhatnak egymás képességeiből. Azt mondtam, hogy a nyelvek csak a szintaxisban és a szemantikában különböznek, és hozzátettem, hogy ez így nem igaz. Persze hogy nem igaz, hiszen a nyelvek mögött egy szoftver van, ami különféle rutinokat tartalmaz. Például a Logo minden interpretációja tartalmazza a teknőcgrafikát, amit a többi nyelvben úgy kell külön létrehozni, ha szükség van rá. Ha több parserünk van, amik ugyanazt a pszeudokódot állítják elő, az csak úgy ér valamit, ha a fordítóban benne vannak a szükséges rutinok is. Vagyis ha tudunk Logót interpretálni, akkor a teknőcgrafikához szükséges rutinoknak is benne kell lenniük a fordítóban. De ha benne vannak a fordítóban, akkor a többi nyelvből is elérhetjük őket. Hogyan? Ki kell dolgozni rá a módszereket. Ilyesféléket: #TRANSLATE   FROM PHP     forward(#VAR#);   END FROM   TO LOGO     forward #VAR#   END TO END TRANSLATE Innentől PHP-ben a **forward()** függvény a Logo-beli **forward** utasítást fogja jelenteni. Szerintem nyereség lenne egy ilyet összehozni. @blogf[! számtech programozás]