<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://man.deeptown.org/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://man.deeptown.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lester</id>
		<title>Deeptown Manual - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://man.deeptown.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lester"/>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Lester"/>
		<updated>2026-05-31T10:27:26Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.20.2</generator>

	<entry>
		<id>http://man.deeptown.org/index.php/%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BB%D0%B0%D1%82%D1%84%D0%BE%D1%80%D0%BC%D1%8B_Gide</id>
		<title>Описание платформы Gide</title>
		<link rel="alternate" type="text/html" href="http://man.deeptown.org/index.php/%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BB%D0%B0%D1%82%D1%84%D0%BE%D1%80%D0%BC%D1%8B_Gide"/>
				<updated>2009-02-25T20:52:31Z</updated>
		
		<summary type="html">&lt;p&gt;Lester: /* Роль скриптов в проекте */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Введение ==&lt;br /&gt;
&lt;br /&gt;
=== Роль скриптов в проекте ===&lt;br /&gt;
&lt;br /&gt;
Многие объекты виртуального мира обладают некоторым специфичным поведением. Например, при нажатии на кнопку зажигается лампочка, а для открытия некоторых дверей требуется ключ (пароль). Для того, чтобы задать специфичное поведение объекту, предусмотрено два способа:&lt;br /&gt;
&lt;br /&gt;
# написание плагина к физическому движку Диптауна, расширяющего стандартное дерево классов объектов;&lt;br /&gt;
# написание скрипта на специализированном языке программирования.&lt;br /&gt;
&lt;br /&gt;
Еще одна важная область применения скриптов - т.н. процедурные модели и текстуры. Суть их заключается в следующем.&lt;br /&gt;
&lt;br /&gt;
Как известно, классически текстура задается в виде массива чисел, каждое из которых определяет цвет соответствующей точки. Даже при достаточно хорошем сжатии, текстуры имеют большой размер и их очень &amp;quot;дорого&amp;quot; передавать по сети. Альтернативой являются процедурные текстуры. Процедурная текстура задается некоторой программой (скриптом), которая рисует изображение. При этом по сети передается относительно маленькая программа, которая затем исполняется на машине пользователя, а полученное изображение используется в качестве текстуры. &lt;br /&gt;
&lt;br /&gt;
Аналогично, процедурная модель - это скрипт, создающий трехмерную модель. &lt;br /&gt;
&lt;br /&gt;
Итак, скрипты в проекте используются, в основном, в трех направлениях: &lt;br /&gt;
* задание поведения объектов; &lt;br /&gt;
* создание процедурных моделей; &lt;br /&gt;
* создание процедурных текстур.&lt;br /&gt;
&lt;br /&gt;
=== Терминология ===&lt;br /&gt;
&lt;br /&gt;
В этом документе будут использованы следующие термины: &lt;br /&gt;
* Gide (гайд) - единый низкоуровневый язык; &lt;br /&gt;
* байт-код gide - бинарный код, получаемый после компиляции кода gide; &lt;br /&gt;
* виртуальная машина gide - программа, исполняющая байт-код. &lt;br /&gt;
&lt;br /&gt;
=== Основные концепции ===&lt;br /&gt;
&lt;br /&gt;
Для различных задач удобны различные языки и различные наборы функций. Поэтому, во избежание повторного написания низкоуровневых библиотек, а также для удобства программирования скриптовых языков, было решено разработать единый низкоуровневый язык - gide. Код любого другого языка компилируется в код gide, затем компилятор gide создает платформенно-независимый байт-код, который исполняется виртуальной машиной gide. Механизм компиляции и исполнения кода изображен на рис. 1. &lt;br /&gt;
&lt;br /&gt;
[[Image:gidebc-1.gif|thumb|Рис. 1. Механизм компиляции и исполнения кода]]&lt;br /&gt;
&lt;br /&gt;
Преимущества такого подхода очевидны: &lt;br /&gt;
* использование библиотек одного языка другими; &lt;br /&gt;
* единая виртуальная машина для всех языков. &lt;br /&gt;
&lt;br /&gt;
Язык gide берет за основу модульную архитектуру. Модули gide - это динамически подключаемые библиотеки, которые бывают двух типов: &lt;br /&gt;
# библиотеки, представляющие собой байт-код gide ('''управляемые''' модули);&lt;br /&gt;
# &amp;quot;обычные&amp;quot; динамически-подключаемые библиотеки ('''неуправляемые''' модули).&lt;br /&gt;
&lt;br /&gt;
Любые из этих библиотек можно подключать как статически, так и динамически.&lt;br /&gt;
Область задач gide:&lt;br /&gt;
* расчет процедурных текстур, объектов и, возможно, звуков;&lt;br /&gt;
* управление поведением объектов в виртуальном пространстве; &lt;br /&gt;
* управление объектами интерфейса на сервере интерфейса.&lt;br /&gt;
&lt;br /&gt;
Gide должен предоставлять максимально удобный механизм управления &amp;quot;внешними&amp;quot; объектами. Набор таких объектов определяет набор решаемых задач, т.е. некий контекст того или иного скрипта.&lt;br /&gt;
&lt;br /&gt;
=== Модель языка ===&lt;br /&gt;
&lt;br /&gt;
Основополагающим понятием в модели Gide является объект.&lt;br /&gt;
&lt;br /&gt;
'''Объект''' - это некоторая абстрактная сущность, для которой определены свойства (поля) и операции (методы). Свойства объекта также являются (именованными) ссылками на объекты. И набор свойств, и набор операций - это динамические наборы, т.е. наличие того или иного свойства/операции определяется в момент выполнения, а не в момент компиляции. Gide позволяет оперировать ссылками на объекты. То есть единственный существующий в нем тип данных - это ссылка на объект. Ссылка может либо указывать на объект, либо быть равной 0.&lt;br /&gt;
&lt;br /&gt;
Набор методов объекта определяется его классом.&lt;br /&gt;
&lt;br /&gt;
'''Класс''' - это набор функций, каждая из которых имеет доступ к объекту, для которого она была вызвана. У класса может быть один или несколько '''родительских''' классов: при поиске метода, он ищется сначала в классе объекта, а затем - рекурсивно - во всех родительских классах, в порядке их перечисления.&lt;br /&gt;
&lt;br /&gt;
'''Функция''', в свою очередь - это некоторый набор операторов, выполняющих определенные действия и составляющие '''тело функции'''. Функция может быть методом какого-либо класса, либо отдельной функцией, не являющейся методом. Функция может принимать некоторое количество параметров и возвращать результат (объект).&lt;br /&gt;
&lt;br /&gt;
Набор классов, предоставляемых скрипту, формирует так называемый контекст исполнения, т.е. по сути стандартную библиотеку языка.&lt;br /&gt;
&lt;br /&gt;
Эта библиотека, для тех или иных вариантов использования, может включать в себя:&lt;br /&gt;
* объекты стандартных типов данных:&lt;br /&gt;
** целые числа,&lt;br /&gt;
** вещественные числа,&lt;br /&gt;
** строки,&lt;br /&gt;
** идентификаторы объектов,&lt;br /&gt;
** указатели,&lt;br /&gt;
** массивы;&lt;br /&gt;
* стандартные операции для этих объектов:&lt;br /&gt;
** арифметические операции,&lt;br /&gt;
** операции сравнения,&lt;br /&gt;
** математические функции,&lt;br /&gt;
** и пр.&lt;br /&gt;
&lt;br /&gt;
== Синтаксис языка gide ==&lt;br /&gt;
&lt;br /&gt;
Синтаксис языка Gide максимально упрощен - с рассчетом на то, что поверх него будут писаться реализации языков более высокого уровня.&lt;br /&gt;
&lt;br /&gt;
Каждая непустая строка исходного кода gide - это некоторая инструкция, записанная в следующей форме:&lt;br /&gt;
 ключевое_слово аргумент1, аргумент2, ..., аргументN&lt;br /&gt;
&lt;br /&gt;
Некоторые инструкции допустимы только за пределами тела функции, некоторые, наоборот, допустимы только внутри тела функции.&lt;br /&gt;
&lt;br /&gt;
Аргументы для инструкции - это произвольные текстовые строки. Если значение аргумента содержит управляющие символы (пробел, табуляция, перевод строки, запятая, символы # или &amp;quot;) - его необходимо заключить в двойные кавычки. Внутри таких кавычек также допустимы escape-последовательности \r, \n, \t, \&amp;quot; и \\.&lt;br /&gt;
&lt;br /&gt;
'''ЗАМЕЧАНИЕ''': вставка произвольных символов \xNN на данный момент не поддерживается, но запланирована на будущее.&lt;br /&gt;
&lt;br /&gt;
Весь текст от символа # и до конца строки - комментарий, он игнорируется.&lt;br /&gt;
&lt;br /&gt;
Внутри тела функции также возможно вставлять т.н. '''метки'''. Метка - это некоторая уникальная в пределах данной функции ссылка на инструкцию. Метка выглядит следующим образом:&lt;br /&gt;
 имя_метки:&lt;br /&gt;
&lt;br /&gt;
Она может быть записана как на отдельной строке, так и на строке с инструкцией.&lt;br /&gt;
&lt;br /&gt;
=== Подключение внешних модулей ===&lt;br /&gt;
&lt;br /&gt;
Для использования классов и функций, объявленных во внешних модулях (любого типа), необходимо их подключить, используя инструкцию '''use'''. Она записывается следующим образом:&lt;br /&gt;
&lt;br /&gt;
 use ''адрес''&lt;br /&gt;
&lt;br /&gt;
Для неуправляемых модулей, адрес - это просто имя такого модуля.&lt;br /&gt;
&lt;br /&gt;
Для управляемых модулей, адрес - это префикс 'gbc:' плюс URL-адрес потока модуля. Например, &amp;quot;gbc:diss:/lib/module.gbc&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Зависимости модулей - рекурсивные. Другими словами, если модуль B подключил модуль A, а модуль C подключил модуль B, то из модуля C будут доступны объявления модуля A.&lt;br /&gt;
&lt;br /&gt;
=== Объявление классов ===&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы объявить класс, нужно написать следующую инструкцию:&lt;br /&gt;
&lt;br /&gt;
 class ''имя_класса''&lt;br /&gt;
&lt;br /&gt;
Имя класса - это произвольная строка. Данная инструкция объявляет класс, в котором еще нет ни одного метода.&lt;br /&gt;
&lt;br /&gt;
Инструкция&lt;br /&gt;
&lt;br /&gt;
 inherit ''имя_класса'', ''имя_родителя''&lt;br /&gt;
&lt;br /&gt;
добавляет класс ''имя_родителя'' в качестве родительского класса. Она должна быть записана после объявления класса. В этой инструкции, и класс ''имя_класса'', и класс ''имя_родителя'' могут быть объявлены во внешнем модуле.&lt;br /&gt;
&lt;br /&gt;
Существует также понятие родителя по-умолчанию. Они могут быть заданы только в неуправляемых модулях. Такие родители добавляются автоматически, если не указаны другие родительские классы.&lt;br /&gt;
&lt;br /&gt;
=== Объявление глобальных переменных ===&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы объявить глобальную переменную - т.е. переменную, доступную из любой функции - нужно написать инструкцию&lt;br /&gt;
&lt;br /&gt;
 global ''имя_переменной''&lt;br /&gt;
&lt;br /&gt;
В качестве имени переменной, опять же, может выступать любая строка.&lt;br /&gt;
&lt;br /&gt;
Глобальные переменные доступны только в пределах данного модуля. Для получения их значений из других модулей, следует использовать функции.&lt;br /&gt;
&lt;br /&gt;
По-умолчанию все глобальные переменные инициализируются нулем.&lt;br /&gt;
&lt;br /&gt;
=== Объявление функции ===&lt;br /&gt;
&lt;br /&gt;
Функция объявляется следующим образом:&lt;br /&gt;
&lt;br /&gt;
 function ''имя_функции'', ''аргумент1'', ''аргумент2'', ..., ''аргументN''&lt;br /&gt;
   ''тело функции''&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
Имя функции - это произвольная текстовая строка. Если имя имеет вид&lt;br /&gt;
 ''имя_класса'':''имя_метода''&lt;br /&gt;
, метод ''имя_метода'' добавляется в класс ''имя_класса'' (этот класс должен быть предварительно объявлен, но не обязательно в текущем модуле). В противном случае, объявляется функция, а не метод.&lt;br /&gt;
&lt;br /&gt;
Аргументы - это формальные параметры функции, они доступны в теле как локальные переменные.&lt;br /&gt;
&lt;br /&gt;
Список аргументов в какой-то мере условен. При вызове функции всегда можно указывать произвольное число параметров, это нигде не проверяется. Если фактических параметров меньше, чем формальных - оставшиеся аргументы будут инициализированы нулем. Если фактических больше - некоторые из них не будут доступны напрямую, однако стандартная библиотека может предоставлять функции, открывающие к ним доступ.&lt;br /&gt;
&lt;br /&gt;
Методы класса могут быть публичными (public), защищенными (protected) или частными (private). Публичные методы можно вызывать без ограничений, защищенные - только из данного класса и его потомков, частные - только из данного класса. Эти проверки делаются во время исполнения.&lt;br /&gt;
&lt;br /&gt;
По-умолчанию, метод является публичным. Для объявления защищенных и частных методов, нужно заменить ключевое слово function в объявлении метода на '''func_protected''' и '''func_private''' соответственно.&lt;br /&gt;
&lt;br /&gt;
Если метод/функция уже был объявлен ранее, он переобъявляется - т.е. данная реализация перекрывает предыдущую. Вызвать предыдущую реализацию можно при помощи оператора '''recall''' (см. ниже).&lt;br /&gt;
&lt;br /&gt;
Функция со специальным именем '''@@module_init''' является конструктором модуля; она вызывается в момент загрузки данного модуля. В ней, в частности, можно инициализировать глобальные переменные модуля.&lt;br /&gt;
&lt;br /&gt;
Метод '''@@init''' - конструктор класса. Он вызывается в момент создания объекта данного класса. Порядок вызова конструкторов таков: сначала рекурсивно вызываются конструкторы родительских классов в порядке объявления родителей, затем - конструктор данного класса. В конструкторе, в частности, можно инициализировать поля объекта.&lt;br /&gt;
&lt;br /&gt;
=== Специальные переменные ===&lt;br /&gt;
&lt;br /&gt;
Существует 6 зарезервированных имен переменных:&lt;br /&gt;
* '''0''' (число ноль) - означает отсутствие объекта;&lt;br /&gt;
* '''@true''' - указывает на специальный объект &amp;quot;истина&amp;quot;. Этот объект не имеет полей и методов; он бывает полезен для написания логических конструкций;&lt;br /&gt;
* '''@false''' - то же, что и 0;&lt;br /&gt;
* '''@this''' - внутри функции-метода, указывает на текущий объект; внутри обычной функции равен 0;&lt;br /&gt;
* '''@result''' - результат последней вызванной функции или оператора '''access''';&lt;br /&gt;
* '''@exception''' - объект исключения, которое требуется обработать.&lt;br /&gt;
&lt;br /&gt;
=== Операторы функции ===&lt;br /&gt;
&lt;br /&gt;
'''Операторы''' - это управляющие инструкции, составляющие тело функции.&lt;br /&gt;
&lt;br /&gt;
Поскольку единственный существующий тип переменной - это указатель на объект, значительная часть операторов не требуется. Все операторы реализуются на уровне самих объектов в виде методов.&lt;br /&gt;
&lt;br /&gt;
Существуют следующие операторы:&lt;br /&gt;
&lt;br /&gt;
 new ''переменная'', ''имя_класса'', ''строка''&lt;br /&gt;
&lt;br /&gt;
: создает новый объект класса ''имя_класса'' и записывает результат в указанную переменную. Если переменная была объявлена ранее - результат записывается в нее; если нет - создается новая '''локальная''' переменная (т.е. переменная, доступная только в пределах данной функции). Третий параметр - это некоторые данные для инициализации объекта. Они имеют значение только для некоторых классов в неуправляемых модулях. Кроме того, любой класс может быть инициализирован пустой строкой.&lt;br /&gt;
&lt;br /&gt;
 bless ''переменная'', ''имя_класса''&lt;br /&gt;
&lt;br /&gt;
: эквивалент &amp;lt;tt&amp;gt;new&amp;lt;/tt&amp;gt; без последнего параметра.&lt;br /&gt;
&lt;br /&gt;
 mov ''переменная'', ''источник''&lt;br /&gt;
&lt;br /&gt;
: копирует в переменную ''переменная'' ссылку на существующий объект ''источник'' (аналогично, если переменная не была объявлена ранее - создается новая локальная переменная). Важно подчеркнуть, что при этой операции не создается нового объекта; две переменные будут указывать на один и тот же объект.&lt;br /&gt;
&lt;br /&gt;
 goto ''имя_метки''&lt;br /&gt;
&lt;br /&gt;
: осуществляет безусловный переход к оператору, помеченному меткой ''имя_метки''.&lt;br /&gt;
&lt;br /&gt;
 if ''переменная'', ''имя_метки''&lt;br /&gt;
&lt;br /&gt;
: осуществляет условный переход к оператору ''имя_метки'': если управляющая переменная (первый параметр) имеет отличное от нуля значение, осуществляется переход; в противном случае этот оператор игнорируется и выполнение продолжается со следующей инструкции.&lt;br /&gt;
&lt;br /&gt;
 call ''переменная'', ''имя_функции'', ''аргумент1'', ..., ''аргументN''&lt;br /&gt;
&lt;br /&gt;
: если ''переменная'' - '''0''', вызывает функцию ''имя_функции''; в противном случае вызывает метод объекта, на который ссылается переменная. Как уже говорилось ранее, количество аргументов может быть любым вне зависимости от количества формальных параметров. Результат выполнения функции записывается в специальную переменную '''@result'''.&lt;br /&gt;
&lt;br /&gt;
: ''имя_функции'' может быть задано в форме ''имя_класса'':''имя_метода''. В этом случае осуществляется вызов метода конкретного класса, а не текущего (''имя_класса'' должно либо совпадать с классом объекта, либо быть его родительским классом). Это позволяет вызывать методы родительских классов, несмотря на перекрытие в дочерних классах.&lt;br /&gt;
&lt;br /&gt;
 return ''переменная''&lt;br /&gt;
&lt;br /&gt;
: осуществляет выход из текущей функции с возвратом объекта, на который ссылается ''переменная''. Если выполнение функции доходит до конца, функция возвращает 0.&lt;br /&gt;
&lt;br /&gt;
 access ''переменная'', ''имя_поля''&lt;br /&gt;
&lt;br /&gt;
: получает значение поля ''имя_поля'' объекта, на который ссылается ''переменная''. Значение записывается в специальную переменную '''@result'''. Если указанного поля в классе нет, в '''@result''' записывается 0.&lt;br /&gt;
&lt;br /&gt;
 mutate ''переменная'', ''имя_поля'', ''значение''&lt;br /&gt;
&lt;br /&gt;
: записывает объект, на который ссылается ''значение'', в поле ''имя_поля'' объекта, на который ссылается ''переменная''. Если такого поля ранее не существовало, оно создается.&lt;br /&gt;
&lt;br /&gt;
 recall&lt;br /&gt;
&lt;br /&gt;
: вызывает замещенную функцию с теми же параметрами, которые были переданы данной функции; осуществляет выход из текущей функции с результатом, который вернула замещенная функция.&lt;br /&gt;
&lt;br /&gt;
 upgrade ''переменная'', ''имя_класса''&lt;br /&gt;
&lt;br /&gt;
: расширяет объект, на который ссылается ''переменная'', до класса ''имя_класса''. Это делается путем вызова конструкторов классов, которые в дереве иерархии находятся между классом переменной и указанным классом. Очевидно, класс объекта должен быть родительским для класса ''имя_класса''. После выполнения данной инструкции, класс объекта станет равным ''имя_класса'', т.е. для него будут доступны все методы этого класса.&lt;br /&gt;
&lt;br /&gt;
 use_locals ''имя_функции''&lt;br /&gt;
&lt;br /&gt;
: открывает данной функции доступ к локальным переменным функции ''имя_функции''. Этот оператор может быть указан только в самом начале тела функции и только единожды. ''имя_функции'' записывается как при объявлении: для обычной функции - просто ее имя, для метода класса - имя класса и имя метода, разделенные двоеточием. Для того, чтобы локальные переменные реально стали доступны, функция ''имя_функции'' должна вызвать текущую функцию специальным образом.&lt;br /&gt;
&lt;br /&gt;
: '''ПРИМЕЧАНИЕ''': такой специальный вызов на данный момент невозможно сделать напрямую. Класс [[Closure]] стандартной библиотеки позволяет создать указатель на метод, при вызове которого (через этот указатель) происходит требуемый тип вызова. В будущем планируется добавить оператор вызова '''ccall''', выполняющий эту операцию.&lt;br /&gt;
&lt;br /&gt;
: данная инструкция требуется для реализации [http://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BC%D1%8B%D0%BA%D0%B0%D0%BD%D0%B8%D0%B5_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29 замыканий].&lt;br /&gt;
&lt;br /&gt;
Кроме перечисленных, существуют еще операторы для работы с исключениями; они рассмотрены в следующем подразделе.&lt;br /&gt;
&lt;br /&gt;
=== Обработка исключений ===&lt;br /&gt;
&lt;br /&gt;
'''Исключения''' - это специальный механизм, предназначенный для передачи информации об ошибках. Он заключается в следующем.&lt;br /&gt;
&lt;br /&gt;
Любая функция может бросить исключение. Само исключение - это некоторый объект произвольного класса. Когда такое происходит, виртуальная машина начинает искать ближайший обработчик исключений. Если сама функция, бросившая исключение, может его обработать - исполнение передается соответствующей инструкции. В противном случае, начинается раскрутка стека вызовов до первой функции, которая может обработать исключение. Если ни одна функция этого сделать не может, выполнение программы прекращается, а вызвавшему модулю сообщается о необработанном исключении.&lt;br /&gt;
&lt;br /&gt;
В функции может быть установлено несколько обработчиков исключений, которые формируют стек. Обработчик - это некоторая метка в пределах функции. Когда функции требуется обработать исключение, управление передается оператору, на который ссылается эта метка, а сама эта метка извлекается из стека обработчиков. Другими словами, в функции может быть установлено несколько обработчиков, которые, при необходимости, будут вызываться в порядке, обратном их установке. Если же возникает исключение, а в функции не установлено ни одного обработчика - происходит выход из функции, а исключение передается функции, которая вызвала данную функцию, и т.д.&lt;br /&gt;
&lt;br /&gt;
Для работы с исключением существуют следующие четыре оператора:&lt;br /&gt;
&lt;br /&gt;
 throw ''переменная''&lt;br /&gt;
&lt;br /&gt;
: кидает исключение, передав в качестве параметра объект, на который ссылается ''переменная''.&lt;br /&gt;
&lt;br /&gt;
 except_push ''имя_метки''&lt;br /&gt;
&lt;br /&gt;
: добавляет метку ''имя_метки'' в стек обработчиков исключений для данной функции. Когда возникает исключение, управление передается указанной метке, а объект исключения записывается в специальную переменную '''@exception'''.&lt;br /&gt;
&lt;br /&gt;
 except_pop&lt;br /&gt;
&lt;br /&gt;
: изымает из стека обработчиков метку, находящуюся на вершине стека.&lt;br /&gt;
&lt;br /&gt;
 except_clr&lt;br /&gt;
&lt;br /&gt;
: очищает стек обработчиков исключений для данной функции.&lt;br /&gt;
&lt;br /&gt;
Кроме оператора '''throw''', исключения могут кидаться неуправляемыми модулями. Кроме того, существует механизм, при помощи которого ошибки, возникающие на уровне самой виртуальной машины, передаются в стандартную библиотеку, которая кидает исключение.&lt;br /&gt;
&lt;br /&gt;
== Формат байт-кода gide ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''ПРИМЕЧАНИЕ:''' в данном разделе приведена устаревшая информация, которая не соответствует действительности. Раздел оставлен для ознакомления с общей концепцией хранения байт-кода. Через некоторое время он будет переписан.&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Байт-код gide представляет собой популярный BER-формат: весь файл разбит на секции, каждая из которых начинается с описания ее типа и размера. &lt;br /&gt;
&lt;br /&gt;
Следует сразу оговориться, что все числа в gide представляются в формате big endian (т.е. наименее значимый байт впереди). &lt;br /&gt;
&lt;br /&gt;
Заголовок BER-секции представляет собой последовательность кода секции (1 байт) и ее размер в BER-формате.&lt;br /&gt;
&lt;br /&gt;
Все целые числа в байт-коде, если это не оговорено специально, представляются в BER-формате: для записи числа требуется столько байт, сколько нужно; в каждом байте записывается 7 битов числа. Если самый старший бит равен 1, требуется прочитать/записать следующий байт. Если старший бит равен 0 - это последний байт, описывающий число.&lt;br /&gt;
&lt;br /&gt;
=== Секция имен ===&lt;br /&gt;
&lt;br /&gt;
Тип секции - код символа N.&lt;br /&gt;
&lt;br /&gt;
Для большей компактности кода используется секция имен. В ней последовательно записываются все текстовые строки (имена переменных/функций, данные конструкторов и пр.), которые встречаются в скрипте. Одинаковые текстовые строки записываются только один раз. Таким образом, каждая текстовая строка получает свой уникальный номер, и в байт-коде вместо строк используются эти номера.&lt;br /&gt;
&lt;br /&gt;
Поскольку в скрипте часто встречаются одинаковые строки (например, работа с одной и той же переменной), это сильно уменьшает размер кода.&lt;br /&gt;
&lt;br /&gt;
Все строки записываются следующим образом:&lt;br /&gt;
* длина строки (в BER формате, см. выше);&lt;br /&gt;
* текст.&lt;br /&gt;
&lt;br /&gt;
Нумерация строк начинается не с нуля, а с 16. Меньшие номера зарезервированы для стандартных имен:&lt;br /&gt;
* Переменная @null (она же 0) имеет номер 0;&lt;br /&gt;
* Переменная @this имеет номер 1;&lt;br /&gt;
* Переменная @false имеет номер 2;&lt;br /&gt;
* Переменная @true имеет номер 3.&lt;br /&gt;
&lt;br /&gt;
В случае обращения к полю объекта, в байт-код записывается все составное имя объекта (вместе с разделяющими точками). Виртуальная машина сама разбирает составные имена.&lt;br /&gt;
&lt;br /&gt;
=== Секция экспорта ===&lt;br /&gt;
&lt;br /&gt;
Тип секции - ASCII-код символа E&lt;br /&gt;
&lt;br /&gt;
Данная секция предназначена для упрощения навигации по секции кода.&lt;br /&gt;
&lt;br /&gt;
Для каждой функции, описанной в модуле, записывается:&lt;br /&gt;
* индекс имени функции;&lt;br /&gt;
* смещение функции относительно начала секции кода.&lt;br /&gt;
&lt;br /&gt;
=== Секция кода ===&lt;br /&gt;
&lt;br /&gt;
Тип секции кода - ASCII-код символа C.&lt;br /&gt;
&lt;br /&gt;
В эту секцию записываются тела функций Gide.&lt;br /&gt;
&lt;br /&gt;
Для каждой функции записывается:&lt;br /&gt;
* индекс имени функции (он должен быть смещен от начала секции кода на количество байт, указанных в секции экспорта);&lt;br /&gt;
* количество аргументов функции;&lt;br /&gt;
* индексы имен аргументов функции;&lt;br /&gt;
* размер блока операторов;&lt;br /&gt;
* для каждого оператора:&lt;br /&gt;
** индекс имени оператора;&lt;br /&gt;
** количество передаваемых параметров функции (только для оператора call);&lt;br /&gt;
** индексы имен всех параметров.&lt;br /&gt;
&lt;br /&gt;
Индексы операторов:&lt;br /&gt;
* Простые операторы имеют номера от 1 до 9 в порядке их перечисления в п.2.1;&lt;br /&gt;
* Оператор создания объекта имеет номер 10;&lt;br /&gt;
* Оператор throw имеет номер 13;&lt;br /&gt;
* Оператор except_push имеет номер 16;&lt;br /&gt;
* Оператор except_pop имеет номер 17;&lt;br /&gt;
* Оператор создания переменной пользовательского класса имеет номер 11;&lt;br /&gt;
* Оператор расширения наследования имеет номер 15;&lt;br /&gt;
* Оператор use имеет номер 12;&lt;br /&gt;
* Оператор external номер 14;&lt;br /&gt;
&lt;br /&gt;
=== Секция импорта ===&lt;br /&gt;
&lt;br /&gt;
Тип секции импорта - ASCII-код символа I&lt;br /&gt;
&lt;br /&gt;
В эту секцию записываются подключаемые операторами use и external библиотеки.&lt;br /&gt;
&lt;br /&gt;
Для каждой библиотеки записывается:&lt;br /&gt;
* число 1 в случае оператора external, 0 - в случае use;&lt;br /&gt;
* индекс пути к библиотеке.&lt;br /&gt;
&lt;br /&gt;
=== Секция наследования классов ===&lt;br /&gt;
&lt;br /&gt;
Тип секции - код символа H.&lt;br /&gt;
&lt;br /&gt;
В эту секцию записывается статическая таблица наследований классов.&lt;br /&gt;
&lt;br /&gt;
Для каждого оператора inherit записывается:&lt;br /&gt;
* индекс наследующего класса;&lt;br /&gt;
* индекс наследуемого класса.&lt;br /&gt;
&lt;br /&gt;
=== Секция номеров строк ===&lt;br /&gt;
&lt;br /&gt;
Тип секции - код символа D.&lt;br /&gt;
&lt;br /&gt;
Эта секция не является обязательной. В ней записываются соответствия операторов и номеров строк в исходных файлах, на которых указан соответствующий оператор.&lt;br /&gt;
&lt;br /&gt;
В секцию записывается массив следующих структур:&lt;br /&gt;
* индекс имени файла;&lt;br /&gt;
* размер блока функций;&lt;br /&gt;
* для каждой функции:&lt;br /&gt;
** индекс имени функции;&lt;br /&gt;
** размер блока операторов;&lt;br /&gt;
** для каждого оператора:&lt;br /&gt;
*** номер оператора в теле функции;&lt;br /&gt;
*** номер строки кода, на которой объявлен оператор.&lt;/div&gt;</summary>
		<author><name>Lester</name></author>	</entry>

	</feed>