Free Pascal ハンドブック

編集

はじめに

編集

Free Pascalは、オープンソースのPascalコンパイラおよび開発環境です。このハンドブックでは、Free Pascalの基本的な使い方から高度な機能までを解説します。

インストール

編集

Windows環境

編集
  1. 公式サイト( https://www.freepascal.org/ )からインストーラをダウンロード
  2. インストーラを実行し、画面の指示に従う
  3. 環境変数PATHにコンパイラのパスを追加

UNIX 環境

編集
FreeBSDの場合(パッケージを導入)
# pkg install lang/fpc
FreeBSDの場合(ソースコードを入手しビルドしインストール)
# make -C /usr/ports/lang/fpc all install clean

GNU/Linux 環境

編集
Debian系の場合
sudo apt-get install fpc
RHEL系の場合
sudo dnf install fpc

基本文法

編集

プログラム構造

編集

基本的なプログラム構造は以下の通りです:

program HelloWorld;
begin
  writeln('Hello, World!');
end.

データ型

編集

主要なデータ型:

  • Integer - 整数型
  • Real - 実数型
  • String - 文字列型
  • Boolean - 論理型
  • Char - 文字型

変数宣言

編集
var
  age: Integer;
  name: String;
  isValid: Boolean;

制御構造

編集
if condition then
  statement1
else
  statement2;

for文

編集
for i := 1 to 10 do
  writeln(i);

while文

編集
while condition do
  statement;

プロシージャとファンクション

編集

プロシージャの定義

編集
procedure PrintMessage(msg: String);
begin
  writeln(msg);
end;

ファンクションの定義

編集
function Add(a, b: Integer): Integer;
begin
  Result := a + b;
end;

オブジェクト指向プログラミング

編集

クラスの定義

編集
type
  TPerson = class
  private
    FName: String;
    FAge: Integer;
  public
    constructor Create(name: String; age: Integer);
    procedure Display;
  end;

実装例

編集
constructor TPerson.Create(name: String; age: Integer);
begin
  FName := name;
  FAge := age;
end;

procedure TPerson.Display;
begin
  writeln('Name: ', FName, ', Age: ', FAge);
end;

ユニット

編集

ユニットの構造

編集
unit MyUnit;

interface
// 外部に公開する宣言

implementation
// 実装部分

end.

デバッグとエラー処理

編集

例外処理

編集
try
  // 危険な処理
except
  on E: Exception do
    writeln('Error: ', E.Message);
end;

コンパイルとビルド

編集

コマンドライン編集

編集

基本的なコンパイルコマンド:

fpc program.pas

デバッグ情報付きでコンパイル:

fpc -g program.pas

最適化オプション付きでコンパイル:

fpc -O2 program.pas

よくある問題とその解決方法

編集

一般的なエラーメッセージ

編集
  • "Identifier not found" - 変数や関数が未定義
  • "Type mismatch" - データ型の不一致
  • "File not found" - ファイルが見つからない

デバッグのヒント

編集
  • writelnを使用して変数の値を確認
  • デバッグモードでコンパイルして実行
  • 例外処理を適切に実装

標準PascalとFree Pascalの違い

編集

言語仕様の違い

編集

文字列処理

編集
標準Pascal
  • 文字列は固定長配列として扱われる
  • 文字列操作は基本的な機能のみ
  • 文字列長の制限が厳格
Free Pascal
  • 動的な文字列型をサポート
  • 豊富な文字列操作関数
  • Unicode対応
  • アナシバイト文字列のサポート

モジュール化

編集
標準Pascal
  • モジュール化の概念は限定的
  • ライブラリの再利用が困難
Free Pascal
  • UNITシステムによる強力なモジュール化
  • インターフェースと実装の明確な分離
  • 豊富な標準ライブラリ

オブジェクト指向機能

編集
標準Pascal
  • オブジェクト指向プログラミングの概念なし
  • 構造化プログラミングのみ
Free Pascal
  • 完全なクラスベースのOOPをサポート
  • 継承、ポリモーフィズム、カプセル化
  • プロパティ、メソッド属性
  • インターフェース実装

実用的な拡張機能

編集

コンパイラ機能

編集
標準Pascal
  • 基本的なエラーチェックのみ
  • 最適化機能は限定的
Free Pascal
  • 高度な最適化オプション
  • クロスプラットフォームコンパイル
  • インラインアセンブラ
  • 条件付きコンパイル

メモリ管理

編集
標準Pascal
  • 静的メモリ割り当てのみ
  • ポインタの使用が制限的
Free Pascal
  • 動的メモリ管理
  • 参照カウント方式の文字列
  • オブジェクトの自動解放
  • メモリリーク検出ツール

入出力機能

編集
標準Pascal
  • テキストファイルの基本的な入出力のみ
  • デバイス制御機能なし
Free Pascal
  • バイナリファイル操作
  • ストリーム処理
  • ネットワーク入出力
  • データベース接続

互換性と移植性

編集

コード互換性

編集
標準Pascal
  • ISO/IEC 7185:1990に準拠
  • 厳格な構文規則
Free Pascal
  • Turbo Pascal互換モード
  • Delphi互換モード
  • MacPascal互換モード
  • 独自の拡張構文

プラットフォーム対応

編集
標準Pascal
  • プラットフォーム依存の機能なし
  • OSとの連携機能が限定的
Free Pascal
  • Windows、Linux、macOS対応
  • モバイルプラットフォーム対応
  • 組み込みシステム対応
  • プラットフォーム固有API呼び出し

開発環境

編集

ツールサポート

編集
標準Pascal
  • 基本的なコンパイラのみ
  • 統合開発環境なし
Free Pascal
  • Lazarus IDE統合環境
  • ビジュアルコンポーネント
  • デバッガ統合
  • プロファイラ

ライブラリエコシステム

編集
標準Pascal
  • 標準ライブラリのみ
  • サードパーティライブラリなし
Free Pascal
  • 豊富な標準ユニット
  • オープンソースライブラリ
  • コンポーネント共有システム
  • パッケージマネージャ

まとめ

編集

Free Pascalは標準Pascalの基本理念を継承しながら、現代のプログラミング要件に対応する多くの拡張機能を提供しています。特に以下の点で大きく進化しています:

  • オブジェクト指向プログラミングの完全サポート
  • クロスプラットフォーム開発環境
  • 豊富な標準ライブラリと開発ツール
  • 現代的な言語機能の実装

これらの拡張により、Free Pascalは教育用途だけでなく、実務的なソフトウェア開発にも適した言語となっています。

Free Pascalの系譜

編集

Pascal言語の発展とFree Pascal

編集

言語の進化

編集
言語の進化
時期 言語/製品 主な特徴
1970年 Pascal(Wirth Pascal)
  • Niklaus Wirthによる設計
  • 構造化プログラミング
  • 強い型付け
  • 教育用途重視
1983年 Turbo Pascal
  • Borland社による実装
  • 統合開発環境の導入
  • コンパイラの高速化
  • 実用的な拡張機能
1986年 Object Pascal
  • Apple社とBorland社による拡張
  • オブジェクト指向機能の導入
  • クラスベースの継承
  • メソッドのオーバーライド
1995年 Delphi
  • Borland社による視覚的開発環境
  • コンポーネント指向開発
  • イベント駆動プログラミング
  • RAD(高速アプリケーション開発)
1993年- Free Pascal
  • オープンソースによる実装
  • 多言語モード対応
  • クロスプラットフォーム
  • 継続的な機能拡張

Free Pascalの互換モード

編集

Turbo Pascal互換モード

編集
構文と機能
  • $MODETP ディレクティブで有効化
  • Turbo Pascal 7.0との高い互換性
  • ユニットシステムの完全サポート
  • 文字列処理の互換性維持
主な特徴
  • 従来のTurbo Pascalコードの移植が容易
  • レガシーコードの保守性
  • クラシックな開発スタイルのサポート

Object Pascal/Delphi互換モード

編集
構文と機能
  • $MODE DELPHI ディレクティブで有効化
  • Delphiスタイルのクラス定義
  • プロパティ構文
  • メソッド参照
拡張機能
  • インターフェース実装
  • 例外処理
  • RTTI(実行時型情報)
  • ジェネリクス

Free Pascal固有の拡張

編集
言語拡張
  • オペレータのオーバーロード
  • 関数のオーバーロード
  • 無名関数(ラムダ式)
  • 高度な型システム
モジュール化
  • パッケージシステム
  • 名前空間管理
  • 循環参照の解決
  • 条件付きコンパイル

各言語仕様の継承と発展

編集

Turbo Pascalからの継承

編集
  • 高速なコンパイル
  • 効率的なコード生成
  • インラインアセンブラ
  • ユニットシステム

Object Pascalからの継承

編集
  • クラスベースのOOP
  • 継承とポリモーフィズム
  • メソッドディスパッチ
  • オブジェクトライフサイクル管理

Delphiからの継承

編集
  • コンポーネントフレームワーク
  • ビジュアル開発手法
  • データベース接続機能
  • Windows API連携

開発モデルの違い

編集

コンパイラアプローチ

編集
コンパイラアプローチ
製品 コンパイル方式 最適化
Turbo Pascal シングルパス 基本的
Delphi マルチパス 高度
Free Pascal マルチパス 設定可能

開発環境

編集
開発環境
製品 IDE ビジュアル開発 デバッグ機能
Turbo Pascal 統合型(シンプル) なし 基本的
Delphi 統合型(高機能) あり 高度
Free Pascal Lazarus(選択可) あり 高度

まとめ

編集

Free Pascalは、先行する Pascal 系言語の優れた特徴を継承しながら、以下の特徴を実現しています:

  • 異なる Pascal 方言間の互換性確保
  • オープンソースによる継続的な進化
  • クロスプラットフォーム開発の実現
  • 現代的なプログラミング手法への対応

特に、Turbo Pascal の実用性、Object Pascal のオブジェクト指向機能、Delphi の高度な開発環境という、それぞれの長所を取り入れながら、独自の発展を遂げている点が特徴的です。

Free Vision - テキストユーザーインターフェース・ライブラリ

編集

概要

編集

Free Vision(FV)は、Free Pascalに組み込まれているテキストユーザーインターフェース(TUI)ライブラリです。Borland社のTurbo Vision(TV)との互換性を持ち、テキストモードでのアプリケーション開発を可能にします。

特徴

編集

アーキテクチャ

編集
  • イベント駆動型プログラミングモデル
  • オブジェクト指向設計
  • マルチプラットフォーム対応
  • テキストウィンドウシステム

コンポーネント

編集
基本コンポーネント
  • TApplication - アプリケーションフレームワーク
  • TView - 基本表示コンポーネント
  • TWindow - ウィンドウコンポーネント
  • TDialog - ダイアログボックス
  • TMenu - メニューシステム
入力コンポーネント
  • TInputLine - テキスト入力フィールド
  • TButton - プッシュボタン
  • TCheckBoxes - チェックボックス群
  • TRadioButtons - ラジオボタン群
  • TListBox - リストボックス
表示コンポーネント
  • TStaticText - 静的テキスト表示
  • TFrame - 枠線表示
  • TScrollBar - スクロールバー
  • TStatusLine - ステータスライン
  • TBackground - 背景

プログラミング例

編集

基本的なアプリケーション

編集
program HelloFV;

uses
  Objects, App, Drivers, Views, Menus;

type
  TMyApp = object(TApplication)
    procedure InitMenuBar; virtual;
  end;

procedure TMyApp.InitMenuBar;
var
  R: TRect;
begin
  GetExtent(R);
  R.B.Y := R.A.Y + 1;
  MenuBar := New(PMenuBar, Init(R, NewMenu(
    NewSubMenu('~F~ile', hcNoContext, NewMenu(
      NewItem('~Q~uit', 'Alt-X', kbAltX, cmQuit, hcNoContext,
      nil)),
    nil))));
end;

var
  MyApp: TMyApp;

begin
  MyApp.Init;
  MyApp.Run;
  MyApp.Done;
end.

Turbo Visionとの違い

編集

互換性

編集
互換性
機能 Turbo Vision Free Vision
基本アーキテクチャ オリジナル 互換
イベントモデル 16ビット 32/64ビット
プラットフォーム DOS マルチプラットフォーム
カラー処理 EGA/VGA 拡張カラー対応

拡張機能

編集
Free Visionの追加機能
  • Unicode対応
  • マウスホイールサポート
  • 拡張キーボードサポート
  • 現代的な端末エミュレータ対応
プラットフォーム固有の機能
  • Linux/Unixコンソール対応
  • Windows コンソール対応
  • SSHセッション対応
  • 端末リサイズ処理

利用場面

編集

適した用途

編集
  • テキストベースの管理ツール
  • サーバー管理インターフェース
  • リモートアクセスアプリケーション
  • クロスプラットフォームTUIアプリケーション
  • レガシーシステムの移植

利点

編集
  • 軽量で高速な動作
  • リモート接続での使いやすさ
  • キーボード操作の効率性
  • リソース使用量の最小化
  • シンプルな実装

開発のベストプラクティス

編集

設計原則

編集
  • モジュール化された構造
  • イベントハンドラの適切な分離
  • リソース管理の徹底
  • エラー処理の実装

コーディング規約

編集
  • 一貫したネーミング規則
  • コメントとドキュメンテーション
  • メモリ管理の注意点
  • イベント処理の標準化

まとめ

編集

Free Visionは、テキストベースのユーザーインターフェースを必要とするアプリケーションに最適なライブラリです。以下の特徴を備えています:

  • Turbo Visionとの高い互換性
  • マルチプラットフォーム対応
  • 現代的な機能拡張
  • 効率的な開発フレームワーク

特に、サーバー管理ツールやリモートアクセスツールの開発において、その真価を発揮します。

AFX互換機能とSysUtils

編集

概要

編集

Free PascalのSysUtilsユニットは、Borland Application Framework (AFX)との互換性を提供する多くのクラスと機能を実装しています。これにより、AFXベースのアプリケーションの移植や、同様のアプリケーションフレームワークの構築が可能です。

主要クラスと機能

編集

例外処理クラス

編集
例外処理クラス
クラス 説明 AFX互換性
Exception 基本例外クラス 完全互換
EAbort アプリケーション中断例外 完全互換
EOutOfMemory メモリ不足例外 完全互換
EInOutError 入出力エラー例外 完全互換
EExternal 外部例外 完全互換

ストリームクラス

編集
基本ストリーム
  • TStream - 抽象ストリームクラス
  • THandleStream - ハンドルベースのストリーム
  • TFileStream - ファイルストリーム
  • TCustomMemoryStream - メモリストリーム基本クラス
  • TMemoryStream - メモリストリーム
  • TStringStream - 文字列ストリーム
機能
  • シーク操作
  • 読み書き操作
  • サイズ管理
  • バッファリング

AFX互換APIの実装

編集

文字列処理

編集
文字列関数
 function UpperCase(const S: string): string;
 function LowerCase(const S: string): string;
 function CompareStr(const S1, S2: string): Integer;
 function CompareText(const S1, S2: string): Integer;
変換関数
 function IntToStr(Value: Integer): string;
 function StrToInt(const S: string): Integer;
 function FloatToStr(Value: Extended): string;
 function StrToFloat(const S: string): Extended;

ファイル操作

編集
ファイル管理
 function FileExists(const FileName: string): Boolean;
 function DirectoryExists(const Directory: string): Boolean;
 function ForceDirectories(Dir: string): Boolean;
 function DeleteFile(const FileName: string): Boolean;
パス操作
 function ExtractFilePath(const FileName: string): string;
 function ExtractFileName(const FileName: string): string;
 function ExtractFileExt(const FileName: string): string;
 function ChangeFileExt(const FileName, Extension: string): string;

拡張機能

編集

Free Pascal固有の機能

編集
追加クラス
  • TFPList - 汎用リストクラス
  • TStringList - 文字列リスト
  • TCollection - コレクションクラス
  • TObjectList - オブジェクトリスト
ユーティリティ機能
  • RTTI(実行時型情報)サポート
  • 国際化対応
  • スレッド安全性
  • メモリ管理の最適化

プラットフォーム固有の実装

編集
プラットフォーム固有の実装
機能 Windows Unix/Linux macOS
ファイルパス バックスラッシュ対応 スラッシュ対応 スラッシュ対応
文字エンコーディング ANSI/Unicode UTF-8 UTF-8
ファイルロック Windows API POSIX BSD
プロセス管理 Win32 Fork/Exec Fork/Exec

移植ガイドライン

編集

AFXからの移行

編集
移行手順
  1. ユニットの依存関係確認
  2. 例外処理コードの見直し
  3. ストリーム使用箇所の確認
  4. プラットフォーム依存コードの特定
注意点
  • 文字列型の違いへの対応
  • メモリ管理の違い
  • 例外階層の違い
  • プラットフォーム固有APIの使用

コーディングプラクティス

編集
推奨事項
  • クロスプラットフォーム対応の考慮
  • 適切な例外処理の実装
  • リソース管理の徹底
  • ユニットテストの作成

まとめ

編集

Free PascalのSysUtilsユニットは、以下の特徴を持つAFX互換機能を提供します:

  • 標準的な例外処理メカニズム
  • 豊富なストリームクラス群
  • 充実したユーティリティ関数
  • クロスプラットフォーム対応

これにより、AFXベースのアプリケーションを効率的に移植し、現代的な環境で実行することが可能になります。

附録

編集

便利なユニット

編集
  • System - 基本的なシステム関数
  • SysUtils - 文字列処理、ファイル操作など
  • Classes - オブジェクト指向プログラミング支援
  • Math - 数学関数
  • DateUtils - 日付時刻処理

コードギャラリー

編集
program MathAlgorithms;

uses
  Math, SysUtils;

type
  TIntegerArray = array of Integer;
  TBisectionFunc = function(x: Double): Double;

// エラトステネスの篩
function Eratosthenes(n: Integer): TIntegerArray;
var
  isPrime: array of Boolean;
  primes: TIntegerArray;
  i, j, count: Integer;
begin
  SetLength(isPrime, n + 1);
  FillChar(isPrime[0], Length(isPrime) * SizeOf(Boolean), True);
  isPrime[0] := False;
  isPrime[1] := False;
  
  for i := 2 to Trunc(Sqrt(n)) do
    if isPrime[i] then
      for j := i * i to n do
        if j mod i = 0 then
          isPrime[j] := False;
  
  // 素数の数を数える
  count := 0;
  for i := 2 to n do
    if isPrime[i] then
      Inc(count);
      
  // 結果の配列を作成
  SetLength(primes, count);
  count := 0;
  for i := 2 to n do
    if isPrime[i] then
    begin
      primes[count] := i;
      Inc(count);
    end;
    
  Eratosthenes := primes;
end;

// 2数の最大公約数
function GCD2(m, n: Integer): Integer;
begin
  if n = 0 then
    GCD2 := m
  else
    GCD2 := GCD2(n, m mod n);
end;

// 複数の数の最大公約数
function GCD(const numbers: array of Integer): Integer;
var
  i: Integer;
begin
  GCD := numbers[0];
  for i := 1 to High(numbers) do
    GCD := GCD2(GCD, numbers[i]);
end;

// 2数の最小公倍数
function LCM2(m, n: Integer): Integer;
begin
  LCM2 := (m div GCD2(m, n)) * n;
end;

// 複数の数の最小公倍数
function LCM(const numbers: array of Integer): Integer;
var
  i: Integer;
begin
  LCM := numbers[0];
  for i := 1 to High(numbers) do
    LCM := LCM2(LCM, numbers[i]);
end;

// 二分法
function Bisection(low, high: Double; f: TBisectionFunc): Double;
var
  x, fx: Double;
const
  EPSILON = 1.0e-10;
begin
  x := (low + high) / 2.0;
  fx := f(x);
  
  if Abs(fx) < EPSILON then
    Bisection := x
  else if fx < 0 then
    Bisection := Bisection(x, high, f)
  else
    Bisection := Bisection(low, x, f);
end;

// テスト用の関数
function F1(x: Double): Double;
begin
  F1 := x - 1;
end;

function F2(x: Double): Double;
begin
  F2 := x * x - 1;
end;

// メインプログラム
procedure PrintIntegerArray(const arr: TIntegerArray);
var
  i: Integer;
begin
  Write('[');
  for i := 0 to High(arr) do
  begin
    Write(arr[i]);
    if i < High(arr) then
      Write(', ');
  end;
  WriteLn(']');
end;

var
  primes: TIntegerArray;
  numbers1: array[0..2] of Integer = (30, 72, 12);
  numbers2: array[0..2] of Integer = (30, 42, 72);
begin
  // エラトステネスの篩のテスト
  primes := Eratosthenes(100);
  WriteLn('Eratosthenes(100):');
  PrintIntegerArray(primes);
  WriteLn;
  
  // 最大公約数と最小公倍数のテスト
  WriteLn('GCD2(30, 45) = ', GCD2(30, 45));
  WriteLn('GCD(30, 72, 12) = ', GCD(numbers1));
  WriteLn('LCM2(30, 72) = ', LCM2(30, 72));
  WriteLn('LCM(30, 42, 72) = ', LCM(numbers2));
  WriteLn;
  
  // 二分法のテスト
  WriteLn('Bisection for x - 1 = 0: ', Bisection(0, 3, @F1):0:10);
  WriteLn('Bisection for x^2 - 1 = 0: ', Bisection(0, 3, @F2):0:10);
end.
Output
Eratosthenes(100):
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

GCD2(30, 45) = 15
GCD(30, 72, 12) = 6
LCM2(30, 72) = 360
LCM(30, 42, 72) = 2520

Bisection for x - 1 = 0: 0.9999999999
Bisection for x^2 - 1 = 0: 1.0000000000

索引

編集
 
Wikipedia
ウィキペディアFree Pascalの記事があります。
  • A
    • Arrays(配列)
    • Abstract classes(抽象クラス)
  • C
    • Classes(クラス)
    • Compiler options(コンパイラオプション)
  • D
    • Debugging(デバッグ)
    • Data types(データ型)
  • E
    • Exception handling(例外処理)
  • F
    • Functions(関数)
    • File handling(ファイル処理)
  • P
    • Procedures(プロシージャ)
    • Pointers(ポインタ)
  • U
    • Units(ユニット)
  • V
    • Variables(変数)