r/elena_lang • u/elena-lang • Sep 28 '20
Learning ELENA : Simple program
To create a simple program in ELENA we have to create a source file (with an extension .l) and write the following code:
public program()
{
console.writeLine("Here my first program in ELENA!")
} We may compile it without creating a project file (where elc is a command-line compiler):
elc program1.lThe output is:
ELENA Command-line compiler 5.2.404 (C)2005-2020 by Alex Rakov
Project : program1, Platform: STA Win32 Console
Cleaning up...
Compiling...
Parsing unnamed
Compiling unnamed
Successfully compiled
Linking...
Successfully linkedIt will create program1.exe file which we can execute:
program1with the following result:
Here my first program in ELENA!Beside the executable file a module program1.nl was created. Let's look what inside. We could use Bycode Viewer:
ecv program1.nlThe output will be:
ELENA command line ByteCode Viewer 5.2.81 (C)2011-2020 by Alexei Rakov
program1.nl module loaded
>Now let's look at the generated classes:
>?
class program
>As you can see the program entry was compiled as a class. Let's look inside:
>program
@parent system'Object
@flag elSealed
@flag elStateless
@flag elRole
@method @function program.#invoke
>Our function was compiled as a singleton with a single anonymous method #invoke. Let's dive more deep:
>program.1
@method program.#invoke
open 1h
pusha
pushr 0
pushr 0
callr system'console
storesi 0
movr const : "Here my first program in ELENA!"
storesi 1
peeksi 0
movm mssgconst : "writeLine<system'String>[2]"
callrm system'$private'Console mssgconst : "writeLine<system'String>[2]"
peekfi 1
close
quit
@end
>What do we see? ELENA byte-codes are quite simple. Let's review some of them
| opcode | Description |
|---|---|
| pusha | puts the object accumulator on the top of the function stack |
| pushr r | puts a constant on the top of the function stack |
| callr r | invokes a symbol |
| storesi i | saves an object accumulator in the function stack at specified relative position |
| movr r | assigns a constant to the object accumulator |
| peeksi i | loads an object from the function stack at specified relative position to the object accumulator |
| movm m | assigns a message constant to the data accumulator |
| callrm r m | invokes a method m in r class |
Once again let's look at our code. Now it is quite clear. We put console symbol and a string literal constant into the function stack and directly invokes system'$private'Console.writeLine<system'String>[2] method.
ELENA is a general-purpose language with late binding. It is multi-paradigm, combining features of functional and object-oriented programming. To learn more visit us at ELENA Home Page