Board.KolibriOS.org

Official KolibriOS board
It is currently Wed May 22, 2019 10:16 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 6 posts ] 
Author Message
PostPosted: Fri Feb 17, 2017 3:23 pm 
Offline

Joined: Thu Mar 31, 2016 10:18 am
Posts: 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.
Пример импорта функции:
Code:
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.


Attachments:
gentee_build_1.zip [403.77 KiB]
Downloaded 81 times
Top
   
PostPosted: Sun Feb 19, 2017 5:10 pm 
Offline
User avatar

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


Top
   
PostPosted: Sun Feb 19, 2017 6:43 pm 
Offline

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


Top
   
PostPosted: Sun Feb 19, 2017 6:52 pm 
Offline

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


Top
   
PostPosted: Sun Feb 19, 2017 11:47 pm 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Я как-то интересовался Gentee примерно в 2006-ом году.
Многое ли изменилось с того времени?
Помнится, там был пример для Delphi.


Top
   
PostPosted: Mon Feb 20, 2017 8:58 am 
Offline

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


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 6 posts ] 

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited