A Pascal compiler in Haskell that compiles to LLVM

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

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


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

查看所有标签

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

Design and Analysis of Distributed Algorithms (Wiley Series on P

Design and Analysis of Distributed Algorithms (Wiley Series on P

Nicola Santoro / Wiley-Interscience / 2006-10-27 / USD 140.95

This text is based on a simple and fully reactive computational model that allows for intuitive comprehension and logical designs. The principles and techniques presented can be applied to any distrib......一起来看看 《Design and Analysis of Distributed Algorithms (Wiley Series on P》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

随机密码生成器
随机密码生成器

多种字符组合密码

URL 编码/解码
URL 编码/解码

URL 编码/解码