LispでLispインタープリターを勉強することがなぜそんなに重要なのですか?


30

私は、特にlispで書かれたLispインタープリターを研究することを志望するプログラマーに求める新しいプログラマーのための多くのCSカリキュラムと学習提案を見てきました。これらのサイトはすべて、「その知的な啓示」、「すべての真面目なプログラマーが持つべき啓発体験」、「ハードウェアとソフトウェアの関係を示す」、その他の曖昧な声明、特にこの記事からこの評判の高いハウツー

私の質問の一般的な感情は、Lispが上記の目標をどのように達成し、なぜLispを達成するのかということです。他の言語はなぜですか?

Schemeでスキームインタプリタの記述を終えたばかりなので(SICP http://mitpress.mit.edu/sicp/から取得)、現在スキームでPythonインタプリタを記述しており、この伝説的なエピファニーを得るのに苦労しているため、これを求めています。それは前者から具体的に来ることになっています。プログラムの仕組みを理解するために、スキームインタープリターで活用できる2つの言語間の特定の技術的な詳細を探しています。

すなわち:

解釈する言語で書かれた通訳者の研究が強調されているのはなぜですか?元の言語と構築された言語をまっすぐに保つのは単に素晴らしい精神的な運動ですか、それともその性質でしか解決できない特定の問題がありますか?元の言語?

Lispインタプリタは、将来のソフトウェア設計のために優れたアーキテクチャの概念をどのように実証しますか?

この演習をC ++やJavaなどの別の言語で行った場合、何が恋しいですか?

何が最も使用され、この運動からテイクアウトや「精神的なツールが」?**

** このエクササイズから、他のどのツールよりも頭の中で解析ツールを設計するスキルが得られていることに気付いたので、答えを選択しました。スキームに適した異なる解析方法を見つけたいと思います。 Pythonインタープリターよりもインタープリター。



4
@gnat正確なキャリアアドバイスではなく、「Lispのすごいところ」の質問です。
ロバートハーヴェイ14

1
@RobertHarveyは、リンクがキャリアのためだけでなく、教育アドバイスのためでもあることを意味します。しかし、まあ、Lispは-で、それほど大きなあまりにもおそらく良いフィット感です
ブヨ

1
特定のエクササイズから何を学ぶかを尋ねているようです。あなたの沈黙は怠goodの兆候であり、優れたプログラマーの鍵となりますが、エクササイズから学べることを見つける唯一の方法にかかわらず、それを実行して確認することです。誰もあなたがそれから学ぶことをあなたに伝えることはできません、あなたはそれをしなければなりません。
ジミーホファ14

2
この質問は教育全般に関係していますが、「どの言語を学ばなければならないのか」という方法で「教育アドバイス」として分類することはしません。です。つまり、特定の種類のコースや仕事に固有のものではありません。実際、教育用の流行語の一部を削除すると、これはプログラミング言語全体に関する質問であり、その答えは言語機能について説明しています。Lispにも固有のものではありませんが、xsltなどの他のホモイコニック言語に適用できます。ですから、これは完璧な質問ではなく、単に「キャリアアドバイス」ではないということではありません。
TheRubberDuck 14

回答:


17

「私も」と答えるリスクがあるので、試してみると...

コンピューター言語を勉強しているなら、少なくとも構文解析の半分であるという印象を受けるでしょう。Lispを学べば、表面構文の構文解析は、多くの苛立たしい単一括弧を好まない人々(私たちのほとんど)にとっての利便性に過ぎないことに気付くでしょう。

そうすれば、その利便性のために大きな代金が支払われたことに気付くでしょう。Lispでは、プログラムが別のプログラムをビルドして実行することは簡単です。他の言語では、ローマ数字で乗算を行うなど、高度な手法です。

もちろん、ほぼ誰もが「誰がそれをする必要があるのか​​」と尋ねるでしょう。まあ、あなたはそれがあなたが前にできなかったことにさえ気付くことさえなかったものの全体的な展望を開くことを非常によく見ることができました。他の言語でもできますが、それほど簡単ではありません。

イズカタのコメントに答えるために挿入:

  • SHRDLU自然言語理解プログラムは、英語の文または質問をMICRO-PLANNERと呼ばれるLisp方言のプログラムに翻訳して実行することで機能しました。
  • たとえば、プログラムを単純化したり、正しいことを証明したりするためにプログラムを操作するプログラムは、当然Lispで書かれています。
  • プログラムでプログラム生成を使用して、視覚的なシーンを理解しました。そこでは、コードを増やすことなく、3次元オブジェクトで可能なすべての対称性を処理する必要がありました。
  • プログラムの一種である論理式を操作する際の論理および定理証明取引に関係するもの。
  • シンボリック積分や微分計算などのシンボリック数学には、ミニチュアプログラムのような数学式の操作が含まれます。
  • コード生成に関係する問題、またはより高度な用語「部分評価」は、Lispでは自然なことです。私はずっと前にデータベースブリッジプログラムのためにこれをしました。私はCでそれをしましたが、Lispほど簡単ではありませんでしたが、Lispからアイデアを得ました。これは、当時ほとんど誰もできなかった手法と見なされていました(特にCOBOLヘッド)。多分もっと今、私は願っています。

...それはほんの一部です...

それから、あなたは、今日「近代的」であると考えられているものが40年の間Lispで古い帽子であったことに気づきます。関数型プログラミングのように。ガベージコレクションのように。クロージャーのように。

だからといって、OOPなどのように、現代の言語には新しい良いアイデアがないと言っているわけではありません。しかし、Lispを学ぶと、視野が広がります。


You can do it in other languages, but not nearly so easily.-好き?(私への質問は、このような文が頻繁に行われているためのようですが、ほとんどのより具体的に取得することはありません)
Izkata

javascriptが独自のソースコードを印刷でき、オブジェクトをトラバースして文字列リテラルを取得し、それをオブジェクトリテラルに変換できることに気付いたときに、世界に革命が起こったと最初に思いました。それから、Perlが$ Data :: Dumper :: Deparseと共にこれを持っていることに気づき、それからlispがこれを永遠に持っていることに気付きました。インタプリタを理解することは、生きているモジュールを構築するために常にあるこの力を解き放ちます。そして、Lispでは、これは他のどの言語よりもアクセスしやすいです。
ドミトリー

面白いのは、Lispの内部構造を認識しているLispプログラマーが、javascriptからbash、perl、またはpythonに至るまで、あらゆる動的言語に対する独自のLispフロントエンドを常に作成できることです。利用可能な環境からlispがうまくブートストラップします。
ドミトリー

19

あなたの質問に対する簡単な答えは、できればSICPと組み合わせてLispを試すことです。その後、あなたは啓発されます。

とはいえ...

コードはデータである
ほとんどの言語では、コードとデータを明確に区別しています。Lispはしません。これにより、たとえば、LispでLispパーサーを簡単に記述したり、Lisp内でLispコードを操作したりできます。私が見つけたこの啓発の最も良い説明は、The Lispの性質です

これは、言語の構文が非常に単純であるため、一部は正しいです。構文が邪魔になるため、他の言語では実用的ではないLisp(メタプログラミングなど)で可能になります。

平均を破ってさらに読む


3
2番目の段落は意味をなしません。ホモイコニシティ!=単純な構文。単純な構文により、任意の言語で Lispパーサーを簡単に記述できますこれを参照)。3番目の段落はあいまいで、例を必要とします。

@MattFenwickは、ホモイコニック性を複雑な構文で実行できることは事実ですが、それは非常に困難です。ホモイコニック構文を扱っている場合、それが要求される一貫性以外の理由がなければ、非ホモイコニック構文よりも従うことが非効率的に容易になる場合、それは単純になるだろうと仮定するのは公平です。あなたの第二の点は良いものですが、それは単純な構文なので、LISPは(homoiconicityは、そのシンプルさの原因であっても)のでhomoiconicityの、解析することは容易ではありません
ジミー・ホッファ

1
いずれにせよ、データ値を取得してプログラムとして解釈するオーバーヘッドはほとんどありません。これはいいことです。構成データのインタープリターを作成するだけでよい場合、構成によるプログラミングは簡単です。高度な数学的変換(ステートフル言語では実装が困難)は、多くの場合、Lispの純粋なフラグメントの単なる構文変換に「縮小」されます。
ノメン14

1
@MattFenwick:答えから「ホモイコニシティ」という単語を削除しました。
ロバートハーヴェイ14

1
The Lisp of Natureに+1以上を与えることができたらいいのにと思います。私はそのような素晴らしい説明を見たことがない。
ドーバル14

9

なぜ、通訳する言語で書かれた通訳者の研究がそれほど強調されているのですか?

一般的に、インタープリターを学習すると、その言語と機能についての洞察が得られます。一般に、プログラミング言語でコードを勉強することは、リスニングとリーディングによって話された言語を練習するようなものです。より具体的には、Lispはホモイコニック言語です。つまり、式の構文はデータの構文と同じです。Lispでコードを書くことは、リストを書いているように見えますし、逆もまた同様です。したがって、Lispコードを使用してLispコードを解釈することは、carおよびを使用してリストを実行するのと同じくらい簡単cdrです。

概念的に最大限に活用するには、この演習をどのように活用すればよいですか?

インタープリターがそれ自体をどのように解釈するかを考えてください-多くのメタサーキュラーインタープリターの実装(ホモイコニック言語がそれ自体を解釈する)では、関数を単に「パススルー」できます。たとえば、を実装するにはcar、単にcar引数を取ります。これにより、データストレージメカニズムから強調が取り除かれ、機能に焦点が当てられます。

Lispインタプリタは、将来のソフトウェア設計のために優れたアーキテクチャの概念をどのように実証しますか?

通訳者は非常に複雑になる可能性があり、そのため設計時に優れたアーキテクチャが促進されます。それを念頭に置いて、これは個々の通訳者により依存しています。

この演習をC ++やJavaなどの別の言語で行った場合、何が恋しいですか?

これらの言語はホモイコニックではないため、メタサーキュラーLispインタープリターの優雅さとシンプルさの恩恵を受けません。これは運動をより難しくし、おそらくあまり一般的ではありませんが、実際にそれほど有益ではないとは言いません。

この演習で最もよく使用されるテイクアウトまたは「メンタルツール」は何ですか?

これに対する良い答えがあるかどうかはわかりません。単にインタープリターがどのように機能するかを確認するのに役立ち、さらに重要なことには、言語の小さな変更を簡単に実装できる方法を確認するためにそれをいじくり回すだけです。


5

LISP自体は、非常に簡単に解析できるように構成されています。コンパイラーを作成しようとする場合、言語のすべてが式であり、あいまいさが少ないと、はるかに簡単になります。LISPは、曖昧さを排除するためにどこでも括弧を強制し、ステートメントはなく、式のみを持ちます。

LISPが非常に簡単に解析できるという事実は、ユーザーが独自のソースコードを解析し、それを使って手品を行うことを促します。データとコードの境界があいまいになり、リフレクション、動的なコードの書き換え、プラグイン、シリアル化など、通常かなりの労力が必要なことを簡単に行うことができます。

それがその要点です。この演習はおそらく、コード自体からコードを簡単に解析できる場合に何ができるかについての洞察を与えることを目的としています。


解析しやすいのはLispではありません。S式は簡単に解析できます。さらに、Lispを解析する必要があります。
レイナージョスウィグ

@Rainer:それは単なるピッキングではありませんか?私の世界では、構文解析とはテキストからASTに移行することを意味し、コマンドの解釈については何も言いません。
アレクサンダートーストリング

C ++では、パーサーは構文的に間違った関数宣言を検出します。Lispではない。読者はプログラミング言語Lispについて何も知らない。C ++パーサーは、完全なC ++構文を認識しています。Lispリーダーはs式のみを知っています。
ライナージョスヴィッヒ

ああ、それから私はあなたが意味するものを理解する。確かに、私はまだ単純なLispエバリュエーターは単純なc ++エバリュエーターよりも構築が簡単だと思いますが。それが彼らがSICPでやっていることです(私が読んでからしばらく経ちました)?
アレクサンダートーストリング

SICPで使用される言語は非常にシンプルで、完全なSchemeでもありません。小さなCのような言語のインタープリターもシンプルでなければなりません。C ++は大きいです。その困難の一部は、比較的多数の組み込み構文に起因しています。典型的なLispシステムでは、構文の多くはマクロで構築されます-インタープリターの外部。マクロは、ソース変換の構文と拡張メカニズムを実装します。これにより、コアが小さくなります。しかし、マクロは巨大になる可能性があります。たとえば、LOOP構造の実装には、2000行を超える複雑なマクロコードがあります。
ライナージョスヴィッヒ

4

誰にとってもそれが本当に重要かどうかはわかりません。Lispインタープリターの仕組みを知らなくても、開発者として成功することができます。しかし、コンピューターサイエンスを勉強するときは、Lispの基本的な考え方を学ぶ必要があります。

Lispインタープリターは、Lispプログラマーにとって重要です。言語の使用方法を完全に理解するには、インタープリター([およびコンパイラ] 1)の仕組みを理解する必要があります。

Lispインタプリタは、多くの場合、学生にいくつかのことを教えるためのコンピューターサイエンスのツールとして使用されます。

Lispインタプリタは、短時間で学習および理解できるため、教育デバイスとして役立ちます。すでにLispについて知っている学生はほとんどいないので、学生は上記の概念を学ぶ際にレベルのフィールドにいます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.