『コンパイラ 作りながら学ぶ』を読み始めてみた

自分が興味ある分野ってなんだろうと考えたけれど、WEBとか心の奥底では食っていく手段としか考えてないし、人工知能とかIoTとかにも大して興味ないし、VRにはまあ多少興味あるけどそれもゲームとかが好きで普段からバリバリやってる人に比べたら無いに等しいくらいしか興味ないし、スマホアプリとかもさっぱり興味ないし、なんだろうなあ。。。

と毎日悩んでいたけど、多分コンパイラに興味がある。構文解析とか仮想マシンとか、そういうのに心を惹かれる。なのに今まで避けていた。コンパイラとかはちゃんと情報系の大学院とかを出た偉い人がやる分野だと先入観があり、自分がやるようなことではないと思っていたのだ。

しかし、コンピュータの分野で興味を引かれるのって本当にコンパイラくらいだ。なんでかと問われても、自分でもなぜかはわからない。プログラミング言語を作りたいという欲求があるわけでもない。ただなんとなくコンパイラは面白そうだ。

人生は短い。特にプログラミングを始めるのが人よりだいぶ遅かった自分のような人間は、本当にやりたいことだけをやるべきだと思った。だから独学でコンパイラの勉強しょうと思った。それで食えるかと言われたら、まあ食えないだろうが、面白いことをやるべきだ。面白いことがなければ、人生はやってられない。

もちろん飯を食っていくためには別のこともやんないといけない。そこはまあ、人工知能様がWEBの現場を破壊し尽くしてくれるまではPHPMySQLJavaScriptという三種の神器でのらりくらりやってくしかないだろう。

手始めに『コンパイラ 作りながら学ぶ』を読み始めた。ビギナー向けの本だ。大学の学部生向けの本らしい。しかし情報系の学校に行ったこともなければ理系ですらない自分には大変むずかしい。しかし面白い。章末問題ですら楽しい。

2章の章末問題を解いてみたので、GitHubにあげてみた。

github.com

普段Cは殆ど書かないので、自分でもクソなコードだと思うが、なんとか解けた(実はテストがだめで全く解けてないという可能性も高いが)。

自分は性格的に、目に見えるものにはあまり興味が向かないようだ。大体目に見えない、下層にあるものとか、原理的なことばっかりに興味が向く。そしてそれはだいたい役に立たない。その上極めるには金と時間がかかる。だからこうして産業廃棄物ができあがったわけ。

しかし産廃産廃なりに、自分の運命を受け入れて、なんとか楽しく産廃としての一生を終えねばと思う。

産廃コンパイラの勉強をする。

車輪の再発明をするときは既存ソフトのコード見ないようにする

なぜなら徒労感を半端なく味わうから。

何かを作ろうと頑張れるのは、まだこの世に無いものを作っているからだ。いかに車輪の再発明が楽しいからと言っても、人間の本能として無駄なことをしているときは気が滅入る。

そこで大切なのは、どうやって自分の作業が「無駄ではない」「生産的である」と信じ続けるか、ということだ。

既存のデファクトとなってるようなOSSのコードとか仕様を読んだりすると、自分が作ってるものがいかにゴミでガラクタかということをまざまざと見せつけられてしまう。そうなると、モチベーションがゼロになり、コードを書かなくなってしまう。俺がコードを書く意味は? となる。しかし、コードは書くべきなのだ。

真に生産的>車輪の再発明>>>超えられない壁>コードを書かない

なのだ。

もちろん「真に生産的」であるのが一番いい。でもアイデアとかスゲー技術力がないと「真に生産的」にはなれない。

イデアも技術力もない人間は、車輪の再発明を繰り返してクンフーを積むしかないのだ。そして車輪の再発明を続けていくモチベーションを維持するためには、あえて「井の中の蛙」でいることが必要だという気がする。

車輪の再発明が一段落したら、もっとすごい「真に生産的」なコードを読み、打ちのめされて、また車輪の再発明にもどる。。。そんな感じで頑張るしかないのではないか、と思った。

トークンの作り方がわからない

python製のテンプレートエンジンを作っていて、ifブロックを実装するときに昨日までは愚直に一行ずつ正規表現でマッチさせて、フラグを上げたり下げたりとかネストレベルを保持するカウンターの値を増やしたり減らしたりしてifブロック内のパースをしていたのだが、トークンに切り分けてやったほうが良いのではないかと気づいてトークンに分割するようにしてみた。

けど、全然うまくいかない。分割そのものは簡単だった。ただ、ifブロックのネストのこととかを考えると単純にいかなくなる。例えば下記みたいなのがあるとする。

{{ if hoge }}
    hogeのときだけ出力
    {{ if fuga }}
        fugaのときだけ出力
    {{ fi }}
{{ fi }}

{{}}とそれ以外をトークンにして分割すると、下記のようになる(見やすくするため、半角スペースは_で書く。あと改行は\n)。

{{
_if_hoge_
}}
\n____hogeのときだけ出力\n____
{{
_if_fuga_
}}
\n________fugaのときだけ出力\n____
{{
_fi_
}}
\n
{{
_fi_
}}
\n

これをループで回してパースしたい。

ifとfiは単純に{{}}で囲まれているだけだから簡単にパースできる。
問題はifとfiの間のブロックで、ifブロックの中にある場合はそいつらだけ別の変数に入れて、別のメソッドでブロックの中をパースしたいわけだけど、どこからどこまでがifブロックかを判定する段階でif hogeからif fugaをも含めて最後のfiまでループを回してしまっている。

すると、ifブロックパース専用メソッドの中でまたifブロックをループでなめてパースするのは無駄だ。ループは一回で済ませたい。

トークンは文字列じゃなくてオブジェクトにして、トークンに分割した段階でifのネストレベル、forのネストレベルなどを持っておくべきなのか。。

自分の設計力の無さに唖然としている。明日はもう少し進展することを願いつつ今日は寝る。。

車輪の再発明は楽しい

最近車輪の再発明が楽しい。土日とか帰宅後とか、ほぼ毎日コードをいじってる気がする。

最近作ってるのは、以下のようなもの。

github.com Python製のテンプレートエンジン。

github.com JavaScriptでクライアントサイドだけでパスワードを自動生成するやつ。

github.com パスワード自動生成ツールを作る過程で副産物的に生まれた、気軽にユニットテストをするやつ。

いずれのツールも、世の中にはもっと高機能でバグの少ない優秀なものがすでにある。改めて個人で作るのは生産性という観点から見ればほぼ無意味だ。

テンプレートエンジンとか、普通に仕事としてプログラミングをするだけであればわざわざ自分で作る必要性など皆無だ。仕事をする上で「スキル」とみなされるのは、世の中にすでに存在しているテンプレートエンジンを使えるかどうかという点のみである。

しかし、車輪の再発明は勉強にはなるし、楽しい。仕事以外の時間でコードを書くモチベーションは、楽しいかどうかということにほとんどすべてかかっている。金のために書くコードは楽しくはない、こともないけど、楽しくないこともまあ無いとは言えない。

アルゴリズムの勉強とか、仕事としてプログラミングをする上では昨今ほとんど必要とされていない。それと同じように、自分でよく使うツールを実装してみるという試みは仕事としてプログラミングをする上ではほとんど意味を持たない。

でもなんというか、プログラミング自体にモチベーションを持ち続けるためにはそういう楽しさも必要だろうと思う。また、自分で車輪を作ってみないと他人が作った車輪のどこがすごいのかということがわからない。

あと、車輪の再発明は「プログラミングをしたいけど作りたいものがない。。。」という状態を解消してくれる。プログラマーにとってつらいのは、作りたいものがないという状態だ。新しい言語にプログラマーが飛びつくのは、新しい言語にはライブラリが少ないから既存の言語のライブラリを移植するとかいうクエストが山程あり、移植に成功すると有名になれるし、何より「作りたいものがない」という状態を一発で解消してくれるからなのではないかと思う。

無論、自分のような野良プログラマーがそんな流行りのイケてる新言語のコミュニティに入り込めるわけもないから、シコシコと車輪の再発明をするしかない。でも車輪の再発明は野良プログラマーに与えられた最後の光明という気がする。車輪の再発明を続けていれば、プログラミング自体に興味を失うことは避けられるし、継続して勉強ができる。

これからも車輪の再発明を頑張っていきたい。コードを書かなくなるのが一番良くない。

python3で標準出力を取得

kazuph.hateblo.jp

kusanohitoshi.blogspot.com

出力する系のメソッドをテストするときに毎回ググるのでメモ。

from io import StringIO
tmp_buffer = StringIO()
sys.stdout = tmp_buffer

# outの中に出力されるはずだったやつが入る
out = tmp_buffer.getvalue()

# sys.stdoutの行き先を標準出力に戻す
sys.stdout = sys.__stdout__

なんかググると上の方の検索結果に、sys.stdoutを一旦ファイル出力してそのファイルの中身を拾って標準出力をゲットする、ていうやり方が出てくるけど、なんかすごく直感的に嫌な感じがしてしまうのでこっちのやり方のほうが好き。

Twitter凍結問題

www.christiantoday.co.jp

絵師のアカウントが凍結されたとか政治活動家のアカウントが凍結されたとか、それ系のニュースとその反応を見るたびに思うんだけど、Twitter社へ抗議するとかいう感覚が理解できない。

Twitterは私企業に過ぎないのだし、どんなアカウントをどういう理由でBANしようがそれはTwitterの勝手だ。私企業のプラットフォームをタダで使うということはそういうことだろう。「Twitterは現代ではほとんど言論のインフラとなっているのだから公平さ公正さに配慮しなければならない!」とかいう主張は頭がおかしいと思う。タダ乗りし過ぎ。そんなになるまでTwitterに依存してしまった己の選択を悔いろとしか思わない。

本当に主張したいこととか、宣伝したいことがあるのであれば、本来的には自前のメディアを持つのが正道だ。ちゃんとした政党とか宗教団体は自前で印刷物を作って定期購読会員募ったり街頭で配ったりして、自前のプラットフォームを作っている。それにWEBサイトを作ることはだれも禁止していない。Twitterがだめなら自分のWEBサイトの宣伝を頑張ればいいだけ。

Twitterのプレミアムアカウントみたいなものが仮にあったとして、それを利用しているのであれば多少話は変わってくるとは思うが、本質的には同じことだと思う。プラットフォームは利用する側よりも提供する側の方が立場が上だ。使う側はどこまで行っても依存する側。

要はTwitterのアカウントが凍結されることによって機会損失が生まれて不当に不利益を被ったと主張したいのだろう。結局カネだよな。そんなにカネがほしいならTwitterと個別に契約でもしろよ。