11
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

GoAdvent Calendar 2022

Day 21

O'REILLY の『Go言語でつくるインタプリタ』が良かったので、続きの洋書『WRITING A COMPILER IN GO』 もやってみた

Last updated at Posted at 2022-12-21

この記事は Go Advent Calendar 2022 カレンダー 2 の 21 日目の記事です。

『WRITING A COMPILER IN GO』という書籍を読んでコンパイラを作ってみたので、その書籍について紹介します。

『Go言語でつくるインタプリタ』と『WRITING A COMPILER IN GO』について

まず、『Go言語でつくるインタプリタ』については、
O'REILLY から 2018 年に日本語訳版が発売されたものとなります。

書籍で想定したオリジナルの言語 Monkey のインタプリタを実装していくという内容になっています。
ステップバイステップで少しずつ作っていく流れがわかりやすく、私も楽しくインタプリタの作成を実践することができました。

そして、今回紹介する書籍は『WRITING A COMPILER IN GO』というタイトルのもので、
こちらも、上記のインタプリタ本と同じ、Thorsten Ball さんが執筆された書籍となっています。
こちらは、2022 年 12 月現在は、まだ日本語訳版は発売されていおらず、オリジナルの洋書のみが販売されています。
書籍は電子、ペーパバックどちらも Amazon から購入することができます。

内容は、上記のインタプリタに対しこちらは同じ Monkey のコンパイラを作成するという内容になっています。

本記事では、『WRITING A COMPILER IN GO』読み、コンパイラを作成してみたことを振り返って、
簡単にこの書籍でどのようなことを学べるかを紹介したいと思います。

インタプリタ版とコンパイラの違い

インタプリタ版とコンパイラ版の違いは以下の図のようになります。

一言で言うと、インタプリタ版では主にコンパイラフロントエンドについて学ぶのに対して、
コンパイラ版は主にコンパイラバックエンドについて学ぶ内容になっています。

image.png

コンパイラ版で学べたこと

コンパイラ版を実際にやってみて、学べたことは以下です。
内容がコンパイラバックエンド側に集中しているため、以下をじっくり学べるようになっています。

  • マシンコードとそれを実行する環境が作成できる
    • VM 用の簡単な命令セットの実装ができる
    • 命令セットを実行する簡単な仕組みの VM を実装できる
  • コンパイラバックエンドの具体的な処理を実装できる
    • AST を再帰的に解析して、命令とオペランドのバイトコード(マシンコード)へ変換する処理が実装できる
  • 上記の仕組みの中で様々なプログラミング言語の機能を実現する方法を学べる
    • if 文や Closure などプログラミング言語の機能を実際にコンパイラ~ VM で実現する方法がわかる

まとめ

Thorsten Ball 氏の、「読者と一緒になって考えていく」スタイルの構成のおかげで、インタプリタ版に引き続きわかりやすくてよい書籍だと思いました。
コンパイラ本からいきなり読んでみてもよいと思いますし、インタプリタ本からやるとなおよいと思いました。

洋書しかまだ販売されていないため、英文を読む必要があるのがややハードルとなりますが、
特別な英語のスキルのない私でも、辞書を引きながら読めば挫折しない程度には読むことが出来ました。

References

11
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?