Page 1 of 1

Транслятор языка программирования Gentee уже и на Kolibri OS

Posted: Fri Feb 17, 2017 3:23 pm
by netryx
Транслятор языка программирования Gentee для Kolibri OS.
Ссылка: 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);
}
Еще одна полезная фитча Gentee - можно создать функцию обратного вызова на основе функции на Gentee и получит ее указатель.
Это может иметь смысл, для передачи в качестве параметра внешней импортируемой функции (типа 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.

Re: Транслятор языка программирования Gentee уже и на Kolibri OS

Posted: Sun Feb 19, 2017 5:10 pm
by IgorA
Привет.
Хочется кое что узнать об этом языке.
1) поддерживаются ли в нем многострочные макросы?
2) есть ли возможность создать указатель на структуру с данными или функцию? В документации написано что все указатели uint, потому неясно как идет работа с указателями на структуры, объекты и функции?

Re: Транслятор языка программирования Gentee уже и на Kolibri OS

Posted: Sun Feb 19, 2017 6:43 pm
by netryx
1. Нет. Макросы в gentee служат в качестве констант, есть еще макровыражения, в них допускается арифметические и логические выражения, пример:

Code: Select all

define
{
VAL0 = 10 + 245
VAL1 = $VAL0 + ( 12 - 233 )
VAL2 = $VAL1 & 0xFFFF
SUMMARY = $VAL0 | $VAL1 | $VAL2
PROGNAME="My Application"
PROG ="Release"
TEST1 = $PROGNAME != "My Application" && $PROG != "Debug"

} 
Но никто не запрещает использовать C/C++ препроцессор.
2. Используется оператор ->
Можно использовать еще оператор as
Пример:

Code: Select all

type my_struct{
	uint a;
	uint b;
	uint c;
}

func main <main> (){
	my_struct s1;
	uint ptr;
	ptr=&s1
	ptr->my_struct.a=10;
	ptr->my_struct.b=20;
	ptr->my_struct.c=30;
	print("\na=\(s1.a)");
	print("\nb=\(s1.b)");
	print("\nc=\(s1.c)");
	print("\nOffsets:");
	uint offset;
	offset=&ptr->my_struct.a-ptr;
	print("\n@a=:\(offset)");
	offset=&ptr->my_struct.b-ptr;
	print("\n@b=:\(offset)");
	offset=&ptr->my_struct.c-ptr;
	print("\n@c=:\(offset)");
}
Для функций загруженных динамичеcки (Win32:LoadLibraryA,GetProcAddress ; Kolibri,Linux -dlopen/dlsym) - См. документацию gentee.pdf:
Вызов функции по адресу
В переменной типа uint может храниться адрес (идентификатор) функции. Для вызова функции по ее идентификатору
используется операция ->func и далее в скобках перечисляются параметры. В этом случае следует следить за
количеством параметров и их типами, так как компилятор не может проверить совпадение параметров. Таким образом
можно вызывать не только функции, но и методы и операторы.
a = &myfunc
a->func( c, d )
Gentee также позволяет вызывать внешние функции по их адресу. Например, при динамическом подключении DLL
библиотек, адрес функции можно получить с помощью Window s API функции GetProcAddress. Для вызова функции по
адресу используется операция ->stdcall и далее в скобках перечисляются параметры. Если функция имеет тип cdecl, то
нужно использовать служебное слово cdecl вместо stdcall.
a = GetProcAddress( mylib, "myfunc".ptr())
a->stdcall( 1, b )
----------------------------
В варианте для Kolibri OS можно использовать импортируемые из псевдо-модуля libc.so dlopen/dlsym:

Code: Select all

define<export>{
	LIBC_PATH = "/lib/libc.so"
}

import $LIBC_PATH <cdeclare>
{
	int syscall3(int /*syscall*/, int /*arg1*/, int /*arg2*/, int /*arg3*/)
	int syscall2(int /*syscall*/, int /*arg1*/, int /*arg2*/)
	int syscall1(int /*syscall*/, int /*arg1*/)
	uint dlopen(uint,int)
	uint dlsym(uint,uint)
}
Импорт функций работает благодаря реализованной мною функции dlopen/dlsym.
Я добавил в них псевдо-библиотеку libc.so, из нее можно импортировать большинство функций libc.dll(newlib) плюс реализованные мною функции, которых не хватает в libc-newlib, включая указанные dlopen, dlsym, syscall3. Полный список могу дать.

Re: Транслятор языка программирования Gentee уже и на Kolibri OS

Posted: Sun Feb 19, 2017 6:52 pm
by netryx
Да, забыл сказать. Кроме псевдо-модуля libc.so можно импортировать и реальные библиотеки, форматы Obj-Coff и PE-DLL поддерживаются функцией dlopen. Это показано в примерах gentee программ в архиве.

Re: Транслятор языка программирования Gentee уже и на Kolibri OS

Posted: Sun Feb 19, 2017 11:47 pm
by 0CodErr
Я как-то интересовался Gentee примерно в 2006-ом году.
Многое ли изменилось с того времени?
Помнится, там был пример для Delphi.

Re: Транслятор языка программирования Gentee уже и на Kolibri OS

Posted: Mon Feb 20, 2017 8:58 am
by netryx
Я не знаю, как там было в 2006 году, я не разработчик gentee, я просто портировал его (Gente Open Source) на Linux.
Сейчас есть поддержка ООП, наследование, перегрузка операторов и многое другое.
Есть поддержка OLE/COM, но это не знаю если может где-то пригодится, разве что на Win32.
Уже сегодня этот язык высокого уровня достаточно удобный.
Дальнейшее развитие Gentee я вижу в написание g библиотек и устанение ошибок. Порт на Kolibri OS может иметь (а может и не иметь) косяки, надо тестировать.