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

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

FPC JVM/Language/ru

English · Русский

Общая информация

Поддержка JVM это пока лишь изменения в компиляторе. А это значит, что портирован только модуль System и модули которые импортируют лишь некоторые JDK классы. Другие RTL модули не доступны. Функционал модуля System так же очень ограничен (подробности ниже).

Со временем, вполне возможно реализовать большинство стандартных модулей RTL таким образом, чтобы они компилировались для JVM платформы. Но это не является целью и баг-репорты о том что какого-то модуля не хватает - особой пользы не принесут. (Но конечно, патчи приветствуются!)

Компиляция в JVM код на данный момент довольно медленная. Причина - используемый Ява ассемблер Jasmin - медленный. И причина не в том, что сам ассемблер написан на Java, а просто потому что он так написан.

Минимальная требуемая версия JDK для программ скомпилированных FPC - 1.5.

Терминология и соглашения

Базовое поведение платформы

По устройству компилятора платформа Java/JVM рассматривается как 32-битная. Это лишь означает, что вся арифметика ориентируется, по умолчанию, на 32-бита, а не 64. Точно так же, как и на нативных платформах, созданный код будет без проблем запускаться и на 64-битных ява-машинах. Компилятор так же будет использовать 64-битные инструкции (опкоды) для 64-битных вычислений.

Причина такого выбора:

Тип extended приравнен к типу double, точно так же, как и на других платформах, не поддерживающих 80-битовые числа с плавающей точкой.

Языковая поддержка

В связи с разницей между JVM и нативными платформами, не все особенности языка FPC могут быть поддержаны на JVM. Языковая конструкция не указанная ниже, при компиляции в JVM работает точно так же и при обычной компиляции. Однако может возникать некоторая разница в производительности и внутренней реализации.

Основные конструкции языка

Неподдерживаемые конструкции

Частично поддерживаемые конструкции

Новые языковые конструкции

pascal
type
JavaClassName = class [external ['package.name'] [name 'ExternalClassName']] [(JavaSuperClassName|ProtocolName [, ProtocolName, ProtocolName])] 
[strict][private, protected, public]
 [variables declarations]
 [method declarations]
end;

Перегрузка

Некоторые различные типы Паскаля и конвенции передачи параметров отображаются в идентичные в JVM. Причина в том, что JVM поддерживает меньше примитивных типов, чем Паскаль, и потому, что некоторые конвенции передачи параметров приходится эмулировать с использованием других типов.

Это означает, что определенные перегрузки, которые действительны при нативной компиляции, являются недействительными при компиляции для JVM, потому что внутреннее имя метода используется для кодирования типов параметров. Компилятор обнаруживает такие ситуации и выдёт ошибку при обнаружении.

Случаи, которые могут возникнуть включают в себя:

Specific language features information

Classes

Classes are implemented as Java classes:

Issues to take into account when using FPC-defined classes from Java code:

java
type
TMyClass = class
constructor Create(l: longint); virtual;
end;
</source>

becomes

<syntaxhighlight lang=java>
class TMyClass {
TMyClass(int l) {
...
}

// the generic parameter declaration means "any class reference
// type for TMyClass or one of its descendants")
static TMyClass Create(java.lang.Class<? extends TMyClass> self, int l)
{
...
}

Интерфейсы (Interface)

Интерфейсы реализованы, используя Ява интерфейсы:

Implicit pointer types

As mentioned in the #Used_terminology_and_conventions, certain types that are not pointer-based in the Pascal language are implemented on top of Java classes or arrays. These data structures are pointers in Java, and as a result we can do some things with them that we cannot do with other types that map more directly onto a Java type.

The implicit pointer types and their corresponding Java representations are listed below:

Specific properties of implicit pointer types are:

Строки

String, unicodestring и java.lang.String

JVM поддерживает только 16-bit unicodestring тип (java.lang.String). По этой причине, unicodestring в целом более эффективен, чем ansistring или shortstring на JVM.

Тип unicodestring напрямую перенесён в тип java.lang.String. Что так же означает, что если ваш код будет использоваться другим Ява-кодоам, все публичные строковые параметры и константы должны быть объявлены как unicodestring, а не какой-либо другой строковый тип.

Чтобы использовать тип unicodestring по-умолчанию, была добавлена директива компиляции {$modeswitch unicodestrings}. Если директива объявлена ВМЕСТЕ с директивной {$h+}, тип string преобразуется в тип uncodestring по-умолчанию, а char в тип widechar. Подобное преобразование происходит в Delphi 2009, затем исключением, что modeswitch действует на 1 модуль а не на весь код.

Если {$modeswitch unicodestrings} использован с {$h-}, тогда string тип преобразуется в shortstring, но тип char становится widechar. Для синтаксиса {$mode delphi} режим {$h+} включается по-умолчанию.

Кодировка Ansistring и shortstring

"ansi" кодировка устанавливается java программе при запуске. Кодировка устанавливается в зависимости от кодировки выбранной в операционной системы, в которой запущена программа Linux или Windows. Для Mac OS X, по причинем обратной совместимости кодировка всегда MacRoman, и скорее всего, эту кодировку вы использовать не хотите. Для дополнительной информации о кодировке см. Usage instructions.

String conversions

The compiler will implicitly convert any string type to java.lang.String and vice versa.

Type aliases and subrange types

The JVM supports neither type aliases nor subrange types. As a result, none of the marked type definitions in the following example will be visible to Java code. Of course, they still work as expected in Pascal code.

pascal
type
  tc = class
  end;

  tenum = (ea,eb,ec);

  tc2 = tc;         // Pascal-only
  intsub = 3..41;   // Pascal-only
  enumsub = eb..ec; // Pascal-only

From the Free Pascal wiki, page "FPC JVM/Language/ru", as it stood on 2020-02-16 after a change by Trev, 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, .