Формат PCU: различия между версиями
Материал из Вики проекта PascalABC.NET
Перейти к навигацииПерейти к поиску
Нет описания правки |
Нет описания правки |
||
Строка 546: | Строка 546: | ||
| | | | ||
| Таблица констант класса: см. выше | | Таблица констант класса: см. выше | ||
| | | implementation | ||
|- | |- | ||
| 4 | | 4 | ||
| Количество элементов в таблице полей класса | | Количество элементов в таблице полей класса | ||
| | | implementation | ||
|- | |- | ||
| | | | ||
| Таблица полей класса: см. выше | | Таблица полей класса: см. выше | ||
| | | implementation | ||
|- | |- | ||
| 4 | | 4 | ||
| Количество элементов в таблице методов класса | | Количество элементов в таблице методов класса | ||
| | | implementation | ||
|- | |- | ||
| | | | ||
| Таблица методов класса: см. выше | | Таблица методов класса: см. выше | ||
| | | implementation | ||
|- | |- | ||
| 4 | | 4 | ||
| Количество элементов в таблице свойств класса | | Количество элементов в таблице свойств класса | ||
| | | implementation | ||
|- | |- | ||
| | | | ||
| Таблица свойств класса: см. выше | | Таблица свойств класса: см. выше | ||
| | | implementation | ||
|- | |- |
Версия от 15:28, 7 июня 2009
PCU - промежуточный формат хранения семантического дерева в PascalABC.NET. Он служит для ускорения компиляции программ, поскольку отпадает фаза синтаксического и семантического анализа. Выходной размер PCU файла в среднем в 1,5 раза больше исходного текста модуля. При чтении PCU-файла в таблицу символов заносятся заглушки считываемых сущностей (типов, подпрограмм и т.д.) и по запросу разворачивается семантическое дерево этих сущностей. Таким образом считываются только используемые имена, поэтому размер выходного исполняемого файла сокращается.
Формат PCU файла
Размер | Описание | Примечания |
3 | Сигнатура PCU-файла 'PCU' | |
2 | Версия PCU | PCU разных версий несовместимы |
8 | Контрольная сумма (временно не используется) | |
1 | Флаг, включена ли отладочная информация | |
- | Имя исходного файла программы при включенной отладочной информации | |
4 | Количество записей в таблице интерфеисных имен модуля | |
Таблица имен сущностей interface части модуля. Каждая запись имеет структуру:
|
||
4 | Количество записей в таблице имен implementation части модуля | |
Имеет ту же структуру, что и таблица интерфейсных имен | ||
4 | Количество элементов в таблице подключаемых модулей | |
Таблица подключаемых модулей. Каждая запись - имя файла модуля без расширения. | ||
4 | Количество элементов в таблице используемых пространств имен | |
Таблица используемых пространств имен (нужна отладчику и зашивается в exe) | ||
4 | Количество подключаемых модулей в interface части модуля | |
4 | Количество записей в таблице подключаемых сборок | |
Таблица подключаемых сборок .NET. Каждая запись - полное имя сборки (Assembly.FullName). | ||
4 | Количество элементов в таблице директив компилятора | |
Таблица директив компилятора. Имеет структуру:
|
||
4 | Количество элементов в таблице импортируемых сущностей | |
Таблица импортируемых сущностей. Имеет вид:
|
||
4 | Смещение, по которому находится таблица синонимов типов, описанных в interface части модуля | |
4 | Смещение, по которому находится таблица синонимов типов, описанных в implementation части модуля | |
4 | Количество элементов в таблице используемых имен сущностей .NET | |
Таблица используемых имен сущностей .NET. Имеет структуру:
|
||
Имя namespace_node (пространство имен .NET) interface части модуля | ||
16 | Отладочная информация об interface части модуля | |
Имя namespace_node (пространство имен .NET) implementation части модуля | ||
16 | Отладочная информация об implementation части модуля | |
4 | Количество элементов в таблице template-классов | interface-часть модуля |
Таблица template-классов. Каждая запись имеет следующую структуру:
|
||
4 | Количество элементов в таблице типов (классов, записей, перечислений и т. д.) interface части модуля | |
Таблица типов interface части модуля
|
||
4 | Количество элементов в таблице откомпилированных (в сборках .NET) типов | |
Таблица откомпилированных (в сборках .NET) типов
|
||
4 | Количество элементов в таблице синонимов типов | |
Таблица синонимов типов:
|
||
4 | Количество элементов в таблице меток | implementation часть модуля |
Таблица меток. Каждая запись имеет следующую структуру:
|
||
4 | Количество элементов в таблице template-классов | |
Таблица template-классов (см. выше) | ||
4 | Количество элементов в таблице типов (классов, записей, перечислений и т. д.) implementation части модуля | |
Таблица типов implementation части модуля (см. выше) | ||
4 | Количество элементов в таблице откомпилированных (в сборках .NET) типов (см. выше) | |
Таблица откомпилированных (в сборках .NET) типов (см. выше) | ||
4 | Количество элементов в таблице констант класса (для каждого класса отдельная таблица) | interface часть модуля |
Таблица констант класса. Каждая запись имеет следующую структуру:
|
||
4 | Количество элементов в таблице полей класса | |
Таблица полей класса. Каждая запись имеет следующую структуру:
|
||
4 | Количество элементов в таблице методов класса | |
Таблица методов класса. Каждая запись имеет следующую структуру:
|
||
4 | Количество элементов в таблице свойств класса | |
Таблица свойств класса. Каждая запись имеет следующую структуру:
|
||
4 | Количество элементов в таблице констант класса | implementation |
Таблица констант класса: см. выше | implementation | |
4 | Количество элементов в таблице полей класса | implementation |
Таблица полей класса: см. выше | implementation | |
4 | Количество элементов в таблице методов класса | implementation |
Таблица методов класса: см. выше | implementation | |
4 | Количество элементов в таблице свойств класса | implementation |
Таблица свойств класса: см. выше | implementation | |
4 | Количество элементов в таблице констант модуля | interface |
Таблица констант модуля. Каждая запись имеет следующую структуру:
| ||
4 | Количество элементов в таблице переменных модуля | |
Таблица переменных модуля. Каждая запись имеет следующую структуру:
|
||
4 | Количество элементов в таблице подпрограмм модуля | |
Таблица подпрограмм модуля. Каждая запись имеет следующую структуру:
|
||
4 | Количество элементов в таблице типов-указателей модуля | |
Таблица типов-указателей модуля: | ||
4 | Количество элементов в таблице констант модуля | implementation |
Таблица констант модуля: см. выше | ||
4 | Количество элементов в таблице переменных модуля | |
Таблица переменных модуля: см. выше | ||
4 | Количество элементов в таблице подпрограмм модуля | |
Таблица подпрограмм модуля: см. выше | ||
4 | Количество элементов в таблице типов-указателей модуля | |
Таблица типов-указателей модуля: см. выше | ||
Реализации всех методов и подпрограмм (сериализованные семантические деревья тел методов и подпрограмм) | ||
Список атрибутов .NET. Каждая запись имеет следующий вид:
|
||
Семантические деревья для значений констант, переменных и параметров |
Примечания
- Под ссылкой на тип понимается следующее: флаг, указывающий на род типа (обычный тип, массив, короткая строка, указатель). Обычный тип не сериализуется после флага, так как он уже определен, а массивы, указатели и т. д. сериализуются после флага (var p : ^integer). Для обычного типа после флага идет флаг, описан ли тип в этом модуле. Далее если тип описан в модуле, то пишется смещение в модуле, по которому хранится тип, иначе смещение в таблице импорта.
- Код методов хранится в виде сериализованного семантического дерева. Узлы семантического дерева распознаются по semantic_node_type. Код хранится в конце файла.
- Ссылки на сущности .NET сериализуются следующим образом. Для типов, событий, полей, свойств хранятся их полные имена (System.Collections.ArrayList). Для метода кроме имени записывается список имен типов параметров, чтобы можно было выбрать перегруженный метод. Имена считываются один раз и кэшируются.
- При десериализации семантических деревьев могут проводиться некоторые дополнительные семантические действия, например добавление в тип внутреннего интерфейса ordinal_type_interface, при котором тип становится порядковым.
- Отладочная информация имеет следующую структуру (если отладочной информации нет, то вместо номеров строк и колонок пишется -1):
- номер начальной строки
- номер начальной колонки
- номер конечной строки
- номер конечной колонки