Приложение И. Отличия Free Pascal от Turbo Pascal
(из руководства пользователя Free Pascal версия документа 2.4 март 2010)
В Free Pascal был разработан компилятор, который должен был компилировать как можно больше программ, написанных как для компиляторов Turbo Pascal, так и для Object Pascal, Delphi или Mac Pascal.
В то же время, разработчики Free Pascal ввели множество расширений языка Object Pascal. Для согласования этих различных целей, и чтобы убедиться, что люди могут создавать код, который может компилироваться в Turbo Pascal и Delphi, компилятор поддерживает понятие "режим компиляции". В определенном режиме работы, компилятор имеет включенные или выключенные конкретные возможности. В настоящее время, поддерживаются 5 режимов работы компилятора Free Pascal (рис. И.1., меню Options / Compiler…):
Рис. И.1. Выбор режима работы компилятора
· Free Pascal dialect (FPC). Это оригинальный режим работы компилятора Free Pascal использует по умолчанию: здесь поддерживаются все конструкции языка, за исключением классов, интерфейсов и исключений, но поддерживаются объекты.
· Object Pascal extension on (OBJFPC). Это тот же режим FP, за исключением того, что в нем поддерживаются классы, интерфейсы и исключения.
· Turbo Pascal compatible (TP). Режим совместимости с компилятором Turbo Pascal. В этом режиме, компилятор пытается имитировать компилятор Turbo Pascal, насколько это возможно, компилируя только 32-битный или 64-разрядный код.
· Delphi compatible (DELPHI). Режим совместимости с DELPHI. В этом режиме, компилятор пытается как можно больше походить на компилятор Delphi: Реализованы все возможности Delphi 7, кроме функции, которые были реализованы в .NET версии Delphi.
· Macintosh Pascal dialect (MACPAS). Режим совместимости с Mac Pascal. В этом режиме, компилятор пытается разрешить все конструкции, которые реализуются на языке Паскаль для Mac.
Компилятору можно задать для обработки каждый модуль отдельно: каждый модуль может иметь свой собственный режим компилятора. Режим может быть установлен одним из 2 способов:
1. Через командную строку, с помощью переключателя -M.
Например: fpc –M OBJFPC myunit.
2. В исходном файле модуля или программы, с помощью директивы {$MODE }.
Например так:
{$MODE OBJFPC}
Unit myunit;
…
Оба метода в качестве параметра принимают имя режима. Если исходный текст модуля или программы не определяет режим, то будет использоваться режим указанный в командной строке компилятора. Если же он указан, он перекрывает режим указанный в командной строке.
Директива режима компилятора должна быть расположена перед описанием используемых модулей в интерфейсной части модуля или используемых модулей в программе, потому что настройки режима компилятора. Отметим, что директива {$ MODE} глобальная директива, т. е. она действительна для всего модуля, и может быть указана только одна директива.
Режим компиляции не влияет на доступность модулей: все доступные модули могут быть использованы независимо от режима, который используется при компиляции текущего модуля или программы.
Free Pascal был изначально разработан так чтобы напоминать Turbo Pascal, насколько это возможно. Но есть, конечно, ограничения. Некоторые из них в связи с тем, что Turbo Pascal был разработан для 16-разрядных архитектур, тогда как Free Pascal является 32/64-битным компилятором. Другие ограничения являются результатом того что, что Free Pascal работает на более чем одной операционной системе.
В целом можно сказать, что если вы пишите ваш программный код в Free Pascal близко к ANSI Pascal, у вас не будет проблемы совместимости с Turbo Pascal, или даже Delphi.
Далее будут перечислены конструкции Turbo Pascal и Delphi, которые не поддерживаются в Free Pascal, т.е. то, что не будет работать.
1. Дублирующиеся описания меток разрешается в Turbo Pascal, но не в Free Pascal.
2. В Turbo Pascal, списки параметров ранее определенных функций и процедур, не должны в точности совпадать. В Free Pascal должны. Причиной этого является механизм перегрузки функций Free Pascal.
3. Переменные Turbo Pascal MEM, MEMW, MEML и PORT для памяти и доступ к портам не доступны в модуле system. Это связано с операционной системой. Под DOS, модуль расширения (GO32) реализует поддержку mem . Под LINUX, модуль ports осуществляет такую возможность для переменной Ports.
4. Turbo Pascal позволяет создавать процедуры и переменные с использованием слов, которые не разрешены в этой роли в Free Pascal. Это происходит потому, что есть некоторые слова, которые зарезервированы в Free Pascal (и Delphi), но не зарезервированы в Turbo Pascal, такие как: PROTECTED, PUBLIC, PUBLISHED, TRY, FINALLY, EXCEPT, RAISE.
5. Зарезервированные слова Turbo Pascal FAR, NEAR игнорируются.
6. Turbo Pascal INTERRUPT директивы будут работать во Free Pascal только для целевой платформы DOS . Другие операционные системы не позволяют обработку прерываний пользовательской программой.
7. По умолчанию компилятор Free Pascal использует AT&T синтаксис ассемблера. Главным образом потому, что Free Pascal использует GNU Assembler.
8. Библиотека Turbo Vision из состава Turbo Pascal доступна во Free Pascal под названием FreeVision, которая должна быть почти 100% совместима с Turbo Vision.
9. Модуль ’overlay’ из Turbo Pascal не доступен. Он также не является необходимым, так как Free Pascal является 32/64-bit компилятором, так что размер программы не должен быть проблемой.
10. Параметры командной строки компилятора отличаются.
11. Параметры и директивы компилятора в основном совпадают, но существуют некоторые дополнения.
12. Модули бинарно несовместимы. Это значит, что Вы не можете использовать .tpu файл, созданный компилятором Turbo Pascal, в проекте Free Pascal.
13. Free Pascal структуры для внутреннего описания файлов бинарно не совместимы с TP или Delphi.
14. Наборы по умолчанию имеют размер 4 байта в Free Pascal, а это значит, что некоторые приведения типов, которые были возможны в Turbo Pascal, уже не возможны в Free.
15. Файл открывается только для вывода, когда он открыт с помощью процедуры Rewrite. Для того чтобы иметь возможность читать из него, он должен быть сброшен с помощью Reset.
16. Turbo Pascal позволяет использовать более одного деструктора для объекта. В Free Pascal, может быть только один деструктор.
17. Порядок, в котором вычисляются выражения, не обязательно совпадает. В следующем выражении: a: = g(2)+f(3), не гарантируется, что g(2) будет вычисляться, прежде чем f(3).
18. В Free Pascal, вам нужно использовать оператор адреса @ при присвоении процедурных переменных.
Дополнительно приведем список отличительных особенностей, которые возможны только в Free Pascal, но которые не существуют в Turbo Pascal или Delphi.
1. Функции Free Pascal могут также возвращать составные типы, такие как записи и массивы.
2. В языке Free Pascal можно использовать возвращаемое значение функции как переменную.
3. В Free Pascal, есть частичная поддержка Delphi конструкций.
4. В Free Pascal функция выхода exit принимает параметр, который возвращается функцией.
function a : longint;
begin
a:=12;
if a>4 then
begin
exit(a*67); {функция возвращает a*67 }
end;
end;
5. Free Pascal поддерживает перегрузку функций. Это означает, что Вы можете объявить несколько функций с одним и тем же именем, но с разными аргументами.
procedure Proc1 (a : integer); begin {...} end;
procedure Proc1 (a : real); begin {...} end;
Вы можете вызвать процедуру Proc1 с аргументом типа Integer или Real. Однако при этом процедура или функция должна быть предварительно объявлена и иметь одинаковые заголовки:
procedure x (v : longint); forward;
Обращение к процедуре выполняется следующим образом:
procedure x (v : longint); begin {...} end;
Конструкция procedure x; begin {...} end; вызовет ошибку при компиляции, т.к. компилятор не может найти процедуру procedure x (v : longint);
6. Free Pascal поддерживает перегрузку операторов, например, Вы можете определить оператор "+" для матриц.
7. На системах с файловыми системами FAT16 и FAT32 , поддерживаются длинные имена файлов.
Включение режима совместимости с Turbo Pascal
При компиляции программы с опцией
–M TP
или с директивой
{$MODE TP}
компилятор FP будет пытаться имитировать компилятор Turbo Pascal.