Sign in Join
Wiki copytemporary

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.

Revision 1, last changed by WikiArchive .

Talk about this page

Nobody has opened a bench for this page yet. Sign in to open one.