Free Pascal Compilerが動的パッケージをサポート
Free Pascal Compiler Now Supports Dynamic Packages (getlazarus.org)
要約
Free Pascal Compiler (FPC) と Lazarus IDE の最新リリースにより、動的パッケージの完全サポートが実現しました。この機能により、ユーザーはIDE全体を再ビルドすることなく、コンポーネントや拡張機能を数秒で作成・インストールできるようになります。また、プログラム内でプラグインシステムを構築し、実行時に動的にパッケージをロード・置換することも可能です。コンパイラ、ランタイム、IDEの各部分に改善が加えられ、開発効率が大幅に向上しています。
全文翻訳
動的パッケージ
Free Pascal Compiler (FPC) および Lazarus IDE における完全な動的パッケージサポートの最初のリリースを発表できることを嬉しく思います。この機能はエコシステムにとって長年の懸案でしたが、完全な実装がこのウェブサイトからダウンロードできるようになりました。
動的パッケージにより、ユーザーはIDE全体を再ビルドすることなく、数秒でコンポーネント、コントロール、Lazarus拡張機能を生成・インストールできます。また、独自のプログラムで、動的パッケージライブラリを介してネイティブなPascalクラスや型を公開するプラグインを開発・デプロイするためにも使用できます。この機能に対応するため、コンパイラ、ランタイム、Lazarus IDEに数多くの改善を加えました。また、Lazarusパッケージでの作業体験を向上させるための追加のIDE拡張機能も作成しました。
動的パッケージは、Linux、Windows、macOS向けの標準的な共有ライブラリファイルとして実装されています。これらはコンパイラによって生成された追加のメタデータを含んでおり、新しいRTLユニットを使用して検査・クエリすることができます。ランタイムには、プログラムとパッケージ間、または複数のパッケージ間で、スレッド変数と動的型(文字列や動的配列など)を安全に保持・管理するためのメカニズムも含まれています。
動画: 動的パッケージの例
[動画: 動的パッケージの例]
プログラムをデプロイする際、すべてを単一の実行可能ファイルにバンドルすることも引き続き可能です。あるいは、プログラム実行中に置き換え可能な複数の動的パッケージに分割することで、プラグインシステムを提供することもできます。
制限事項
動的パッケージにはいくつかの制限があります。まず、パッケージに含まれるユニットは、パッケージ自体の名前と同じ名前を持つことはできません。デフォルトのパッケージシステムを拡張し、生成されるPascalソースファイルには、パッケージ名に自動的に "Package" という単語が追加されるようにしました。例えば、ElectroTools.lpk という名前のパッケージを作成した場合、そのパッケージに含まれるすべてのユニットをリストするソースファイルは、ElectroTools.pas ではなく ElectroToolsPackage.pas という名前になります。
もう一つの制限は、ユニット名はパッケージ間で一意である必要があることです。もし誰かが Widgets という名前のユニットを作成した場合、同じ名前のユニットを含む別のパッケージをインストールすることはできません。インストールするパッケージを選択するか、競合するユニットのいずれかをリネームする必要があります。
動的パッケージは、内部のすべてのマッピング情報を含むため、通常の共有ライブラリよりもサイズが大きくなります。動的パッケージをストリップすると、動的パッケージとして機能するために必要なメタデータが削除されます。
RTLの拡張
type
TPackageType = record
{ 型を宣言するユニット}
UnitName: string;
{ 型の名前}
Name: string;
{ 型の種類}
Kind: TTypeKind;
{ 型のRTTI}
Info: PTypeInfo;
{ KindがtkClassの場合のクラス、それ以外はnil}
ClassType: TClass;
end;
ランタイムライブラリは、動的パッケージをサポートするために拡張されており、その内容を検査するためのメタデータと、パッケージ境界を越えて動的型とスレッド変数を安全に管理するために必要なメカニズムが含まれています。
RTLには、動的パッケージからの情報の読み取りを支援する新しいユニット DynPkgTypes.pas が追加されました。パッケージからRTTI情報を収集してその内容を扱うことができます。RTLには、実行時にパッケージのロード、列挙、検索、アンロードを含む、動的パッケージを扱うために必要な十分な関数があります。
Lazarusの拡張
Lazarus IDEにいくつかの拡張を加え、動的パッケージをより活用できるようにしました。
Lazarusを開いたときに最初に気づくのは、IDEの外に表示される可能性のある新しい進捗ウィンドウです。IDEに登録されているパッケージに属するソースコードを変更すると、システムが変更を検出し、Lazarusが起動する前に自動的にパッケージを再ビルドします。この間、進捗ウィンドウが変更が検出されたこととパッケージが再ビルドされていることを通知します。
IDE全体を再ビルドするオプションを選択した場合も、同じウィンドウが表示されます。このウィンドウは表示されたままで、現在の操作に関する情報(IDEが再起動されるまでの推定残り時間を含む)を表示します。進捗ウィンドウは、操作に5秒以上かかる場合、パッケージの追加または削除時にも表示されます。これは、一度に複数のパッケージをインストールする場合に発生する可能性があり、これも新しい機能です。
もう一つの拡張機能は、デフォルトで右側にドッキングされる新しいパッケージウィンドウです。最近開いたパッケージが表示され、リストはLazarusセッション間で保持されます。パッケージ内のファイルをブラウズし、項目をダブルクリックして開くことができます。
インストール済みのパッケージを開き、そのパッケージウィンドウでコンパイルをクリックすると、関連するコントロール、コンポーネント、または拡張機能が1〜2秒以内に更新されます。これにより、以前はIDE全体の再ビルドが必要だった変更がほぼ即座に適用できるようになり、開発が大幅にスピードアップします。
利用可能なパッケージのリストであるパッケージメニューも改善されました。パッケージの追加または削除は、再ビルドを必要とせずにIDEを更新するようになりました。
パッケージオプションも拡張されました。IDE統合の下で、パッケージを特定のプラットフォームまたはウィジェットセットに制限できるようになりました。パッケージが現在のプラットフォームまたはウィジェットセットの要件を満たさない場合、パッケージリストには表示されません。IDEは、変更を検出した場合や、パッケージを開こうとした場合にも、そのパッケージを無視します。
例えば、WindowsのIShellView COMインターフェースのTWinControl実装を開発したとします。パッケージを制限して、LazarusがWindowsで実行されている場合にのみ利用できるようにすることができます。
動的パッケージの機能を実証するために作成したもう一つの拡張機能は、Lazarus拡張機能向けの新しいフォームまたはフレーム変換機能です。これは、任意のフォームまたはフレームを、コンポーネントパレットに自動的に追加されるインストール可能なコントロールに変換します。すべてのコントロール、イベント、メソッド、プロパティが新しいコントロールにコピーされます。
これにより、新しいコントロールを視覚的にデザイン・レイアウトしたり、既存のフォームやフレームを他のプロジェクトで簡単に再利用したりすることが可能になります。
注意: 開いているフォームで使用中のパッケージをビルドしようとすると、IDEはパッケージをビルドする前にフォームを保存または閉じるように求めます。
これらの機能およびその他の機能は、下記リンク先の場所からダウンロードできます。FPCとLazarusへの完全な変更は、dynamic-packages という名前の私のフォークされたブランチのGitLabにコミットされています。
問題が発生した場合は、上記リンク先のブランチに関連付けられたGitLabの課題トラッカーを通じて報告してください。動的パッケージについて議論したり質問したりしたい場合は、下記リンク先のフォーラムを使用できます。新しい投稿を作成するには、モデレーターによるアカウントの承認が必要であることに注意してください。
協力のお願い
このプロジェクトに協力したい場合は、サイトのモデレーターが必要です。興味のある方は、私(sysrpl)にプライベートメッセージを送ってください。
また、macOSでの作業や必要なビルドの作成に苦労しています。M1 Macintoshを寄付していただける方がいらっしゃいましたら、私にプライベートメッセージを送ってください。M1アーキテクチャで動的パッケージをサポートするために必要なコンパイラコードに取り組みたいと強く思っています。