|
Carbone Ruby VM README COPYING THANKS FEATURES TODO ChangeLog doc/guide.txt doc/generator.txt doc/input_language.txt doc/gc.txt doc/proposals.txt 20020416_1129 |
Input Language
------------------
The input language - Carbone's first native language - is Lisp-like,
corresponding to a subset of LGram level 1.
It is parsed and precompiled Ruby code.
Sooner or later - when the Ruby parser will work and a compiler is
written (in Ruby) - the Carbone input language will become an internal
data format. It's definition is: "The input for the generator, the
last step in compilation." (This is also the reason, why you can
build Carbone with `make gen'; it's derived from a generator test)
Look at the tests to get an impression.
tests/t0_base.lg
for the language basics; use `./gen -Stc tests/t0_base.lg | less' to
see whats happening)
sequence:
(body list_of(statements))
literals:
(lit number) e.g. (lit 1) (lit 2)
(lit symbol) e.g. (lit a) (lit *a--<->--b*)
(lit list) e.g. (lit (+ (* 1 2) (* 3 4)))
synonym:
(quote ...)
constants:
(const nil const-name) e.g. (const nil Object)
(const nilFixnum)
Currently only outer constants are supported.
reference comparison:
(eql a b) compare the references a and b
simple conditions:
(scond (true) a b) means 'a && b'
(scond (false) a b) means 'a || b'
while loop:
(while condition instruction)
calling C functions generically:
(cfunc c-function-name param1 param2 ...)
will call a C function that has to be compiled into the VM and
declared with something like:
`cfunc_declare("meth_generate", meth_generate, 1, 2);'
parameters to cfunc_declare():
* method name as string
* the C function itself
* 0 for returns-void; 1 for returns-something(e.g. some-VALUE)
* number of parameters
send:
(send receiver selector (list of arguments) rest-array proc)
for example, the Ruby code `1+2' would translate to:
(send
(lit 1) ;; rcv
+ ;; sel
((lit 2))) ;; args
rest_args and proc are prevu, but not yet fully implemented.
invoke:
(invoke rcv callable)
evaluates `rcv' and `callable';
calls callable with `rcv' as self;
callable must be a method of rcv's class or a block which was
compiled for it;
and inside the context of a method or a block:
self:
(self)
local variables:
(lv lvar-name) get a local-variable
(lv= lvar-name) set a local-variable
parameters:
(par parameter-name)
instance variables:
(iv ivar-name)
(iv= ivar-name new-value)
method existance:
(boundp class selector)
block/proc creation:
(block (compilation-hints) code)
At the end, the code is the documentation: see comp/generator.c
Currently everything has to be packaged inside
`(snippets list_of(code expected-result))'
(Excluded the code given at the commandline with the -e option.)
Available Methods
-----------------
define_class
------------
define_method
-------------
(send ; see main.c#load_builtins()
target-class
define_method
((lit
(method-name
(parameter-list rest-parameter)
(stack-variables) ; svars
(local-variables) ; lvars
(proc)
(method-code)))))
In the directory carbone/builtins/ you can see that I'm trying to
_declare_ builtin methods and not to hardcode them in C.
builtins/trans.rb is doing the translation to C code and they get
appended to the set of VM primitives in carbone/vm/Makefile.
See the README in this directory.
explain compilation-flags
|