プログラミング言語を趣味で自作している話

このところ、趣味でプログラミング言語を作っています。

どんな言語を作っているか

静的な型付けの関数型プログラミング言語で、見ためはこんな感じです。

# hello, world!
puts "hello, world!"

# 1 * 2 * .. * n を計算する関数
fun factorial : Int -> Int = {
    1 -> 1
    n -> n * factorial (n-1)
}
factorial 5   #=> 120

型について理解したいという気持ちがあったので、型検査や多相型など、型に関する機能を少しづつ取り入れて作っています。

プログラミング言語 Mud
http://mud.tiny-app.net/

なぜ作っているか

純粋に楽しみとしてです。世の中にまともな言語がたくさんあるのに、今さらおもちゃみたいなものを新しく作る意味ないよねとも思いますが、どんな分野でも自分だけのちょっとしたものを自作するのはやっぱり楽しいものです。

あと既存の言語についての勉強にもなります。

どんな言語機能が欲しかったか

最初の動機となったのは、「関数型の言語で、関数適用の関数名と第一引数の順番を “.” でひっくり返せばオブジェクト指向っぽく見えるんじゃないか」という思いつきでした。

関数型の言語では、以下のような式を書くことになるケースがあると思います。

reverse (uniq (sort [2,1,4,1]))
#=> [4,2,1]

意味としては、 [2,1,4,1] というリストをソートして、重複を取り除いて、逆順にするということになります。

ですが、ふつうに左からコードを読むと、「ひっくり返す。なにを? 重複を取り除いたものを。なにから?・・」となって読みづらいことになります。意味をつかむためには式を右から左に、逆順に読まなければいけません

それがめんどくさいよねということで、既存の言語、たとえば Elixir だと |> 演算子があって、関数呼び出しの引数と関数名の位置をひっくり返すことができます。つまり

sort [2,1,4,1]

[2,1,4,1] |> sort

と書くことができる。なので、これを繰り返すと元の式はこうなります。

[2,1,4,1] |> sort |> uniq |> reverse

「[2,1,4,1] というリストをソートして、重複を取り除いて、ひっくり返す」という素直な語順どおりになりました。

でも思ったのです。これ  |> じゃなくて “.” なら普通にオブジェクト指向っぽい見た目になるじゃんと。つまりこういうことです。

[2,1,4,1].sort.uniq.reverse

ふつうに Ruby で動きそうな見た目になりました(実際動きます)。

なので、こんなふうに、関数型の言語なのに見ためはオブジェクト指向っぽく書ける言語を作ってみようと思ったのがきっかけでした。

(あとから知りましたが、そういうアイデアの言語はすでにいっぱいあるようです。Nim や、あるいは Ruby のまつもとゆきひろさんの Streem がそうです。でもそういう人たちと同じアイデアを思いつけたのは嬉しいです。 )

シンプルな関数定義

Haskell の関数定義の構文がとてもシンプルで、好きです。たとえば 1 * 2 * 3 * .. * n を関数を計算する関数 factorial は、こう書けます。

factorial :: Int -> Int
factorial 1 = 1
factorial n = n * factorial (n-1)

そして Elixir の匿名関数の構文もまたシンプルでかっこいいと思います。

factorial = fn
   1 -> 1
   n -> n * factorial (n-1)
end

なので、両方を合わせたこんな感じの関数定義の構文が使えるようにしました。

fun factorial : Int -> Int = {
   1 -> 1
   n -> n * factorial (n-1)
}

関数の値への適用(呼び出し)は Haskell ふうに

factorial 5
#=> 120

と、引数をカッコでくくらずに並べます。

多重ディスパッチと自由な演算子オーバーロード

もうひとつ欲しかったのが、自由な演算子オーバーロードでした。たとえば Ruby のように、 + のような演算子をいろいろな意味で気軽に定義したい。

1 + 2 は 3
"a" + "b" は "ab"

のように。

そこで、多重ディスパッチという仕組みを取り入れました。同じ関数名(演算子名)でも、引数の型が一つでも違えば違う関数として定義することができるというものです。

# 整数に1を足したものを返す
fun incr : Int -> Int = {
   x -> x + 1
}
# 数の英語表現に1を足したものを返す
fun incr : String -> String = {
  'zero' -> 'one'
  'one'  -> 'two'
  'two'  -> 'three'
}

# 同じ関数名でも引数の型によって異なる関数が呼び出される
incr 2       #=> 3
incr 'two'   #=> 'three'

# . 演算子を使えばオブジェクト指向的なポリモーフィズムに見える
2.incr      #=> 3
'two".incr  #=> 'three'

上は、作っている言語での実際に動作するサンプルです。同じ関数名でも引数の型によって動作がちゃんと違っています。

この言語では、演算子も関数として定義されるようにしています。なので、多重ディスパッチの仕組みを使うことによって、同じ演算子を次のようにいろんな意味に使い分けることができます。

# 整数と整数の掛け算
2 * 3      
#=> 6

# 文字列と整数の掛け算
"abc" * 3       
#=> "abcabcabc"

# リストと整数の掛け算
[1,2,3] * 3       
#=> [3,6,9]

# リストとリストの内積
[1,2,3] * [1,2,3]       
#=> 14 (1*1 + 2*2 + 3*3)

# 関数合成
(incr * factorial) 5
#=> 121 (nの階乗に1を足す、という関数にn=5を適用する)

多重ディスパッチ(Multiple Dispatch )の仕組みはぼくにとってはかなり面白かったので、その頭文字を取って言語名を Mud としました。

なお、多重ディスパッチを機能として前面に出している言語としては、最近では Julia があると思います。

どうやって作っているか

実装言語は Haskell です。

megaparsec というライブラリで字句解析、構文解析をして式を抽象構文木に変換しています。その後に型検査をして、問題がなければ、抽象構文木のまま評価しています。つまり、コンパイラーではなくてインタープリターで、その中でも最も簡単な(速度が出ない)やり方です。 Tree Walking Interpreter というそうです。

ソース
https://github.com/mitsuchi/mud/

最初は42みたいな数字だけを認識できるものを作り、次は足し算だけができるものをつくり、つぎは変数が使えるようにする、というふうに機能を足しながら作りました。これだと、小さいながらどの段階でも言語としてちゃんと動くので、作っていて楽しいです。このあたりは次の本を参考にしました。

低レイヤを知りたい人のためのCコンパイラ作成入門(Rui Ueyamaさん)https://www.sigbus.info/compilerbook/

どこらへんが楽しいか

言語を作るたのしさは、好きな構文や機能を自分でデザインできちゃうところだと思います。空想地図を書いたりする人たちの楽しみと近いところがあるかもしれない。

こういう構文があったらなーとか、既存の言語のここがこうなっていて欲しいなーというときに、それを実現したものが(苦労するけど)作れて、なおかつ動くというのは嬉しい。

それから、どこまでもいじれてしまうというところも趣味に向いてます。たとえば言語の核の機能をもっと足そうとか、ライブラリーを足そうとか、エラー処理をまともにしようとか、いじろうと思えばずっといじれます。

この言語も、整数と変数が使えて関数が定義できるところまでできたらいいなと思っていました。が、いざ動くようになってくると、やっぱり浮動小数点数も使いたい、文字列も使いたい、高階関数も、多相性も、といろいろと欲がでて少しずつ大きくなっています。

つぎはコンパイラー型にしてみたいです。LLVMのIRを出力するようにできたら楽しいだろうなと思います。

動作デモ

ブラウザーから、この言語のいろんなサンプルコードを編集して動かせるページを作りました。よければ遊んでみてください。

Mud プレイグラウンド
http://mud.tiny-app.net/playground/

マンホールナイト vol.10 に行ってきた

 

マンホール好きが集うイベント、「マンホールナイト」に行ってきた。場所は駒込の滝野川会館。自宅から近いので徒歩で行けてありがたかった。

東京23区デザインマンホール総覧(竹内正則さん)

 

最初は、マンホールナイト創設者の一人である竹内さんによる、デザインマンホールの話。

デザインマンホールというのはこういうやつだ。

 

ふつうの地味なやつと違って、人に見てもらうためのデザインが全面になされている。こういうののカタログを作ったという話。

デザインマンホールの一覧を作るためには、数あるマンホールをデザインマンホールとそれ以外に分けなければいけない。つまり、「デザインマンホール」の定義をしなければいけないのだけど、それってかなり難しい。

さらに「デザインマンホール」といいつつ、実際にデザインされているのはマンホールじゃなくて「マンホールの蓋」だ。だからここには「マンホール」という言葉で、実際にはその蓋を指すという慣用がある。

というような定義についての話をしているうちに残り5分になってしまった。ここでは次のような定義、というか指針で「デザインマンホール」を集めたそうだ。

・物理的な機能とは関係なく、ほぼ全体がデザインされた蓋
・100パーセント鋳物でできている。
・カラーは樹脂充填かセラミック
・デザインが全面

その結果、東京都23区内に現に設置されているものは43種類に大別できることが分かったとのこと。

 

上の写真はその一部。

なにかの話をしようとすると、どうしてもその対象についての定義と、ある程度の割り切りが必要になる。こういう悩みって、他のジャンルでもほぼ間違いなくあることなのでよく分かる。

たとえば暗渠もそうだ。狭義の暗渠という言葉が指す対象と、ぼくたちが実際に興味をもっている対象にはズレがある。たぶんもっと包括的な言葉を使ったほうがいいんだろうけど、いろいろ飲み込んで暗渠という言葉を使っている。

定義の話をしているだけで残り5分になるというあたり、誠実なんだなと思った。

測量の蓋のはなし(小金井美和子さん)

 

小金井さんは多才な人だ。

マンホールの蓋だけでなく、送水口や境界標にもくわしい。鳥の鳴き声を聞けばなんの鳥か分かる。そして最近、測量士の資格試験に合格した。

ちょっと意味がわからないほどすごい。今回はそれらの趣味のうち、測量の蓋についての話。

 

測量の蓋というのはこういうの。左が基準点。右が水準点。

「基準点や水準点の蓋が好き」と言っても、たいていのひとはまず基準点がなにか知らない。そこから説明しないといけないのが大変だという。

というわけで今回もまず、基準点とはなにかの説明から。基準点は測量をするための平面位置の基準だ。

 

座標を求めたい点(左上)にピンポールミラーというものを置き、すでに座標の分かっている任意の点、つまり基準点(右下)にトータルステーションという機械を置く。さらに、別の基準点(右上)に見た目の似ているターゲットミラーという機械を置く。

・まず、トータルステーションからターゲットミラーまでレーザーを飛ばして跳ね返すことで、その距離を正確に測る。
・同様に、トータルステーションからピンポールミラーまでの距離を測る。
・そして、ターゲットミラーからピンポールミラーまでの角度を測れば、求めたい座標が計算で分かる。

つまり、三角測量のために基準となる点が二つ必要で、それを提供するための点が基準点ていうことなのか。すごくよく分かった。

そして水準点は高さの基準で、レベルという高さを測る機械で水準測量というのをするときに使うとのこと。

・気になる蓋があったら「点の記」で調べられる。
・二級基準点は、杉並区のものであれば「すぎナビ」で調べられる

途中、小金井さんも書いた「街角図鑑」のことを紹介してくださっていて、とても嬉しかった。

異文化交流枠(顔ハメ兄さん)

マンホール以外の趣味の人を呼んで話をしてもらうコーナー。以前のマンホールナイトで、蓋以外のものも見たほうがいいというアドバイスを林丈二さんにもらったことも影響しているそうだ。

 

話者は、顔ハメにはまっているという顔ハメ兄さんという方。恩師とのコミュニケーションの一貫として、顔ハメを見かけたら撮って送り合うというのを続けていたところ、ハマってしまったという。いまでも1日に1個くらいのペースで撮っている。

顔ハメを楽しむコツ。

・とにかくその場を楽しむ
・観光地で顔ハメ写真だけ撮って、その場を楽しまずに去ってしまう「ハメ逃げ」は恥ずべきこと。

・誰かと一緒に撮る(顔ハメトゥギャザー)
・顔ハメはコミュニケーションツール

一人しかいなくても、自分が顔ハメをしているようすを、その場にいる誰かに撮ってもらえば、それがコミュニケーションになる。そういう視点で顔ハメを捉えたことはなかった。

とにかくまずはハメてみるということなんだろうか。終始楽しそうに話しているのが印象的だった。

ふたの東海道五十三次拓本の旅(飯田眞三さん)

 

なんと、北九州のパブリックビューイング会場から中継での発表。

飯田さんは、マンホールの蓋を拓本しながら東海道を歩く、ということを思いついた。

 

これは品川駅前でのようす。日本橋から出発して、この調子で実物大のマンホール拓本を取りながら、京都まで本当に歩いた。

すごすぎる。

「拓本を取りながら京都まで行っちゃったりして」というのは、思いつくことはあるかもしれないし、飲み会とかでそういうノリになることもあるかもしれない。

でも、やらない。やったとしても1日目で我に返る。でも飯田さんは、やった。この実行力。そして情熱。ひえーという声が出た。

マンホールナイト10回記念座談会(竹内正則さん、清水貴司さん、白浜公平さん)

 

マンホールナイトは7年前に竹内さん、白浜さん、清水さんの3人で始めたんだそうだ。10回目ということで歴史を振り返るコーナー。

・1回め、2回めは徹夜した。熱狂だった。
・当時は謎が多く、蓋に書かれた記号と座標の関係がリアルタイムに解き明かされていくような興奮もあった。
・下水道業界の主催するマンホールサミットとの接点もできた。
・林丈二さんが参加してくれるようになった!

右側にいるのが司会の清水さんなんだけど、むちゃくちゃいい声。落ち着いてて、余裕があって、ユーモアもある。こんなにすばらしい司会者はなかなかいない。

・今後はマンネリ化が懸念される
・しかし謎もまだまだ多い
・新しい試みを続けていきたい

知性を感じさせる3人の座談会だった。世の中の会議がみんなこんなだったらいいのに。

光明電気鉄道の蓋が保管された経緯について(白浜公平さん)

 

白浜さんは、静岡で珍しい古い蓋を発見した。それを磐田市埋蔵文化財センターに報告したところ、センターに保存されることになった。その経緯についての発表。

骨董蓋とも呼ばれる古い貴重な蓋については、それを発見したときに報告することにはジレンマがあるという。

・報告することによって撤去されてしまう可能性
・貴重だという認識を共有できれば保管されるかも
・その判断を一個人で行ってよいのかどうか

マンホールの蓋には一定の使用期限があるので、古い蓋は更新する必要がある。なので、古い蓋が残っていることが明らかになると、かえって撤去される可能性がある。

ただ、報告する相手さえ正しければ、それは貴重だとなって保管されるかもしれない。結果がどっちに転ぶかは、報告してみないと分からない。

そういう状況で、じゃあ貴重な蓋の発見を報告するかどうか、するならどこにという判断を、自分一人でやってしまっていいのかどうか。

ということを悩みつつ、白浜さんとしては、何もしないで撤去されてしまうよりは適切に報告したほうがマシなんじゃないかと考えているとのこと。

今回は、埋蔵文化財センターに報告したことによってきちんと保管された。しかもテレビや新聞にも取り上げられて、文化財センターとして3番目の話題物件となったそうだ。

 

蓋の場合、ジレンマはあるにしても保管という道がちゃんとあるというのがいいなと思う。蓋は文化財なんだ。

路上にあって観察の対象となるもので、保管の対象となるものはそんなに多くないように思う。たとえばトマソンは、第一号となる四谷の純粋階段はもう永久に見ることができない。古い装飾テントも、古いガードレールも、古い三角コーンも、おそらくどこにも保管されてない。

保管されるのはなんだろう。古い橋の親柱はよく見る。橋そのものも保管される。古い送水口は、なんと私人の情熱によって私設の送水口博物館に保管されている。そうか、情熱をもって博物館をつくればいいのか。お金と場所が必要だけど。

・物質的余裕
・社会的信用
・時間的余裕

白浜さんは、送水口博物館が成功している理由はこの3つが大きい、自分もほしいと言っていた。同感。

物販いろいろ

後ろのほうでは物販もやっていた。今回からの試みらしい。いろいろ買ってしまった。

マンホールマカロン。岡山の桃太郎マンホールがかわいい。

「街角図鑑」にも書いてくださったAYAさんによる「日本逸品送水口百選 上」。写真がきれい!

今日の人たちは、一つのことにずっと取り組んでいる。そして楽しそうに発信している。それってすごいことだ。

ぼくはたまに書きものをするけど、テーマは毎回違う。それは性にあってるんだけど、たまには一つのことにずっと取り組んだほうがいいのかもしれない。でもできるかな。少しはやってみるか。などと思った。

思考としてのランドスケープ本の出版記念トークイベントに行ってきた

 

石川初さん(慶應義塾大学教授)の新刊「思考としてのランドスケープ 地上学への誘い」(LIXIL出版)の刊行記念イベントに行ってきた。

場所は下北沢の本屋B&Bで、内容は石川さんと大山顕さんによるスライドを使ったトークイベント。お二人のお話はいつも面白いです。

石川さんの話

著者である石川さんの話は、徳島県の神山町でのフィールドワークについて。本では第一章の「FAB-G」にあたる部分。

・神山町には工作能力に長けた年長者がいる
・勝手にFAB-Gと呼んでいる
・Fabrication Skilled Grandfather の略。
・生活に必要なものを何でもつくる
・彼らは材料のもとの意味を忘れて、何に使えるかで見る。
・いい感じの杉の木の桶と、100均のプラスチックの桶が平等に扱われる。
・100均を使った工作者がものを買う態度も一緒
・商品の本来の意味ではなく、何に使えそうかで買う
・100均は一種の雑木林ともいえる

石川さんは、ふだん関係ないものを同じだと言ってはっとさせることがよくある。「100均は雑木林だ」とか言ってみたい。

あとネーミングがキャッチー。「工作の上手なおじいさん」じゃなくて「FAB-G」。慶應の研究室でも、何かを見つけたらそれにうまいネーミングを当てることを推奨してるらしい。

ネーミングは大山さんもいつもうまい。「マンションポエム」とか。

「本物の正義」問題

・神山町の建築はいくつかの傾向に分類できる。
・そのうちの一つが「本物の正義」
・素材が本物、つまり正統的であることが重要

「本物の正義」という言葉は石川さんが別のイベントでぽろっと言っていて意味が分からなかったんだけど、今回ようやくたぶん分かった。

つまり、FAB-Gが本物の杉の桶と100均の桶を等価に見るのとは違って、本物の杉の桶であることを何よりも重要視するっていう考え方のことだろう。

そしてそういう態度を取るのは地元住民ではなく、むしろ観光客や都市から来た事業者だったりする。外の人は田舎にロマンを見るけど、中の人は実利を見るというようなことだろうか。

あと、なにかを大規模にやろうとすると、正義に頼りがちだということもあるのかもしれない。浮かれ電飾を街ぐるみでやるにあたって、「絆」みたいな正義が援用されたという大山さんの話を思い出した。

浮かれ電飾論〜浮かれ電飾は「正義化する」〜
http://portal.nifty.com/kiji/171215201476_1.htm

FAB-Gの活動は個人的なものなので、自分が使えればいい。正義はとくに必要ない。

大山さんの話

 

つづいて大山さんの話。

・先日、子供が生まれた。
・生まれた病院から自宅まで一緒に帰ったGPSログがある
・それ以降も外出の際はすべて同行しているのでログがある
・つまり、生まれた瞬間からのログがある!
・以上、自慢

冒頭の余談がすごすぎた。GPSログの第2ステージが始まってる。生まれた瞬間からのすべての移動履歴がある人はたぶん世界で初めてだろう。子供がいやがったらやめますとのこと。

・今回は埋立地の話
・ランドスケープの語源はじつは「ランドショップ」かもしれない
・ショップは「スコップ」のこと。つまり埋め立て。
・ファウストが最後に願ったのも埋め立てだった。

・東京湾を埋め立てるネオトーキョー構想があった。
・なんと核で千葉の山を削って、その土を使おうとした。
・実現しなくてよかった。

・京急の産業道路駅が新しい名前を募集している。
・産業道路が地下を通るようになったから。
・地上からは地下はないのと一緒か。
・いっぽうで、地下鉄の駅は地上に名前の由来を求める。

 

日本橋問題

 

・日本橋はインフラの歴史が重なっているからよい
・空が欲しいのなら高速道路を壊すのではなくて、その上に新しい橋をかけるべき
・オランダのエイドリアン・ヒューゼというランドスケープアーキテクトが日本橋に来た時、まったく同じことを言った上、日本橋川の水の下に、かつての木の橋たちも沈めて歴史の厚みを持たせるのがいいと言った(石川さん)
・それは思いいたらなかった。そのとおりだ。(大山さん)

・首都高は上から下をながめられない
・日本橋の上にパーキングエリアを作ればいい

日本橋問題については、大山さんが急遽ニュース番組によばれて五十嵐太郎さんたちと話をしたときと同趣旨だった。大山さんは、そろそろどこかの先生になったらいいのになと思った。

その後はサイン会があり、時間が押していることもあって質疑応答はなく終了。石川さんに、公園と銀座ソニーパークのことを聞きたかった。どこかで聞きたい。

デザインハブのゼミ展に行ってきた

 

六本木ミッドタウンのデザインハブでやっているゼミ展というのに行ってきた。

http://designhub.jp/exhibitions/4168/

いろんな大学のゼミでの学生による制作物を、作品として展示するという企画。

京都工芸繊維大学 中野研究室

 

京都工芸繊維大学の中野研の展示は、デザインについての課題。

 

「ボディタイプとしても使用可能なフォントをデザインしなさい」という課題に対しての学生の作品、「タイ語フォント」。

どう見てもタイ語なんだけど、じつは「いろはにほへと…」とひらがなで書いてある。一度ひらがなに見えるともうタイ語に見えなくなっちゃうのもおもしろい。

 

既存の映画のポスターを作るという課題に対する、「エイリアン」。このまま本当にポスターにできそうだ。上手だなあ。

京都工芸大学 福島研究室

 

社会問題をうまく可視化しなさい、という課題に対して、女性の社会進出比率をとりあげた作品。

管理職になる割合は男性100に対して女性7しかない、というのが一番上の赤青鉛筆でしめされていて分かりやすい。鉛筆を棒グラフとして使うのすごい。冴えてる。

慶應義塾大学 石川研究室

 

石川研の展示はこれまでに何回も見て、記事にさせていただいたこともある。http://portal.nifty.com/kiji/180215202077_1.htm

今回初めてじっくり見れたものがあって嬉しかった。

 

「ジェットコースター鑑賞ガイド」。日本各地のジェットコースターを回り、乗らずにその形態を鑑賞する。その結果を冊子にまとめたもの。どこかで売ってほしい。

 

「Park Studies」

公園というテーマで各自が調べたり、みんなで議論したことをまとめた冊子。これはすごかった。

石川さんの近刊で「思考としてのランドスケープ 地上学への誘い」というのがあるんだけど、読んでて(図がないので)意味がとりづらかった「ベンチが境界になってる」っていう部分が、この冊子を読んでようやく分かったりした。

 

目次こんな。すごい面白い! これも売ってほしい。この日は1時間かけてずっとこれを読んでた。