| 家族 | リスプ |
|---|---|
| デザイン: | オーブリー・ジャファー、トム・ロード、マイルズ・ベイダー |
| 開発者 | GNU プロジェクト |
| 初登場 | 1993年[1] |
| 安定版リリース | 3.0.10 [2]
/ 2024年6月24日[2] |
| プラットフォーム | IA-32、x86-64、AArch64、armel、armhf、mips、mips64el、mipsel、ppc64el、s390x |
| OS | Linux、BSD、Windows ( MinGWまたはCygwin経由) |
| ライセンス | LGPL-3.0以降 |
| ファイル名拡張子 | .scm .go (Guile オブジェクト) |
| Webサイト | gnu.org/ソフトウェア/guile |
| 影響を受けた | |
| Lisp、Scheme、SCM | |
GNU Ubiquitous Intelligent Language for Extensions [3] ( GNU Guile ) は、 GNUプロジェクト[4]の推奨拡張言語システムであり、プログラミング言語Schemeの実装を特徴としています。最初のバージョンは1993年にリリースされました。 [1] Scheme標準の大部分に加えて、Guile Schemeにはさまざまなプログラミングタスク用のモジュール化された拡張機能が含まれています。[5] [6]
プログラムを拡張するために、Guileはlibguileを提供しており、これにより言語を他のプログラムに埋め込み、C言語のアプリケーションプログラミングインターフェース(API)を通じて密接に統合することができます。同様に、C APIを通じて定義された新しいデータ型とサブルーチンをGuileの拡張機能として利用できるようになります。[7]
GuileはGNUプロジェクト傘下の多くのプログラム(GDB、Make、Guix、GNU TeXmacs、GnuCash、LilyPond、Lepton-EDAなど)で使用されています[8]が、Googleの分裂など、それ以外の場面でも使用されています。
狡猾な計画
Guile Schemeは、C言語などの言語よりも少ないコード行で概念を表現できる柔軟性を備えた汎用の高水準プログラミング言語です。たとえば、その衛生的なマクロシステムにより、Guileを変更することなくドメイン固有の構文要素を追加できます。Guileは、Scheme標準R5RS、R6RSとR7RSの大部分、[9]いくつかのScheme実装要求(SRFI)、および独自の多くの拡張機能を実装しています。
Guile Scheme の核となる考え方は、「開発者は重要なアルゴリズムとデータ構造を C または C++ で実装し、関数と型をエクスポートして解釈されたコードで使用できるようにする。アプリケーションは、コンパイルされたコードの効率性と解釈の柔軟性を組み合わせた、インタープリタによって編成されたプリミティブのライブラリになる」というものです。[10]したがって、Guile Scheme (および Guile によって実装された他の言語) は、C API を通じて実装された 新しいデータ型とサブルーチン で拡張できます。
標準ディストリビューションは、ポータブルオペレーティングシステムインターフェース(POSIX)システムコール、スケジューリング、外部関数インターフェース、SXML、SXPath、SXSLTを介したS式ベースのXML処理、 HTTPおよびその他のWorld Wide Web API、区切り継続、配列プログラミング、[11]およびその他の機能用のモジュールを提供します。[5] [6] Guileプログラムは、ポータブルSchemeライブラリであるSLIB の機能を使用することができます。 [12]
実装の詳細
Scheme標準の要件であるcall/ccで継続を使用する場合、Guileは実行スタックをヒープにコピーし、それを戻します。[13]マニュアルでは、より効率的な実装であるため、代わりに区切り継続を使用することを推奨しています。[14]
外部コードにはSchemeオブジェクトへのポインターが含まれている可能性があるため、Guileは保守的なBoehm-Demers-Weiser(BDW)ガベージコレクターを使用します。[15]
歴史
Guileのマニュアルには、この言語の始まりと初期の歴史が詳しく記載されています。[16] 簡単に要約すると次のようになります。
Emacs が、その拡張 (および部分的な実装) 言語であるEmacs Lisp を介して、高度に拡張可能でカスタマイズ可能なアプリケーションとしてフリーソフトウェアコミュニティで成功した後、コミュニティはこの設計戦略を GNU システムの残りの部分にどのように適用できるかを検討し始めた。 Tom Lord は当初、Aubrey Jaffer の Scheme 実装SCM (George Carrette のSIODがベース) に基づいた、GNU 拡張言語 (GEL) という埋め込み可能な言語ランタイムの開発に取りかかった。[17] [18] Lord は、 Scheme は Emacs Lisp よりもクリーンなLisp方言であり、GEL は同じランタイム、つまり Emacs Lisp 上で他の言語を実装するように進化できるという主張に基づいて、 Richard Stallman を説得して GEL を GNU プロジェクトの公式拡張言語にした。Lord は、GEL が他のプログラミング言語と名前が競合していることを発見した後、新しい名前の提案を求めた。いくつかのUsenetニュースグループでの投稿の中から、ロードは物議を醸しながらもリー・トーマスの提案からガイルを選んだ。[19] [20] [21] [22]
Guile (当時は GEL) の開発中、そして一般公開前には、拡張言語Tclが人気を集め、汎用拡張言語として推進されていました。Stallman は Tcl が拡張言語としては力不足であると見て、comp.lang.tcl ニュースグループに批判を投稿しました。これが「Tcl 戦争」として知られる炎上を引き起こしました。[23] Guile プロジェクトの一般公開が Tcl の論争と重なったため、Guile はこれに対する反応として始まったという誤解が広まっています。
Guileの最初のリリース後、開発は長年停滞していましたが、2009年から2010年にかけて大きな改善が見られ、[24] 2011年には新しいコンパイラインフラストラクチャ、仮想マシン実装、 Boehm–Demers–Weiserガベージコレクターへの切り替え、Guile Scheme言語への多くの改善、およびその他の大きな変更を加えたGuile 2.0がリリースされました。[25]
Guile の目標の 1 つは、Scheme と並行して他の言語を使用できるようにして、Guile を事実上言語中立なランタイム環境とすることです。過去のバージョンでは、これに向けたさまざまな試みが行われてきました。C のような構文のみが本質的に異なる Scheme の方言、 Emacs Lispの翻訳、 tkWWWに触発された Tcl コンバータ、Logo言語に似たものなどです。[26] バージョン 2.0 では、プロジェクトはコンパイラ タワーアプローチへの移行に成功し、ある言語から別の言語へのコンパイラの定義が可能になりました。通常は、高レベルのコンパイラから低レベルの中間表現、そして最終的には仮想マシン バイトコードまたはネイティブマシン コードです。[27] [28]
2017年3月16日、新しい最適化コンパイラと高性能レジスタ仮想マシンを搭載したGuile 2.2.0がリリースされました。Andy Wingoによるリリース発表によると、実際のプログラムでは、以前の2.0シリーズと比較して、Guile 2.2で30%以上の高速化が見られることが多かったそうです。Guile 2.2.0では、メモリ使用量の削減、evalインタープリタの高速化、マルチコアプログラミングのサポートの改善、再帰関数呼び出しの固定制限の撤廃も行われました。また、何百万もの同時軽量「ファイバー」を多重化するユーザー空間の同時実行機能の作成もサポートされ、Emacsと完全に互換性のあるElisp実装が提供され、Elispのすべての機能と癖がEmacsと同じように実装されました。[29]
2020年1月16日、Guile 3.0.0がリリースされ、ジャストインタイム(JIT)ネイティブコード生成によりパフォーマンスが大幅に向上しました。2.2と比較すると、マイクロベンチマークのパフォーマンスは全体的に約2倍向上し、一部のベンチマークでは最大32倍高速化しています。また、語彙コンテキストでのインターリーブされた定義と式のサポート、構造化例外のネイティブサポート、R6RSおよびR7RS Scheme標準のより優れたサポート、および多くの最適化も特徴としています。[30] [31]
Emacs 統合
これまで、Guile で他の言語をサポートする取り組みと並行して、Emacs Lisp拡張言語を Guile に置き換えたり、補足したりする未完の試みがいくつかありました。 [要出典]
Guileバージョン2.0では、GuileコンパイラタワーにElispを実装し、EmacsのElisp実装をlibguileの実装に置き換えるという新たな試みが始まり、Google Summer of Codeプロジェクトを通じて大きな進歩を遂げました。[32] GuileベースのEmacsは、Emacs Lispの実行パフォーマンスを向上させ、新しいEmacs Lisp言語機能をより簡単にサポートし、他のプログラミング言語で書かれたGuileライブラリをEmacs Lispコードで利用できるようにし、Guileでサポートされている他のプログラミング言語でEmacs拡張機能を記述できるようにし、既存のEmacs Lispコードベースとの完全な下位互換性を維持します。
2014年10月現在[アップデート]、実装はGuile EmacsがほとんどのEmacs Lispコードを確実に実行できる段階に達している。残っている問題、あるいは起こり得る問題としては、Emacs Lisp文字列とScheme文字列の内部表現が異なること、Emacs LispとSchemeがブール偽値と空リストオブジェクトを扱う方法が異なること、Emacs LispマクロがSchemeと統合されていないこと、Emacs Lispが並行処理用に設計されていないこと、EmacsがサポートするプラットフォームへのGuileの移植性などがある。Emacsコミュニティが提起したその他の懸念としては、EmacsとGuileのコミュニティの相対的な規模、EmacsがEmacs Lisp以外のプログラミング言語で拡張可能になった場合にコミュニティの分裂を引き起こすかどうかなどがある。[33]
GNU Make 統合
GNU makeは、組み込み拡張言語としてGNU Guileのサポートを備えてビルドすることができます。[34]
参考文献
- ^ ブランディ1997年、102ページより。
- ^ ab 「GNU Guile 3.0.10 リリース」。gnu.org。
- ^ 「GNU Guile (Guile について)」。GNU プロジェクト。Guile
は、GNU オペレーティング システムの公式拡張言語である GNU Ubiquitous Intelligent Language for Extensions です。
- ^ 「GNU コーディング標準、どの言語を使用するか」。GNU プロジェクト。
- ^ ab 「Guile マニュアル、API リファレンス」。GNU プロジェクト。
- ^ ab 「Guile マニュアル、Guile モジュール」。GNU プロジェクト。
- ^ 「カスタマイズを促進するために、Guile は広範なインターフェイスを提供し、C コードが Scheme の世界と対話できるようにします。C コードは Scheme オブジェクトを自由に作成、アクセス、変更できます。C関数はScheme 関数を呼び出すことができ、その逆も可能です。C コードは Scheme の世界に新しい型を追加し、Guile のガベージ コレクションを利用できます... 標準的な Scheme プロシージャのほとんどは C 関数によって実装され、Guile クライアントから参照できます。たとえば、アプリケーションは
scm_consScheme プロシージャの基礎となる実装であるC 関数を呼び出すことができますcons。」Blandy 1997、94、96 ページ。 - ^ 「Guile を使用したアプリケーション」。GNU プロジェクト。2017 年 11 月 24 日時点のオリジナルよりアーカイブ。
- ^ 「R7RS の非互換性 (Guile リファレンス マニュアル)」。GNU プロジェクト。2020 年 1 月 20 日閲覧。
- ^ ブランディ1997年、87ページ。
- ^ 「Guile マニュアル、配列」。GNU プロジェクト。
- ^ 「Guile マニュアル、SLIB」。GNU プロジェクト。SLIB
は Guile ディストリビューションには含まれていませんが、別途インストールできます。
- ^ 「Guile では外部関数と Scheme 関数が自由に呼び出せるため、Guile 継続には C と Scheme の両方のスタック フレームを含めることができます。簡単にするために、Guile の実装では
call/ccC スタック全体をヒープにコピーします。継続を呼び出すと、スタックがヒープからコピーされ、longjmp関数を使用してスタックが再アクティブ化されます。この実装にはいくつかの欠点があります...」、Blandy 1997、p. 99。 - ^ 「Guile マニュアル、続き」。GNU プロジェクト。
- ^ 「Guile マニュアル、保守的な GC」。GNU プロジェクト。
- ^ 「Guile マニュアル、履歴」。
- ^ 「Guile を誰が設計したのかを特定するのは難しい。その功績の大部分は、実装の中核を成す優れた Scheme インタープリタ SCM を開発した Aubrey Jaffer に帰属する。モジュール システムは Miles Bader によって設計および構築された…」『An Anatomy of Guile, The Interface to Tcl/Tk』、1995 年
- ^ 「これは、このインタープリタの非常に短い歴史です。過去に関わった人々がこの文書にもっと貢献してくれることを願っています。SIOD: George Carrette が SIOD (最初のバージョン) を書きました。このコードのほとんどは時間の経過とともに書き直されたり置き換えられたりしましたが、 SIOD のガベージ コレクターは今でも Guile の重要な部分です。SIOD は現在も積極的に開発されており、無料で利用できます。フットプリントは非常に小さいです。」Guile Scheme 1995。
- ^ 「Guile という名前は、Usenet のディスカッションで Lee Thomas によって最初に提案されました。」Guile Scheme 1995。
- ^ Lee Thomas (1994-11-04). 「薔薇の名前」.ニュースグループ: gnu.misc.discuss.
- ^ 「GUILE - それを好む 2 つの理由」。
- ^ 「GEL:重要な名称変更」.
- ^ Tcl戦争のアーカイブ
- ^ Wingo, Andy (2023年7月16日). 「wingoの古いブログエントリ(328番から)」. Advogato.
- ^ 「Guile News」。GNU プロジェクト。2014 年 3 月 28 日時点のオリジナルよりアーカイブ。
- ^ Lord, Thomas (1995 年 7 月)。「An Anatomy of Guile The Interface to Tcl/Tk」( PostScript )。第 3 回 Tcl/Tk ワークショップ。トロント、オンタリオ州、カナダ: Usenix。2010年11 月 23 日閲覧。
- ^ 「Guile マニュアル、その他の言語」。GNU プロジェクト。Guile
は基本的には Scheme ですが、さまざまな言語ビルディング ブロックをサポートしようとしているため、Guile の上に他の言語を実装できます。
- ^ 「Guile マニュアル、コンパイラ タワー」。GNU プロジェクト。Guile
は、Scheme から始まり、VM 命令セットに似た言語まで徐々に簡素化される言語のタワーを定義します。
- ^ 「GNU Guile 2.2.0 リリース」 2017-03-16 . 2020-01-20閲覧。
- ^ 「GNU Guile 3.0.0 リリース」 2020-01-16 . 2020-01-20閲覧。
- ^ 「GNU Guile 3.0.0 リリース」 2020-01-16 . 2020-01-20閲覧。
- ^ 「Elisp の実装について?」 BT Templeton。
- ^ 「Emacs、Guile、Emacs Lisp の将来」。
- ^ 「12.1 GNU Guile 統合」。gnu.org。2020年3 月 16 日閲覧。
さらに読む
- 「Guile の解剖学、Tcl/Tk へのインターフェース」(1995)
- Blandy, Jim (1998)。Peter H. Salus (編)。「Guile: 完全なアプリケーションのためのインタープリタ コア」。プログラミング言語ハンドブックIV: 関数型プログラミング言語と論理型プログラミング言語 (第 1 版)。Macmillan Technical Publishing: 87–104。ISBN 1-57870-011-6。
外部リンク
- 公式サイト
- Guile リファレンスマニュアルを 1 つの長い Web ページにまとめました
- GNU Savannahソフトウェアフォージのソースコード
- Guile とは何ですか?
- 「Guile の簡単な歴史」(Guile マニュアルより)
- GNU Guile のメンテナー Marius Vollmer 氏への 2003 年のインタビュー
