5 ms·
Hey there, author here :). The language is intentionally very simple indeed, because the goal is to showcase all indispensable steps of a complete compiler. I i
by p4bl0 4y ago
Hey there, author here :). The language is intentionally very simple indeed, because the goal is to showcase all indispensable steps of a complete compiler. I initially wrote it for my students as an introduction to my compiler class (for the very first session).
> would traditionally be called an expression evaluator
It is not an evaluator, evaluators are included (the different eval functions).
> the 150 lines doesn't include the parser or lexer either
This is just wrong:
$ cat *.ml{,l,y} *.c | sed '/^\s*$/d' | wc -l
149
and these 149 lines (okay, 169 if you count blank lines which are removed using sed in the count above) include the two `eval` and the `run` functions which are not actually part of the compiler but here for clarity (they help understanding how the successive intermediate representations of the boolean expressions work — without them the entire project is less than 130 lines).
> Not a bad attempt for what is presumably a first try
It's not ;). It is however targeted at beginner compsci students who have absolutely no idea how compilers are built yet :).
> but I think "complete compiler" is overselling it.
It does lexing & parsing to produce an AST of a boolean expression, then a traversal of this AST to transform it into a second intermediate representation (an AST of NAND-only expression), then compiles the expression into a list of instructions (and this paradigm shift is a big step that is tough to teach to some students, believe me ^^), and then emits the corresponding bytecode (which here is 1:1 with the imperative instructions), and then the VM interprets this bytecode. I don't think I'm overselling it :).
The only way it is not complete — and that's written in the README — is that it has absolutely no semantics analysis (there is only one type, and no names, so there is nothing to analyze ^^), but that is not mandatory to be called a compiler.
Then again, this is only the first hour of a semester long compiler class (which covers semantic analysis, don't worry) ;).
- userbinator 4y agoThe only way it is not complete — and that's written in the README — is that it has absolutely no semantics analysis I was referring to the complete lack of flow control. Could you compile the compiler with itself, for example? Then again, this is only the first hour of a semester long compiler class If you're taking a course, you might enjoy "leaping ahead" by studying C4 and C4x86. They are also VM-based, and self-compiling, yet still tiny. I think they really raised the bar on what a tiny-and-complete compiler is. (https://news.ycombinator.com/item?id=8558822 https://news.ycombinator.com/item?id=8558822 https://news.ycombinator.com/item?id=8746054 https://news.ycombinator.com/item?id=8746054)
- p4bl0 4y ago> Could you compile the compiler with itself, for example? That's only possible if you write the compiler in the language it compiles. By this account writing a Python compiler in something else than Python, for example in C, would make it incomplete? It doesn't make much sense. > If you're taking a course (…) You should read my post more carefully, I think.
- tiagoleifert 4y ago> I was referring to the complete lack of flow control. Could you compile the compiler with itself, for example? This is not a requirement for it to be a compiler. > They are also VM-based, and self-compiling, yet still tiny. I think they really raised the bar on what a tiny-and-complete compiler is. The purpose of OP's compiler is educational so this comparison makes no sense.
- userbinator 4y ago
- user5678 4y ago
- userbinator 4y agoI thought personal insults and appeal to authority were frowned upon here.
- survirtual 4y agoIt is, but I think he is understandably upset because people are engaging with you in good faith but you aren’t reading or acknowledging what they write. Sometimes, it’s good to just take a step back and start with something like “Oops, I missed you are a professor and this is a teaching tool. Disregard that part. I do think, however…” Otherwise, you’re bound to annoy someone even if you think you are technically contributing.
- shadowofneptune 4y agoOne question: what is the binary size of the compiler?
- p4bl0 4y agoThe native binary produced by ocamlopt is 917KB, the bytecode produced by ocamlc is 156KB. I must admit I didn't expect such "big" files. Out of curiosity I tested to compile a completely empty OCaml program: the native binary is 365KB and the bytecode is 21KB.
- l33t2328 4y agoI don’t know much about OCaml but one reason could be linking unnecessary libraries
- chrisseaton 4y agoPresumably you’re linking in a large GC etc?