Pull to refresh

Язык программирования Gentee

Reading time 4 min
Views 7.5K
Уважаемое сообщество, я хочу рассказать вам о языке программирования Gentee. Я уверен, что вы о нем ничего не слышали, но это не новинка. Первая рабочая версия компилятора увидела свет в 2008 году, а в конце 2010 была выпущена последняя на данный момент 3-я версия. Gentee является open source проектом и распространяется под MIT лицензией, то есть без всяких условий и ограничений. Кроме меня над компилятором, библиотеками и всей документацией работал еще один человек. В начале я хочу написать об истории возникновения языка. Начиная с 2000 года я работал над инсталляторами, в которых пользователь мог строить сценарии из определенных команд. То есть, каждая команда из параметров на форме должна была конвертироваться в код на каком-то языке, который можно было бы компилировать в байт-код и создавать исполняемый файл. Начинали с примитивного языка, но в конце концов решили сделать язык широкого применения. Основные требования были следующие: быстрый компилятор, легкая работа с Windows API, маленький размер движка виртуальной машины, лаконичный и понятный синтаксис, возможность использования компилятора и виртуальной машины из любого языка программирования. На языке C был написан компилятор в байт-код и виртуальная машина. Gentee.dll (компилятор и ВМ) занимает всего 112 КБ и может быть включена в любой проект, которому требуется встроенный язык программирования. Программа на Gentee может быть выполнена сразу после компиляции или можно создать исполняемый файл с байт-кодом и вшитой виртуальной машиной.

Краткое описание языка


Gentee имеет «C»-подобный синтаксис и будет понятен каждому, кто сталкивался с любым языком из этого семейства. Язык имеет строгую типизацию и не является ООЯП, хотя и имеет наследование типов (объектов) и поддерживает полиморфизм. Я не буду описывать синтаксис и основные возможности, я просто приведу содержание раздела Описание языка из официальной документации, а затем остановлюсь на паре интересных моментов. Я думаю, что в этом случае у вас сложится более полное представление о возможностях Gentee.

Базовые элементы языка

  • Идентификаторы
  • Числа
  • Строки
  • Двоичные данные
  • Макросы
  • Коллекции


Структура программы. Препроцессор

  • Комментарии. Замена символов
  • Команда define
  • Команда ifdef
  • Макровыражения
  • Команда include
  • Команда import
  • Команды public и private


Типы и переменные

  • Команда type
  • Наследование типов
  • Системные методы для типов
  • Команда global
  • Локальные переменные


Функции методы операции

  • Определение функции func
  • Определение метода method
  • Переопределение операций operator
  • Определение text функции
  • Свойства property
  • Команда extern
  • Подфункции subfunc
  • Возвращение переменных


Конструкции языка

  • Конструкция условия if-elif-else
  • Конструкция выбора switch
  • Конструкции цикла while и do
  • Конструкции цикла for и fornum
  • Конструкция цикла foreach
  • Инструкции return, break, continue
  • Инструкции label, goto
  • Конструкция with


Выражения и операторы

  • Арифметические операторы
  • Логические операторы
  • Операторы присваивания
  • Приведение типов
  • Поля и указатели
  • Вызов функций и методов
  • Условный оператор ?
  • Операция позднего связывания
  • Таблица приоритетов операторов


Некоторые интересные моменты


Мне нравилось программировать на С, но мне всегда не нравилось то, что я не могу просто определить в локальных переменных строку типа str, работать с ней и не думать об ее удалении при выходе из функции. При создании языка я исправил эту проблему и можно смело написать

func myfunc
{
str mystr = "This is a string"
print( mystr ) // Я понимаю, что можно написать просто print( "This is a string")
}


Это относится не только к str, но и к любым типам. Вы можете у типа опиcать методы delete и init, которые будут автоматически вызываться при создании и уничтожении переменных. Также к любому типу можно «прикрутить» обращение по индексу [i], перебор в операторе foreach, использование операций =, +, -, ==, !=, * и т.д…

Второй интересный момент — это интеграция с любым API. Если есть DLL c экспортируемыми функциями, то можно легко подключить и использовать их в вашей программе.
Например, можно написать
import "user32.dll"
{
uint ExitWindowsEx( uint, uint )
uint RegisterWindowMessageA( uint ) -> RegisterWindowMessage
}

и затем использовать ExitWindowsEx и RegisterWindowMessage как обычные функции. Такая возможность совсем не означает, что язык не может быть портирован под другие платформы. Gentee v2 имел версию под Linux, но, к сожалению, третья версия компилятора по разным причинам пока так и остается только для Windows.

Сложно было найти компромисс между простой и мощностью языка, какого-то функционала возможно не хватает, но нам не стыдно за получившийся результат. Имеется, например, text функция — это когда идет не код со строками, а любой текст с вкраплениями кода (аналог HTML с PHP кодом). Можно линковать к байт-коду любые файлы и потом обращаться к ним прямо в памяти или записывать временно на диск (полезно для используемых DLL файлов). Конечно, есть препроцессор с макросами и условной компиляцией и еще много чего.

Что дальше?


Любой язык не представляет никакого интереса без возможности его практического применения. С одной стороны, Gentee широко используется в наших программах, в дистрибутив включено более 30 библиотек (files, string, tree, dbf, sqlite, xml, COM/OLE, HTTP, FTP и т.д.), компилятор содержит встроенный оптимизатор, имеется даже визуальная студия для созданию GUI программ (но без документации), есть отладчик, разработанный одним из пользователей Gentee. C другой стороны, массового интереса к языку нет. Причины понятны — все, что касается языка создавалось на чистом энтузиазме и поэтому не хватает средств, чтобы привести его в желаемому виду. Хочется видеть версии не только для Windows. Также, можно было бы добавить новые возможности в сам язык (необязательные параметры, поддержка UTF-8 и Unicode на уровне языка). Пути для развития имеются, но даже сейчас Gentee является очень удобным языком для использования в других приложениях и в качестве подручного инструмента для быстрого создания небольших утилит.

Тем кто скажет: «Зачем нужен еще один язык программирования?» или «Чем он лучше прочих?», — пусть назовут мне другой язык с подобными возможностями, который можно использовать в программе в качестве скриптового языка и у которого компилятор и/или виртуальная машина занимает меньше 150 КБ.
Tags:
Hubs:
+16
Comments 56
Comments Comments 56

Articles