clihlt писал(а):Задаю: где можно почитать полное на данный момент времени описание вашего языка программирования?StoYazykov писал(а):Задавайте!
Для примера, возмём простейшую программку:
А теперь разберём её по кусочкам.
@ - это вызов, нативной функции. Функция должна быть записана в 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'ом.
hexdump -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
И... Тадааам!
- Код: Выделить всё
@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'ом.
hexdump -C...
- Код: Выделить всё
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#
imports-table.txt - это файлик, содержащий в себе, данные об нативных функциях. В стандартной поставке он выглядит так:
$DOCTYPE CHKALOV IMPORTS <1.00> - это сигнатура.
% - это начало секции, то бишь файла $CHKALOV/ИМЯ_СЕКЦИИ/libИМЯ_СЕКЦИИ.so. В нашем случае это будет - libstdcon.so.
А вот плюсик - это определение функции. В нашем случае, функция носит название println.И при выполнении программы, ВМ загрузит в память, библиотеку $CHKALOV/stdcon/libstdcon.so, и вызовет из неё нативную функцию println.
Вы спросите, а почему же, нативка без аргументов? Отвечу. ЛЮБАЯ нативная функция, принимает, два аргумента: size_t argc и Slot *argp. argc - это кол-во аргументов, а argp - указатель, на первый аргумент.
Что такое Slot? - Да ничего особенного. Это, просто структура, хранящая в себе: 1 байт типа, и 8 байт значения.
В общем-то, вот и всё.
- Код: Выделить всё
$DOCTYPE CHKALOV IMPORTS <1.00>
%stdcon
+println
$DOCTYPE CHKALOV IMPORTS <1.00> - это сигнатура.
% - это начало секции, то бишь файла $CHKALOV/ИМЯ_СЕКЦИИ/libИМЯ_СЕКЦИИ.so. В нашем случае это будет - libstdcon.so.
А вот плюсик - это определение функции. В нашем случае, функция носит название println.И при выполнении программы, ВМ загрузит в память, библиотеку $CHKALOV/stdcon/libstdcon.so, и вызовет из неё нативную функцию println.
Вы спросите, а почему же, нативка без аргументов? Отвечу. ЛЮБАЯ нативная функция, принимает, два аргумента: size_t argc и Slot *argp. argc - это кол-во аргументов, а argp - указатель, на первый аргумент.
Что такое Slot? - Да ничего особенного. Это, просто структура, хранящая в себе: 1 байт типа, и 8 байт значения.
В общем-то, вот и всё.

