Skip to content

A statically-typed compiled language defined by a simple grammar

License

Notifications You must be signed in to change notification settings

iwillspeak/ullage

Folders and files

NameName
Last commit message
Last commit date

Latest commit

c0330d9 · Aug 28, 2022
Aug 15, 2020
Sep 29, 2019
Sep 29, 2019
Aug 16, 2020
Aug 28, 2022
Aug 16, 2020
Sep 29, 2019
Aug 28, 2022
Aug 28, 2022
Feb 10, 2019
Aug 15, 2020
Feb 10, 2019
Oct 3, 2020
Aug 15, 2020
Aug 28, 2022
Oct 3, 2020

Repository files navigation

Ullage

Build Status

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 and to cargo install just. 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