Попытался сделать перевод на русский статьи, которая, на мой взгляд, будет очень полезна для переходящих на FPC. Перевод пока, что называется "на скорую руку" сделан - возможны неточноти, ошибки, и еще некоторые пункты так "с лёту" перевести не получилось
Но, надеюсь со временем и вашей помощью статья исправится, допишется, возможно даже кто-то сможет добавить какие-то свои замечания/наблюдения.
Оригинал: Porting Turbo Pascal to Free Pascal
Мой перевод:
Портирование приложений с Turbo Pascal на Free Pascal.
Этот документ содержит некоторую информацию о различиях между Free Pascal`ем и Turbo Pascal 7.0. Этот список не полный.
Assembler
* Ассемблер по-умолчанию использует другой синтаксис, но вы можете переключиться на синтаксис Intel (который использует Turbo Pascal) путем добавления ключа -Rintel при компиляции или добавлением {$asmmode intel} в ваш исходник.
* 32-битная модель памяти требует полного переписывания ваших ассемблерных блоков.
Run time библиотеки
* Чтобы пользоваться массивом PORT, добавьте мудль Ports к вашим используемым модулям (доступно только под Dos/Go32v2 и Linux).
* Вы можете обращаться к памяти в real mode используя MEM[seg:ofs] (так же как MemW и MemL) только под Go32v2.
* Ofs() возвращает longint а не word.
* Модуль OVERLAY не доступен.
* Поддержка Turbo Vision осуществляется Free Vision; клон, потому что оригинальный Turbo Vision все еще не доступен свободно (авторские права на него еще принадлежат Borland).
Препроцессор/Синтаксис
* Если вы будете использовать ключ -So (или добавите {$mode TP} в ваш исходник), компилятор перейдет в режим совместимости с Turbo Pascal, который сделает недоступными некоторые продвинутые особенности FPC (как например перегрузка процедур) для обеспечения лучшей совместимости с Turbo Pascal.
* Вложенные комменатрии разрешены, но вы получите Note при компиляции (отключено в режиме TP).
Синтаксис
* FAR и NEAR игнорируются.
* Чтобы получить адрес процедуры для назначения его переменной процедуры вы должны использовать @-оператор (в TP режиме, переменные процедуры работают как в TP).
* INLINE поддерживается компилятором, но может использоваться только для кода паскаля, не для байткода.
* Заголовки процедур/функций, которые были объявлены в начале всегда должны полностью переписываться в определении, иначе компилятор будет думать, что они перегружены (не требуется, если используете -So).
* Здесь гораздо больше зарезервированных слов.
* Некоторые расширения Delphi поддерживаются частично.
Семантика
* Максимальный размер параметра, который можно передать к подпрограмме, составляет 64 КБ для версии Intel и 32 КБ для версий Motorola.
* Записи всегда выравниваются по словам; используйте 'packed record' или {$PACKRECORDS 1} чтобы получить записи, совместимые с TP7. Небольшое предупреждение: используйте packed только если вам действительно это надо, поскольку non-alignment of fields может не работать на не-Intel процессорах (и замедлит доступ к данным практически во всех случаях).
* Предупреждение: currently all sets in FPC are either longint or 32 byte sized, whereas TP sets usually are byte or word sized. A current work around for this is declaring your sets as a byte/word and then use the bit manipulation unit available on the contributions page to manually include/exclude items. Of course, this is only necessary if you need TP compatible records, otherwise you can use the standard FPC sets.
* Function results can also be complex types like arrays or records (not in TP mode).
* It's possible to handle the function result in a function like a variable (not in TP mode):
* Вышеупомянутый пример работал бы с TP, но компилятор предположит, что a>4 является рекурсивным вызовом. Чтобы сделать рекурсивный вызов в FPC, Вы должны добавить () после названия функции (не в режиме TP):
* Определяемые в начале функции, всегда должны определяться с полным заголовком (не в режиме TP):
* Всегда короткое определение булевых переменных (для TP режима тоже!!).
Другое
* Параметры командной строки различаются.
* Не все ключи компилятора полностью реализованы.
* Бинарные модули не совместимы.
Оригинал: Porting Turbo Pascal to Free Pascal
Мой перевод:
Портирование приложений с Turbo Pascal на Free Pascal.
Этот документ содержит некоторую информацию о различиях между Free Pascal`ем и Turbo Pascal 7.0. Этот список не полный.
Assembler
* Ассемблер по-умолчанию использует другой синтаксис, но вы можете переключиться на синтаксис Intel (который использует Turbo Pascal) путем добавления ключа -Rintel при компиляции или добавлением {$asmmode intel} в ваш исходник.
* 32-битная модель памяти требует полного переписывания ваших ассемблерных блоков.
Run time библиотеки
* Чтобы пользоваться массивом PORT, добавьте мудль Ports к вашим используемым модулям (доступно только под Dos/Go32v2 и Linux).
* Вы можете обращаться к памяти в real mode используя MEM[seg:ofs] (так же как MemW и MemL) только под Go32v2.
* Ofs() возвращает longint а не word.
* Модуль OVERLAY не доступен.
* Поддержка Turbo Vision осуществляется Free Vision; клон, потому что оригинальный Turbo Vision все еще не доступен свободно (авторские права на него еще принадлежат Borland).
Препроцессор/Синтаксис
* Если вы будете использовать ключ -So (или добавите {$mode TP} в ваш исходник), компилятор перейдет в режим совместимости с Turbo Pascal, который сделает недоступными некоторые продвинутые особенности FPC (как например перегрузка процедур) для обеспечения лучшей совместимости с Turbo Pascal.
* Вложенные комменатрии разрешены, но вы получите Note при компиляции (отключено в режиме TP).
Синтаксис
* FAR и NEAR игнорируются.
* Чтобы получить адрес процедуры для назначения его переменной процедуры вы должны использовать @-оператор (в TP режиме, переменные процедуры работают как в TP).
| Код |
|---|
procedure p; begin end; var proc : procedure; begin proc:=@p; end; |
* INLINE поддерживается компилятором, но может использоваться только для кода паскаля, не для байткода.
* Заголовки процедур/функций, которые были объявлены в начале всегда должны полностью переписываться в определении, иначе компилятор будет думать, что они перегружены (не требуется, если используете -So).
* Здесь гораздо больше зарезервированных слов.
* Некоторые расширения Delphi поддерживаются частично.
Семантика
* Максимальный размер параметра, который можно передать к подпрограмме, составляет 64 КБ для версии Intel и 32 КБ для версий Motorola.
* Записи всегда выравниваются по словам; используйте 'packed record' или {$PACKRECORDS 1} чтобы получить записи, совместимые с TP7. Небольшое предупреждение: используйте packed только если вам действительно это надо, поскольку non-alignment of fields может не работать на не-Intel процессорах (и замедлит доступ к данным практически во всех случаях).
| Код |
|---|
type
r1=record
a : byte;
b : word;
end;
r2=packed record
a : byte;
b : word;
end;
begin
writeln(sizeof(r1)); { outputs 4 }
writeln(sizeof(r2)); { outputs 3 }
end.
|
* Предупреждение: currently all sets in FPC are either longint or 32 byte sized, whereas TP sets usually are byte or word sized. A current work around for this is declaring your sets as a byte/word and then use the bit manipulation unit available on the contributions page to manually include/exclude items. Of course, this is only necessary if you need TP compatible records, otherwise you can use the standard FPC sets.
* Function results can also be complex types like arrays or records (not in TP mode).
* It's possible to handle the function result in a function like a variable (not in TP mode):
| Код |
|---|
function a : longint;
begin
a:=12;
while a>4 do
begin
{...}
end;
end;
|
* Вышеупомянутый пример работал бы с TP, но компилятор предположит, что a>4 является рекурсивным вызовом. Чтобы сделать рекурсивный вызов в FPC, Вы должны добавить () после названия функции (не в режиме TP):
| Код |
|---|
function a : longint;
begin
a:=12;
{ v---- this is a recursive call }
if a()>4 then
begin
{...}
end;
end;
[code]
[b]*[/b] Процедура exit может так же использоваться с function result как параметр:
[code] function a : longint;
begin
a:=12;
if a>4 then
exit(a[b]*[/b]67);
end;
|
* Определяемые в начале функции, всегда должны определяться с полным заголовком (не в режиме TP):
| Код |
|---|
procedure x(v : longint);forward;
procedure x; { this overloads the procedure x !!!!}
begin
{ ... }
end;
{ write instead: }
procedure x(v : longint);
begin
{ ... }
end;
|
* Всегда короткое определение булевых переменных (для TP режима тоже!!).
Другое
* Параметры командной строки различаются.
* Не все ключи компилятора полностью реализованы.
* Бинарные модули не совместимы.
Изменено:
Андрей - 02.12.2009 01:13:41