Free Pascal
Free Pascal ハンドブック
[編集]はじめに
[編集]Free Pascalは、オープンソースのPascalコンパイラおよび開発環境です。このハンドブックでは、Free Pascalの基本的な使い方から高度な機能までを解説します。
インストール
[編集]Windows環境
[編集]- 公式サイト( https://www.freepascal.org/ )からインストーラをダウンロード
- インストーラを実行し、画面の指示に従う
- 環境変数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文
[編集]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からの移行
[編集]- 移行手順
-
- ユニットの依存関係確認
- 例外処理コードの見直し
- ストリーム使用箇所の確認
- プラットフォーム依存コードの特定
- 注意点
-
- 文字列型の違いへの対応
- メモリ管理の違い
- 例外階層の違い
- プラットフォーム固有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
索引
[編集]- 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(変数)