A Pascal compiler in Haskell that compiles to LLVM

栏目: IT技术 · 发布时间: 5年前

内容简介: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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

宇宙涟漪中的孩子

宇宙涟漪中的孩子

谢云宁 / 四川科学技术出版社 / 2017-11 / 28.00元

近未来。日冕科技公司通过建造围绕太阳的光幕搜集了近乎无穷的能源,这些能源主要用于地球上的网络空间建设。随着全球网络时间频率的不断提升,越来越多的人选择接驳进虚拟空间,体验现实中难以经历的丰富人生。 网络互动小说作者宁天穹一直自认为是这些人中普通的一员,有一天却被一名读者带进反抗组织,了解到日冕公司的各种秘密,并被告知自己的小说将在抵抗运动中起到重要作用。 起初他拒绝参与,但看到地球被笼......一起来看看 《宇宙涟漪中的孩子》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具