1 unstable release
0.1.0 | May 11, 2019 |
---|
#2074 in Development tools
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 compilertarget/release/ullage
.$ ./build.sh test
will build the compiler and run the test suite fromspecs/
.$ ./build.sh bench
will run the benchmarks fromspec/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)
- Lowering of
- 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