ArkScript, a small and fast language for scripting video games
source link: https://github.com/ArkScript-lang/Ark
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
ArkScript
- Documentation: Wiki
- Discord server: invite link , to discuss the specification of the language and receive help
- Modules
Nota bene: the project is referred as "Ark" and as "ArkScript". The official public name is "ArkScript" since "Ark" is already being used by another language
Key features
ArkScript is
- small: the compiler, and the virtual machines fit under 5000 lines, but also small in term of keywords (it has only 10)!
- a scripting language: it's very easy to embed it in your application. The FFI is quite easy to understand, so adding your own functions to the virtual machine is effortless
- portable: it produces a bytecode which is run by its virtual machine, like Java but without the
OutOfMemoryException
- a functional language: every parameters are passed by value, everything is immutable unless you use
mut
to define a mutable variable - powerful: it can handle object oriented programming in a very elegant way with its closures and explicit captures (see examples/church-encoding)
- promoting functionalities before performances: expressiveness often brings more productivity, but performances aren't bad at all
- easy to compile: it takes less than 200ms to compile and check a complex code with a lot of branches and sub-branches of 200 lines.
- a Lisp-like, but with less parentheses:
[...]
is expanded to(list ...)
and{}
to(begin ...)
. More shorthands will come in the future. - extensible: it is very easy to create a C++ module to use in the language
Also:
- it has a REPL
- it has a growing standard library, composed of ArkScript (under
lib/
) and C++ (undermodules/
) - it has a lot of unit tests, which are ran before every release to ensure everything work as intended
Examples
Fibonacci suite
{ (let fibo (fun (n) (if (< n 2) n (+ (fibo (- n 1)) (fibo (- n 2)))))) (print (fibo 28)) # display 317811 }
More or less game
{ # more or less game (print "More or less game!") (import "librandom.so") (import "Math/Arithmetic.ark") (let number (mod (abs (random)) 10000)) (mut value 0) (mut essais 0) (mut continue true) (while continue { (set value (toNumber (input "Input a numeric value: "))) (if (< value number) # then (print "More!") # else (if (= value number) # then { (print "Bingo!") (set continue false) } # else (print "Less!"))) (set essais (+ 1 essais))}) (print "You won in " essais " tries") }
More examples are available in the folder examples/
.
Contributing
- First, fork the repository
- Then, clone your fork:
git clone [email protected]:username/Ark.git
- Create a branch for your feature:
git checkout -b feat-my-awesome-idea
- When you're done, push it to your fork and submit a pull request!
Don't know what to work on? No worries, we have a list of things to do :wink:
Our beloved contributors
Who worked on
- the standard library
- the FFI
- the REPL
- the CLI
- the documentation
- the language specification
- the logo
Contributing to the ArkScript standard library
See Coding guidelines if you want to write ArkScript for the library (see folder lib/
).
For performance reasons, some functions might be written in C++, in include/Ark/VM/FFI.hpp
and src/VM/FFI/
.
Code structure
Dependencies
- C++17
- CMake >= 3.12
- Visual Studio >= 11 (on Windows)
Libs already included:
- rj format , MIT licence
- CLIPP , MIT licence
- termcolor , BSD (3-clause) licence
- google/benchmark , Apache 2.0 licence
Building
# first, clone it ~$ git clone --depth=50 --branch=dev https://github.com/ArkScript-lang/Ark.git ~/Ark$ cd Ark ~/Ark$ git submodule update --init --recursive # building Ark ~/Ark$ cmake -H. -Bbuild -DCMAKE_BUILD_TYPE=Release -DARK_BUILD_EXE=1 ~/Ark$ cmake --build build # installing Ark # works on Linux and on Windows (might need administrative privileges) ~/Ark$ cmake --install build --config Release # running ~/Ark$ Ark --help DESCRIPTION ArkScript programming language SYNOPSIS build/Ark -h, --help build/Ark --version build/Ark --dev-info build/Ark ((<file> [-c]) | -r) [-(d|bcr)] [-L <lib_dir>] [-f(function-arity-check|no-function-arity-check)] [-f(allow-invalid-token-after-paren|no-invalid-token-after-paren)] OPTIONS -h, --help Display this message --version Display ArkScript version and exit --dev-info Display development information and exit -c, --compile Compile the given program to bytecode, but do not run -r, --repl Run the ArkScript REPL -d, --debug... Increase debug level (default: 0) -bcr, --bytecode-reader Launch the bytecode reader -L, --lib Set the location of the ArkScript standard library -f(function-arity-check|no-function-arity-check) Toggle function arity checks (default: ON) -f(allow-invalid-token-after-paren|no-invalid-token-after-paren) Authorize invalid token after `(' (default: OFF). When ON, only display a warning LICENSE Mozilla Public License 2.0
Performances
Compiled on WSL (Ubuntu 18.04.3 LTS 64 bits), 25 independants runs, 5 consecutives runs to have a nice median.
Run on (8 X 1992 MHz CPU s) CPU Caches:
- L1 Data 32K (x4)
- L1 Instruction 32K (x4)
- L2 Unified 262K (x4)
- L3 Unified 8388K (x1)
The test here is the Ackermann-Peter function with m=3 and n=6:
data ArkScript C++ (g++ 8.3.0) Java (OpenJDK 11.0.6) 64 bits Lua 5.1.5 Python 3.6.9 mean 51.5 ms 0.144 ms 0.211 ms 13.553 ms 9.125 ms median 51.1 ms 0.142 ms 0.179 ms 13.404 ms 9.375 ms stddev 0.619 ms 0.003 ms 0.906 ms 0.146 ms 0.865 msGames
You can find a snake created in ArkScript in the folder examples/games/snake (run it from there, otherwise it won't find the font and the sprites ; you won't need to install the SFML).
Controls are the arrows (left, right, up and down), the game closes itself when you successfully collect the 3 apples.
Credits
This project was inspired by gameprogramingpatterns and ofan lisp.cpp
Copyright and Licence information
Copyright (c) 2019-2020 Alexandre Plateau. All rights reserved.
This ArkScript distribution contains no GNU GPL code, which means it can be used in proprietary projects.
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK