Копия викизеркало

Это зеркало вики с pascal.chat. Правка, история и вход — там.

FPC JVM/Internals/ru

English · Русский

Изменения в компиляторе

Генерация кода во время компиляции

Реализация языка паскаль на уроне JVM потребовал дополнительных обёрток кода:

Обёрток достаточно большое количество, и для каждого "обёрточного" случая можно написать дополнительные исключения в компиляторе создав свои описания (definitions) и узлы (nodes). Но если делать обёртки на уровне самого паскаль кода, то их гораздо проще писать и поддерживать. Для генерации динамического паскаль-кода на стадии компиляции используется специальный модуль symcreat. В компилятор позволяет разбирать объявления и реализацию методов а так же объявления типизированных констант в динамически создаваемом коде.

Сразу после того, как объявление метода (method declaration) было распарено или создано каким-либо иным путём для него создаётся структура procdef. Полю synthetickind этой структуры можно задать значение любой из tks_* констант, объявленных в модуле symdef. Это укажет какой год необходимо генерировать для объявленного метода. Функция symcreate.add_synthetic_method_implemementations_for_struct() занимается тем, что создаёт вспомогательный код в исходном Паскаль коде, разбирает его и компилирует в машинный или байт код.

Особенности:

Типизированные константы

В Java-class файлах нет секции данных, как в обычных исполняемых файлах. В результате, инициализация данных должна быть выполнена через явное присваивание значений в секции инициализации (~unit initialization) Основной функционал модуля ptconst был вынесет в модуль ngtcon. Генерация инициализации типизированных констант выполняется классом TTypedConstBuilder. Сам класс - абстрактный, но для него объявлено два дочерних класса-реализации:

Оба класса так же могут быть переопределены для каких-либо специфических требований платформы.

В зависимости от значения константы systems.systems_typed_constants_node_init создаётся класс AsmList или NodeTree.

Вложенные функции

В JVM нет указателя на фрейм, которые можно было бы передавать между процедурами. Для платформы был разработан иной способ доступа к вложенных функций к переменным внешней функции. Для этой цели, во вложенную функцию передаются все используемые переменные внешней функции через дополнительную структуру, передаваемую как скрытый параметр. Структура имеет название parentfpstruct.

В тех случаях, когда вложенная функция вызывает собственную вложенную функцию, параметр parentfpstruct так же передаётся на следующий уровень. Такая цепочная передача переменных позволяет реализовать доступность внешних переменных с любого уровня вложенности.

Для тех платформ, которые не используют стандартный механизм framepointer, необходимо использовать модули ncgnstld (вместо ncgld) и ncgnstmm (вместо ncgmem) и/или переопределить классы, объявленные в этих модулях, чтобы генерировать необходимый для платформы код.


From the Free Pascal wiki, page "FPC JVM/Internals/ru", as it stood on 2015-05-14 after a change by FTurtle, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Версия 1, последнее изменение: WikiArchive, .