5

私が知る限り、Lisp 構文は AST を表していますが、人間が簡単に読み取ったり変更したりできる高レベルの形式であると同時に、マシンがソース コードを簡単に処理できるようにもなっています。

このため、Lisp ではコードはデータであり、データはコードであると言われています。これは、コード (s-epxession) が AST にすぎないためです。OS全体を再コンパイルして新しいものを統合することなく、より多くのAST(これは私たちのデータであり、単なるLispコードです)を他のAST(Lispコード)にプラグインするか、独立して機能を拡張し、オンザフライで操作できます(ランタイム)他の言語では、コードにコンパイルされる前に、人間の言語のソース コードを有効な AST に変換するために、から再コンパイルする必要があります。

これが、Lisp 構文がそのように設計される (人間と機械の両方を満足させるために、AST を表しますが、人間が読める形式である) 理由でしょうか? より強力な (オンザフライ - ランタイム) だけでなく、より単純な (再コンパイルなし、より高速な) マンマシン間の通信を可能にするには?

Lisp マシンには、すべてのデータを保持する単一のアドレス空間しかないと聞きました。Linux のようなオペレーティング システムでは、プログラマーは仮想アドレス空間しか持たず、それを実際の物理アドレス空間のふりをして、好きなことを何でもできます。Linux のデータとコードは領域が分離されています。事実上、データはデータであり、データはコードであるからです。C (または C に似た言語) で書かれた通常の OS では、システム全体に対して単一のアドレス空間だけを操作すると非常に面倒になり、データとコードを混在させると非常に面倒になります。

Lisp マシンでは、コードはデータであり、データはコードであるため、(仮想層なしで) 単一のアドレス空間しか持たないのはこれが理由ですか? GC がありポインタがないので、物理メモリを壊さずに安全に操作できるでしょうか?

編集: Lispの利点の1つは単一のアドレス空間であると言われているので、私はこれを尋ねます:

安全な言語とは、タスクを個別のメモリ空間に分離する必要のない信頼できる環境を意味します。

Unix の「明確に分離されたプロセス」モデルの特徴は、C や C++ で記述されたコードの場合のように、安全でなくなるほど信頼できない可能性があるソフトウェアを扱う場合に強力なメリットがあります。システム。" MS-DOS とその継承者は、その意味で非常に信頼性が低く、ほとんどのプログラムのバグがシステム全体をダウンさせる可能性があります。「死のブルースクリーン」など。

システム全体が Lisp で構築およびコーディングされている場合、システムは Lisp 環境と同じくらい信頼できます。通常、これは非常に安全です。標準に準拠したレイヤーに到達すると、それらは非常に信頼性が高く、システムの自己破壊を可能にする直接ポインター アクセスを提供しないためです。

健全なパーソナル コンピューティングの第 3 法則

揮発性記憶装置 (RAM など) は、不揮発性記憶装置の読み取り/書き込みキャッシュとしてのみ機能します。オペレーティング システムを除くすべてのソフトウェアの観点から、マシンは、不揮発性と見なすことができる単一のアドレス空間を提示する必要があります。電源の中断から状態を完全に回復するのに電球よりも時間がかかるこの法則に従うコンピューター システムはありません。

前述のように、単一のアドレス空間は、実行中のすべてのプロセスを同じメモリ空間に保持します。単一アドレス空間の方が優れていると人々が主張する理由が気になります。これを Lisp の AST に似た構文に関連付けて、それが単一空間モデルにどのように適合するかを説明しようとしました。

4

1 に答える 1

7

あなたの質問は、特に Linux やその他の OS でのコードとデータの分離に関する部分で、現実を正確に反映していません。実際、この分離は OS レベルではなく、コンパイラ/プログラム ローダーによって強制されます。OS レベルでは、さまざまな保護ビット (実行可能、読み取り専用など) を設定できるメモリ ページのみがあり、このレベルの上には、プログラム メモリのさまざまな部分に制限を指定するさまざまな実行可能形式 (Linux の ELF など) が存在します。

Lisp の話に戻ると、私の知る限り、歴史的に、S 式形式は Lisp の作成者によって使用されていました。これは、言語のセマンティクスに集中し、しばらく構文を脇に置いておきたかったからです。最終的に Lisp 用の構文を作成する計画があり (M 式を参照)、Dylan のように、より多くの構文を持つ Lisp ベースの言語がいくつかありました。しかし、全体として、Lisp コミュニティは、S 式のメリットがデメリットを上回るというコンセンサスに達したため、固執しました。

コードをデータとして扱う場合、他のコードをデータとして扱うこともできるため、これは厳密に S 式に限定されるわけではありません。このアプローチ全体はメタプログラミングと呼ばれ、さまざまなレベルでさまざまなメカニズムでサポートされており、多くの言語によってサポートされています。(Perl、JavaScript、Python)をサポートするすべての言語では、evalコードをデータとして扱うことができます。ほとんどの場合、表現は文字列ですが、Lisp ではツリーであり、はるかに便利で、マクロなどの高度なものを容易にします。

于 2012-07-04T07:08:15.473 に答える