Επισκόπηση
Η Alan είναι μια μικρή προστακτική γλώσσα διδασκαλίας: τύποι byte/int/reference/proc, συναρτήσεις, if/else, while, συμβολοσειρές και βιβλιοθήκη ρουτίνων. Αυτό το έργο είναι πλήρης compiler γι’ αυτήν — από το πηγαίο κείμενο έως εκτελέσιμο JVM bytecode.
Η πιο δύσκολη απόφαση ήταν και η πιο ικανοποιητική: αντί να εκπέμψει Java πηγαίο κώδικα και να αφήσει τον javac να τελειώσει τη δουλειά, ο compiler εκπέμπει απευθείας JVM bytecode με το tree API της ASM (ClassNode, MethodNode, InsnList). Αυτό σημαίνει ότι έπρεπε να λειτουργήσει κάθε φάση ενός πραγματικού compiler.
Τι έφτιαξα
Κλασικό pipeline τριών σταδίων:
- Λεκτική ανάλυση — γραμματική JFlex (
lexer.jflex) που καλύπτει λέξεις-κλειδιά, δεκαεξαδικά και συμβολοσειρές, σχόλια--, με παρακολούθηση γραμμής/στήλης. - Συντακτική ανάλυση — γραμματική CUP LALR (
parser.cup) με δηλώσεις προτεραιότητας τελεστών, που χτίζει τυποποιημένο AST (Program,FuncDef,Expr,IfStmt,WhileStmt,Assignment…). - Σημασιολογία και παραγωγή κώδικα — στοίβα
SymbolTable/SymbolEntryμε πλήρη έλεγχο τύπων (SemanticException,TypeException), έπειταIRGen/CompileContextπου διασχίζει το AST και εκπέμπει bytecode ASM. ΈναMemHeapδιαχειρίζεται τη διάταξη μνήμης και ένα πακέτοlibrary/παρέχει ενσωματωμένες ρουτίνες (ReadInteger,WriteString,Strcmp,StringToArrayList).
Η παράδοση περιλαμβάνει scripts Maven και shell για συντακτικό έλεγχο, σημασιολογικό έλεγχο, μεταγλώττιση και εκτέλεση — με έτοιμα παραδείγματα: hello_world, bubble sort, πύργοι του Ανόι, πρώτοι αριθμοί, αντιστροφή συμβολοσειράς.
Τεχνικά highlights
- Πλήρες pipeline: lexer → parser → τυποποιημένο AST → JVM bytecode, χωρίς κενά
- Άμεση εκπομπή bytecode μέσω ASM — χωρίς ενδιάμεσο πηγαίο κώδικα
- Πίνακες συμβόλων, έλεγχος τύπων και βιβλιοθήκη χρόνου εκτέλεσης για πλήρη γλώσσα
Αποτέλεσμα
Πραγματικά προγράμματα Alan μεταγλωττίζονται και τρέχουν στο JVM. Από όλη την τεχνική δουλειά που έχω κάνει, αυτό μου πρόσφερε τα περισσότερα: είναι απαιτητικό, ακριβές και βαθιά απολαυστικό.