Haskell勉強会

関数型プログラミングの学習日記

Lispインタプリタ―の作り方の本

Lispインタプリタ―の作り方に関する参考書が紹介されていました。

処理系の作り方を通じて、関数型プログラミング言語の動作について理解が深まると思うので、時間があったら読んでみたいです。

 

zehnpaard.hatenablog.com

 

 

6冊の本が紹介されていました。

 

定番の「SICP」本

www.amazon.com

 

日本のAmazonでも売ってました。

 

日本語版もあります。

 

ちょっと気になったのが、SICPJavaScript版があったこと。

 

出版日は「2022/4/12」になっていたので、今年出た新しい本ですね。

JavaScirptはSchemeも参考にして作られた言語なので、関数型プログラミングもある程度可能なのです。

こちらも時間があったら読みたいです。

この手の本はあまり発行部数が多くなさそうなので、とりあえず在庫切れになる前に入手しておきましょう。

 

Anatomy of Lisp

www.amazon.com

 

日本のAmazonでも売ってました。

Anatomy of Lisp

Anatomy of Lisp

Amazon

 

アメリカのAmazonも日本のAmazonも、どちらも中古本だったので、買うなら送料込みでも安いアメリカのAmazonからでしょうか?

 

Lisp in Small Pieces

www.amazon.com

 

日本のAmazonでも売ってました。

 

Lisp System Implementation

www.t3x.org

 

この本はAmazonでは売っていませんでした。

同人誌みたいな本なのでしょうか?

 

Functional Programming Application and Implementation

www.amazon.com

 

日本のAmazonでも売ってました。

 

Lispkit Lispという純粋関数型な(副作用がない)Lispの言語機能と処理系の解説。この本の最大の特徴はLispコンパイル先の抽象機械がPeter LandinのSECDマシンだということ。SECD抽象機械とそのマシン語をターゲットにするコンパイラの実装を学ぶには多分最良の資料だと思われる。

 

知らない用語が出てきました。

 

ja.wikipedia.org

 

抽象機械(ちゅうしょうきかい)とは、計算モデルのうち、チューリングマシンなどのような「機械っぽい」ものを指す語である。

 

ja.wikipedia.org

 

SECDマシンとは、関数型言語コンパイラのターゲット(目的機械)を意図し、後に大きな影響を与えた抽象機械である。SECD は Stack(スタック)、Environment(環境)、Code(コード)、Dump(ダンプ)の略であり、それぞれ仮想機械にあるレジスタの名称となっている。これらのレジスタはメモリ上の連結リストを指している。

Peter J. Landinの考案によるもので、1964年のComputer Journal誌が初出である。ラムダ計算式を評価するものだが、Landin の発表した説明は非常に抽象的で、(操作的意味論のように)実装にかなりの自由度が与えられていた。SECDマシンはより詳細化された形態で説明されることが多く、例えば Peter Henderson の Lispkit Lisp コンパイラは SECDマシンをベースとして1980年に登場している。以降、いくつかの実験的コンパイラが SECDマシンをターゲットとして使用してきた。また、ISWIMを提案した "The Next 700 Programming Languages" でも参考文献として挙げられている。

 

コンピューター(電子計算機)の動作を模した「仮想機械」の一つ、ということらしいです。

 

Topics in Advanced Language Implementation

www.amazon.com

 

日本のAmazonでも売ってました。

 

その他

Amazonで上記の本を探していたら、関連書籍として興味深い本がサジェストされていました。

 

 

SICP本の著者が書いた新しい本でした。(2021/3/9 出版)

後から仕様変更(機能追加)をしたとき困らないように、うまく設計するコツが紹介されているようです。

こちらも時間があったら読んでみたいです。

 

 

ブコメSchemeの処理系の作り方を学ぶサイトが紹介されていました。

Lispを実装したくなったら読んでほしい本6選 - Arantium Maestum

&quot;Write Yourself a Scheme in 48 Hours&quot; を写経しながら Scheme を造ると、構文を評価することが何なのかを理解できると思う。 <a href="https://en.wikibooks.org/wiki/Write_Yourself_a_Scheme_in_48_Hours" target="_blank" rel="noopener nofollow">https://en.wikibooks.org/wiki/Write_Yourself_a_Scheme_in_48_Hours

2022/12/02 10:00

b.hatena.ne.jp

 

en.wikibooks.org

 

HaskellSchemeを作るみたいですが、Haskellの勉強にもなると思いました。

 

DSL作成のための基礎知識

どの言語でもそうですが、インタプリタ―やコンパイラーの作り方を勉強しておくと、他の言語で作ってるアプリに簡易のDSLを追加できて便利です。

 

ja.wikipedia.org

 

その意味で、普段Lispを使っていない人でも、Lispの処理系の作り方を知っておくことは、いざというときの切札になります。

世の中、知らなくて損していることって、いっぱいありますからね。

 

Prologの実装方法

個人的には、論理型言語(Prolog等)の実装方法を知っておくと便利だと思います。

複雑な条件分岐がある場合に、Prologで記述するとスッキリ書けますからね。

 

LispPrologを実装する方法

www.asahi-net.or.jp

 

逆にPrologLispを実装する方法

qiita.com