Az egész nem túl nagy, de nagyon jó passokkal való kísérletezésre, ha valakinek épp nincs saját hobbinyelve.
- Dokumentáció egy JSON alapú IR-hoz egy apró nyelvnek
- Pretty printer, ami a JSON-t assemblyhez hasonló formátumba ki tudja írni
- Parser amivel a fenti formátumból visszakapható a JSON
- Egy interpreter
Az egészben az a zseniális, hogy mivel JSON alapú, ezért tetszőleges nyelvben dolgozhat az ember, és utána a saját transformációs pipeline-ját unix shellben össze tudja rakni.
Egy Móriczka példa a + operátor - ra cserélésére, majd a kód interpreterben való futtatására:
cat ../test/parse/add.json | python negate_add.py | brili
A pass python kódja:
import json
import sys
ir = json.load(sys.stdin)
for func in ir["functions"]:
for instr in func["instrs"]:
if instr["op"] == "add":
instr["op"] = "sub"
print(json.dumps(ir, indent=4))
Szerintem ez az egész két esetben lehet hasznos. Egyrészt ha kis efforttal (pl LLVM fordításhoz képest) akar az ember megpróbálni implementálni egy jól ismert compiler algoritmust tanulásképp (vagy esetleg egy új algoritmust, instrumentációt stb). Vagy ha egy új nyelvi elemmel akart kísérletezni, már adott egy apró nyelv amit ki lehet egészíteni.
Sok példa algoritmus már le van implementálva a repoban, pl value numbering, azokkal is lehet szemezgetni. Az biztos, ha egyszer újra tartok fordítóprogramos órát, akkor valami ilyesmit fogok használni :)
Üdv,
Gábor