Címkearchívumok: compiler

Debra – a kezdetek

Mindig is érdekeltek a programozási nyelvek, főleg a szintaxis. Miért pont ilyenek, mi az előnye vagy a hátránya egy-egy programnyelvnek? Azt már programozói pályafutásom elején láttam, hogy a C nem nekem való, sokkal jobban tetszett a Pascal. Akkoriban a Pascal forrásokat még csupa nagybetűvel írták a könyvekben, arra rögtön rájöttem, hogy kényelmesebb írni és könnyebb olvasni, ha a C-hez hasonlóan kisbetűvel írom a kódot.

És bár a C idegen volt, mindig is irigyeltem a kapcsos zárójeleket a Pascal begin-end blokkja helyett. Így, ahogy volt egy kis időm, a TPA-1148-as számítógép (ezzel dolgoztam akkoriban) Pascal fordítójával elkezdtem egy programot írni, ami egy egyszerűsített forráskódot Pascal-ba fordított át, ezt a programot hívtam MCP-nek. Nem volt ez igazi fordító, egyszerű szöveghelyettesítésekkel és ügyes trükkökkel cserélte a kapcsos zárójeleket begin-end blokkokra, és még néhány számomra kényelmes átalakítást végzett a forrás kódon. Ezekután, nálam a fejlesztés úgy nézett ki, hogy megírtam az “mcp” forrást, átalakítottam Pascal-ra, fordítottam, szerkesztettem és így készült el a végrehajtható program.

TPA-1148 számítógép, hasonlón tanultam programozni, és egy ilyenen telepítettem életemben először operációs rendszert, RSX-11M-et

Problémát ez csak akkor okozott, amikor munkahelyet változtattam, és otthagytam egy csomó “mcp” kódot. A kolléganőmnek, aki programozó matematikus szakon végzett el kellett magyaráznom, hogy miért is használtam az MCP-t, és ha a programjaimon változtatni szeretne, akkor ezt hogyan teheti meg. Persze megoldhattam volna, hogy minden MCP forrást PAS-ra fordítok, és úgy hagyom ott őket, de nem ezt a lehetőséget választottam, meg nem tudom mondani, miért.

Aztán jöttek a 90-es évek, a Dos, a Windows 3.1, a Turbo Pascal, az integrált programozói környezetek, és valahogy már nem volt szükségem ilyen többlépcsős eszközökre, és az MCP-t lassan elfelejtettem.

Aztán jött a fordulat, a megvilágosodás, az interneten böngészve rátaláltam Jack W. Crenshaw “Let’s build a compiler” című 16 részes cikksorozatára, ami a compiler (fordító program) írásról szólt, de nem a már ismert bonyolult, elméleti módon, hanem egészen egyszerű stílusban, és gyakorlati megközelítéssel. Ebben a sorozatban egy egyszerű nyelvet közvetlenül assembly nyelvre fordító program készítésének módját írja le a szerző, és mellékeli a fordító Pascal nyelvű forrását is, ami 68000-es assembly-re fordítja le a forráskódot.

A forrásnyelv egyszerű, egykarakteres változóneveket használ, de az utasításkészlete teljes, és a kifejezései is tartalmazzák a legegyszerűbb, de legfontosabb műveleteket. A cikksorozat egyik legnagyobb erőssége, hogy a lehető legegyszerűbb módon, érthetően magyarázza el a forráskód elemzést, a tokenizálást, és a kifejezés-elemzője is rendkívül egyszerű, de mégis hatékony. És a cikksorozat végén a fordítók mellett az interpreter írásra is kitért a szerző, ami az én szívemet különösen megdobogtatta.

Kiderült, hogy szintaxis-fa (AST), top-down és bottom-up módszerek nélkül is lehet érthető módon tárgyalni a fordítást, és lehet működő compiler-t írni csupán a józan észre támaszkodva, anélkül, hogy az embernek többszáz oldalas elméleten kellene átrágnia magát teljesen feleslegesen, hiszen ezután ugyanúgy nem fog tudni fordítót írni, mint annak előtte.

Ráadásul az ismertetett elemző, tokenizáló módszer lehetővé teszi a contextus-függő nyelvek fordítását is, megoldható például, hogy az “=” jelentsen értékadást, és egyenlőség relációt is attól függően, hogy milyen környezetben van éppen. És igazán ez volt az a pont, amikor elhatároztam, hogy én is belekezdek egy nyelv tervezésébe és egy interpreter, majd egy compiler megírásába.

…folytatás következik…

Debra Interpreter – bemutatkozás

A Debra Interpreter egy általam megtervezett programozási nyelvhez készült interpreter. A közeljövőben a fejlesztésével kapcsolatos írások kerülnek majd ide, illetve letölthetőek és kipróbálhatóak lesznek a program különböző verziói is.

Azért, hogy legyen némi elképzelésünk arról, hogyan is néz ki egy Debra kód, álljon most itt példaként egy konzol program, ami egy szövegállomány sorait számolja meg:

console program LineCount

main {
    if argc() = 0 quit("missing command line argument")
    if not isfile(arg(1)) quit("missing file : " + arg(1))
    i = 0
    f = textin(arg(1))
    while not f.eof() {
        f.read()
        i++
    }
    f.close()
    write "File: ", arg(1), ", lines: ", i
}