Free Pascal Compiler FAQ |
20.05.2005 Иван Шихалев |
Ответы на часто возникающие вопросы по компилятору Free Pascal, языку и стандартным библиотекам.
Free Pascal как и всякий живой открытый проект непрерывно развивается. Постоянно добавляются новые возможности и исправляются ошибки. Соответственно версий становится все больше и больше. Благодаря продуманной нумерации ориентироваться в них достаточно просто.
Вывод можно сделать следующий: если вы используете Free Pascal в своих проектах и не желаете самостоятельно вылавливать баги в исходниках, то следует качать версии с нулем во второй позиции (точнее — с четной цифрой, поскольку не исключено, что следующий релиз таки будет 2.2, а не 3.0), если очень не терпится, то с девяткой на свой страх и риск. Если же есть желание поучаствовать в развитии Free Pascal, то берем текущую версию с единичкой (другой нечетной цифрой) во второй позиции, качаем исходники и вперед.
Общий смысл примерно тот же: четная версия стабильная, нечетная — нет. Но в данном случае четная означает, что компилятор собран и проверен авторами, тогда как нечетная — автоматическая сборка из текущих исходников и может вообще отказаться работать. Кроме того, если третья цифра нечетная, то одна и та же версия, скачанная в разные дни — на самом деле две разных версии: последняя цифра не меняется, пока авторы не решат собрать «четный» дистрибутив.
Snapshot в переводе с английского — снимок. В разработке ПО данный термин означает текущее (с точностью до дня) состояние проекта. На сайте freepascal.org можно встретить упоминания о «source snapshot» и «binary snapshot»: первое — исходники на текущий момент, а второе — автоматическая сборка, сделанная из этих исходников. С одной стороны, использование таких снимков — самый быстрый способ получить исправление какой-то ошибки (на следующий день после того, как она исправлена), но с другой — «binary snapshot» может вообще отказаться работать, а «source» даже и компилироваться. В общем, третья цифра версии в данном случае — нечетная.
Старые версии доступны на FTP сервере Free Pascal и на его зеркалах. Адрес на главном сервере — ftp://ftp.freepascal.org/pub/fpc/olddist/, на зеркалах — аналогично, т.е. следует искать директорию 'olddist'.
Большой размер возникает по нескольким причинам:
{$smartlink on}
или ключом командной строки -CX
. Иногда, особенно в нестабильных версиях, стандартные модули скомпилированы иначе. Так это или нет, можно узнать поискав файлы вида libp<имя модуля>.a
— если такой файл существует, то модуль скомпилирован правильно. Кроме того, следует проверить опции компилятора в командной строке и файле fpc.cfg
: чтобы компилятор старался использовать smartlink везде, где это возможно, должна использоваться опция -XX
.sysutils.pp
), а так же .inc-файлы, которые он использует, и выставить в нем соответствующую директиву. Главный недостаток этого способа — с модулем System такое не пройдет, а он «весит» более 100 килобайт.
-g…
, и на наличие -Xs
. Первый указывает включать отладочную информацию, второй — исключить из исполняемого файла информацию о символах, используемую компоновщиком. Если конфигурационный файл стандартный, то можно использовать ключ -dRELEASE
в командной строке, который указывает, как обращаться с вышеупомянутыми ключами.-Xs
в командной строке компилятора). Если размер важен, под Win32 следует пользоваться утилитой strip.
Кроме того, по умолчанию FPC оптимизирует код в сторону ускорения, а не уменьшения. Если размер более критичен, то можно использовать ключ -Og
, и оптимизация пойдет на размер.
Дополнительно можно сжать результирующий бинарник утилитой типа UPX.
В настоящий момент (версия 2.0) для скачивания предлагаются варианты для следующих платформ (процессор/OS):
Однако надо заметить, что работы по портированию продолжаются, и что более старые версии поддерживали и другие платформы, такие как DOS, Solaris, OpenBSD и т.д. По всей видимости в ближайшее время для них выйдет и версия 2.0. Так что данный список будет обновляться, следите.
Динамические библиотеки создаются точно так же, как в Delphi — основной исходный файл начинается с ключевого слова library
вместо program
; затем идет секция uses
; затем, возможно, объявления переменных, функций и т.д.; и наконец — секция exports
.
В секции exports
через запятую перечисляются имена экспортируемых функций и процедур, при необходимости — с явным указанием имени. Пример секции exports
:
exports MyFunc, MyOtherFunc, MyProc name 'myProc';
Важно: имена экспортируемых функций и процедур зависят от регистра, т.е. — MyFunc
и myFunc
будут разными именами.
В целом, использование внешних функций так же аналогично Delphi. Существует два способа загрузки:
external 'libname'
. Например:
function MyFunc (Param : Integer) : Integer; external 'mylib';В этом случае, как и при создании библиотеки можно явно указать имя загружаемой функции:
function MyFunc (Param : Integer) : Integer; external 'mylib' name 'myFunc';Следует отметить отличие от Delphi — в последней возможно объявить в разделе Interface просто функцию как таковую, а директиву
external
указать уже в Implementation. FPC же требует сразу указать данную директиву — в Implementation такая функция уже вовсе не фигурирует.
LoadLibrary
, GetProcedureAddress
и FreeLibrary
из модуля dynlibs
. В принципе, можно воспользоваться, например, соответствующими функциями из модуля windows
, однако такое решение будет привязано к одной платформе. Рекомендуется все-таки использовать кроссплатформенный модуль dynlibs
.LoadLibrary
;GetProcedureAddress
— и присваиваем его нашей переменной;FreeLibrary
.Важно: разные системы программирования, и даже разные версии Free Pascal, используют по умолчанию различные соглашения о вызове функций (FPC 1.0 — stdcall
, а FPC 2.0 — register
). Поэтому, настоятельно рекомендуется при экспорте/импорте функций указывать тип вызова явно.
Вообще говоря, нельзя. Длинные строки и динамические массивы используют динамическую память, причем перераспределение ее происходит неявно и программистом не контролируется. Тем не менее это ограничение можно снять. Подробности см. в материале «Разделяемая память в FPC»
Скорее всего — не установлен режим совместимости. Для Delphi это — {$MODE DELPHI}
или -Mdelphi
в командной строке, а для Turbo Pascal — {$MODE TP}
или -Mtp
. Если хочется частичной совместимости с Delphi и в то же время расширений типа перегрузки операторов, можно попробовать режим OBJFPC, который, однако несколько отличается от Delphi в тонкостях...
Кроме того, надо помнить, что во Free Pascal реализованы не все возможности Delphi — в частности, нет dispinterface
, implements
и автоматизированного вызова методов интерфейса через variant
. О расширениях языка, появившихся в Dephi после 5 версии, пока и речи нет.
Что касается проблем с модулями и программами Turbo Pascal, как правило они связаны с низкоуровневыми вызовами. Надо помнить, что Free Pascal — 32-х разрядный компилятор, кроме того, некоторые вещи, нормальные для DOS, никак не допустимы в Win32 (например).
Если используются ассемблерные вставки, следует помнить, что Free Pascal понимает два синтаксиса ассемблера: Intel (как в Delphi и Turbo Pascal) и AT&T (совсем иначе). Причем по умолчанию используется AT&T-синтаксис. Синтаксис Intel выбирается директивой {$ASMMODE INTEL}
или ключом командной строки -Rintel
.
Рекомендуется прочитать статьи «Режимы компиляции» по поводу совместимости с Delphi и TP, а также «Использование ассемблера с Free Pascal».
В отличие от Delphi, Free Pascal по умолчанию трактует тип string
как короткую (shortstring
или string[255]
), а не как длинную (ansistring
) строку. Чтобы это исправить, следует использовать директиву {$LONGSTRINGS ON}
или ключ командной строки -Sh
.