Знакомьтесь: Gentee


Вступление

Интерпретируемые языки программирования так распространились в софтверном мире, что в обозримом будущем, похоже, имеют шансы вытеснить традиционные компилируемые языки. Хотя полное и безоговорочное вытеснение выглядит, конечно, не совсем реальным, поскольку сами интерпретаторы тоже ведь кто-то писать должен. Тем не менее, писать все прикладные программы на интерпретируемых языках в недалёком будущем станет не просто модно, но и рационально, поскольку в этом случае их проще и отлаживать, и портировать на разные новые платформы, и RAD-среды для интерпретируемых языков создавать проще.

Есть у интерпретируемых языков и ещё одна область применения. Условно её можно назвать пользовательским программированием, причём под пользователями понимаются не разработчики, а именно конечные пользователи прикладных приложений. Это программирование включает в себя автоматизацию пользовательских задач посредством написания макросов. Самый известный в этом плане пример - это, конечно же, Microsoft Office с его знаменитым Visual Basic for Applications (VBA).

Впрочем, насколько я знаю, идею использования в программе специального скриптового языка и макросов на нём пока ещё никто не запатентовал. Так что вам никто не мешает встроить в собственный программный продукт аналогичную возможность и срубить за это побольше денежек с благодарных пользователей. Причём вариантов такого встраивания имеется множество, поскольку интерпретаторов и различных языков программирования, которые можно встраивать в прикладные приложения, не так уж и мало. И сейчас я расскажу об одном из них - языке программирования Gentee. Он не совсем интерпретируемый, поскольку имеется в нём промежуточный код, выполняемый виртуальной машиной... Но это уже тонкости.

Официальный сайт этого проекта расположился по адресу www.gentee.ru, там можно найти сам интерпретатор и различную документацию по языку и стандартным библиотекам. Обратите внимание, что всё, включая документацию, на русском языке.


Синтаксис Gentee

Gentee по синтаксису чем-то напоминает C. Директива include означает подключение других файлов на языке Gentee, import - подключение импортируемых функций из DLL, define определяет макрос. Всё очень, очень знакомо, не так ли? Дальше всё будет тоже знакомо.

Поддерживается и условная компиляция (именно компиляция - текст программы компилируется в промежуточный код). Для условной компиляции применяется директива ifdef. Функции определяются с помощью ключевого слова func, методы - с помощью слова method, операторы - operator. Глобальные переменные маркируются словом globa, а предопределение функций, методов, операций происходит при активном участии слова extern. Исполняемая часть программы может находиться только в блоках четырех команд - func, method, operator, text (последняя определяет такую экзотическую и присущую только Gentee вещь, как текстовые функции). Блок любой этой команды - тело функции. Внутри него, естественно, могут находиться вложенные блоки и блоки конструкций. Внутри блоков функции могут быть выражения, конструкции и описания локальных переменных.

Комментарии, как и в C, есть двух видов: однострочные (начинаются с "//") и многострочные (начинаются с "/*", кончаются на "*/").

По умолчанию, все функции, методы, типы и прочие элементы языка являются общедоступными после их описания. Если вы не хотите, чтобы какие-то элементы были доступны за пределами файла, в котором они описаны, то для этого можно использовать команду private. Все элементы языка, которые идут после этой команды, будут видны только до конца компиляции текущего файла с исходным текстом программы. После этого имена этих элементов будут удалены и к ним невозможно будет обратиться по имени. Команда public восстанавливает режим общего доступа для последующих элементов. Вы можете чередовать public и private как вам нужно в ваших исходных текстах. Действие этих команд распространяется на функции (func), методы (method), операторы (operator), типы (type), глобальные переменные (global).

Gentee - язык строгой типизации. Типы переменных в нём делятся на базовые, структурные и тип reserved. Все базовые типы и некоторые структурные встроены в язык. Структурные типы можно описывать командой type. Базовые типы аналогичны базовым типам из C. В языке Gentee нет типов-указателей, их функции выполняет тип uint. Тип reserved является особым типом и не принадлежит ни к базовым, ни к структурным типам. Он представляет собой массив байтов и описывается и используется как массив. Его особенность в том, что резервируется область памяти в том месте, где он описан, например, поле в структуре. reserved field[50] - означает, что в структуре будет зарезервирована область размером 50 байт. Резервируемый размер ограничен 65 535 байтами. Для указания размера нельзя использовать выражение, в квадратных скобках должно стоять число. Для конвертации выражения в другой тип пишется имя типа, в который будет произведена конвертация, и само выражение в скобках, конвертация будет проведена только в том случае, если исходный тип имеет соответствующий метод.

Инкремент и декремент, которыми знамениты C/C++, остались также до боли узнаваемыми и в Gentee. Совершенно аналогичны "сишным" и практически все остальные операторы. Оператор as может выполнять две функции: присваивать значение переменной и изменять тип. Оператор бинарный, вычисляется справа налево. Левый операнд обязательно должен быть локальной переменной типа uint. В зависимости от правого операнда может быть два варианта работы. Оператор sizeof предназначен для получения количества байтов, необходимых для хранения объекта. Оператор имеет один параметр - имя типа. Интересен ещё один оператор - тильда ("~"). Он применяется для позднего связывания. Данный оператор во многом схож с использованием "точки" (".") - взятия поля или вызова метода, отличие состоит в том, что иногда на момент компиляции невозможно определить все возможные поля и методы объекта, а во время выполнения программы вызывается специальный метод объекта, которому передается имя поля/метода, типы и значения параметров. Технология позднего связывания часто применяется при работе с COM объектами. Левым операндом операции ~ является идентификатор объекта, этот объект должен поддерживать позднее связывание, правым операндом является имя поля/метода, с которым необходимо связаться.

Думаю, дальше нет нужды рассказывать обо всём так же подробно и детально, поскольку язык свой авторы максимально приблизили к C/C++. По крайней мере, синтаксически. И это очень хорошо, потому что привычно, и нет нужды изучать что-то принципиально новое, чтобы написать программу на Gentee.


Стандартные библиотеки

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

Встроенные функции включают в себя математические функции (элементарные - sin, cos, ln, возведение в степень и т.п.), функции работы с памятью (отведение памяти, освобождение памяти, копирование и прочее), строковые функции (конвертация различных типов в строку и обратно) и прочие функции, полный список которых можно увидеть в документации. Стандартная библиотека имеет более широкие возможности, чем непосредственно те, которые предоставляют встроенные функции виртуальной машины. Для работы с памятью используются специальные переменные типа buf, которые предоставляют поля и методы, необходимые для выполнения различных операций. Для работы со строками, аналогично, существуют переменные типа str, для массивов - arr, и т.д. и т.п. для стеков, коллекций, хеш-таблиц. В стандартной библиотеке языка присутствуют функции для работы со временем, с консолью, с файлами и с Windows API.

Помимо стандартной библиотеки и встроенных функций интерпретатора, есть ещё и специализированные дополнительные библиотеки, входящие в стандартную поставку Gentee. Есть библиотеки для работы с Интернетом, реестром Windows; CSV, DBF и INI файлами, потоками, древовидными структурами данных, клавиатурой, XML-данными, технологиями ODBC и COM. Функций в этих библиотеках великое множество, поэтому подробнее о них я сейчас рассказывать не буду - посмотрите сами.

Библиотеки для GUI в Gentee как таковой нет, но его можно разрабатывать, используя WinAPI.


GT

Ещё одной интересной особенностью Gentee я считаю GT. GT (Gentee Text) является языком для описания различных данных и предназначен для хранения и обработки информации в текстовом виде. Описав свой текст с помощью GT, вы можете осуществлять вывод в различные форматы (HTML, XML, RTF и т.д.) без изменения основного текста. Для этого достаточно будет только изменять соответствующие функции на Gentee. С другой стороны, для локализации документа на другой язык достаточно перевести только GT текст не затрагивая конвертирующие Gentee функции. В целом, GT по своей структуре очень похож на XML:

<имя [атрибуты]>
[Дочерние объекты]
[текст объекта]
</имя>

В качестве объекта может быть указана команда include, причём имя команды, в отличие от имени объекта, должно начинаться с двоеточия. Так как подстановка объектов идет с указанием полного имени, то при большой вложенности это становится не очень удобным. Вы можете указывать атрибут alias для определения нового имени объекта. Если alias указан без значения, то к объекту можно обращаться по его простому имени. По умолчанию данные объекта рассматриваются как строка, но вы можете с помощью атрибута type определить их как список (list), ассоциативный массив (keys) или дерево (tree). Функции GT API позволяют работать с объектами этих типов как с массивами, хэш-таблицами или деревьями. Если вы хотите получить элемент списка или ассоциативного массива на языке GT, то укажите первым параметром номер (начиная с единицы) в списке или ключ.

Язык GT позволяет вызывать text-функции, написанные на языке Gentee. Их вызов ничем не отличается от подстановки объектов с параметрами. Text-функции должны иметь следующий вид: text myname( gtitem, arr of str ). В первом параметре указан объект, из которого произошел вызов, а во втором параметре хранится массив строк-параметров, которые были указаны при вызове. Список готовых текстовых функций велик, и приводить его я не буду.

Для работы с GT данными необходимо использовать переменные типа gt. Такая переменная представляет собой дерево объектов типа gtitem, в каждом из которых хранится информация о соответствующем объекте GT данных.


Код написан. Что же дальше?

А дальше много вариантов. Для простоты положим, что писали вы код какого-либо прикладного приложения. Теперь его можно запустить под интерпретатором или преобразовать в EXE-файл.

Компиляция и выполнение программы на языке Gentee осуществляется с помощью консольного приложения gentee.exe. Синтаксис вызова такой:

gentee.exe [switches] <source file> [arguments]

Source file является обязательным параметром и должен определять имя файла компиляции или файл с байт-кодом для выполнения. Switches - опции, их полный список легко отыскать в документации. Argiments - параметры командной строки для запускаемого приложения.

Если вы хотите запускать программы на языке Gentee как EXE файлы, то воспользуйтесь программой ge2exe. Она позволяет из (.g) файлов или откомпилированного байт-кода (.ge файла) создать исполняемый файл. Но как таковой компиляции не происходит: к байт-коду присоединяется исполняемый файл виртуальной машины. Он, правда, очень мал по размеру, за что можно сказать спасибо разработчикам.

Для разработчиков имеется возможность выполнять программы на языке Gentee в своих приложениях, о чём я уже говорил. Для этого достаточно подключить файл gentee.dll. Он содержит несколько импортируемых функций, которые отвечают за компиляцию и выполнение программ. В поддиректории Examples, которая находится там, куда вы установили Gentee, находятся два идентичных проекта на Delphi и Visual C++. Они иллюстрируют основные возможности при работе с Gentee из внешних программ.

Что ещё я не сказал о Gentee? Ах, да, пардон. Все исходные тексты интерпретатора языка открыты, и постоянно дорабатываются. На сайте есть форум, причём довольно оживлённый для такого проекта. Ну и то, что вся документация на русском - это тоже огромный плюс к и так немалому их списку.

В общем, изучайте. Gentee - разработка не только интересная, но и полезная, так что respect, как говорится, его авторам.

Вадим СТАНКЕВИЧ

Версия для печатиВерсия для печати

Номер: 

30 за 2007 год

Рубрика: 

Software
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!

Комментарии

Аватар пользователя чуд
не надо изобретать велосипедов -- возьмите Python
Аватар пользователя SF
Проблема "Питона" в синтаксисе. Он приемлем не для всех пользователей. Так что встраиваемый язык - оптимально VBS.