内容简介:A (reduced) Pascal compiler in Haskell that compiles to LLVMOnce the executable is built, it can be used to compile Pascal source files to llvm-ir, or internal IR used by the compiler:The compiler is complemented with the
Paskell
A (reduced) Pascal compiler in Haskell that compiles to LLVM
Features
- Declarations: var, type (aliases)
- Types: integer, boolean, string, char, real
- Control Flow: if, while, for
- Functions/Procedures
- Pass by reference
- Basic Typecasting
- Nested Functions/Procedures (Not finished yet)
- I/O: Write/Writeln
Progress
Usage
Once the executable is built, it can be used to compile Pascal source files to llvm-ir, or internal IR used by the compiler:
paskell -c src
compile to llvm-ir
paskell -c src dest
compile to llvm-ir and save in dest
paskell -ir src
produce internal IR
paskell -x src
execute pascal source. Equivalent to paskell -c src | lli
paskell -h
(for help)
Demo:
The compiler is complemented with the llvm
utilities
$ paskell -c fib.pas fib.ll
Since the output is llvm-ir, we can leverage the many tools LLVM provide to:
-
execute it using the llvm interpreter
$ lli fib.ll
-
convert it to bitcode llvm assembly (.bc)
$ llvm-as fib.ll -o fib.bc
-
optimize the code using various settings, for example
$ opt -mem2reg fib.bc
-
translate it to a native assembly executable of a specific architecture (x86, ARM, etc)
$ llc -march=x86-64 fib.bc -o fib.s
- link many modules into one program
Building
With docker
$ make bash
to build the compiler and launch a shell session where the compiler and llvm utitlies are in $PATH
and ready out-of-the-box.
Alternatively
$ make build
will build the same image tagged paskell
which can be used with docker run
and volumes.
For example:
$ docker run -v /path/to/original_file.pas:/path/to/file.pas paskell paskell -c /path/to/file.pas
Without docker
You need to have llvm installed
$ sudo apt-get install llvm-5.0
lli
should be in $PATH
to be able to execute Pascal programs
Then, you can use Cabal or Stack.
To build using Cabal:
$ cd Paskell/ $ cabal install -j
this will install all dependencies and produce an executable in dist/build/Paskell/
You can also build using Stack.
Tests
$ make test
to run the test suite using docker.
Implementation
This is a 4-pass compiler:
pass 1: lex/parsing
pass 2: type checking
pass 3: constructing IR: type-annotation, type resolution, (future: identifier-renaming, nested-function extraction)
pass 4: code generation
TODO
-
finish nested functions/procedures:
this only requires pulling nested functions to global scope
and renaming them during the type-annotation pass - constants: trivial to implement
- Read/Readln IO statements
- records
- arrays
- case statements
- forward declaration
Contributions
Bug reports, added features, etc are welcome
References
- Language grammar
- Stephen Diehl's Haskell llvm-tutorial
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
HTML5与CSS3基础教程(第8版)
[美] Elizabeth Castro、[美] Bruce Hyslop / 望以文 / 人民邮电出版社 / 2014-5 / 69.00元
本书是风靡全球的HTML和CSS入门教程的最新版,至第6版累积销量已超过100万册,被翻译为十多种语言,长期雄踞亚马逊书店计算机图书排行榜榜首。 第8版秉承作者直观透彻、循序渐进、基础知识与案例实践紧密结合的讲授特色,采用独特的双栏图文并排方式,手把手指导读者从零开始轻松入门。相较第7版,全书2/3以上的内容进行了更新,全面反映了HTML5和CSS3的最新特色,细致阐述了响应式Web设计与移......一起来看看 《HTML5与CSS3基础教程(第8版)》 这本书的介绍吧!