Публикации FreePascal

Что такое Free Pascal, и с чем его едят?

18.04.2005
Иван Шихалев

Free Pascal, иначе называемый FPC (Free Pascal Compiler) — это 32х-разрядный, кросс­плат­фор­мен­ный компилятор языка Pascal. В настоящем обзоре я рассмотрю его основные ха­рак­те­рис­ти­ки и возможности. Free Pascal относится к категории сво­бод­но­го программного обес­пе­че­ния (free software) и распространяется по лицензии GNU.


Кроссплатформенность

Итак, что в данном случае понимается под кроссплатформеностью? Довольно-таки большое ко­ли­чес­тво платформ, однако. Во-первых, это два типа процессора:

  • i386 — процессоры Intel серии 80x86, начиная с 80386;
  • m68k — процессоры Motorola серии m68k, соответственно.

Для i386 поддерживаются следующие операционные системы:

  • BeOS
  • BSD Unix, а именно:
    • FreeBSD
    • NetBSD
    • OpenBSD
  • DOS32, т.е. DOS с расширителем для 32х-разрядного защищенного режима. В версии компилятора 1.0.10 поддерживаются расширители:
    • Go32v1 — DJ Delorie DOS extender версии 1
    • Go32v2 — DJ Delorie DOS extender версии 2
  • Lunux
  • OS/2
  • QNX
  • SunOS/Solaris
  • Win32

Для m68k:

  • Amiga
  • Atari
  • PalmOS

Версия 1.1 (находящаяся в состоянии разработки нестабильная ветвь) также поддерживает:

  • OS/2 via EMX
  • Nowell Netware
  • MacOS
  • WDOSX DOS extender

Надо заметить, что поддержка некоторых целевых платформ в нестабильной версии на­хо­дит­ся в состоянии разработки и не впол­не пригодна для серьезной работы. Также в ветке 1.1 идет разработка компиляции для Linux и других ОС на отличных от i386 и m68k типах про­цес­со­ров, таких как PowerPC, Sparc и 64х-разрядные процессоры линии x86.

Непосредственно кросскомпиляция поддерживается, однако возникают серьезные про­бле­мы. Так, например, мне не удалось ском­пи­ли­ро­вать ассемблерные части RTL для Linux ис­поль­зуя версии binutils для DOS и Windows.


Возможности языка

В целом возможности языка ориентированы на развитые "промышленные стандарты", а не на ANSI-стандарт языка, как GNU Pascal. Промышленным же стандартом языка Pascal в нас­тоя­щее время является его диалект Object Pascal от фирмы Borland. Кро­ме того, Free Pascal под­дер­жи­ва­ет дополнительные расширения, нехарактерные для Borland Delphi.

Версия 1.0.10 поддерживает следующие возможности:

  • Object Pascal на уровне Delphi 3, и немного от Delphi 4:
    • Объектные типы, в том числе классы;
    • Длинные строки;
    • "Широкие" строки с поддержкой UNICODE. Впрочем, полной поддержки различных кодовых страниц на данный момент нет, т.е. автоматическое преобразование WideString -> AnsiString и наоборот корректно выполняется только для символов Latin-1;
    • Перегрузка (overloading) функций и процедур.
  • Дополнительные расширения:
    • Перегрузка операторов сравнения (<, >, =, <=, >=), арифметических (+, -, *, /, **, div, mod), и оператора присваивания (:=);
    • Поддержка inline-функций и процедур — в отличие от Borland Pascal, такие подпрограммы не требуется писать в машинных кодах;
    • Поддержка примитивных макросов;
    • Поддержка операторов присваивания с выполнением некоторого арифметического действия (+=, -=, *=, /=).

В версии 1.1 добавлены средства языка из старших версий Borland Delphi:

  • Динамические массивы;
  • Интерфейсы.

В настоящий момент все перечисленные средства языка работают удовлетворительно, хотя мож­но выделить пару проблем: во-пер­вых, незавершено автопреобразование строк UNICODE, и во-вторых, реализация интерфейсов допускает не­со­от­вет­ствие тре­бо­ва­ни­ям мо­де­ли COM — единственность ссылки на IUnknown должна отслеживаться разработчиком.


Компиляция

Компиляция происходит весьма быстро, поскольку, как и положено компилятору Pascal, Free Pascal работает в один проход. Так, на­при­мер, полная сборка самого компилятора на моем ком­пью­те­ре (Celeron 600) занимает около полутора минут.

Для сборки объектных файлов, получающихся в результате компиляции, вызывается внеш­ний компоновщик — GNU ld (или ldw для Windows-платформы). Вообще, дистрибутив Free Pascal попросту включает в себя пакет GNU BinUtils, частью которого яв­ля­ет­ся ld. Также дан­ный пакет включает в себя кроссплатформенный ассемблер as (asw), GNU make, ком­пи­ля­тор ресурсов для Win32 — windres и другие программы.

Встроенный компоновщик планируется в следующих версиях компилятора, однако ход ра­бот в этом направлении мне неизвестен.

Компилятор командной строки для платформ i386 называется ppc386 (ppc386.exe для DOS и Windows). В дистрибутив входит так­же "загрузчик" (loader) компилятора, называемый, для лю­бо­го процессора, fpc (fpc.exe). Таким образом, на любой платформе мож­но использовать в ко­манд­ной строке fpc <имя файла>.

Компилятор Free Pascal использует оптимизацию. Хотя она и уступает интеллектуальной оп­ти­ми­за­ции компилятора того же Delphi, од­на­ко рутинную, формальную оптимизацию FPC та­ки выполняет. В частности, можно указать целевой процессор, чтобы ис­поль­зо­вать рас­ши­рен­ный набор команд, отсутствующих в i386, например, команды Pentium II. Для вычислений мож­но задействовать на­бор команд MMX или XMM.


Стандартные модули

В состав дистрибутива входят модули, реализующие основную функциональность. Кон­крет­ный состав модулей зависит от плат­фор­мы. Кроме ядра RTL, дистрибутив включает в себя до­пол­ни­тель­ные модули, на­зы­ва­емые "пакетами" (packages), со­дер­жа­щие, на­при­мер, ин­тер­фейс к API SQL-сервера InterBase (пакет ibase), или функции работы с регулярными вы­ра­же­ни­ями (пакет regexpr).

Также наличествует некоторый аналог VCL, точнее ее ядра — основных классов и модулей биб­лио­те­ки. Библиотека на­зы­ва­ет­ся FCL — Free Component Library. Содержит как от­но­си­тель­но примитивные классы, a-la TStringList, так и классы для ра­бо­ты с ба­за­ми данных. Впро­чем, модули FCL в настоящее время явно недоработаны — содержат пробелы в функ­цио­наль­нос­ти и не­ко­то­рые баги.


Документация

В целом, Free Pascal весьма хорошо документирован.

Документация к версии 1.0.10 состоит из шести частей и распространяется в различных фор­ма­тах, в том числе — исходники LaTeX. В состав дистрибутива входит документация в виде PDF и HTML. Ниже — описание частей документации.

Free Pascal : Reference guide

Справочное руководство. Содержит описание языка и модуля System. Также описывается модуль ObjPas, автоматически под­гру­жа­емый (аналогично System) при выборе режима ком­пи­ля­ции Delphi, или ObjFPC.

Free Pascal : Users' manual

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

Free Pascal : Programmers' manual

Руководство программиста. Описываются режимы компиляции, директивы компилятора, во­про­сы распределения памяти, ком­по­нов­ки, использования ассемблера и так далее.

Free Pascal supplied units : Reference guide

Справочное руководство по стандартным модулям. Довольно подробно описываюся модули RTL, за исключением тех, которые яв­ля­ют­ся интерфейсами к API операционных систем и их ком­по­нент.

Free Component Library (FCL) : Reference guide

Справочное руководство по FCL. В настоящий момент содержит описание классов модуля Classes. По всей видимости, в даль­ней­шем будет расти вместе с доработкой самой FCL. По край­ней мере, я на это надеюсь.

FPDoc : Free Pascal code documenter : Reference manual

Руководство по использованию утилиты для автодокументации fpcdoc, входящей в состав дист­ри­бу­ти­ва.


IDE и утилиты

Вместе с компилятором распространяется IDE (интегрированная среда разработки — In­te­gra­ted Development Environment) тек­сто­во­го режима, похожее на IDE Turbo/Borland Pascal. В нас­тоя­щее время, стабильные версии IDE, насколько мне известно, су­щес­тву­ют только для DOS и Win32, работа над вариантами для других платформ еще не закончена. IDE содержит встро­ен­ную систему отладки — если я не ошибаюсь, с использованием отладчика GNU GDB, — и встроенную справку.

О стабильности IDE, к сожалению, приходится говорить с некоторой натяжкой — проблемы су­щест­ву­ют. Однако, в целом поль­зо­вать­ся можно.

Также в состав дистрибутива входят следующие утилиты:

  • data2inc — преобразует произвольный файл во включаемый файл (.inc) для FPC, где соответсвующие данные представлены в виде константы-массива.
  • delp — очищает каталог от "временных" файлов, возникающих при компиляции, таких как объектные файлы модулей и .ppu.
  • fpcmake — используется для подготовки make-файлов для GNU make.
  • fpdoc — генерирует документацию из модулей Free Pascal в форматах HTML и LaTeX.
  • fpmc — компилятор msg-файлов.
  • fprcp — pascal-препроцессор для windres.
  • h2pas и h2paspp — транслятор заголовочных файлов C и C++ в модули Pascal.
  • makeskel — утилита для подготовки скелета xml-описания для fpdoc.
  • ppdep — позволяет получить список модулей, от которых зависит некий данный.
  • ppudump — извлекает информацию из .ppu-файлов.
  • ppufiles — то же, что ppdep, но не для исходных модулей, как тот, а для .ppu-файлов.
  • ppumove — позволяет собирать библиотеки из .ppu.
  • ptop — форматирование исходников.
  • rstconv — конвертирует файлы .rst, создаваемые компилятором для строк, описанных как resourcestring, в формат GNU gettext .po.

Кроме вышеперечисленных, относящихся собственно к Free Pascal, утилит, в дистрибутив вхо­дит, как уже упоминалось, пакет GNU BinUtils.

В настоящий момент находится в процессе разработки RAD для Free Pascal — IDE Lazarus. Су­щест­ву­ет рабочая версия для Linux. Версия для Win32 пока не работает.


Лицензия

Free Pascal распространяется под лицензией GNU GPL (GNU General Public License), вхо­дя­щие в состав дистрибутива биб­ли­о­те­ки модулей — под лиценизией GNU LGPL (GNU Lesser Public License). Таким образом, программы, написанные на Free Pascal, мо­гут рас­про­стра­нять­ся каким угодно образом, в том числе — и закрытым, а исходники самого компилятора дос­туп­ны для из­ме­не­ния и использования с сохранением условий GNU GPL.


Источники в InterNet

Основной источник информации — официальный сайт Free Pascal — www.freepascal.org, а так­же его зеркала, в том числе — на­хо­дя­ще­е­ся в России — www.ru.freepascal.org. On-line до­ку­мен­та­ция находится по адресу www.freepascal.org/docs.html.

Домашняя страница GNU BinUtils — sources.redhat.com/binutils.

Информацию о лицензиях и идеологии GNU следует искать на официальном сайте GNU Project — www.gnu.org.

Дистрибутивы и/или исходники рекомендую скачивать с ftp-зеркала в Черноголовке — ftp.chg.org/pub/lang/pascal/fpc.

Официальный сайт проекта Lazarus — lazarus.freepascal.org

Актуальные версии
FPC3.0.0release
Lazarus1.6release
MSE4.2release
fpGUI1.4.1release
наши спонсоры ;)