{"componentChunkName":"component---src-templates-post-template-js","path":"/posts/4873118220","result":{"data":{"markdownRemark":{"id":"7cf3403b-76fc-5d52-90c6-65d02a6f6d3b","html":"<p>オライリーの『Go言語でつくるインタプリタ』を読みながら、実際にインタプリタを実装してみました。</p>\n<p>うわさ通りの非常に良い本だったので、</p>\n<ul>\n<li>必要な前提知識</li>\n<li>見どころ</li>\n<li>どんな人におすすめか</li>\n</ul>\n<p>をまとめます。</p>\n<h2 id=\"書籍『go言語でつくるインタプリタ』とは\" style=\"position:relative;\"><a href=\"#%E6%9B%B8%E7%B1%8D%E3%80%8Ego%E8%A8%80%E8%AA%9E%E3%81%A7%E3%81%A4%E3%81%8F%E3%82%8B%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%97%E3%83%AA%E3%82%BF%E3%80%8F%E3%81%A8%E3%81%AF\" aria-label=\"書籍『go言語でつくるインタプリタ』とは permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>書籍『<a href=\"https://amzn.to/3sjXiIM\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Go言語でつくるインタプリタ</a>』とは</h2>\n<p><a href=\"https://www.amazon.co.jp/dp/4873118220?&linkCode=li3&tag=oshimayuki0d-22&linkId=ce7aeea09d49f9b507cb84c6c1ee338e&language=ja_JP&ref_=as_li_ss_il\" target=\"_blank\"><img border=\"0\" src=\"//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4873118220&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=oshimayuki0d-22&language=ja_JP\" ></a><img src=\"https://ir-jp.amazon-adsystem.com/e/ir?t=oshimayuki0d-22&amp;language=ja_JP&amp;l=li3&amp;o=9&amp;a=4873118220\" width=\"1\" height=\"1\" border=\"0\" alt=\"\" style=\"border:none !important; margin:0px !important;\"></p>\n<p>この本はタイトル通り、Go 言語でインタプリタを実装する書籍です。</p>\n<p>実装するのは Monkey というシンプルな言語で、最終的には REPL で実行可能な Tree-Walking 型のインタプリタができあがります。</p>\n<p>コードはほぼ書籍内に書かれており、写経しながら読み進めるのに適しています。</p>\n<h2 id=\"必要な前提知識\" style=\"position:relative;\"><a href=\"#%E5%BF%85%E8%A6%81%E3%81%AA%E5%89%8D%E6%8F%90%E7%9F%A5%E8%AD%98\" aria-label=\"必要な前提知識 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>必要な前提知識</h2>\n<p>この本を読む上で必要な前提知識は非常に少ないです。</p>\n<p>Go 言語の基本文法が分かれば十分で、コンパイラやインタプリタについての知識は不要です。</p>\n<h2 id=\"3-つの見どころ\" style=\"position:relative;\"><a href=\"#3-%E3%81%A4%E3%81%AE%E8%A6%8B%E3%81%A9%E3%81%93%E3%82%8D\" aria-label=\"3 つの見どころ permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>3 つの見どころ</h2>\n<p>自分にとって、この本の見どころは以下の 3 つでした。</p>\n<ul>\n<li>Pratt 構文解析器</li>\n<li>クロージャの実現</li>\n<li>マクロシステムの実装</li>\n</ul>\n<p>それぞれの見どころについて、簡単に書いていきます。</p>\n<h3 id=\"pratt-構文解析器\" style=\"position:relative;\"><a href=\"#pratt-%E6%A7%8B%E6%96%87%E8%A7%A3%E6%9E%90%E5%99%A8\" aria-label=\"pratt 構文解析器 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Pratt 構文解析器</h3>\n<p>この本は字句解析や構文解析もツールを使わずに実装していくのですが、そこで最初の見どころが Pratt 構文解析器の実装です。</p>\n<p>Pratt 構文解析は「再帰下降構文解析」の一種で、JSLint で使われているそうです。</p>\n<p>再帰下降構文解析自体はなんとなく実装したことがあったのですが、Pratt 構文解析のあまりのシンプルさに衝撃を受けました。</p>\n<p>書籍の中にも書かれている通り、最初はなぜそれでうまく動くのかピンと来なかったりしますが、理解できたときの驚きはとても大きいです。</p>\n<h3 id=\"クロージャの実現\" style=\"position:relative;\"><a href=\"#%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3%E3%81%AE%E5%AE%9F%E7%8F%BE\" aria-label=\"クロージャの実現 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>クロージャの実現</h3>\n<p>実装していくインタプリタは Tree-Walking 型のため、構文解析さえできれば、評価の部分は特別難しくはないです。</p>\n<p>そんな評価の章で特に良かったのが、クロージャを実現できることです。</p>\n<p>JavaScript などでよく話題になるクロージャにおける変数の束縛を、実際に実装してみることができるのです。</p>\n<p>Monkey 言語は非常にシンプルな文法ですが、関数の挙動がパワフルで、こんなにシンプルな実装でもこんなに複雑なコードを実行できるのかと感動しました。</p>\n<h3 id=\"マクロシステムの実装\" style=\"position:relative;\"><a href=\"#%E3%83%9E%E3%82%AF%E3%83%AD%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E5%AE%9F%E8%A3%85\" aria-label=\"マクロシステムの実装 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>マクロシステムの実装</h3>\n<p>最後に、付録のマクロシステムについてです。</p>\n<p>4 章まで実装すると一段落なので「付録のマクロシステムまでは実装しなくてもいいかな」という気持ちになってしまうかもしれませんが、ここもかなりの見どころでした。</p>\n<p>この付録を読み、手を動かしてみると、AST (抽象構文木) の取り扱いについて理解が深まる感触があります。</p>\n<p>最初は何をしようとしているか分かりにくい点もありますが、最終的にはここまでやって良かったと感じました。</p>\n<h2 id=\"どんな人におすすめか\" style=\"position:relative;\"><a href=\"#%E3%81%A9%E3%82%93%E3%81%AA%E4%BA%BA%E3%81%AB%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%8B\" aria-label=\"どんな人におすすめか permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>どんな人におすすめか</h2>\n<p>全体として非常に良かったこの本ですが、インタプリタやコンパイラについてあまり知らないという方にとてもおすすめです。</p>\n<p>遊びレベルのインタプリタやコンパイラは、実装したことがない方が想像しているよりも、ずっと簡単に実装できます。</p>\n<p>特別な知識は不要で、プログラムをすらすら書ける (コンパイルエラーなどでつまづくことがない) くらいの段階で十分取り組めます。</p>\n<p>この本は TDD で進んでいくこともあり、プログラミングの練習としても非常に良い題材なので、興味を持った方はぜひ手に取ってみてほしいです。</p>\n<p><a href=\"https://www.amazon.co.jp/dp/4873118220?&linkCode=li1&tag=oshimayuki0d-22&linkId=2823b2bf592b21d2cf405d67ea75d235&language=ja_JP&ref_=as_li_ss_il\" target=\"_blank\"><img border=\"0\" src=\"//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4873118220&Format=_SL110_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=oshimayuki0d-22&language=ja_JP\" ></a><img src=\"https://ir-jp.amazon-adsystem.com/e/ir?t=oshimayuki0d-22&amp;language=ja_JP&amp;l=li1&amp;o=9&amp;a=4873118220\" width=\"1\" height=\"1\" border=\"0\" alt=\"\" style=\"border:none !important; margin:0px !important;\"></p>","fields":{"slug":"/posts/4873118220","tagSlugs":["/tag/interpreter/","/tag/go/"],"autoRecommendPosts":["linux-learning-roadmap","4873117127","4839975868","c-next-step-books"]},"frontmatter":{"date":"2022-02-04T13:34:30.506Z","description":"オライリーの『Go言語でつくるインタプリタ』を読みながら、実際にインタプリタを実装してみました。\nうわさ通りの非常に良い本だったので、必要な前提知識・見どころ・どんな人におすすめか、をまとめます。","tags":["interpreter","go"],"title":"【感想】『Go言語でつくるインタプリタ』を読みながら、インタプリタを実装してみた","socialImage":null,"recommendPosts":null}}},"pageContext":{"slug":"/posts/4873118220"}},"staticQueryHashes":["251939775","3942705351","401334301"]}