Ссылка: http://www.gentee.ru/
Включает в себя (в одном исполняемом файле) компилятор и интерпретатор языка Gentee.
Для запуска нужно в командной строке указывать полный путь к ".g" файлу(поддержку относительного пути я потом сделаю).
Пример:
gentee /fd2/1/test-app.g
gentee /tmp0/1/hello.g
gentee /hd0/1/gentee-files/sample1.g
Указанный в командной строке ".g" файл является обычным текстовым файлом с кодом Gentee.
То есть, программа gentee может запускать по сути скрипты и при этом нет необходимости использовать какие-либо двоичные файлы.
Gentee является языком со строгой типизацией (как C и Java), поддерживаются примитивные типы int,uint,long,float,double и другие.
Есть также типы: строки, бинарные данные, массивы и коллекции.
Можно определять собственные структурные типы, подобные struct на C.
Можно для структуры определять методы, то есть поддерживается OOП.
Есть и перегрузка операторов.
В отличии от Java поддерживает работу с указателями, указатель при этом на самом деле является uint (как uint32_t на C).
Язык позволяет напрямую импортировать функции( в том числе и низкого уровня, и работающие с указателями) из
динамических библиотек DLL (.so на Linux). На платформах Windows, Linux и Kolibri OS (DLL-ки формата OBJ и DLL-PE) это работает.
Этим Gentee отличается от других языков программирования. Для импорта новых функции из DLL не нужно никаких промежуточных обвязочных
библиотек (как на Python, Java) и не нужно изменять и компилировать код самого транслятора Gentee.
Нужно только описать функцию, ее параметры, тип вызова (cdeclare, stdcall: по умолчанию - stdcall) в текстовом файле исходника программы на gentee.
Пример импорта функции:
Code: Select all
import "/sys/lib/console.obj"{
con_init(int,int,int,int,uint)
con_set_title(uint)
con_write_asciiz(uint)
}
import "/kolibrios/lib/libc.dll" <cdeclare> {
puts(uint) -> c_puts
exit(int)
}
func test_console(){
//con_init(-1,-1,-1,-1,"Hello title!".ptr());
con_write_asciiz("\nHello by import con_write_asciiz".ptr())
}
func test_libc <main> () {
test_console();
c_puts("\nStr by puts!".ptr());
exit(0);
}
Это может иметь смысл, для передачи в качестве параметра внешней импортируемой функции (типа atexit, qsort).
Эта фитча еще не реализована на Kolibri OS, но ее можно реализовать, даже не меняя бинарника программы Gentee, просто написав
небольшую функцию на языке Gentee, которая выделяет память, копирует туда заготовленный код, который использует внутренние
вызовы функций VM Gentee (можно посмотреть реализацию на Win32, там только надо поменять выделение памяти под сегмент кода).
Внимание! Некоторые функции из официальной документации могут не работать, поскольку они являются частью еще не реализованной
gentee-stdlib, стандартной библиотеки, написанной на самой Gentee.
Причем реализация gentee-stdlib частично использует зависимые от платформы функции. Так на gentee-stdlib под Win32 используются
WinAPI функции.
Мне удалось портировать Gentee на Linux, в том числе и gentee-stdlib (на syscalls и POSIX функциях). Этот порт вполне можно
использовать для портирования gentee-stdlib на Kolibri OS (при этом не потребуется перекомпиляции самой программы gentee).
Данный язык программирования представляется мне где-то более удобным, чем скриптовые языки программирования типа Lua, Python. Почему?
Легкий импорт внешних функций, поддержка указателей, удобные встроенные типы:str, buf, arr, collection.
И другие причины. Вы можете почитать документацию по Gentee (на русском) - ссылка на сайт выше, и возможно, что вам тоже
понравится данный язык программирования.
Оптимизация. Для ускорения работы Gentee на Kolibri OS нужно портировать одну фишку, называется вроде GeAsm, тогда можно
добиться скорости работы приложений на Gentee, соизмеримой со скоростью языка "С" . GeAsm генерирует код на Asm (только IA32/x86),
заменяя куски байт-кода VM на родной код процессора x86.
В архив включил вариант libc.dll (newlib, взят из latest-iso-19-01-2017.7z), который требует gentee, на которым он тестировался.
На новой версии (libc.dll) может не заработать.
В архив положил также простенькие примеры коды на gentee.