Публикации FreePascal

Free Pascal: Свободный софт для свободных людей

26.02.2006
Анатолий Камынин

Статья с сайта http://www.tiflocomp.ru/

Читать или не читать?..

Начнем, пожалуй, с оператора if...then...else.

Если вы не программируете на Паскале и в обозримом будущем не собираетесь этим заниматься, то, скорее всего, все, о чем здесь пойдет речь, будет для вас малопригодным.

Если вы уже знакомы с Free Pascal и применяете этот компилятор, разрабатывая собственные программы, то для вас, должно быть, нижеследующее повествование будет скучным.

Для всех остальных, надеюсь, рассказ о Free Pascal окажется полезным. Не зря же говорят, что чем больше информации, тем выше уровень свободы( или энтропии?..).

Помимо всего прочего, Free Pascal потенциально может быть интересен незрячим программистам, поскольку позволяет создавать современные и качественные программы, используя компилятор в режиме командной строки.

Отсутствие платы за лицензию и открытость исходных кодов Free Pascal дают возможность использовать его в школах и университетах. Также Free Pascal может заинтересовать тех разработчиков, которых волнуют вопросы юридической чистоты создаваемых программных продуктов.

Напутственное

Разговор наш пойдет о компиляторе Free Pascal Compiler (FPC), который распространяется группой разработчиков по общественной лицензии GNU. Лицензия эта подразумевает, в частности, что для Free Pascal открыты и общедоступны исходные коды, а их распространение и модификация (при условии соблюдения лицензии) ничем не ограничены. Входящие в состав дистрибутива пакеты и библиотеки имеют лицензию LGPL (GNU Lesser Public License), что позволяет распространять скомпилированные программы на любых (в том числе и коммерческих) условиях. В дополнение к этому, Free Pascal можно получить совершенно бесплатно, то есть даром (вернее, на что вам придется раскошелиться, так это на оплату соединения через интернет для загрузки дистрибутива на свой компьютер).

По давно устоявшейся традиции, разработчики этого программного обеспечения ничего вам не гарантируют, дистрибутив и исходные коды отдают вам в том виде, каком они существуют (то есть если в них есть ошибки, то они там есть... если нет ошибок, то нет...). Все, что вы будете делать с программным обеспечением, вы будете делать на свой страх и риск. Следуя этой традиции, добавлю, что и вся эта статья предоставлена вам на таких же условиях.

Примечание: все необходимые ссылки собраны в заключительном разделе этой статьи.

К чему он пригоден?..

Читая документацию по Free Pascal, то и дело натыкаешься на слово "Delphi". Речь идет о совместимости Free Pascal с Delphi, причем это настолько завораживает, что поначалу пояснения о том, что совместимость поддерживается лишь на уровне языка программирования, не воспринимаются всерьез. Как всегда, хочется всего сразу и бесплатно. Так что если для вас программирование в среде Delphi сводится к "мышиной" возне с формами и "кидании" компонентов из одного угла экрана в другой, то, подозреваю, Free Pascal вас разочарует. Ничего подобного Free Pascal не содержит. Вернее сказать, среда быстрой разработки приложений -- это другой программный продукт и, следовательно, тема для другого разговора.

Здесь же начнем с того, что Free Pascal -- это 32-разрядный компилятор. Мощный, быстрый (компиляция выполняется за один проход), многоплатформенный. Он поддерживает и расширяет синтаксис промышленных стандартов языка Паскаль: Turbo Pascal 7.0 и Object Pascal (тот самый, который используется в качестве языка программирования в среде Delphi). Для Turbo Pascal декларируется почти полная совместимость, а для Delphi - совместимость с большинством версий, включая Delphi 7 (классы, rtti, исключения, ansistrings, widestrings, интерфейсы). В дистрибутиве для Apple предусмотрен режим совместимости с Mac Pascal. Кроме того, Free Pascal реализует перегрузку функций, перегрузку операторов, глобальные свойства и некоторые другие самобытные возможности.

Free Pascal поддерживает компиляцию кода для процессоров Intel, начиная с i386, AMD64 or EMT64, PowerPC, SPARC, Intel ARM. На сегодняшний день существуют или находятся в разработке релизы Free Pascal для следующих операционных систем: Dos (с поддержкой 32-разрядных расширений), Linux, Mac OS X/Darwin, Mac OS classic, Amiga (только версия 0.99.5), Win32, os/2, FreeBSD, BeOS, Solaris , PalmOS , NetBSD, Netware, OpenBSD, MorphOS.

Сейчас последней и рекомендуемой к использованию является версия 2.0.2, вышедшая в ноябре 2005 г. Для каждой из поддерживаемых платформ существует свой дистрибутив Free Pascal. В дальнейшем речь пойдет о пакете, предназначенном для семейства ОС Win32.

На уровне исходного кода приложения, разработанные при помощи Free Pascal, являются переносимыми (портируемыми) между поддерживаемыми платформами. Степень переносимости тем выше, чем больше приложение ориентировано на использование входящих в состав Free Pascal модулей (имеются в виду модули, общие для всех поддерживаемых платформ).

Free Class Library

Вернемся еще раз к вопросу совместимости Free Pascal и Delphi. Полагаю, что справедливей будет говорить о легкости/трудности перехода от Delphi к Free Pascal и легкости/трудности переноса существующих исходных кодов. При таком подходе нельзя не сказать о библиотеке Free Class Library (FCL), входящей в состав дистрибутива Free Pascal. Эта библиотека содержит аналоги невизуальных компонентов Delphi. Здесь широко представлены средства доступа к различным базам данных (в том числе Interbase, mysql, ODBC и др.), средства работы с XML и средства работы с интернет. В некоторых случаях совместимость с компонентами Delphi доведена вплоть до совпадения имен классов и методов.

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

В дистрибутив Free Pascal для Win32 включена документация на английском языке, представленная в формате pdf. На сайте разработчиков также доступна он-лайн документация и архивы с документацией в формате html и в виде обычного текстового файла.

В состав документации входят руководство пользователя, руководство программиста, справочник по диалекту языка Паскаль, который поддерживается Free Pascal, справочник по опциям командной строки,справочник по модулям и функциям встраиваемых библиотек и руководство по созданию документации.

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

Прибавления

Кроме компилятора, в состав пакета входят дополнительные утилиты, призванные подсобить в разработке приложений. Среди них:

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

Интегрированная среда разработки

Единственное, что не устроило меня во Free Pascal, это интегрированная среда разработки. Дело в том, что она малопригодна для работы незрячих программистов, поскольку реализована в виде консольного приложения. Напомню, что консольным называется такое приложение, которое не использует графический интерфейс, а работает исключительно в текстовом режиме. При этом такое приложение может быть 32-разрядным приложением Windows (а не только DOS-программой). Не секрет, что консольное окно, мягко говоря, недостаточно озвучивается скринридерами (например, Jaws for Windows). Ситуация осложняется еще и тем, что внешне среда разработки Free Pascal выглядит подобно среде разработки Turbo Pascal (то есть имеет меню, диалоги, множество окон, реализованных в текстовом режиме). Однако скринридеры, работающие под DOS, здесь тоже не помогут, так как это приложение Windows.

С точки зрения разработчиков Free Pascal, такой подход, возможно, и оправдан: консоль есть практически во всех операционных системах, а графический интерфейс только в некоторых. Но в данном случае приходится признать, что интегрированная среда Free Pascal для незрячих недоступна.

Впрочем, выход есть всегда . Free Pascal может выполнять компиляцию и сборку программ из командной строки. То есть вы можете для подготовки исходных текстов использовать наиболее удобный для вас текстовый редактор, который позволяет редактировать обычный текст (plain text) в кодировке ANSI, а компилировать программы можно, запуская специально подготовленный bat-файл или используя утилиту make, входящую в состав Free Pascal. Такой способ может показаться непривычным для пользователей Windows, програмирующих в среде Delphi, но для пользователей Linux - это в порядке вещей. Ниже будут приведены два примера (консольное приложение и GUI-приложение), иллюстрирующих такой подход.

Также следует заметить, что уже существуют многочисленные (в том числе и бесплатные) текстовые редакторы, представляющие собой не слишком изощренную среду разработки программ. Некоторые из них вполне доступны для чтения программой Jaws for Windows. В таких редакторах выполняется цветовое выделение синтаксических конструкций для различных языков программирования, а также есть возможность собрать несколько файлов в один проект и указать командную строку для компиляции исходных кодов.

Проект Lazarus

Рассуждая об "идеологической совместимости" Free Pascal и Delphi, необходимо отдать должное проекту Lazarus, в рамках которого и реализуется идеология быстрого визуального программирования.В основе проекта лежит библиотека визуальных компонентов Lazarus (LCL), для которой декларируется совместимость с визуальными компонентами VCL из Delphi. Библиотека LCL является платформонезависимой и утверждается, что исходные коды приложений могут быть портированы на любую из поддерживаемых платформ.

Развитие проекта идет в двух направлениях: разработка и улучшение работы визуальных компонентов, входящих в LCL, и совершенствование интегрированной визуальной среды быстрой разработки приложений. Дистрибутив этой среды разработки и библиотека компонентов Lazarus не входят в состав дистрибутива Free Pascal. Если вас интересует этот проект, вы можете отыскать все необходимые файлы на сайте разработчиков.

Установка компилятора

Рекомендуемую для работы версию Free Pascal можно загрузить с официального сайта разработчиков. Имя загружаемого файла (версия 2.0.2 для ОС Win32): fpc-2.0.2.i386-win32.exe, размер составляет около 26 мегабайт.

Также на официальном сайте доступны исходные коды компилятора и входящих в него пакетов. Этот материал может быть использован и как пример большого открытого проекта, и как своего рода образец стиля программирования, и как основа для собственных разработок.

После того как вы загрузили дистрибутив, запустите программу установки Free Pascal (файл fpc-2.0.2.i386-win32.exe). Далее придется выполнить стандартную процедуру установки, то есть последовательно пройти несколько диалогов, нажимая кнопку Next (в последнем диалоге нужно будет нажать кнопку Install).

Не рекомендуется изменять папку, в которую будет установлен компилятор (по умолчанию это C:\FPC\). Иначе (если путь к этой папке будет слишком длинным) возможны ошибки при компиляции.

Рекомендуемый тип установки (если позволяет размер свободного места на диске) - Full installation (Установка полного пакета). Также доступны - Minimum installation (Установка минимально необходимых файлов) и Custom installation (Выборочная установка). Полная установка займет на диске 101 мегабайт. При выборочной установке можно отказаться, например, от интегрированной среды разработки.

Первые программы

Командный файл

Для компиляции простых примеров и небольших программ вполне подойдет bat-файл, который должен располагаться в той же папке, где и файл с исходным кодом. Для консольного приложения он может иметь следующий вид(предполагается, что компилятор установлен в папку C:\FPC\):

rem Командный файл для компиляции 
rem консольного приложения hello.pas
path=C:\FPC\2.0.2\bin\i386-win32\;%path%
set app=hello

rem Удаление результатов предыдущей компиляции
if exist %app%.exe del %app%.exe
if exist %app%.o del %app%.o

fpc.exe %app%.pas >errlog.txt

В результате выполнения такого файла в текущей папке появятся три файла: объектный (с расширением .o), исполняемый (.exe) и файл, содержащий отчет о компиляции и сообщения об ошибках (errlog.txt). Разумеется, что объектный и исполняемый файлы появяться лишь в том случае, если во при компиляции не было ошибок.

Аналогичный bat-файл для GUI-приложения дополнительно будет содержать командную строку для вызова компилятора ресурсов. Компилятор ресурсов входит в дистрибутив Free Pascal.

rem Командный файл для компиляции
rem GUI-приложения hellowin.pas

path=C:\FPC\2.0.2\bin\i386-win32\;%path%
set app=hellowin
if exist %app%.exe del %app%.exe
if exist %app%.o del %app%.o
if not exist %app%.rc goto compile
windres.exe -v %app%.rc %app%.res >>errres.txt
:compile
fpc.exe %app%.pas >errlog.txt

Консольное приложение

По заведенному порядку следовало бы в качестве первой консольной программы предложить четырехстишие, выводящее на экран строку "Hello, world!". Немного отступим от этого порядка и, кроме вывода текста на экран, проиллюстрируем работу с функциями Win32 API (в данном случае GetVersionInfo).

Поместите нижеследующий текст программы в текстовый файл с hello.pas. В той же папке создайте bat-файл для компиляции консольного приложения. Запустите этот bat-файл. Если во время компиляции ошибок не было, то в папке появятся файлы hello.o, hello.exe и errlog.txt. В противном случае вы увидите только файл errlog.txt (просмотрите его и устраните ошибки).

Запустите файл hello.exe. На экран будет выведено сообщение о версии ОС Windows, установленной на вашем компьютере. Если вы используете Jaws for Windows, то прочитать содержимое окна можно при помощи Jaws-курсора. Нажмите клавишу Enter, чтобы закрыть окно приложения.


program Hello;
uses windows;
var
	c: Char;
	OsVer: OsVersionInfo;
begin
	OsVer.dwOSVersionInfoSize := SizeOf (OsVer);
		GetVersionEx(@OsVer);
	case OsVer.dwPlatformId of
	VER_PLATFORM_WIN32S: writeln ('Platform: Win32s');
	VER_PLATFORM_WIN32_WINDOWS: Writeln('Platform: Windows');
	VER_PLATFORM_WIN32_NT: Writeln('Platform: Windows NT');
	else writeln ("Platform ID:', OsVer.dwPlatformId); 
	end;
	Writeln('Version: ',OsVer.dwMajorVersion, '.', OsVer.dwMinorVersion);
	Writeln('Build: ',OsVer.dwBuildNumber);
	Writeln('CSD version: ', OsVer.szCSDVersion);
	writeln ('Press Enter to close...');
	readln(c);
end.

GUI-приложение

Если вы изучаете Win32 API и системное программирование в ОС Windows, но при этом не хотели бы переходить с Паскаля на Си, то Free Pascal - это вполне приемлемое решение. Практически любой пример, приводимый в справочниках по Win32 API, можно реализовать на Free Pascal путем замены конструкций языка Си на аналогичные конструкции языка Паскаль.

В качестве примера ниже приведен исходный код простого GUI-приложения, которое описывает и регистрирует класс окна, создает окно и запускает цикл обработки сообщений. Окно приложения содержит горизонтальную полоску меню: Файл и О программе. При выборе в меню Файл пункта Открыть появляется стандартный диалог открытия файла. Пользователь может выбрать только файлы с расширением .wav. После того как файл будет выбран, он будет воспроизведен при помощи системной функции PlaySound (). Чтобы сделать пример попроще, в нем не обрабатывается сообщение о перерисовке окна.

При создании GUI-приложения необходимо указать компилятору тип приложения (по умолчанию подразумевается консольное). Это делается дериктивой

{$APPTYPE GUI}

Если необходимо добавить к приложению файл ресурсов (в данном случае ресурсом является меню программы), то следует воспользоваться директивой

{$RESOURCE filename.res}

Вам следует скопировать исходный код приложения в текстовый файл hellowin.pas, а исходный код файла ресурсов в hellowin.rc. В ту же папку необходимо поместить bat-файл для компиляции GUI-приложения. Запустите этот файл. Если не было ошибок компиляции, то в папке появяться файлы hellowin.exe, hellowin.o, hellowin.res, hellowin.or и два файла с отчетами о компиляции errlog,txt и errres.txt. Запустите файл hellowin.exe и проверьте работу пунктов меню приложения.

 

{ Пример простого GUI-приложения.}
{$MODE DELPHI}
{$APPTYPE GUI}
{$RESOURCE hellowin.res}

program HelloWin;
uses strings, Windows, mmsystem;

const
AppClass : pChar = 'MainWClass';
AppTitle: pChar = 'Hello, Win!';
MenuName: pChar = 'AppMenu';

// идентификаторы пунктов меню
IDI_OPEN = 1000;
IDI_EXIT = 1002;
IDI_ABOUT = 1003;

function MainWndProc(hWnd: HWnd; AMessage, WParam,LParam: Longint): Longint; stdcall; export;
const
FilterString: pChar = 'Звуковые файлы (*.wav)';
FilterWildcard: pChar = '*.wav';
var
pcFilter: pChar;
pcFileName: pChar;
pcCurDir: pChar;
Ofn: OpenFileName; 

begin
//подпрограмма обработки сообщений
case AMessage of
WM_DESTROY: begin
	PostQuitMessage(0);
	Exit;
end;
WM_COMMAND: 
		case wParam of
	IDI_EXIT: DestroyWindow (hWnd);
	IDI_ABOUT: MessageBox (hWnd, 'Пример простой программы для Windows.', 'Info', MB_ICONINFORMATION);
IDI_OPEN: begin
// резервируем память
GetMem (pcFileName, MaxPathLen);
GetMem (pcCurDir , MaxPathLen);
GetMem (pcFilter, 128);

// заполняем структуру для диалога открытия файла
Ofn.lStructSize := SizeOf (Ofn); 
Ofn.hwndOwner := hWnd;
pcFileName^ := #0; 
Ofn.lpstrFile := pcFileName;
Ofn.nMaxFile := 256;
// формируем шаблон
ZeroMemory (pcFilter, 128);
StrCat (
StrECopy (pcFilter, FilterString) +1, 
FilterWildcard);
Ofn.lpstrFilter := pcFilter;

Ofn.lpstrCustomFilter := nil;
Ofn.lpstrFileTitle := nil;

GetCurrentDirectory (MaxPathLen, pcCurDir);
Ofn.lpstrInitialDir := pcCurDir;
Ofn.lpstrTitle := 'Открыть';
Ofn.flags := ofn_EXPLORER + ofn_FILEMUSTEXIST 	; 
if GetOpenFileName (@Ofn) then PlaySound(pcFileName, 0, SND_ASYNC);

// освобождаем память
FreeMem(pcFileName, MaxPathLen);
FreeMem(pcCurDir , MaxPathLen);
FreeMem(pcFilter, 128);
end;
	end;
else Result := DefWindowProc(hWnd, AMessage, WParam, LParam);
end;
end;

function InitApplication: Boolean;
var
wcx: TWndClass;
begin
//Заполняем структуру TWndClass
wcx.style := CS_HREDRAW or CS_VREDRAW;
// адрес оконной процедуры
wcx.lpfnWndProc := @MainWndProc;
wcx.cbClsExtra := 0;
wcx.cbWndExtra := 0;
wcx.hInstance := hInstance;
// загружаем стандартную иконку
wcx.hIcon := LoadIcon(0, IDI_APPLICATION);
// загружаем стандартный курсор
wcx.hCursor := LoadCursor(0, IDC_ARROW);
// делаем светло-серый фон
wcx.hbrBackground := COLOR_WINDOW;
// указываем меню из файла ресурсов
wcx.lpszMenuName := MenuName;
// имя класса окна
wcx.lpszClassName := AppClass;

// Регистрируем наш класс окна.
Result := RegisterClass(wcx) <> 0;
end;

function InitInstance: HWND;
begin
// Создаем главное окно.
Result := CreateWindow(AppClass, AppTitle,
WS_OVERLAPPEDWINDOW, Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT),
Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT),
0,0,hInstance, nil);
end;

var
hwndMain: HWND;
AMessage: msg;
begin
if (not InitApplication) then
begin
MessageBox(0, 'Ошибка регистрации окна', nil, mb_Ok);
Exit;
end;
hwndMain := InitInstance;
if (hwndMain = 0) then
begin
MessageBox(0, 'Ошибка создания окна', nil, mb_Ok);
Exit;
end
else
begin
// Показываем окно и посылаем сообщение WM_PAINT оконной процедуре
ShowWindow(hwndMain, CmdShow);
UpdateWindow(hwndMain);
end;
while (GetMessage(AMessage, 0, 0, 0)) do
begin
//Запускаем цикл обработки сообщений
TranslateMessage(AMessage);
DispatchMessage(AMessage);
end;
Halt(AMessage.wParam);
end.

Для компиляции приложения необходим файл ресурсов hellowin.rc.

// Файл ресурсов hellowin.rc
#define IDI_OPEN 1000
#define IDI_EXIT 1002
#define IDI_ABOUT	1003

AppMenu MENU
{
POPUP "&Файл"
{
MENUITEM "Открыть", IDI_OPEN
MENUITEM "Вы&ход", IDI_EXIT
}
MENUITEM "&О программе", IDI_ABOUT
}

 

Ссылки по теме

  1. Исходные коды примеров (zip, 28 Kb).
  2. www.freepascal.org - Официальный сайт разработчиков Free Pascal. Здесь находятся все, что необходимо для установки Free Pascal и работы с ним (дистрибутивы, документация, faq, форум разработчиков и т.д.)
  3. Прямая ссылка для загрузки дистрибутива Free Pascal версии 2.0.2 Win32
  4. Страница для загрузки дистрибутива Free Pascal 2.0.2 для OC Win32 и документации (на случай, если предыдущая ссылка не будет работать).
  5. www.lazarus.freepascal.org - Официальная страница проекта Lazarus, в рамках которого разрабатывается библиотека визуальных компонентов и среда быстрой разработки приложений для Free Pascal.
  6. www.freepascal.ru - Российский сайт для разработчиков, использующих Free Pascal. Создателями сайта ведется работа по переводу документации на русский язык.

Актуальные версии
FPC3.2.2release
Lazarus3.2release
MSE5.10.0release
fpGUI1.4.1release
links