RandomThoughts

RandomThoughts

【書籍】まつもとゆきひろ、言語のしくみ

Contents:
  1. 購入動機 2022-08-17
  2. 読んでいる間の感想
    1. 2-4まで読んだ感想:どうも言語の実現方法の話が多すぎていまいち 2022-08-19
    2. 3-2、ドット記法の実現の所はなかなか面白い
    3. 3-3、文法を見直す話はなかなか良い
    4. NaN Boxingの話はなかなか勉强になった
  3. 読み終わっての感想 2022-08-25
    1. 今の時代でもこういうふうにやってみるのが大切なのだろうか?

購入動機 2022-08-17

仕事で自作言語を作っていて、新しい機能を追加する段になってどうも良いシンタックスや機能が思いつかない。 こういう言語のデザインについてヒントにならないかなぁ、と思って購入。

読んでいる間の感想

読んでいる間の感想を書いていく。

2-4まで読んだ感想:どうも言語の実現方法の話が多すぎていまいち 2022-08-19

本書の序盤にも書いてあるように、言語のデザインの話を語るのが良いと思うんだが、 どうもあまり詳しいとは思われないepoll使ったイベントシステムとかの話が多くて、 肝心の文法の変更とかはコラム的におまけ的に追加されてしまっている。 自分の方がこの辺は明らかに詳しいし経験もあるのであまり学ぶ事が無いんだよなぁ。

1-4, 1-5の言語デザイン入門はなかなか面白くて参考になる事も多かったので、 こういう話をもっと増やして欲しい気がする。この辺も決まった理由が多くて試行錯誤の過程が少ないので、 2章からは試行錯誤の過程を期待していたのだが、 どうも実現方法の紙幅が多い気がする。

たぶんこの本の読者の多くは実現方法に関心があるだろうからこれは読者の期待には答えているのかもしれないけれど、 自分の期待はそこでは無いし、そこに関しては冒頭にも述べてるようにすでにたくさん本はある。 「こういう言語を作る」と決めたら実装自体は読者は勝手に出来るという前提で、 どうやって作る対象を決めて改善していくかという所にフォーカスして欲しいんだが。 例えばBNFは知っている事を前提に文法の試行錯誤の話をして欲しい。 でもそれだと対象読者はほとんど居なくなってしまうのかねぇ。

小話とかコラム的なのは参考になる事も多く面白いので、こっちをメインにもっと増やして欲しいなぁ。

3-2、ドット記法の実現の所はなかなか面白い

総称関数とパイプをドットにする事を組み合わせて普通のドット記法のように見せる、というのは、 著者の言語設計のセンスを感じる良い章に思う。 こういうのは長年言語処理系やってきて考えてきた人間の思いつく事だよなぁ。 その前までのマルチスレッド周りの素人っぽさとは全く別次元の内容になっている。

3-3、文法を見直す話はなかなか良い

どの辺に不満を持ってどう変えたか、が書いてある。 もうちょっと試行錯誤というかたぶん検討したであろう採用されなかったアイデアをいろいろ見たいとは思うが、 そうはいってもこういった文法を変えていく過程というのはこの本を読む前に期待していた所なので楽しさはある。

一方で、自分が日々やっている自分言語の新しいクールなシンタックスを考える、という事に参考になる要素はあまり無い。 matzも同じようにやっているんだなぁ、と思うだけで、なにかアイデアを思いつくヒントみたいなものは特に無い。

ヒントという点では序盤に話していた、会社で仕事がポシャって暇になった、 とか、言語のデザインは一人で作らないととんがった所が出ない、とか、 本当にこだわる所以外は普通にしておく、みたいな話の方が参考にはなった。

NaN Boxingの話はなかなか勉强になった

ソケットの所はいまさらC言語でソケットプログラミングの話を長々されても…という感じで存在意義が良く分からなかった。 言語処理系の拡張の仕方の例を話すにしてももうちょっと良い例があったのでは無いか、と思うし、 ソケットの話はいかにも「なぜ今どきC言語を選んでしまった…」という内容になってしまっている。

基本データ構造の話なども別段知らない事も無く、Lispとかで良くある話が繰り返されているだけという印象。 だが知らない人にはこういうのも価値はある事かもしれないなぁ、と思わなくも無い。 この辺、この書籍のターゲットが揺れている所だよなぁ。 言語デザインに興味がある自分みたいな読者だけに絞ると狭すぎるが、 言語処理系の作り方を知りたい人向けの解説を増やしてしまうと似たような本がたくさんあるのであまり価値が無くなってしまう、という。

ただNaN Boxingは自分は知らなかったので勉强になった。 結局自分が知っているか知っていないかで印象は随分変わるよなぁ。 単なるエッセイ集として知らない所をへーっと読むくらいの気持ちで読んでいくのは一つのスタンスかもしれない。

読み終わっての感想 2022-08-25

GCの本の丸写しみたいなGCの解説がダラダラ続いたあとに「実装する気力がわかずに実際は実装できてません」と続いたり、 突然ロックフリーの解説が始まったと思ったら実装しようとして「なんかバグってて使えませんでした」と言い出したり、 ビッグデータの話をいろいろしたあとにメモリ上でsortを実装したり、 なんか全体的に「それはどうなの?」と思うようなのが続いていた。

本書で本人が述べているようにパラレルのプログラムも統計のプログラムも全然得意じゃないのにそういう言語を作ろう、 というあたりにいろいろ無理が出ている。 正直これを書いたのがmatzじゃなければ「これは酷い」で終わった本かもしれない。

だが、これを書いているのがmatzだ、というのはちょっと考えさせられるものがあった。 自分に十分な経験が無い分野でもとりあえず欲しいからやってみる、 という姿勢が、Rubyを生んだのかもしれないよなぁ。 いつも成功する訳では無い、というより失敗の方が多いだろうけれど、 少なくともmatzはRubyという特大ホームランを一本打っているからなぁ。

自分ももっと苦手な分野でも壮大なものにチャレンジしたりしていった方がいいのかもしれない。

後半のかなりの部分が実際の実装の話ばかりで、しかもただ書けば出来るような事を書きました、という内容で、あまり読む価値は感じなかった。 これでは良くある「自分で言語を作ってみよう」系の本と同じではないか、という気もしたし、 しかもいまさらC言語ゆえの面倒さをいろいろ解説されてもいまいち読む気が起こらない。 これは自分的には残念だったが、あまり言語処理系とかを勉强した事が無い人はむしろこういう内容が勉强になる、 と思ったりするのかもしれないし、そっちの読者の方が多いのかもしれないが。

ただ自分の期待していた、どうやってクールな言語(シンタックスとか)を思いつくのか、 という問題意識に対しても、全体の1/10くらいはそういう内容が含まれていたので、参考にはなった。 参考になったというか、結局自分が今やっているような事をやっていくしか無いっぽいな、 と思えたので、このままの方針でやっていこう、と自信はついた。 それは本書を読んだ意義というか、読んだ甲斐があった気がする。

読み物としては結構面白かった。なんか「えー?そりゃだめだろ〜?」と思って読んでいって、あとのコラムで「だめでした」って続いて、「ですよね〜」とか思いながら読むのが、なんかエンターテインメント性を感じてちょっとおもしろかった。

余談だが後半の実用的な例としては、ほとんど自分が作ったcsvplrhtmnix_chartでもっといい感じに実現できているのばかりで、 この辺は自分の方がセンスあるんじゃないか?という気もした。 実際自分は花粉症の時期にはバリバリ使っているしね。

今の時代でもこういうふうにやってみるのが大切なのだろうか?

Rubyを生み出したのがこういうやってみる姿勢だったのかもしれない、と思う一方で、 今の時代に同じやり方で大きな成功が生まれうるのか?というのは個人的に少し気になったので考えてみたい。

まずStreem、使ってみたいとも今後が楽しみという気も全くしない。 これはC言語だというのがまず大きいように思う。 C言語なのはmatzがC言語に慣れているからで、Rubyと同じように始めてみたんだと思うけれど、 その結果を見るに、やはり90年代と今では大きく時代が違うよなぁ、と感じてしまう。 あの頃よりも今の方が、いろいろなすでにあるものをうまく使う能力の方が重要になってきているのでは?

でもこういうのって新しいものが生み出されてみるまで分からないものだよなぁ。 iPhoneが出る前に携帯業界に同じような事を思っていたが、iPhoneは全く新しいもので全てを変えた。 時代的にもういろんなものがあるので新しいものを生み出す力がそれほど活かせない、 というのは、結局は本当かは事後的にしか分からないという話にも思う。 まぁ本当の所は分からないので大切なのは、自分はどちらを信じるか?という事かもしれない。

Streemが初期のRubyと違う所に、とりあえず使ってみたい用途があまり無いというのがあるようにも思う。 Rubyはシェル回りで雑用を片付ける、という明確な使いたい分野があって、それが出来る程度の完成度はそんなに遠くもなかった。 いろいろとできてない所があっても自分の問題が片付けられれば十分実用になる。

でもStreemはまずマルチコアを活かしたい、というのが動機にあるが、マルチコアを活かすためには結構大規模な事をする必要がある。 「まだまだ完成は遠いがとりあえず目先の事はやれる」という段階のマルチコアを活かした状態というのはなかなか考えづらい。 でもマルチコアの事を考えないなら、C言語でわざわざ作らなくても構わないように思う。 それこそ、dplyrとggplot2じゃだめなの?という話になってしまう。 RxJavaとは凄いにた事やっているからJava+RxJavaでいいのでは?という話もあるし、 それならKotlinとFlowでもいい気がしてしまう。 なんかマルチコアを活かすってのは、ちょっと小さく始める対象として難しいよなぁ。

これは見方を変えると、やってみたい事が小さく始めづらい事になっている、という事にも思える。 コアを使い切るような事で大きなデータでなにかやりたい、というのは、 C言語で独自の言語を1から作る、というのと相性が悪いんじゃないか。

例えば今自分は仕事で新しい言語を作っていて、これは既存の言語には無い制約がいろいろ必要だからやっているのだが、 これは動かす周辺に多くの知識と経験が必要な分野になっている。 だからこそ誰も作ってないという面もある訳で。 こういう所で新しい言語作るなら、知らないけれどとりあえずやってみる、 という感じでは作れない気もする。

こうして考えてみると、今の時代がどちらかはおいておいて、自分は経験の必要な所で勝負したい、と思っている気がするな。 自分が苦手だが誰もやらない分野に挑む、というよりも、皆ができない分野を自分の経験と実力でやっていく、 みたいな風に戦っていきたいと思っている気がした。