Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/austral/austral
Systems language with linear types and capability-based security.
https://github.com/austral/austral
capabilities compiler linear-types
Last synced: 22 days ago
JSON representation
Systems language with linear types and capability-based security.
- Host: GitHub
- URL: https://github.com/austral/austral
- Owner: austral
- License: apache-2.0
- Created: 2018-09-25T02:21:49.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2024-04-27T20:40:09.000Z (6 months ago)
- Last Synced: 2024-05-22T02:12:07.648Z (6 months ago)
- Topics: capabilities, compiler, linear-types
- Language: OCaml
- Homepage: https://austral-lang.org/
- Size: 4.56 MB
- Stars: 1,062
- Watchers: 29
- Forks: 37
- Open Issues: 15
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
- Roadmap: ROADMAP.md
Awesome Lists containing this project
README
# Austral
![Build status badge](https://github.com/austral/austral/actions/workflows/build-and-test.yml/badge.svg)
Austral is a new language.
Features:
- **Linear types**: linear types allow resources to be handled in a
provably-safe manner. Memory can be managed safely and without runtime
overhead, avoiding double `free()`, use-after-`free` errors, and double fetch
errors. Other resources like file or database handles can also be handled
safely.- **Capabilities**: linear [capabilities][cap] enable fine-grained permissioned
access to low-level facilities. Third-party dependencies can be constrained in
what types of resources they can access. This makes the language less
vulnerable to [supply chain attacks][sca].- **Typeclasses**: typeclasses, borrowed from Haskell, allow for bounded ad-hoc
polymorphism.- **Safe Arithmetic**: Austral has well-defined semantics for all arithmetic
operations on numeric types. There are distinct operations for
trap-on-overflow arithmetic and modular arithmetic, as in Ada.- **Algebraic Data Types**: algebraic data types, as in ML or Haskell, with
exhaustiveness checking.Anti-features:
- No garbage collection.
- No destructors.
- No exceptions (and no surprise control flow).
- No implicit function calls.
- No implicit type conversions.
- No implicit copies.
- No global state.
- No subtyping.
- No macros.
- No reflection.
- No Java-style @Annotations.
- No type inference, type information flows in one direction.
- No uninitialized variables.
- No pre/post increment/decrement (`x++` in C).
- No first-class async.
- No function overloading (except through typeclasses, where it is bounded).
- No arithmetic precedence.
- No variable shadowing.## Example
Calculate and print the 10th Fibonacci number:
```ml
module body Fib is
function fib(n: Nat64): Nat64 is
if n < 2 then
return n;
else
return fib(n - 1) + fib(n - 2);
end if;
end;function main(): ExitCode is
print("fib(10) = ");
printLn(fib(10));
return ExitSuccess();
end;
end module body.
```Build and run:
```bash
$ austral compile fib.aum --entrypoint=Fib:main --output=fib
$ ./fib
fib(10) = 55
```## Building with Nix
If you have [Nix][nix], this will be much simpler. Just:
[nix]: https://nixos.org/
```bash
$ nix-shell
$ make
```And you're done.
## Building without Nix
Building the `austral` compiler requires `make` and the `dune` build system for
OCaml, and a C compiler for building the resulting output. You should install
OCaml 4.13.0 or above.First:
```bash
$ git clone [email protected]:austral/austral.git
$ cd austral
```Next, install [opam][opam]. On Debian/Ubuntu you can just do:
```bash
$ sudo apt-get install opam
$ opam init
```Then, create an opam switch for austral and install dependencies via opam:
```bash
opam switch create austral 4.13.0
eval $(opam env --switch=austral)
opam install --deps-only -y .
```Finally:
```bash
make
```To run the tests:
```bash
$ ./run-tests.sh
```To build the standard library:
```bash
$ cd standard
$ make
```## Usage
Suppose you have a program with modules `A`, `B`, and `C`, in the following
files:```
src/A.aui
src/A.aumsrc/B.aui
src/B.aumsrc/C.aui
src/C.aum
```To compile this, run:
```bash
$ austral compile \
src/A.aui,src/A.aum \
src/B.aui,src/B.aum \
src/C.aui,src/C.aum \
--entrypoint=C:main \
--output=program
```The `--entrypoint` option must be the name of a module, followed by a colon,
followed by the name of a public function with either of the following
signatures:1. `function main(): ExitCode;`
2. `function main(root: RootCapability): ExitCode;`The `ExitCode` type has two constructors: `ExitSuccess()` and `ExitFailure()`.
Finally, the `--output` option is just the path to dump the compiled C to.
By default, the compiler will emit C code and invoke `cc` automatically to
produce an executable. To just produce C code, use:```bash
$ austral compile --target-type=c [modules...] --entrypoint=Foo:main --output=program.c
```If you don't need an entrypoint (because you're compiling a library), instead of
`--entrypoint` you have to pass `--no-entrypoint`:```bash
$ austral compile --target-type=c [modules...] --no-entrypoint --output=program.c
```If you just want to typecheck without compiling, use the `tc` target type:
```bash
$ austral compile --target-type=tc [modules...]
```Generated C code should be compiled with:
```bash
$ gcc -fwrapv generated.c -lm
```## Status
1. The bootstrapping compiler, written in OCaml, is implemented. The main
limitation is it does not support separate compilation. In practice this is
not a problem: there's not enough Austral code for this to matter.2. The compiler implements every feature of the spec.
3. A standard library with a few basic data structures and capability-based
filesystem access is being designed.## Contributing
See: [`CONTRIBUTING.md`](https://github.com/austral/austral/blob/master/CONTRIBUTING.md)
## Community
- [Discord](https://discord.gg/8cEuAcD8pM)
## Roadmap
Currently:
- Expanding the [standard
library](https://github.com/austral/austral/tree/master/standard).Near-future work:
- Build tooling and package manager.
# License
Copyright 2018–2023 [Fernando Borretti][fernando].
Licensed under the [Apache 2.0 license][apache] with the [LLVM exception][llvmex]. See the [LICENSE file][license] for details.
[opam]: https://opam.ocaml.org/doc/Install.html
[cap]: https://en.wikipedia.org/wiki/Capability-based_security
[sca]: https://en.wikipedia.org/wiki/Supply_chain_attack
[fernando]: https://borretti.me/[apache]: https://www.apache.org/licenses/LICENSE-2.0
[llvmex]: https://spdx.org/licenses/LLVM-exception.html
[license]: https://github.com/austral/austral/blob/master/LICENSE