KXκωνσταντίνος.χαφής
CompilersΑκαδημαϊκό2024Επιλεγμένα

Compiler της Alan

JavaJFlexCUPASMMaven

Επισκόπηση

Η Alan είναι μια μικρή προστακτική γλώσσα διδασκαλίας: τύποι byte/int/reference/proc, συναρτήσεις, if/else, while, συμβολοσειρές και βιβλιοθήκη ρουτίνων. Αυτό το έργο είναι πλήρης compiler γι’ αυτήν — από το πηγαίο κείμενο έως εκτελέσιμο JVM bytecode.

Η πιο δύσκολη απόφαση ήταν και η πιο ικανοποιητική: αντί να εκπέμψει Java πηγαίο κώδικα και να αφήσει τον javac να τελειώσει τη δουλειά, ο compiler εκπέμπει απευθείας JVM bytecode με το tree API της ASM (ClassNode, MethodNode, InsnList). Αυτό σημαίνει ότι έπρεπε να λειτουργήσει κάθε φάση ενός πραγματικού compiler.

Τι έφτιαξα

Κλασικό pipeline τριών σταδίων:

  1. Λεκτική ανάλυση — γραμματική JFlex (lexer.jflex) που καλύπτει λέξεις-κλειδιά, δεκαεξαδικά και συμβολοσειρές, σχόλια --, με παρακολούθηση γραμμής/στήλης.
  2. Συντακτική ανάλυση — γραμματική CUP LALR (parser.cup) με δηλώσεις προτεραιότητας τελεστών, που χτίζει τυποποιημένο AST (Program, FuncDef, Expr, IfStmt, WhileStmt, Assignment…).
  3. Σημασιολογία και παραγωγή κώδικα — στοίβα SymbolTable/SymbolEntry με πλήρη έλεγχο τύπων (SemanticException, TypeException), έπειτα IRGen/CompileContext που διασχίζει το AST και εκπέμπει bytecode ASM. Ένα MemHeap διαχειρίζεται τη διάταξη μνήμης και ένα πακέτο library/ παρέχει ενσωματωμένες ρουτίνες (ReadInteger, WriteString, Strcmp, StringToArrayList).

Η παράδοση περιλαμβάνει scripts Maven και shell για συντακτικό έλεγχο, σημασιολογικό έλεγχο, μεταγλώττιση και εκτέλεση — με έτοιμα παραδείγματα: hello_world, bubble sort, πύργοι του Ανόι, πρώτοι αριθμοί, αντιστροφή συμβολοσειράς.

Τεχνικά highlights

Αποτέλεσμα

Πραγματικά προγράμματα Alan μεταγλωττίζονται και τρέχουν στο JVM. Από όλη την τεχνική δουλειά που έχω κάνει, αυτό μου πρόσφερε τα περισσότερα: είναι απαιτητικό, ακριβές και βαθιά απολαυστικό.