私は多くのCSカリキュラムと、LISPで特別に書かれたLISPインタープリターを研究する意欲的なプログラマーを求める新しいプログラマーのための学習提案を見てきました。これらのサイトはすべて、「その知的な啓示」、「すべての真剣なプログラマが持つべき啓蒙体験」、「ハードウェアとソフトウェアの関係を示している」など、特に この記事この評判の良いハウツー から引用。
私の質問の一般的な感情は、LISPはどのようにして上記の目標を達成し、なぜlispなのかということです。なぜ他の言語ではないのですか?
これは、schemeでのスキームインタープリター(SICP http://mitpress.mit.edu/sicp/ から取得)の作成を終えたばかりで、pythonインタプリタをスキームで使用しており、この伝説的なエピファニーが特に前者からのものであることに苦労しています。2つの言語間のスキームインタプリタで利用できる特定の技術的な詳細を探して、その方法について理解を深めていますプログラムは機能します。
すなわち:
解釈する言語で書かれた通訳の研究がなぜ強調されているのか-元の言語と構築された言語をまっすぐに保つのは単なる精神的な練習であるのか、それとも解決策が自然の中でしか見られない特定の問題があるのか元の言語?
LISPインタープリターは、将来のソフトウェア設計のための優れたアーキテクチャー概念をどのように示しますか?
この演習をC++やJavaなどの別の言語で行った場合、何を見逃すでしょうか?
この演習で最もよく使用される要点または「メンタルツール」とは何ですか? **
**私はhaveを行ったので、自分が選択した回答を選択しましたツールと私はpythonインタープリターよりもスキームインタープリターに適しているかもしれない異なる解析方法を見つけたいと思います。
「私も」と答えるリスクがあるので、試してみるとわかります...
コンピューター言語を研究していると、構文解析については少なくとも半分だという印象を受けるでしょう。 LISPを学ぶと、表面の構文の解析は、多くのイライラする単一の括弧を好まない人(ほとんどの人と同様)にとって便利なものに過ぎないことに気付くでしょう。
それから、あなたはその便宜のために高い代償が払われたことに気づくことができました。 LISPでは、プログラムが別のプログラムを作成して実行するのは簡単です。他の言語では、ローマ数字で乗算を行うような高度な手法です。
もちろん、ほとんど誰もが「誰がそれをする必要があるのか」と尋ねるでしょう。まあ、それはあなたが前にあなたがすることができないことに気づくことさえなかった事の全体的なビスタを開くことを非常によく見ることができました。他の言語でもできますが、それほど簡単ではありません。
挿入されたIzkataのコメントに答える:
...それはほんの一部です...
次に、今日「モダン」と見なされているもののいくつかが、LISPで40年間古くからあることに気付きます。関数型プログラミングのように。ガベージコレクションのように。閉鎖のように。
それは、現代の言語にOOPなどの新しい良いアイデアがないと言っているわけではありません。しかし、LISPを学べば、視野が広がります。
あなたの質問に対する簡単な答えは、LISPを試すことです。できれば [〜#〜] sicp [〜#〜] と組み合わせてください。その後、あなたは悟りを開くでしょう。
それは言った...
コードはデータです
ほとんどの言語では、コードとデータを明確に区別しています。 LISPはしません。これにより、たとえばLISPでLISPパーサーを簡単に記述したり、LISP内でLISPコードを操作したりすることが可能になります。私が見つけたこの啓蒙主義の最も良い説明は LISPの性質 です。
言語の構文が非常に単純であるため、これは一部には当てはまります。構文が邪魔になるため、他の言語では実用的ではない(メタプログラミングのような)LISPでのことを可能にします。
さらに読む
平均を打ち負かす
なぜそれが解釈する言語で書かれた通訳の研究がそれほど強調されているのですか?
一般に、インタープリターを研究することで、その言語と機能についての洞察が得られます。一般に、プログラミング言語でコードを学習することは、リスニングとリーディングによって話し言葉を練習することに似ています。それは、その言語で何ができるか、どのように使用されるか、および一般的な「イディオム」に慣れます。より具体的には、LISPは同型言語です。つまり、式の構文はデータの構文と同じです。LISPでコードを書くと、リストを書いているように見える逆に。したがって、LISPコードをLISPコードで解釈するのは、car
およびcdr
を含むリストを実行するのと同じくらい簡単です。
概念的に最大限に活用するには、このエクササイズをどのように活用すればよいですか?
インタプリタがそれ自体をどのように解釈するかを考えてください-多くのメタサーキュラインタプリタの実装(ホモニコ言語がそれ自体を解釈する場合)では、関数を単に「通過」できます。たとえば、car
を実装するには、引数のcar
を取るだけです。これにより、データストレージメカニズムからの重点が取り除かれ、機能に重点が置かれます。
LISPインタープリターは、将来のソフトウェア設計のための優れたアーキテクチャー概念をどのように示しますか?
インタープリターは非常に複雑になる可能性があり、それはそれらを設計する上で優れたアーキテクチャーを奨励します。それを念頭に置いて、これは個々の通訳者により依存しています。
この演習をC++やJavaなどの別の言語で行った場合、何を見逃すでしょうか?
これらの言語は同義語ではないので、メタサーキュラーLISPインタープリターの優雅さと単純さから利益を得ることができません。これは運動を難しくし、おそらくあまり一般的ではありませんが、それが実際にそれほど有益ではないとは言いません。
この演習で最もよく使用される「メンタルツール」は何ですか。
これについては良い答えがあるかわかりません。単に、インタプリタがどのように機能するかを確認するのに役立ち、さらに重要なことには、インタプリタをいじくり回して、言語への小さな変更を簡単に実装できる方法を確認するのに役立ちます。
LISP自体は、非常に簡単に解析できるように構造化されています。コンパイラを書こうとすると、言語のすべてが式であり、あいまいさが少ない方がはるかに簡単であることがわかります。 LISPはあいまいさをなくすためにどこでも括弧を強制し、ステートメントはなく、式のみを持ちます。
LISPは非常に解析しやすいという事実により、ユーザーは自分のソースコードを解析し、それを使って手品を行うことができます。データとコードの境界がぼやけ、リフレクション、動的コードの書き換え、プラグイン、シリアライゼーションなど、通常かなりの労力を必要とすることを簡単に行うことができます。
それがその要点です。演習はおそらく、コードがそれ自体から簡単に解析できる場合に何ができるかについての洞察を与えることを意図しています。
それが誰にとっても本当に重要かどうかはわかりません。 LISPインタープリターがどのように機能するかを知らなくても、成功する開発者になることができます。コンピュータサイエンスを学ぶときは、LISPの基本的な考え方を学ぶ必要があります。
LISPインタープリターはLISPプログラマーにとって重要です。 言語の使い方を完全に理解するには、インタプリタ(およびコンパイラ1 )の仕組みを理解する必要があります。
LISPインタプリタは、学生にいくつかのことを教えるためのコンピュータサイエンスのツールとしてよく使用されます。
実装を通じてコンパクトで最小限の言語定義を理解する: Alan Kay それを Maxwell’s Equations of Software と呼びました。
インタプリタを変更および拡張することにより、理解 言語レベルのプログラミング
理解 メタレベルプログラミング と、プログラミング言語の設計と使用に対するそれの影響。たとえば、「引用」の意味とそれが必要な理由を理解する
プログラミング言語LISPの解釈とその ラムダ計算 への接続を理解する
LISPインタープリターは短時間で学習および理解できるため、教育用デバイスとして役立ちます。 LISPについてすでに知っている学生はほとんどいないため、上記の概念を学ぶことに関しては、学生は平等な立場にいます。