Краткий обзор Gentee
Введение
Язык программирования Gentee можно отнести к разряду процедурных языков с некоторыми возможностями объектно-ориентированного программирования. Он не имеет сложных конструкций и прост в использовании, но в тоже время является мощным инструментом для решения самых различных задач. Синтаксис языка основан на синтаксисе языка программирования С и имеет много общего с другими С-подобными языками C++, Java, C#. У Gentee есть те же самые числовые типы int, uint, byte, ubyte, long, double, float, ... и такие же операции над ними +, ==, <, >, -, /, +=, ++, --, /=,... как в других подобных языках программирования. При написании программ вы можете использовать все основные конструкции, которые встречаются в других языках. Например, такие как: while, if, for, with, foreach, switch, include .
Единицей компиляции Gentee является описание-команда. Ниже приведены примеры описания глобальных переменных и макросов.
global
{
uint i my = 0xFF
str name = "Alexey"
arrstr colour = %{"red", "green", "blue" }
}
define
{
PATH = $"c:\temp\docs"
FLAG = 0x0001
}
Если для обращения к переменной или вызова функции достаточно указать ее имя и параметры ( в случае функции ), то для подстановки макроса необходимо добавлять слева '$'. Значения макросов подставляются на этапе компиляции.
i = my | $FLAG
Типы
Кроме базовых числовых и встроенных типов buf, str, collection можно описывать свои типы с помощью команды type.
type mytype_a
{
uint id
str name
}
Переменные любого типа не требуют дополнительной инициализации после своего описания, вы сразу можете обращаться к этой переменной. Обращение к полям типа происходит с помощью операции '.'. Типы могут наследоваться как в объектно-ориентированных языках, при этом обеспечивается полиморфизм операций. Если отсутствует метод или функция для какой-то переменной определенного типа, то будут искаться аналогичные методы для ее типов-родителей. Для любых типов можно определить и использовать операции используемые для числовых типов ( =, +=, ==, != ), а также цикл foreach.
type mytype_b<inherit = mytype_a> : double d
operator mytype_b =( mytype_b left, mytype_a right )
{
left.id = right.id
left.name = right.name
return left
}
Функции
Gentee имеет три вида команд для определения исполняемого кода: func, method, operator. Исполнение программы начинается с функции, имеющей атрибут main.
func - Обычная функция, которая отвечает за выполнение указанных в ней действий.
func hello< main >
{
print("Hello, World!")
getch()
}
method - Функция, привязанная к определенному типу. Вызов метода подобен взятию поля у типа и осуществляется с помощью '.', за которой следует имя метода и параметры.
method uint str.islastchar( uint ch )
{
return this[ *this - 1 ] == ch
}
func myfunc
{
str my = "String"
print( my.islastchar( 'g' ))
}
operator - Данная команда позволяет определять и использовать в дальнейшем для любых типов операторы присваивания, сравнения, арифметические операторы и т.д.
operator str +=( str left, uint i )
{
return left += str( i )
}
func myfunc : print( "Value = " += 100 )
Gentee - язык строгой типизации. Это накладывает определенные ограничения при программировании, но с другой стороны значительно уменьшает вероятность появления ошибок. Допускается присутствие нескольких функций или методов с одним и тем же именем, но они должны иметь хотя бы один различающийся параметр или разное количество параметров.
Строки
Gentee имеет широчайшие возможности по работе со строками. Строки определяются с помощью двойных кавычек и имеют управляющий символ '\'. Если строка начинается с '$', то она не будет учитывать управляющий символ. Кроме подстановки специальных символов, управляющий символ дает возможность вставлять данные из файлов, вычислять и подставлять выражения внутри строки, а также подставлять макросы.
print( "Name = \( name += " gentee" ) Path = \$PATH\n")
Часто бывает необходимо вывести большие объемы текста, причем часть текста должна формироваться динамически. В этом случае удобно использовать text-функции. Они могут осуществлять вывод в строку, которую вы указали при вызове, или на консоль.
text mytext( uint x )
Some text
x = \( x )
x * x = \( x*x )
\{ uint i
fornum i, 5
{
@"x * \( i ) = \( x * i )\l"
}
}
Some text
\!
Импорт функций и использование Gentee в других приложениях
Gentee сразу разрабатывался таким образом, чтобы можно было, с одной стороны, импортировать функции из DLL (или аналогичных модулей на других ОС) и, с другой стороны, чтобы можно было использовать компилятор Gentee из программ, написанных на других языках программирования.
Если вам необходимо импортировать функции из DLL, то достаточно указать имя DLL файла и описать импортируемые функции.
import "kernel32.dll" {
uint CloseHandle( uint )
ExitProcess( uint )
uint GetModuleFileNameA( uint, uint, uint ) -> GetModuleFileName
}
Если вы хотите компилировать файлы на языке Gentee и исполнять их из своего приложения, то вам достаточно взять файл gentee.dll и вызывать необходимые интерфейсные функции. Модуль gentee.dll можно использовать бесплатно, но необходимо соблюдать лицензионное соглашение.
Заключение
Скажем несколько слов о работе компилятора. Исходные тексты компилятора на языке программирования C находятся в открытом доступе, так как Gentee является проектом с открытыми исходными текстами. Скорость компиляции очень высокая. В результате компиляции программы создается байт-код, который можно сохранить в файл или выполнить сразу. Сохраненный байт-код можно запускать без повторной компиляции, а можно использовать в качестве библиотечного модуля в других программах. Следует заметить, что имеется набор готовых библиотек, который постоянно пополняется и помогает создавать программы самой различной сложности. Кроме этого, возможно создание исполняемых ( exe ) файлов.
Мы показали только основные моменты, характерные для языка программирования Gentee. Вы всегда можете найти на этом сайте дополнительную информацию и обсудить любые вопросы с разработчиками и другими пользователями Gentee.