Для примера, возмём простейшую программку:
@println(2)
А теперь разберём её по кусочкам.
@ - это вызов, нативной функции. Функция должна быть записана в imports-table.txt. Если компилятор говорит "Error: Unimported function!", то её надо добавить. Но про это ниже.
Далее, идёт собственно имя функции. println входит в стандартный import-table.txt. Так что беспокоится нам не о чём.
Далее идёт, как и во всех ЯП, открывающая скобка, после чего следует аргумент функции. Заметим, что вместо 2 можно написать и 1+1, и даже (5+3)-6 - компилятор это превратит в соответствующий байт-код.
Потом идёт закрывающая скобка.
И всё!
Сохраняем программу, в файл например demo.txt. Выполняем: ./chkc demo.txt demo.cvm. (в системе, должна быть установлена переменная среды CHKALOV, указывающая на каталог, где лежат chkc, chkvm и прочие. На Линухе это делается так: export CHKALOV=/root/c/ (у меня так)).
Ну, посмотрим, что там нагенерировал компилятор. Например, hexdump'ом.
root@admin:~/c# hexdump demo.cvm -C
00000000 00 01 02 05 01 00 00 00 00 00 00 00 07 0e 00 00 |................|
00000010 00 00 00 00 00 73 74 64 63 6f 6e 2e 70 72 69 6e |.....stdcon.prin|
00000020 74 6c 6e 0d 00 00 00 00 00 00 00 09 04 02 00 00 |tln.............|
00000030 00 00 00 00 00 11 0e 00 |........|
00000038
root@admin:~/c#
Ой, сколько всяких непонятных буковок и символов... (C) Винни-Пух. Но не так уж они и страшны и вполне понятны.
00 01 02 05 - это magic'еское число, сигнатура.
Далее идёт 01 и 7 байт нулей. Размер пула.
Потом идёт 07 0e - размер строки "stdcon.println", после чего идут нули, собственно строка, а потом опять 8 байт размера байт-кода и начинается, собственно сам байт-код...
09 - это PUSH. Потом идёт 04 - тип LONG. И наше число 02 00 00 00 00 00 00 00. (да, по, сути, тип должен быть XSHORT, так как оно умещается в диапазон -128...127, но переезд на чистый Цы заставил меня захардкодить некоторые места (например, всем числам выставить тип LONG). К тому же, скоро вся эта костыльная система типов будет снесена куда подальше, и заменена более совершенной и экономичной. Так что нет смысла, её лечить перед смертью.
Впрочем, я отвлёкся. Пойдём дальше.
11 - это CALL, потом идёт тип 0e (STR1, строка, точнее её индекс в пуле, который умещается в 0...255 - тут я не захардкодил), один байт 00 (индекс пула 0, самая первая строка), и... усё!
А теперь запустим нашу программулину:
./chkvm demo.cvm
И... Тадааам!
root@admin:~/c# ./chkvm demo.cvm
Readed: pool [0] as value stdcon.println !
t: 13 !
push!
2
root@admin:~/c#