mirror of
https://github.com/compiler-explorer/compiler-explorer.git
synced 2026-05-16 13:43:10 -04:00
This adds support for the [Sail language](https://github.com/rems-project/sail) - a DSL for defining ISAs. It's not quite ready but I need some help. These are the main remaining issues: 1. When you "link to binary" it does disassemble the binary properly, but the syntax highlighting and line numbers are broken.  2. If you try to execute the code without a `function main() -> unit = ...` then it gives this error in the compiler output: ``` Internal Compiler Explorer error: Error: spawn /tmp/compiler-explorer-compiler2025025-31052-c8gern.pf8t/model.c EACCES at ChildProcess._handle.onexit (node:internal/child_process:285:19) at onErrorNT (node:internal/child_process:483:16) at process.processTicksAndRejections (node:internal/process/task_queues:82:21) Compiler returned: -1 ``` This is weird - it should give a linker with an undefined reference to `zmain`. 3. Sail compiles to C, and then I added extra steps to compile that to binary (if you select `Execute the code`), but as you can see I had to move the binary back over the C file, so in this case `model.c` is actually an ELF file. It works but that seems very weird. There is a `getExecutableFilename()` method I could override, but doing that seems to make it even more confused. 4. I also had to have a fake flag for `binary` because the `filters` don't seem to get set correctly when passed to `runCompiler()`. E.g. `buildExecutable()` doesn't pass them at all. Not sure what is going on there. Seems to work though. Any help appreciated! PS: Sail is a cool language. It has lightweight dependent type for integers and bit vectors, which I haven't demonstrated in the examples yet, but they're neat. --------- Co-authored-by: Matt Godbolt <matt@godbolt.org>
38 lines
1.2 KiB
Plaintext
38 lines
1.2 KiB
Plaintext
default Order dec
|
|
|
|
$include <prelude.sail>
|
|
$include <vector.sail>
|
|
|
|
// This is generic over all fixed-length vectors. `input` is not
|
|
// dynamically sized.
|
|
function sum_array forall 'n . (input : vector('n, int)) -> int = {
|
|
// Type must be explicitly declared as `int`. If you leave
|
|
// that out the type will be inferred as `int(0)` and it
|
|
// can only contain the value 0.
|
|
var total : int = 0;
|
|
foreach (i from 0 to (length(input) - 1)) {
|
|
// You can easily add `+=` operators - Sail has good
|
|
// support for operator overloading - but it isn't
|
|
// there by default.
|
|
total = total + input[i];
|
|
};
|
|
total
|
|
}
|
|
|
|
// You can also use functional style lists, but these are
|
|
// not supported by all backends.
|
|
function sum_array_fp (input : list(int)) -> int =
|
|
match input {
|
|
// Empty list. List literals are with [| ... |].
|
|
[| |] => 0,
|
|
// Single element.
|
|
[| el |] => el,
|
|
// More than one element.
|
|
head :: tail => head + sum_array_fp(tail),
|
|
}
|
|
|
|
function main() -> unit = {
|
|
print_endline(concat_str("Sum of [1, 2, 3] is ", dec_str(sum_array([1 : int, 2, 3]))));
|
|
print_endline(concat_str("Sum of [1, 2, 3] is ", dec_str(sum_array_fp([| 1, 2, 3 |]))));
|
|
}
|