Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Сб июл 22, 2017 7:46 am

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 6 сообщений ] 
Автор Сообщение
СообщениеДобавлено: Пт фев 17, 2017 3:23 pm 
Не в сети

Зарегистрирован: Чт мар 31, 2016 10:18 am
Сообщения: 11
Транслятор языка программирования 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.
Пример импорта функции:
Код:
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.


Вложения:
gentee_build_1.zip [403.77 КБ]
16 скачиваний
Вернуться к началу
СообщениеДобавлено: Вс фев 19, 2017 5:10 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Пн окт 27, 2008 10:10 pm
Сообщения: 740
Привет.
Хочется кое что узнать об этом языке.
1) поддерживаются ли в нем многострочные макросы?
2) есть ли возможность создать указатель на структуру с данными или функцию? В документации написано что все указатели uint, потому неясно как идет работа с указателями на структуры, объекты и функции?


Вернуться к началу
СообщениеДобавлено: Вс фев 19, 2017 6:43 pm 
Не в сети

Зарегистрирован: Чт мар 31, 2016 10:18 am
Сообщения: 11
1. Нет. Макросы в gentee служат в качестве констант, есть еще макровыражения, в них допускается арифметические и логические выражения, пример:
Код:
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
Пример:
Код:
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:
Код:
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. Полный список могу дать.


Вернуться к началу
СообщениеДобавлено: Вс фев 19, 2017 6:52 pm 
Не в сети

Зарегистрирован: Чт мар 31, 2016 10:18 am
Сообщения: 11
Да, забыл сказать. Кроме псевдо-модуля libc.so можно импортировать и реальные библиотеки, форматы Obj-Coff и PE-DLL поддерживаются функцией dlopen. Это показано в примерах gentee программ в архиве.


Вернуться к началу
СообщениеДобавлено: Вс фев 19, 2017 11:47 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 929
Я как-то интересовался Gentee примерно в 2006-ом году.
Многое ли изменилось с того времени?
Помнится, там был пример для Delphi.


Вернуться к началу
СообщениеДобавлено: Пн фев 20, 2017 8:58 am 
Не в сети

Зарегистрирован: Чт мар 31, 2016 10:18 am
Сообщения: 11
Я не знаю, как там было в 2006 году, я не разработчик gentee, я просто портировал его (Gente Open Source) на Linux.
Сейчас есть поддержка ООП, наследование, перегрузка операторов и многое другое.
Есть поддержка OLE/COM, но это не знаю если может где-то пригодится, разве что на Win32.
Уже сегодня этот язык высокого уровня достаточно удобный.
Дальнейшее развитие Gentee я вижу в написание g библиотек и устанение ошибок. Порт на Kolibri OS может иметь (а может и не иметь) косяки, надо тестировать.


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 6 сообщений ] 

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB