Уважаемое сообщество, я хочу рассказать вам о языке программирования 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 КБ.
Автор: gentee