読者です 読者をやめる 読者になる 読者になる

rubyで楽々言語処理系

ruby Web

というとマサカリ飛んできそうで怖いです:;(∩´﹏`∩);:

大学の課題で「式木について考察せよ」的なものがあったので、「サクッと言語処理系作ってみるか〜」と軽いノリで作り始めました。
成果物(現状)。

https://github.com/levelfour/ruby-lang

現状は
・四則演算に加えて比較演算子等も対応
・変数も使える(/[A-Za-z][A-Za-z0-9]*/)
・カッコは一ペアしか使えない(盛大なバグ)

作ってみて気づいたことを羅列。

rubyが生産性が高いと言われる所以がなんとなく理解できた。
書きたいと思ったことが文字通りサクッと書けてしまう。
正規表現pythonに比べて手軽に使えて、言語処理系みたいな膨大なテキスト処理を行うのには強い(この辺はperlも強いんだろうけど)。
まさか数時間で字句解析・構文解析を両方終えて式の評価ができるようになるとは思わなかったので、正直びっくり。

②動的型付け・暗黙の型変換は便利だけど諸刃の剣だなあと。
C++で処理系を書こうとしたときはSTLを駆使してstackにpushだのなんだの…としているうちに頭が痛くなったが、rubyだとシンプルに演算子オーバーロードされていて直感的。
標準のHashやArrayも柔軟なので、トークンや式を保持するのが楽。
だけど、動的型付けに安住していると、たまに型不一致エラーとか起こってキレそうになる(主に自分が悪い)。
型付けは静的なんだけど、LLのように柔軟な言語、あるといいのかも。

③LLはクラス周りの仕様が言語ごとに微妙に異なってて、しかも(少なくとも僕にとっては)不自然なところがあって気持ち悪い。
例えば、rubyは今回一番驚いたのは、クラスを継承してもメンバ変数が継承されないということ。
pythonpythonでpublicとprivateの区別がなかったりとかアレなんだけど。
継承周りは特に言語ごとに差異があって、なんだかなあという感じ。


rubypythonの両方を半年でちまちま触ってきたけれど、やっぱりどっちも長所短所があるなあといった感じ。

pythonは何より強制インデントが素晴らしく、どんなにクソな書き方をしてもある程度読みやすくなるのに感心したし、ライブラリの充実っぷりもびっくりだけど、ライブラリが妙に使いにくい。特に正規表現
表現が長ったらしくなるのかな。andやorもそうだ。&&や||と書きたい。
その辺を一通りの書き方に縛るのがpythonの哲学ではあるけれど、もうちっと柔軟性を持たせてもいいんじゃないのかな。

rubyrubyで簡潔に、直感的に書けてよいのだけれど、たまにそれが仇になるかな。
個人的にはreturn文の省略はヤバいかなあと思う。
とは言いつつ便利なのでたまに使わせてもらってたけれど。
ブロックの概念は素晴らしいね。

半年間rubypythonをほぼ同時に触ってきたので、大変だったのは関数やスコープ定義のときにrubyを書いてるのにコロンをつけちゃったり、python書いてるのにend書いちゃったりすること(笑)
感想としては、どっちもどっちで気分や用途によって使い分けるのかなって感じです(結局)。