なんで言語を作るの?

これは、Processing+Arduinoという、所謂アート系プログラミングを入り口にコードを書きはじめた自分が、「なんでこれ以上プログラミング言語作るの?」という疑問を抱えた学習記である。Processingを使うとき、自分は画面に丸が描きたいのであって、コードを書きたいのではない。別にコード書かなくていいなら書かない。っていうレベルからのスタートである。ちゃんと情報系の教育を受けたことのある人や、プログラミングを生業にして来た人にはごく当たり前の話だったり、表現や言葉の定義がふわっとしてたりするところがあるかもしれない。大目にみてください。


週1-2のRadical Computer Scienceという授業は、Ramsey先生による授業。SFPCの授業はどれもこれはこれといった定義はないけど、基本的にはプログラミング言語学みたいな内容。

RAMSEY NASSER先生- http://nas.sr/

毎週題材となるのは、難解プログラミング言語のひとつであるBrainfuckや、印刷に用いられるPostScript、8bitゲーム開発に特化したJSベースのPuzzleScript、並列計算をするShader、ビジュアル言語のMax/MSPなどなど。

こういう言語を使って毎週実際に何か書いたり、シンタックスツリーという形にプログラムを分解してみたりしながら、プログラミング言語って何?ということを考えさせられる。最終的にはPEG.jsというJavascriptのパーサーと、彼の作ったplt.js (github)というツールを使って、自分で簡単な言語を作ってみることを目標とする。

ちなみにRamseyは普段はClojure推し。また、彼は作品として、アラビア語のプログラミング言語や、God.jsという宗教の教典をブラウザに移植するツールを作ったりしている。 アラビア語のは「これを、、こう書くと、、こう出力されるんだ!」と実演してみてくれたけど、出力結果も全然読めなかった。

http://nas.sr/قلب


色んな言語を見たり、自分で言語を考えたりする上で、とりあえず一番に思った疑問は、「なんでわざわざ新しい言語作るの?(増やすの怒?)」ということ。

自分は仕事柄なるべく浅くても広くできるようにしておくタイプなので、新しいツールがでてくる度、全部触る気でいると追いつくので必至である。日々新しい技術が登場しては廃れる中、学習時間をどこに割くかでその後できる仕事が変わってくるかと思うと、賭けみたいな要素もある。Swiftデビューしちゃおうかしらと思いながら、Unityやっとかないとヤバいの?とか不安になったり、Arduinoの次はRaspberry PI触ってみたいけど、それ使う仕事どれだけあるの?と不純な考えを持ったりする。結局、Javascriptを書く。

そんな葛藤に追われる日々で、自分で言語を作ってしまおうというのはなんだか浮世離れした行為で、せっかく作っても自分しか使えないし、だったらみんな使い慣れてる言語のライブラリ作ったほうが即戦力になる。

ここで、"チューリング完全"という概念がある。プログラムを体系的に学んだ人であれば常識っぽいけど、自分はSFPCで初めて知った。

"チューリング完全であれば、実現可能なアルゴリズムや手続きはすべて処理できる" チューリング完全 - wikipedia

一般的に使われている所謂プログラミング言語は大体チューリング完全で、この言語で書かれたアルゴリズムは他のチューリング完全の言語でも再現可能。つまり、この言語ではあれができてあれができないというものはなくて、書きやすさや処理速度の差異はあっても、アルゴリズム的には同じことが実現できるらしい。

上にあげたBrainfuckは、+-<>.,[]の8つの文字しか使わない変態プログラミング言語だけど、一応チューリング完全らしい。
Brainfuckで自分の名前を書いてみた記録

また、言語間の互換性の話の一部として、Quine Relayというのも教えてもらった。Quineというのは、自身のソースコードを出力するジョークプログラムのことらしいのだけど、Quine Relayでは一つの言語から始まってそれが別の言語に変換されて、それがまた別の言語に変換されて、、、最終的に最初の言語で出力される。

こんなんできるなら尚更、新しいの作んなくていいじゃないかと思った。


Quine Relay (github)

あるとき、授業のあと「言語を作るモチベーションは何か」という質問をしてみた。先生の答えは「今使っている言語に100%満足してれば作る必要はないけど、自分たちにとって、コードは毎日触れるもの。使ってれば不満も出てくる。」とのこと。

なるほど。ただ、不満があるとはいえ、ずいぶん険しい道を選ぶなあと思った。その時間があれば、仕事終わるだろう。というか、そもそもそのエネルギーはどこへ向かっているのか。

でも、この自分の疑問は全部「プログラミング言語は出力結果を得るためのツールに過ぎない」という考えを前提としていた。


別の授業で、Seymour PapertとAlan Kayという人物の文献を読んだ。彼らはパソコン草創期の人物で、プログラミング言語を教育に生かせないかと考えて、LOGO (wikipedia) というプログラミング言語を作った。WindowsやMacなんかよりずっと前の1960-70年代の話。プログラミングを教育過程に取り込むというのは最近特に言われ始めているけど、当時LOGOでなされようとしたことはプログラムの書き方を学ぶんじゃなくて、プログラミングを通して論理的な問題解決や発想を学ぶこと。LOGOでは「画面に登場する亀に絵の書き方を教える」という形でプログラミングをする。亀がうまく動くように試行錯誤を繰り返すデバッグ作業が特に重要視された。Seymour Papertは数学者であると同時に発達心理学車でもあり、自分が学ぶのではなく、人(亀)に教えるかたちをとることで自然と論理的な考え方を身につけられるという思想がLOGOにあった。ちなみに、Ramseyの授業でも最初にやったことは、「あるダンスの図を見て、それを言葉しか使わずに他人に教えて踊ってもらう」というものだった。


http://dancingplagueof1518.tumblr.com/

プログラミング言語は、ある目的があって作られているけど、その後ろには思想や哲学がある。

openFrameworksが作られたのも、もともと教育目的だったとのことだけど、同時に、oFの大きな特徴は、オープンソースであるということ。ただ、自分はソースコードにコミットなんてしたことないし、自分レベルのやってることはオンライン上にある誰かが書いたコードをコピペしてちょっと変えて動かすということで、それは昔からあった他の言語でもやられてることと同じである。でも「作ったものシェアしよう」「フォーラムで聞いてみよう」「美大生の自分でもできるかも」というオープン、ウェルカム、トゥゲザーな雰囲気はoFを中心に作られた雰囲気で、その結果オープンソースに実際にコミットしたことなくても、これを使っているとその思想や空気感が伝わってくる。

蛇足かもしれないけど、自分は勝手にopenFrameworksはProcessingより言語の持つ雰囲気がリア充っぽい気が何故かしてるんだけど、それはコミュニティの人達がニット帽被ってOFポーズしててなんかCoolなイメージだからなのか、同梱のexampleで出力されるグラフィックにちょっとオシャレなかんじが垣間見えるからなのか。とにかくoFはその言語の後ろにそれを取り巻く人の顔やスタンスがなんとなくイメージできる。他の言語にもきっとこういうのあるんだろう。

Pythonははっきりと思想を出している。SFPCのみんなPython好きだった(一方、JAVAが何かとディスられていた…)みんなの好きなポイントは、やっぱりPythonは「コードがきれい」なところらしい。

The Zen of Python
    Beautiful is better than ugly.
    Explicit is better than implicit.
    Simple is better than complex.
    Complex is better than complicated.
    Flat is better than nested.
    Sparse is better than dense.
    Readability counts.
    Special cases aren't special enough to break the rules.
    Although practicality beats purity.
    Errors should never pass silently.
    Unless explicitly silenced.
    In the face of ambiguity, refuse the temptation to guess.
    There should be one-- and preferably only one --obvious way to do it.
    Although that way may not be obvious at first unless you're Dutch.
    Now is better than never.
    Although never is often better than *right* now.
    If the implementation is hard to explain, it's a bad idea.
    If the implementation is easy to explain, it may be a good idea.
    Namespaces are one honking great idea -- let's do more of those!

The Zen of Python

色んな言語を見ていく中で、というより、それを取り巻く人達を見ていく中で、プログラミング言語はただの出力ツールである以上に、思想、哲学、歴史、コミュニティであると思った。言語を知ることで文化を知ることができる。これってまさに「言語」の話で、英語を学ぶことで英語文化圏の論理的な物言いや考え方を学ぶことと同じかもしれない。  


「なんで新しい言語作るの?」という疑問も少し晴れた気がする。プログラミング言語を、ただ計算結果を出力させるためだけのツールとして考えていると、新しい言語を作ることにそこまで魅力を感じない。だけど、言語がツールではなくそれ自体が思想や文化だと思えば、新しい言語を作ろうという気持ちはなんとなくわかる気がした。路地裏に誰もこんな服着ないだろうという服ばっかり売っている店があるように、マイナーな言語を好んで使っている人達がいても納得できる。Javascriptは大通り沿いのユニクロみたいなものだろうか。それに時代が変われば「かっこいい」の基準も変わるし、一時期のFlashとHTML5みたいに政治に大きく左右されるかもしれない。先生がClojure使ってるのも、機能うんぬんより好きだからなんだと思う。説明しているときすごく嬉しそうだった。

実際の自分の仕事で、「言語作るとこから始めましょう」みたいなことには中々ならないだろう。でも新しい言語の思想を知ることで、時代の流れを知ることはできるかもしれない。身近なところでも、openFrameworksとオープンソース文化や、node.jsとIoTの関係だったり。新しいプログラミング言語の思想が新しいテクノロジーの潮流を生むのか、その逆なのかは、卵とニワトリみたいな話だけど、プログラミング言語の開発というのはデジタルものつくりのかなり根っこの方のプロセスであるとは思うので、その関係は切っても切れなそうである。


余談だけど、言語どころか、OSをイチから作って、そこに自分の世界を込めている人もいるらしい。
The Temple OS
現在進行形で絶賛開発中で、紹介ビデオは常に新しいのがアップされ続けている。

また、色んなプログラムのコミットメッセージを集めてるサイトやbotも授業で紹介された。プログラムの後ろには人がいるんだなあと思うと、この"shit"や"bitch"や"fuck"もなかなか趣きがある。
Commit Logs From Last Night

こっちはゲームのコミットメッセージが織り成す詩
The Strange Log bot


最後に自分が授業中に作った言語2つ。どちらも授業中に、人にアイディアを喋る用に作ったプロトタイプでチューリング云々的なことも考えておらず、色々ちゃんとはしてない。大目に見てください。

ASK (Lazy-Computer)
最初に試しで作ったやつ。プログラミングが、コンピューターとの会話と考えると、もう少し言い方があるかもしれない。この言語では、コンピューターに丁寧語で指示を出すとちゃんと答えてくれるけど、適当に言うと適当な処理をされる。書き手のニュアンスを汲んでくれるプログラミング言語があったら使ってみたい。

ComicStripScript
授業の最後に作ったやつ+このブログ書くにあたってほんの少しアップデートした。マンガを生成する専用の言語。最近よく使うMarkdownは「ソースを見てもちゃんと読みやすいように」という思想で作られているらしいけど、マンガを描く用の言語のソースコードがちゃんとマンガになっていると面白いと思った。あと、なるべく国籍不問でわかる言語(=絵)でプログラミングしたくて、ASCIIテーブルのかわりにEMOTICONテーブルを作った。画像を用意すればEMOTICONテーブルに沿って自分のキャラを追加できる。今後、条件分岐やループとか実装していけば、ただのマンガジェネレーター以上の言語ならではの面白みもでてきそう。


授業のTumblrページ
http://radicalcomputerscience.tumblr.com/

自分の学習ノート
http://sfpcyukiy.tumblr.com/tagged/sfpcRCS