1 unstable release

0.1.0 May 11, 2019

#2074 in Development tools

MIT license

240KB
5K SLoC

Ullage

A statically-typed compiled language defined by a simple grammar.

Current Status

It is now possible to write simple programs. The following program computes 9 factorial:

fn fact(n: Number): Number
    var acc = 1
    var i = 1
    while i < n
        acc = acc * i
        i = i + 1
    end
    acc
end

print fact(9) # => 362880

You can also mess around with constant strings:

# FizzBuzz
#
# Implementation of the legendary `FizzBuzz` algorithm.
fn fizzbuzz(n: Number): String
    (print 'fizzbuzz') if mod(n, 15) == 0 else
    (print 'fizz') if mod(n, 3) == 0 else
    (print 'buzz') if mod(n, 5) == 0 else
    print_num(n)
end

Building and Testing

The main build is performed by cargo. For running the functional tests and benchmarks you'll need Python. The suggested process is to use the build.sh script:

  • $ ./build.sh will build the compiler target/release/ullage.
  • $ ./build.sh test will build the compiler and run the test suite from specs/.
  • $ ./build.sh bench will run the benchmarks from spec/bench/.

License

Ullage is open source, under the MIT License.

Features and Progress

  • Custom data structures
  • Pattern matching
  • First-class functions

Lexer

  • Recognise words, numbers, comments, operators and white-space
  • Position information on each token
  • Interpolated strings
  • Expose whitespace to the parser

Parser

  • Parse base constructs
  • For loops and iterators
  • Traditional if blocks
  • Keep track of all underlying tokens
  • Expose position & span information on syntax nodes
  • Round-trippable/pretty-printable trees

Code Generation / Lowering

  • Create LLVM module and lower basic constructs
  • Array indexing
  • Arbitrary types for local variables
  • Heap allocated types
    • Lowering of String type
    • User-defined types
    • RC garbage collection (#26)
  • Library output types (LLVM ir, LLVM bc, object, staticlib, dylib, exe)
  • Control of target machine & features
  • Optimisation
  • Linker support:
    • clang - macOS linker default
    • gold - GNU ld
    • lld/llvm-link
    • Microsoft LINK

Dependencies

~6–17MB
~236K SLoC