利用者:Gosyoku/OpenLisp
登場時期 | 1988年4月 |
---|---|
設計者 | Christian Jullien |
開発者 | Christian Jullien |
最新リリース | 11.5.0/ 2022年5月23日 |
型付け | Dynamic, strong |
影響を受けた言語 | Lisp, ISLISP |
プラットフォーム | Windows, most Unix-based, Linux, macOS, FreeBSD, OpenBSD, NetBSD, Solaris, HP-UX, AIX, QNX, DOS, OS/2, Pocket PC, OpenVMS, z/OS, Cygwin |
ライセンス | Proprietary |
ウェブサイト |
www |
関連言語 | Lisp |
OpenLispは、 Eligis の Christian Jullien [1]によって開発された Lispファミリーのプログラミング言語です。 [2] [3] [4]国際標準化機構(ISO)と国際電気標準会議(IEC)が共同で発行した ISLISP の国際規格、ISO/IEC 13816:1997(E)に準拠し、[5] [6] ISO/IEC 13816:2007(E) で改訂されました。 [7]
プログラミング言語 Cと Lisp で書かれており、ほとんどの一般的なオペレーティング システムで動作します。 OpenLisp は ISLISP の実装として指定されていますが、多くの Common Lisp 互換の拡張機能 (hashtable、readtable、package、defstruct、sequence、有理数)やその他のライブラリ(ネットワーク ソケット、正規表現、XML、Portable Operating System Interface(POSIX)、SQL、Lightweight Directory Access Protocol(LDAP))も多く含まれています。[8]
OpenLisp には、 read–eval–print ループ(REPL)) に関連付けられたインタープリター、Lisp アセンブリ プログラム (LAP)、C言語用のバックエンドコンパイラーが含まれています。
目標
[編集]この Lisp バージョンの主な目標は、完全に準拠した ISLISP システムを実装することです ( -islisp
フラグで起動すると、ISO/IEC 13816:2007(E) 仕様に厳密に制限されます)。第 2 の目標は、C/C++ または Java(Java Native Interface (JNI) 経由)にリンク可能な、完全な埋め込み可能な Lisp システムを提供することです。外部プログラムとの通信には、コールバックメカニズムが使用されます。
その他の目標は、スクリプト言語またはグルー言語として使用できるようにすることと、スタンドアロン プログラムの実行可能ファイルを生成することです。
ライセンス
[編集]その名前にもかかわらず、OpenLisp はプロプライエタリ ソフトウェアです。そのインタープリターは、非営利目的の使用であれば無料で利用できます。
ユーザーインターフェース
[編集]
OpenLisp は主にコンソール モードで実行されます。Microsoft Windowsではcmd.exe
、Unixベースのシステムではターミナル エミュレーターです。
;; OpenLisp v11.x.y (Build: XXXX) by C. Jullien [Jan 01 20xx - 10:49:13]
;; Copyright (c) Eligis - 1988-20xx.
;; System 'sysname' (64-bit, 8 CPU) on 'hostname', ASCII.
;; God thank you, OpenLisp is back again!
? (fib 20)
;; elapsed time = 0.003s, (0 gc).
= 6765
? _
別の解決策としては、Emacs inferior-lisp-mode
をセットアップしてEmacsから OpenLisp を実行する方法や、OpenLisp構文をサポートする統合開発環境(IDE) を使用する方法があります。 DaanSystems による LispIDE はネイティブ対応しています。
テクノロジー
[編集]メモリーマネージャー
[編集]内部的に、OpenLisp は仮想メモリを使用してオブジェクトを自動的に割り当て、拡張します。同じタイプの小さなオブジェクトは、Bibop (BIg Bag Of Pages) メモリ構成を使用して割り当てられます。大きなオブジェクトは、Lisp ヒープ内の実際のオブジェクトを指すプロキシを使用します。保守的なガベージ コレクションは、合体ヒープを使用したマーク アンド スイープです(スイープ フェーズは、スレッドを使用するように構成できます)。
データ型
[編集]OpenLisp はタグ付けされたアーキテクチャ(32ビットでは 4 ビット タグ、 64ビットでは 5 ビット タグ)を使用して、高速な型チェック (小さな整数、浮動小数点数、シンボル、コンス、文字列、ベクトル)を行います。小さな整数 (32ビットでは 28ビット、64ビットでは 59ビット) はボックス化されず、大きな (32/64ビット)整数はボックス化されます。 ISLISP の要求に応じて、任意精度演算(bignum)も実装されています。文字(したがって文字列)は、 8 ビット(ANSI、EBCDIC)または 16/32 ビット(Unicodeサポートが有効になっている場合)です。
エバリュエーターとコンパイラー
[編集]Lisp カーネル、ネイティブインタープリタ、および基本ライブラリはC言語で手作業でコーディングされ、コンパイラによって生成された LAP中間言語は、C バックエンドコード ジェネレータによって C に変換されます。
歴史
[編集]1988年、OpenLisp の背後にある最初の動機は、 Emacsクローンである EmACT を拡張するために Lisp サブセットを実装することでした。 ISLISP はすぐに当然の選択となりました。さらなる発展が続いた。
年 | バージョン | 主な特徴 |
---|---|---|
1988年 | 1.0 | OpenLisp は MLisp (Minimal Lisp) というおもちゃの言語として始まり、 ISLISP標準プロセスからのアイデアを実験しました。 |
1993年 | 3.3 | 64 ビットマシン ( DEC Alpha OSF/1 ) の最初のポート。 MLisp から OpenLisp への名前の変更 |
1994年 | 4.0 | 最初の商用利用 |
1995年 | 4.5 | ソケット ストリームのサポート |
1997年 | 5.7 | OpenLisp は、ISLISP ISO/IEC 13816:1997(E) 標準を実装した最初の Lisp です。 [10] |
1998年 | 5.8 | Unicodeオプションのサポート |
2000年 | 6.6 | LAP コンパイラへの Lisp。 LAP は、OpenLisp に組み込まれた仮想マシンによって解釈されます。速度が約 2 倍向上 |
2003年 | 7.5 | Lisp から C へのバックエンド。多くの Lisp ファイルを含むアプリケーションをスタンドアロンの実行可能ファイルにコンパイルできます。速度が 10 倍から 20 倍に向上 |
2007年 | 8.7 | ISO/IEC 13816:2007(E) リビジョン[7]に合わせた変更 |
2010年 | 9.2 | ネイティブの整数の任意精度の算術サポート |
2021年 | 11.2 | 完全な CLtL 形式の拡張を追加しました。ヒープ検出を改善する |
2022年 | 11.4 | アクティベーション ブロックのリワークにより、インタープリターが約 15% 高速になります。実験的な ASDF クローン。 |
2022年 | 11.5 | 汎用関数呼び出しは ~3 倍高速です。改善された正規表現内部モジュール。 |
ポート
[編集]OpenLisp は非常に移植性が高いと主張しており、以下を含む多くのオペレーティング システムで実行されます:Windows, 殆どの Unix と POSIX ベース (Linux, macOS, FreeBSD, OpenBSD, NetBSD, Solaris, HP-UX, AIX, Cygwin, QNX), DOS, OS/2, Pocket PC, OpenVMS, z/OS。公式 Web サイトのダウンロード セクションには、50 以上の異なるバージョンが含まれています。
標準ライブラリ
[編集]コネクタ
[編集]OpenLisp は、foreign function interface (FFI) を使用して C言語で記述されたモジュールと対話できます。ISLISP ストリームは、ネットワーク ソケットをサポートするように拡張されています ( ./net
ディレクトリには、Hypertext Transfer Protocol (http)、JavaScript Object Notation (JSON)、Post Office Protocol 3 (POP3)、Simple Mail Transfer Protocol (SMTP)、Telnet、Rss のサンプルが含まれています)、単純化された Extensible Markup Language (XML) リーダーは、XML を Lisp に変換できます。
基本的なSQLモジュールは、 MySQL、Odbc、SQLite、PostgreSQLで使用できます。コンマ区切り値(CSV) モジュールは、CSV ファイルの読み取りと書き込みを行うことができます。
ツール
[編集]開発者ツールには、データ ロギング、 pretty-printer 、プロファイラー、契約プログラミングによる設計、および単体テストが含まれます。
アルゴリズム
[編集]./contrib
ディレクトリには、いくつかのよく知られたアルゴリズムがあります (Dantzig のシンプレックス アルゴリズム、 Dijkstra のアルゴリズム、 Ford–Fulkerson アルゴリズム)。モジュールはBSD ライセンスを使用して出荷されます。
名前の由来
[編集]Openという接頭辞は、オープン ソース モデルではなく、オープン システムを指します。 [11]
この名前は、(Mocklispの後継として) Gosling Emacsで既に使用されていた MLisp 内部コード名を置き換えるために 1993 年に選択されました。
OpenLispプログラミング言語は、 Locator/Identifier Separation Protocol を実装するために 1997 年に開始されたプロジェクトである OpenLISP とは異なります。
コンパイラ
[編集]このセクションでは、コンパイラが Lisp コードを C に変換する方法について説明します。
ソースコード
[編集]フィボナッチ数関数(ほとんどのベンチマークで使用されるこの古典的な定義は、 fib
を計算する最も効率的な方法ではありません)
(defun fib (n)
(cond ((eq n 1) 1)
((eq n 2) 1)
(t (+ (fib (- n 1)) (fib (- n 2))))))
LAP中間コード
[編集]Lisp コンパイラは、Lisp ソース コードを次の中間コードに変換します。その後、この中間形式を使用して命令を分析および最適化するピープホール最適化パスが続きます。最適化後の最終的な LAP コードは次のとおりです。
((fentry fib 1 0 0)
(param 0)
(jeq _l004 '1)
(jneq _l003 '2)
(move a1 '1)
(return)
_l003
(gsub1 a1)
(recurse 1)
(move a2 a1)
(param 0)
(gsub a1 '2)
(recurse 1)
(gadd a2 a1)
_l004
(return)
(end))
Cコード変換
[編集]最後に、C コード ジェネレーターは LAP コードを使用して C の命令を変換します。
static POINTER
OLDEFCOMPILED1(olfib_00, p1) {
POINTER a1;
POINTER VOLATILE a2;
ollapenter(SN_OLFIB_00);
a1 = p1;
if (eq(a1, olmakefix(1))) goto _l004;
if (!eq(a1, olmakefix(2))) goto _l003;
ollapleave(SN_OLFIB_00);
return olmakefix(1);
_l003:
a1 = ollapgsub(a1, olmakefix(1));
a2 = olfib_00(a1);
a1 = ollapgsub(p1, olmakefix(2));
a1 = olfib_00(a1);
a1 = ollapgadd(a2, a1);
_l004:
ollapleave(SN_OLFIB_00);
return a1;
}
スタイルガイド
[編集]線の長さ
[編集]OpenLisp は、無制限の長さの行を受け入れます。推奨されるスタイルは、コード内のテキストの各行が1 行あたり最大 80 文字である必要があることです。
可決
[編集]SDF Public Access Unix System 非営利のインターネット[12] [13]上のパブリック アクセス Unix システムによって、オンラインで利用できるプログラミング言語の 1 つとして選ばれました。
Bricsys は OpenLisp を使用して、 AutoLISP を BricsCADコンピュータ支援設計(CAD) システムに実装しています。 [14]
MEVA [15]はすべて OpenLisp で書かれています。
Università degli Studi di Palermo は、OpenLisp を使用して Lisp を教えています。 [16]
参考文献
[編集]外部リンク
[編集]- 公式ウェブサイト
- Lisp Compilers and Interpreters - Curlie
- LinkedIn Group
- ISLISP on Software Preservation Group
Template:Lisp programming language [[Category:LISP]]
- ^ Parquier (2000年). “JTC1/SC22 N3170”. ISO/IEC. 11 March 2012閲覧。[リンク切れ]
- ^ Simonsen (13 March 1999). “Islisp – faq”. ISO/IEC. 11 November 2016閲覧。
- ^ Nobuto, Izumi (Tohoku Univ., Grad. Sch.); Takayasu, Ito (Tohoku Univ., Grad. Sch.) (1999). “Interpreter and Compiler of the ISO Standard Lisp ISLISP”. Transactions- Information Processing Society of Japan (Transactions of Information Processing Society of Japan). ISSN 0387-5806 17 June 2013閲覧。.
- ^ McJones (2010年). “ISLISP”. Software Preservation Group. 18 March 2012閲覧。
- ^ “ISO/IEC 13816:1997(E)”. International Organization for Standardization. 11 November 2018閲覧。
- ^ Parquier (1996年). “ISO/IEC JTC1 SC22 WG16 N177 – DIS vote”. ISO/IEC. 15 March 2012閲覧。
- ^ a b “ISO/IEC 13816:2007(E)”. International Organization for Standardization. 11 November 2018閲覧。
- ^ Jullien (2011年). “OpenLisp v9.8.0 Reference Manual”. Eligis. 14 March 2012閲覧。
- ^ Jullien (2011年). “OpenLisp ChangeLog”. Eligis. 15 March 2012閲覧。
- ^ Rinehuls (4 August 1999). “JTC1/SC22 N2969”. ISO/IEC. 11 November 2016閲覧。
- ^ Jullien (2011年). “OpenLisp FAQ”. Eligis. 15 March 2012閲覧。
- ^ Stover (2005年). “7.2 Languages on SDF”. SDF Public Access Unix System, Inc.. 14 March 2012閲覧。
- ^ “Hosting companies”. ALU (Association of Lisp Users). 9 February 2011時点のオリジナルよりアーカイブ。18 March 2012閲覧。
- ^ “Bricscad News”. Bricscad (2009年). 20 March 2012閲覧。
- ^ “Competitive Intelligence and Decision Problems”. Amos Davis (2013年). 30 September 2014閲覧。
- ^ “Corso di Informatica Teorica”. Università degli Studi di Palermo (2013年). 22 March 2013閲覧。