書評☆3 まつもとゆきひろ 言語のしくみ | yaccやC言語を使った具体的で意味のあるプログラミング言語の実装手順

概要

日経Linux 2014年4月号から2016年12月号まで連載された「作りながら学ぶプログラミング言語」という記事をまとめて加筆・編集された内容となっている。

プログラミング言語を作るという書籍は既にいくつもあるが,それらは教科書的な内容がほとんどであり,現実に役に立つような発展的な内容が書かれているものはほとんどない。また,実際に世界で広く使われているプログラミング言語の開発経験者により,デザインの仕方を語られた本自体が少ない。その時点で,この本は希少性が高い。

プログラミング言語の開発にはそんなに興味はないが,内部的にどういうことを考えてどうやって作られているかというのには興味があったので読んだ。

言語設計の部分はけっこう小難しくてあまり理解できなかったが,以下のように参考になる箇所もあった。

  • 並行プログラミングではどういうことを気にしないといけないのか
  • オブジェクト指向での継承パターンの選択
  • 構文解析ソフトyaccの使い方
  • C言語での各種具体的な実装方法

参考

p. 004: はじめに

どのように言語をデザインすべきか経験から語れる人など、そうはいないのです。


数少ない例外としては、C++設計者であるBjarne Stroustrup氏による「The Design and Evolustion of C++」(邦題「C++の設計と進化」、ソフトバンクパブリッシング)があります。この本を読めばC++がなぜこのようになっているのか、何を目指していたのかが分かる貴重な書籍です。

C++の設計について書かれている本があることを知らなかったので参考になった。いずれ読んでみたい。

p. 036: 1-3 バーチャルマシン

【シンボル】 言語処理系が内部でメソッド名などの識別に使っている値で、任意の文字列に対して異なった値が割り当てられる。

gdbなどでシンボルという単語を見かけるが意味がわからなかった。この解説で意味がわかった。

p. 056: 単純継承の問題

ところが多重継承でクラス関係がDAG (Directed Acyclic Graph) 構造となる場には、探索順序は一意には定まりません。

単一継承の問題とは、継承のラインを子得てメソッドなどのクラス属性を共有する方法がないことです。共通のスーパークラスが存在しない場合、属性を共有できず、コピーするしかありません。

オブジェクト指向型の単純継承と多重継承で継承時に発生する問題を知れた。

p. 223: 4-2 基本データ構造

ユニオンは同じメモリー領域に対する複数の方での解釈を定義するものです。


ユニオンはあまり頻繁に用いられるものではないので、そのようなものをなんに使うのか疑問に持つ人も多いでしょう。ユニオンの 使われ方はいくつかありますが、典型的なものは以下の3種類です。

  • 最大サイズの確保
  • 条件付き構造体定義
  • メモリー解釈の操作

C言語のunionは使いどころがよくわからなかったのだが,使うタイミングが少し良くわかった。

p. 293: 5-3 CSV処理機能

最も都合が良かったものが「semitrivial/csv_parser」というリポジトリーでした。グローバル変数を使っておらず、非常にシンプルで無駄なことをしていません。

実際にGitHubからC言語のCSVパーサーを探して,組み込む手順について解説していて参考になった。

p. 304: 時刻の表現方法

Linuxを含めた多くのUNIXシステムでは、1970年1月1日00:00 (UTC) をエポックとします。


例えば、現在時刻を取り出すシステムコールtime(2) は、以下のようなAPIです。


しかし、いつも秒単位で話が済むとは限らず、1秒以下の情報を取り出す必要があるかもしれません。UNIXでもそう思ったのか、より新しいシステムコールgettimeofday(2) が追加されています。こちらは秒以下の時刻がマイクロ秒単位で与えられます。


その後、さらにさらに細かい時刻分解能が必要なこともありえると考えたのか、POSIX.1-2008ではより新しいシステムコールclock_gettime(2) が追加されています。


MacOSではいまだにclock_gettime()が未実装なのだそうです。

C言語での時刻の取得方法について参考になった。

p. 339: 5-7 ストリームグラフ

CUIはキャラクターで画面表示を行うので、もう何十年も使われてきているターミナルの中で動作できます。今後もターミナルがなくなることは心配しなくてよさそうです。今回はこちらのCUIを使ってグラフを表示する機能を作ります。

そこで参考にできるツールはないかといろいろ探したところ、stag *1 (https://github.com/seenaburns/stag/) というツールを見つけました。

stagは標準入力から数値データを読み込み、それに対して棒グラフを出力するツールです。

CUIでのグラフ作成ツールを知れた。

結論

プログラミング言語を自分で作ることというのはあまりないかもしれない。しかし,内部でどういうしくみで,何に気を払って実装されているのか,しっておくと他のことにも役に立つように感じた。

技術者の教養として読むのはいいと思った。

パーマリンク: https://senooken.jp/blog/2018/07/05/

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です