Это команда prima-gencls, которую можно запустить в бесплатном хостинг-провайдере OnWorks, используя одну из наших многочисленных бесплатных онлайн-рабочих станций, таких как Ubuntu Online, Fedora Online, онлайн-эмулятор Windows или онлайн-эмулятор MAC OS.
ПРОГРАММА:
ИМЯ
gencls - компилятор интерфейса классов для модулей ядра Prima
СИНТАКСИС
gencls --h --inc --tml -O -I --depend --sayparent filename.cls
ОПИСАНИЕ
Создает заголовки с макросами C и структурами для определений объектов основного модуля Prima.
АРГУМЕНТЫ
gencls принимает следующие аргументы:
--h Создает файл .h (с объявлениями, которые должны быть включены в один или несколько файлов)
--вкл.
Создает файл .inc (с объявлениями, которые будут включены только в файл)
-O Включает алгоритм оптимизации для файлов .inc. Алгоритм основан на предположении,
что некоторые функции объявлены идентично, поэтому фрагмент кода, который обрабатывает
преобразование параметров и результатов может использоваться совместно. При включенном флаге "-O" тело преобразователя
заменен на вызов функции, имя которой состоит из всех параметров метода
плюс результат. Фактическая функция записывается не в файл .inc, а в файл .tml. Все
повторяющиеся объявления из набора файлов .tml могут быть удалены, а напоминание
записывается в один файл утилитой tmlink.
--tml
Создает файл .tml. Включает "-O" автоматически.
-Идирнаме
Добавляет каталог к пути поиска, в котором утилита ищет файлы .cls. Может быть
уточнял несколько раз.
--зависеть
Распечатывает зависимости для данного файла.
--sayparent
Распечатывает непосредственного родителя класса внутри данного файла.
СИНТАКСИС
Вкратце синтаксис файла .cls можно описать следующей схемой:
[ноль или более деклараций типов]
[ноль или одно объявление класса]
Gencls создает файлы .h, .inc или .tml с базовым именем файла .cls, если нет объекта или
указанное имя пакета или имя объекта или пакета в противном случае.
Базовый скаляр данным Типы
Gencls имеет несколько встроенных скалярных типов данных, с которыми он знает, как работать. Иметь дело'
означает, что он может генерировать код, который передает данные этих типов между C и perl,
используя интерфейс библиотеки XS (см. perlguts).
Типы бывают:
Int
Буль
Обрабатывание
двойной
SV *
HV *
символ *
строка (объявление C - char [256])
Есть также некоторые производные встроенные типы, которые
длинной
короткие
колесница
Цвет
U8
которые отображаются в int. Данные не преобразуются в int в процессе передачи, но
вместо этого сохраняется в скаляр Perl, используя newSViv () функция, которая, в свою очередь, может потерять биты
или знак.
Производный данным Типы
Синтаксис определения новых типов данных следующий:
Область видимости может быть одной из двух прагм: «глобальной» или «локальной». Они намекают на использование новых данных
type, будет ли тип использоваться только для одного или нескольких объектов. Использование слова «местный»
чем-то напоминает C pragma static. На данный момент единственная разница в том, что функция
используя сложный локальный тип в списке параметров или как результат не является предметом для
"-O" оптимизация.
скаляр Типы
Новые скалярные типы могут быть только псевдонимами существующих, в первую очередь для кодирования на C
удобство. Скалярный тип можно определить двумя способами:
Прямое сглаживание
Синтаксис:
$ id => ;
Пример:
глобальный $ Handle => int;
Новый идентификатор типа не будет отображаться в файлах C, но тип будет заменен на
все файлы .cls, содержащие это определение.
C макрос
Синтаксис:
id1 id2
Пример:
глобальный API_HANDLE UV
Такой код создает определение макроса C в заголовочном файле .h в форме
#определить id1 id2
Макросы C с параметрами не допускаются. id1 и id2 не обязательны
в пространстве имен .cls, и при обработке файла .cls подстановки не производятся. Этот
Использование прагмы очень ограничено.
Комплекс Типы
Сложные типы данных могут быть массивами, структурами и хешами. Они могут быть как комбинацией, так и
вектор скалярных (но не сложных) типов данных.
Gencls допускает несколько комбинаций сложных типов данных, которые не поддерживает язык C
распознавать. Они будут описаны ниже.
Сложные типы данных не импортируются в код Perl. Программист на Perl должен соответствовать
тип данных, используемый при передаче параметров функции.
Массивы
Синтаксис:
@я бы [измерение];
Пример:
глобальный @FillPattern U8 [8];
Пример функций с использованием массивов:
Массив * func (Массив a1, Массив * a2);
Код Perl:
@ret = func (@ array1, @ array2);
Обратите внимание, что ссылки на массивы не используются, а количество элементов во всем массиве
параметры должны быть точно такими же, как размеры массивов.
Примечание: следующее объявление не будет компилироваться с компилятором C, так как C не может вернуть
массивы. Однако gencls не считает это ошибкой:
Функция массива ();
Структуры
Синтаксис:
@я бы {
;
...
;
};
Пример:
глобальный @Struc {
int число;
строка id;
}
Пример функций, использующих структуры:
Struc * func1 (Struc a1, Struc * a2);
Struc func2 (Struc a1, Struc * a2);
Код Perl:
@ret = func1 (@struc1, @struc2);
@ret = func2 (@struc1, @struc2);
Обратите внимание, что ссылки на массивы не используются, а количество и порядок элементов во всех
Параметры массива должны быть установлены точно так же, как размеры и порядок структур. Struct
имена полей также не используются в коде Perl.
Хэш
Синтаксис:
%я бы {
;
...
;
};
Пример:
global% Hash {
int число;
строка id;
}
Пример функций, использующих хеши:
Хэш * func1 (Хэш a1, Хэш * a2);
Hash func2 (Hash a1, Hash * a2);
Код Perl:
% ret =% {func1 (\% hash1, \% hash2)};
% ret =% {func2 (\% hash1, \% hash2)};
Обратите внимание, что используются и возвращаются только ссылки на хэш. Когда хеш передается из perl
code, в нем могут быть не заданы некоторые или все поля. Структура C заполняется и передается в
C, а поля, которые не были установлены, назначаются соответствующему
Значение C_TYPE_UNDEF, где TYPE - это один из литералов NUMERIC, STRING и POINTER.
Обратное преобразование не учитывает эти значения и всегда возвращает все хеш-ключи с
соответствующая пара.
Пространство имен .
Синтаксис:
{
...
}
Файл .cls может иметь ноль или один раздел пространства имен, заполненный описаниями функций.
Функции, описанные здесь, будут экспортированы в указанный идентификатор во время кода инициализации. А
пространство имен может быть либо «объектом», либо «пакетом».
Синтаксис пространства имен пакета допускает только объявление функций внутри «пакета».
блок.
упаковка {
...
}
Синтаксис пространства имен объекта включает переменные и свойства, а также функции (
вызываемые методы в синтаксисе объекта). Общий синтаксис пространства имен объекта:
объект [(ID родительского класса)] {
}
В пространстве имен объекта можно использовать синтаксис наследования:
объект ( ) {...}
или описание голого корневого объекта (без предка)
объект {...}
для объявления класса объекта.
функции
Синтаксис:
[ ] ( ) [=> ];
Примеры:
int package_func1 (int a, int b = 1) => c_func_2;
Точка package_func2 (Struc * x, ...);
метод void object_func3 (HV * profile);
Префикс используется только с объектными функциями (методами). Подробнее о префиксе в разделе "Методы"
.
Функция может ничего не возвращать (void), скаляр (int, string и т. Д.) Или сложный (
массив, хэш) типа. Он также может принимать скалярные и комплексные параметры с типом
преобразование, соответствующее правилам, описанным выше в разделе «Основные скалярные типы данных»
.
Если функция имеет параметры и / или результат типа, который не может быть преобразован
автоматически между C и perl, он объявляется, но не предоставляется пространству имен perl. В
выдается соответствующее предупреждение. Невозможно использовать синтаксис gencls для объявления
функция с пользовательскими параметрами или данными результата. Для этого явный C
должно быть сделано объявление кода вместе с вызовом "newXS".
Пример: многоточие (...) нельзя преобразовать с помощью gencls, однако это допустимый C
строительство.
Точка package_func2 (Struc * x, ...);
Синтаксис функции имеет несколько удобных дополнений:
Значения параметров по умолчанию
Пример:
void func (int a = 15);
Объявленная таким образом функция может вызываться как с 0, так и с 1 параметром. Если это
вызывается с 0 параметрами, автоматически будет использоваться целочисленное значение 15. В
синтаксис допускает параметры по умолчанию для типов int, указатель и строка и их скаляр
псевдонимы.
Параметров по умолчанию может быть как можно больше, но они должны быть в конце
список параметров функции. Объявление "func (int a = 1, int b)" неверно.
Aliasing
В сгенерированном коде C функция C должна быть вызвана после того, как параметры были
разобраны. Gencls ожидает, что в коде C будет присутствовать соответствующая функция с фиксированным именем.
и список параметров. Однако, если задачей такой функции является обертка идентичного
функция, опубликованная под другим именем, можно настроить псевдоним, чтобы сохранить как код, так и
скорость.
Пример:
пакет Пакет {
void func (int x) => internal;
}
Функция, объявленная таким образом, не будет вызывать Package_func () Функция C, но
внутренний() функция вместо этого. Единственная просьба - это внутренний() функция должна иметь
идентичный параметр и объявление результата в func ().
Встроенный хеш
Был разработан удобный способ вызова функции с хешем в качестве параметра из Perl. Если
функция объявляется с последним параметром или типом "HV *", затем перевод параметра
от perl до C выполняется так, как если бы все переданные параметры были хешем. Этот хеш
передается в функцию C, и ее содержимое возвращается обратно в perl в виде хеша.
Хеш-содержимое может быть изменено внутри функции C.
Это объявление широко используется в конструкторах, которые обычно используются в коде Perl.
саб инициализация
{
мой% ret = shift-> SUPER :: init (@_);
...
return% ret;
}
и код C обычно
void Obj_init (профиль HV *) {
унаследованный init (профиль);
... [изменить содержимое профиля] ...
}
методы
Методы - это функции, вызываемые в контексте объекта. Практически все методы должны
имеют доступ к объекту, с которым имеют дело. Объекты Prima отображаются в C как
Тип данных дескриптора. Такой дескриптор на самом деле является указателем на экземпляр объекта, который, в свою очередь,
содержит указатель на таблицу виртуальных методов объекта (VMT). Чтобы облегчить OO-подобный
синтаксис, этот параметр Handle почти никогда не упоминается во всех методах объекта
описание в файле cls, хотя и учитывается неявно, поэтому каждый метод cls
заявление
метод void a (int x)
для класса объекта Object отражается в C как
void Object_a (Обработка себя, int x)
объявление функции. В отличие от функций пакета, этот gencls не может публиковать, если
он не может справиться с неподдерживаемыми неконвертируемыми параметрами, есть способ
оформить такое объявление с помощью метода. Основное использование для этого - имя метода, которое получает
зарезервировано в VMT объекта.
Методы доступны в коде C путем прямого разыменования имени «Обработать себя» как
соответствующая структура:
(((PSampleObject) self) -> self) -> sample_method (сам, ...);
Метод может иметь один из шести префиксов, управляющих генерацией кода C:
метод
Это первый и самый основной тип метода. Это префиксное имя, "метод" -
поэтому было выбрано как наиболее информативное имя. Ожидается, что методы будут закодированы в
C дескриптор объекта является неявным и не включается в описание .cls.
метод void a ()
приводит к
void Object_a (Самостоятельная обработка)
Объявление C. Опубликованный метод автоматически преобразует свои параметры и результат
между C и perl.
что такое варган?
Когда методы, имеющие параметры и / или результат, не могут быть автоматически
необходимо объявить преобразование между C и perl, или объявление функции не
вписывается в синтаксис C, используется префикс «public». Методы, объявленные с "общедоступными", являются
Предполагается, что для взаимодействия с Perl используется интерфейс XS (см. perlxs). Это также
ожидается, что «открытый» метод создает функции REDEFINED и FROMPERL (см.
Prima :: internals для подробностей). Примеров много во всех источниках Prima, и они будут
не показываться здесь. "общедоступные" методы обычно имеют недействительный результат и не имеют параметров, но
это не имеет большого значения, поскольку gencls не выполняет преобразование для таких методов.
Импортировать
Для методов, которые нецелесообразно кодировать на C, но вместо этого на perl, gencls может быть
сказано производить соответствующие обертки с использованием префикса «импорт». Это своего рода
Метод можно рассматривать как «метод» наизнанку. Функция "импорт" не требует C
аналог, кроме автоматически сгенерированного кода.
статический
Если метод должен уметь работать как с экземпляром объекта, так и без него, ему необходимо
с префиксом "static". "статические" методы похожи на "методические",
за исключением того, что первый параметр "Handle self" не объявляется неявно. Если "статический"
метод вызывается без объекта (но с классом), например
Класс :: Объект-> static_method ();
его первый параметр - это не объект, а строка «Class :: Object». Если метод никогда
имеет дело с объектом, достаточно использовать его объявление как
статический a (char * className = "");
но если это так,
статический a (SV * class_or_object = nil);
требуется декларация. В последнем случае код C сам должен определить, что именно имеет
пройдено, если вообще. Обратите внимание на параметр по умолчанию: обычно используется "статический" метод.
разборчиво называть как
Класс :: Объект :: static_method ();
где ему не передаются никакие параметры. Без параметра по умолчанию такой вызов
генерирует ошибку выполнения "недостаточно параметров передано".
странный
Мы не смогли найти для него лучшего названия. префикс "странный" обозначает метод, сочетающий
свойства как из "статических", так и из "общедоступных". Другими словами, gencls не генерирует
код преобразования и не ожидает, что "Handle self" будет первым параметром для такого метода.
В качестве примера можно изобразить Prima :: Image :: load, который можно вызвать с помощью широкого
спектр семантики вызова (подробнее см. Prima :: image-load).
c_only
Как следует из названия, "c_only" - это метод, который присутствует в VMT, но не
доступно из perl. Его можно перегрузить только из C. Более того, разрешено
зарегистрируйте функцию perl с именем метода "c_only", и по-прежнему эти объекты
будут полностью независимы друг от друга - перегрузки не произойдет.
NB: методы с типами данных результатов и / или параметров, которые нельзя преобразовать.
автоматически измените их префикс на «c_only». Наверное, это неправильное поведение,
и такое состояние должно сигнализировать об ошибке.
Объекты
Инструментарий Prima представляет объект с именем property, который, как ожидается, заменит метод
пары, функция которых заключается в получении и присвоении некоторой внутренней объектной переменной, например,
имя объекта, цвет и т. д. Вместо использования пары методов, таких как Object :: set_color и
Object :: get_color разработано свойство Object :: color. Свойство - это метод с
особые соображения, в частности, когда он вызывается без параметров, режим 'get'
подразумевается. Напротив, если он вызывается с одним параметром, запускается режим «установки».
Обратите внимание, что при вызовах "set" и "get" первым неявным параметром "Handle self" является
всегда присутствует.
Свойства могут оперировать разным, но фиксированным количеством параметров и выполнять «набор»
и функции "получить" только для одного. По умолчанию единственным параметром является неявный "Handle
себя":
свойство char * имя
имеет аналог C
char * Object_name (Самостоятельная обработка, набор Bool, char * имя)
В зависимости от режима "Bool set" может принимать значения "true" или "false". В режиме установки C-код
результат отбрасывается, в режиме «получить» значение параметра не определено.
Синтаксис для многопараметрического свойства:
свойство long pixel (int x, int y);
и код C
long Object_pixel (обрабатывать себя, набор Bool, int x, int y, длинный пиксель)
Обратите внимание, что в случае с несколькими параметрами параметры, объявленные после имени свойства, являются
всегда инициализируется как в режимах «set», так и «get».
Пример переменные
Каждый объект характеризуется своим неповторимым внутренним состоянием. Синтаксис Gencls позволяет
объявление переменной для переменных, которые выделяются для каждого экземпляра объекта. Несмотря на то что
проверка типа данных не выполняется для переменных, и их объявления просто получают
скопированы "как есть", сложные объявления C, включающие указатели на массивы, структуры и функции,
не опознано. В качестве обходного пути используются указатели на определенные типы сущностей. Пример:
объект ОбразецОбъект {
int x;
Список списка;
struct {int x} s; # незаконное объявление
}
Переменные доступны в коде C путем прямого разыменования имени "Handle self" как
соответствующая структура:
((PSampleObject) self) -> x;
АВТОРЫ
Дмитрий Карасик,[электронная почта защищена]>. Антон Березин,[электронная почта защищена]>.
Используйте prima-gencls онлайн с помощью сервисов onworks.net