Banana, a toy VM-based programming language.
long fib(long n) {
if (n == 1 or n == 2) {
return n;
}
return fib(n - 1) + fib(n - 2);
}
int main() {
for (long i = 1; i < 10; i++) {
print fib(i);
}
}
Prerequisites:
sudo apt install g++ cmake libffi-dev
Compile Banana:
git clone --recurse-submodules https://github.com/omaraflak/banana
cd banana
cmake -B build
cmake --build build
Run program:
./banana -i <source.na>
Currently, the language is very limited and supports the following features.
Types: bool, char, int, long.
The language supports automatic casting of types when needed.
Constructs: if, else, for, while, return.
Binary Operators: +, -, *, /, %, ^, &, |, <, <=, >, >=, ==, !=, and, or, +=, -=, *=, /=, %=, ^=, &=, |=.
Unary Operators: =, -, !, ~, ++, --.
Std library: print.
Native C Calls: @native()
You can call native C code from Banana, provided that you expose the code in a shared library.
mylib.cpp:
#include "../src/lib/c_interface.h"
long do_something(long n) {
// something complicated here
return 2 * n;
}
class MyNativeFunction : public CInterface {
cinterface::ArgType get_return_type() const { return cinterface::LONG; }
std::vector<cinterface::ArgType> get_arg_types() const { return {cinterface::LONG}; }
std::string get_name() const { return "math::do_something"; }
void* get_function() const { return (void*) do_something; }
};
std::vector<CInterface*> get_classes() { return {new MyNativeFunction()}; }Compile this as a shared library:
g++ mylib.cpp -o lib_folder/mylib.so -shared -fPIC
Bind it in Banana:
@native("math::do_something")
long doSomething(long n);
int main() {
print doSomething(10);
}
Provide the shared library directory with --lib when running the code:
./banana -i myscript.na --lib lib_folder
$ ./banana source.obj
$ ./banana -i source.na
$ ./banana -c source.na
int add(int a, int b) {
return a + b;
}
int main() {
print add(5, 6);
}
$ ./banana -a source.na
0 jump 48
9 store 0
18 store 1
27 load 0
36 load 1
45 add
46 ret 1
48 push int 6
54 push int 5
60 call 9 2
70 print
71 push char 10
74 print
75 halt