83 lines
3.4 KiB
Markdown
83 lines
3.4 KiB
Markdown
# Schala - a programming language meta-interpreter
|
|
|
|
Schala is a Rust framework written to make it easy to create and experiment
|
|
with toy programming languages. It provides a cross-language REPL and
|
|
provisions for tokenizing text, parsing tokens, evaluating an abstract syntax
|
|
tree, and other tasks that are common to all programming languages.
|
|
|
|
Schala is implemented as a Rust library `schala-repl`, which provides a
|
|
function `repl_main` meant to be used as the equivalent of main() for library
|
|
users. This function parses command-line arguments and either runs an interactive
|
|
REPL or interprets a program non-interactively.
|
|
|
|
Individual programming language implementations are Rust types that implement
|
|
the `ProgrammingLanguageInterface` trait and store whatever persistent state is
|
|
relevant to that language. The ability to share state between different
|
|
programming languages is in the works.
|
|
|
|
## History
|
|
|
|
Schala started out life as an experiment in writing a Javascript-like
|
|
programming language that would never encounter any kind of runtime value
|
|
error, but rather always return `null` under any kind of error condition. I had
|
|
seen one too many Javascript `Uncaught TypeError: Cannot read property ___ of
|
|
undefined` messages, and I was a bit frustrated. Plus I had always wanted to
|
|
write a programming langauge from scratch, and Rust is a fun language to
|
|
program in. Over time I became interested in playing around with other sorts
|
|
of programming languages as well, and wanted to make the process as general as
|
|
possible.
|
|
|
|
The name of the project comes from Schala the Princess of Zeal from the 1995
|
|
SNES RPG *Chrono Trigger*. I like classic JRPGs and enjoyed the thought of
|
|
creating a language name confusingly close to Scala. The naming scheme for
|
|
languages implemented with the Schala meta-interpreter is Chrono Trigger
|
|
characters.
|
|
|
|
Schala is incomplete alpha software and is not ready for public release.
|
|
|
|
## Languages implemented using the meta-interpreter
|
|
|
|
* The eponymous *Schala* language is an interpreted/compiled scripting langauge,
|
|
designed to be relatively simple, but with a reasonably sophisticated type
|
|
system.
|
|
|
|
* *Maaru* was the original Schala (since renamed to free up the name *Schala*
|
|
for the above language), a very simple dynamically-typed scripting language
|
|
such that all possible runtime errors result in null rather than program
|
|
failure.
|
|
|
|
* *Robo* is an experiment in creating a lazy, functional, strongly-typed language
|
|
much like Haskell
|
|
|
|
* *Rukka* is a straightforward LISP implementation
|
|
|
|
## Reference works
|
|
|
|
Here's a partial list of resources I've made use of in the process
|
|
of learning how to write a programming language.
|
|
|
|
### Type-checking
|
|
https://skillsmatter.com/skillscasts/10868-inside-the-rust-compiler
|
|
https://www.youtube.com/watch?v=il3gD7XMdmA
|
|
http://dev.stephendiehl.com/fun/006_hindley_milner.html
|
|
https://rust-lang-nursery.github.io/rustc-guide/type-inference.html
|
|
|
|
### Evaluation
|
|
*Understanding Computation*, Tom Stuart, O'Reilly 2013
|
|
|
|
*Basics of Compiler Design*, Torben Mogensen
|
|
|
|
### Parsing
|
|
http://journal.stuffwithstuff.com/2011/03/19/pratt-parsers-expression-parsing-made-easy/
|
|
https://soc.github.io/languages/unified-condition-syntax
|
|
|
|
[Crafting Interpreters](http://www.craftinginterpreters.com/)
|
|
|
|
### LLVM
|
|
http://blog.ulysse.io/2016/07/03/llvm-getting-started.html
|
|
|
|
###Rust resources
|
|
https://thefullsnack.com/en/rust-for-the-web.html
|
|
|
|
https://rocket.rs/guide/getting-started/
|