Формат PCU

Материал из Вики проекта PascalABC.NET
Версия от 00:00, 26 апреля 2009; Ibond (обсуждение | вклад) (Новая: '''PCU''' - промежуточный формат хранения семантического дерева в PascalABC.NET. Он служит для ускорения компил...)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

PCU - промежуточный формат хранения семантического дерева в PascalABC.NET. Он служит для ускорения компиляции программ, поскольку отпадает фаза синтаксического и семантического анализа. Выходной размер PCU файла в среднем в 1,5 раза больше исходного текста модуля. При чтении PCU-файла в таблицу символов заносятся заглушки считываемых сущностей (типов, подпрограмм и т.д.) и по запросу разворачивается семантическое дерево этих сущностей. Таким образом считываются только используемые имена, поэтому размер выходного исполняемого файла сокращается.

Формат PCU файла

Размер Описание Примечания
3 Сигнатура PCU-файла 'PCU'
2 Версия PCU PCU разных версий несовместимы
8 Контрольная сумма (временно не используется)
1 Флаг, включена ли отладочная информация
- Имя исходного файла программы при включенной отладочной информации
4 Количество записей в таблице интерфеисных имен модуля
Таблица имен сущностей interface части модуля. Каждая запись имеет структуру:

имя сущности

смещение сущности в PCU-файле (4 байта)

семантический тип сущности (TreeConverter.SymbolKind) (1 байт)

флаг method extension (1 байт)

4 Количество записей в таблице имен implementation части модуля
Имеет ту же структуру, что и таблица интерфейсных имен
4 Количество элементов в таблице подключаемых модулей
Таблица подключаемых модулей. Каждая запись - имя файла модуля без расширения.
4 Количество элементов в таблице используемых пространств имен
Таблица используемых пространств имен (нужна отладчику и зашивается в exe)
4 Количество подключаемых модулей в interface части модуля
4 Количество записей в таблице подключаемых сборок
Таблица подключаемых сборок .NET. Каждая запись - полное имя сборки (Assembly.FullName).
4 Количество элементов в таблице директив компилятора
Таблица директив компилятора. Имеет структуру:

- строка директивы (reference, apptype)

- строка значения директивы

- отладочная информация (начало строки, начало колонки, конец строки, конец колонки)

4 Количество элементов в таблице импортируемых сущностей
Таблица импортируемых сущностей. Имеет вид:

-флаг, откуда импортируется сущность (0-модуль,1-сборка .NET)

- для сущностей, импортируемых из модулей - индекс в таблице подключаемых модулей; из сборок - индекс в таблице подключаемых сборок. Если сущность находится в классе, то здесь указывается индекс класса в таблице импортируемых сущностей

- для сущностей, импортируемых из модуля - фактическое смещение сущности в подключаемом модуле; из сборок - индекс в таблице используемых имен сущностей .NET (ниже)

4 Смещение, по которому находится таблица синонимов типов, описанных в interface части модуля
4 Смещение, по которому находится таблица синонимов типов, описанных в implementation части модуля
4 Количество элементов в таблице используемых имен сущностей .NET
Таблица используемых имен сущностей .NET. Имеет структуру:

- семантический вид сущности (тип, поле, свойство, метод, конструктор)

- имя сущности

-дополнительная информация (параметры метода, шаблонного класса) - массив смещений на записи сущностей в данной таблице (например, типы параметров метода)

Имя namespace_node (пространство имен .NET) interface части модуля
16 Отладочная информация об interface части модуля
Имя namespace_node (пространство имен .NET) implementation части модуля
16 Отладочная информация об implementation части модуля
4 Количество элементов в таблице template-классов interface-часть модуля
Таблица template-классов. Каждая запись имеет следующую структуру:

- semantic_node_type

- имя класса

- список имен подключаемых сборок

- список имен подключаемых сборок 2

- имя файла, где описан шаблон

- сериализованное синтаксическое дерево шаблонного класса (если есть)

-

4 Количество элементов в таблице типов (классов, записей, перечислений и т. д.) interface части модуля
Таблица типов interface части модуля

- semantic_node_type сущности

- флаг, находится ли тип в interface части модуля

-если сущность описана в interface части - индекс в таблице имен имен сущностей модуля, иначе имя сущности

- флаг, является ли тип интерфейсом (IsInterface)

- флаг, является ли тип делегатом (IsDelegate)

- ссылка на тип предка

- флаг, является ли тип размерным (internal_is_value)

- список ссылок на реализуемые интерфейсы

- type_access_level

- type_special_kind

- element_type

- ссылка на объемлющее пространство имен

- флаг, есть ли у класса свойство по умолчанию

- смещение, по которому находится свойство по умолчанию (если оно есть)

- отладочная информация

4 Количество элементов в таблице откомпилированных (в сборках .NET) типов
Таблица откомпилированных (в сборках .NET) типов

- semantic_node_type сущности

- флаг, находится ли тип в interface части модуля

- если сущность описана в interface части - индекс в таблице имен имен сущностей модуля, иначе имя сущности

4 Количество элементов в таблице синонимов типов
Таблица синонимов типов:

- имя синонима

- ссылка на именуемый тип

- отладочная информация

4 Количество элементов в таблице меток implementation часть модуля
Таблица меток. Каждая запись имеет следующую структуру:

- имя метки

- отладочная информация

4 Количество элементов в таблице template-классов
Таблица template-классов (см. выше)
4 Количество элементов в таблице типов (классов, записей, перечислений и т. д.) implementation части модуля
Таблица типов implementation части модуля (см. выше)
4 Количество элементов в таблице откомпилированных (в сборках .NET) типов (см. выше)
Таблица откомпилированных (в сборках .NET) типов (см. выше)
4 Количество элементов в таблице констант класса (для каждого класса отдельная таблица) interface часть модуля
Таблица констант класса. Каждая запись имеет следующую структуру:

- semantic_node_type

- индекс имени метода в таблице имен

- ссылка на тип константы

- смещение об'емлющего класса

- значение константы

- field_acces_level

- отладочная информация

4 Количество элементов в таблице полей класса
Таблица полей класса. Каждая запись имеет следующую структуру:

- semantic_node_type

- индекс имени метода в таблице имен

- ссылка на тип поля

- начальное значение поля

- смещение, по которому находится об'емлющий класс

- field_access_level

- polymorphic_state

- отладочная информация

4 Количество элементов в таблице методов класса
Таблица методов класса. Каждая запись имеет следующую структуру:

- semantic_node_type

- индекс имени метода в таблице имен

- is_final

- newslot_awaited

- ссылка на тип возвращаемого значения

- переменная Result (если есть)

- параметры метода

- смещение, по которому находится об'емлющий класс

- is_constructor

- is_forward

- is_overload

- field_access_level

- polymorphic_state

- num_of_default_variables

- num_of_cicles

- флаг override

- локальные переменные

- описания вложенных подпрограмм

- отладочная информация о методе

- смещение, по которому находится код метода

4 Количество элементов в таблице свойств класса
Таблица свойств класса. Каждая запись имеет следующую структуру:

- semantic_node_type

- индекс имени метода в таблице имен

- ссылка на тип свойства

- смещение get-аксессора

- смещение set-аксессора

- параметры свойства

- смещение об'емлющего класса

- field_access_level

- polymorphic_state

- отладочная информация

4 Количество элементов в таблице констант класса implementation
Таблица констант класса: см. выше
4 Количество элементов в таблице полей класса
Таблица полей класса: см. выше
4 Количество элементов в таблице методов класса
Таблица методов класса: см. выше
4 Количество элементов в таблице свойств класса
Таблица свойств класса: см. выше
4 Количество элементов в таблице констант модуля interface
Таблица констант модуля. Каждая запись имеет следующую структуру:

- semantic_node_type

- флаг interface/implementation

- для констант в interface части — индекс имени в таблице имен, implementation — имя константы

- смещение секции модуля, в котором описана константа

- значение константы

- отладочная информация

4 Количество элементов в таблице переменных модуля
Таблица переменных модуля. Каждая запись имеет следующую структуру:

- semantic_node_type

- порядковый индекс переменной в семантическом дереве (нужен для восстановления переменных из pcu в том же порядке, в каком они были в сем. дереве)

- флаг interface/implementation

- для переменных в interface части — индекс имени в таблице имен, implementation — имя переменной

- ссылка на тип переменной

- смещение секции модуля, в котором описана переменная

- начальное значение переменной (если есть)

- отладочная информация

4 Количество элементов в таблице подпрограмм модуля
Таблица подпрограмм модуля. Каждая запись имеет следующую структуру:

- semantic_node_type

- если подпрограмма является method extension — ссылка на расширяемый тип

- для подпрограмм в interface части — индекс имени в таблице имен, implementation — имя подпрограммы

- тип возвращаемого значения

- переменная Result (если есть)

- список параметров подпрограммы

- смещение об'емлющей секции модуля

- is_forward

- is_overload

- num_of_default_variables

- num_of_cicles

- список переменных подпрограммы

- список вложенных подпрограмм

- отладочная информация

4 Количество элементов в таблице типов-указателей модуля
Таблица типов-указателей модуля:
4 Количество элементов в таблице констант модуля implementation
Таблица констант модуля: см. выше
4 Количество элементов в таблице переменных модуля
Таблица переменных модуля: см. выше
4 Количество элементов в таблице подпрограмм модуля
Таблица подпрограмм модуля: см. выше
4 Количество элементов в таблице типов-указателей модуля
Таблица типов-указателей модуля: см. выше
Реализации всех методов и подпрограмм

Примечания

  1. Под ссылкой на тип понимается следующее: флаг, указывающий на род типа (обычный тип, массив, короткая строка, указатель). Обычный тип не сериализуется после флага, так как он уже определен, а массивы, указатели и т. д. сериализуются после флага (var p : ^integer). Для обычного типа после флага идет флаг, описан ли тип в этом модуле. Далее если тип описан в модуле, то пишется смещение в модуле, по которому хранится тип, иначе смещение в таблице импорта.
  2. Код методов хранится в виде сериализованного семантического дерева. Узлы семантического дерева распознаются по semantic_node_type. Код хранится в конце файла.
  3. Ссылки на сущности .NET сериализуются следующим образом. Для типов, событий, полей, свойств хранятся их полные имена (System.Collections.ArrayList). Для метода кроме имени записывается список имен типов параметров, чтобы можно было выбрать перегруженный метод. Имена считываются один раз и кэшируются.
  4. При десериализации семантических деревьев могут проводиться некоторые дополнительные семантические действия, например добавление в тип внутреннего интерфейса ordinal_type_interface, при котором тип становится порядковым.