[JCSS][Presentation]

オレオレプログラミング
言語を作ろう
~Misaから学ぶインタプリタの作り方~
自己紹介


名前 松本 達弥
所属 法政大学 計算技術研究会
本日のアジェンダ(概要)






はじめに
Misaについて
技術的背景
実装解説
まとめ
質疑応答
はじめに
はじめに
まずは
 皆さん、ご入学おめでとうございます。
To新入生の人

いきなり質問 to ALL


プログラミングってやったことある
人?
(挙手!)
質問 to ALL

何言語使ってる? ??
有名な言語
C言語
JAVA Ruby・・・
いろいろありますよね。

しかし!


世の中にはマイナーな言語がいくらでもある
んです。
紹介してるとキリがないぐらい!
そんな中
私は本日
「プログラミング
言語 Misa」を紹介
します。
知る人ぞ知る
マニアック?ネタ?
破廉恥?言語です。
プログラミング言語なの
に破廉恥とか意味不明
ですよね。 。
しかしこの次の
スライドのコードを
見て欲しい。
こいつをどう思う?
Misaのサンプルコード

ごっ、ごぉおっ、ご~きげんよおぉおおぉおほっ。ほおぉおぉおっ。
「ごきげん☆みゃぁああ”あ”ぁ”ぁああ~っ」
さわやかな朝の☆ご挨拶! お挨拶がっ。
澄みきった青空にこだましちゃうぉ~ああぉおおおぉん。
「は、はひっ、はろおぉっ☆わぁるどおおぉっぉ~っ」
こ、この文章は☆おサンプル! おおぉおぉおおサンプルプログラム!!
どんなおプログラム言語でも基本のご挨拶させていただくのぉぉおッ!
「ぽうっ」
長々と書くのがこ、ここでの~、ここでのぉおおぉおぉぉおたしなみぃぃいぃ。
「長いぃ。長すぎましゅう。ご挨拶にこんなプログラム長すぎまひゅぅうぅ☆
んおおぉぉ、ばかになる、おばかになっちゃいましゅ~ッ」
長いのがっ、バッファの奥まで入ってきましゅたぁあぁあっ!
ばっふぁ☆溢れちゃいまひゅぅ~。あみゃぁあ”あ”ぁ”ぁああ”あ”ぁぁ。
「で、出ます☆ んおおぉぉおおっ、エラー出ちゃいまひゅっ」
ほひぃ☆! え、えらーっ、んお”お”ぉお”お”ぉおぉおおぉっっ。
「出た☆ 出た出た出た出たぁぁあっ
えらあぴゅるーっって出たあぁっ」
はしたない☆! ぉおおぉはしたないっ! おはしたない言語ですっっっっっっっ!
おほっほおぉっっっほおぉっっっっっっっっっ!
「えらあらいしゅきぃぃぃいぃっっ」
止まらない すごい エラーみるく
こってりしたのがいっぱい出てるよぉぉぉおおぉぉおおぉぉおっっ。
「んほぉっ☆ っおぉぉぉおお国が分からなくなっちゃいまひゅう~っ」
ま、まだ出るぅ☆ 出てるのおぉっ☆ エラーまだまだ出ましゅぅぅ!
ばんじゃ~ぁぁあい、ばんじゃいぃぃ、ばんにゃんじゃぁんじゃあぁぁああぁい!
すごく・・・破廉恥で
す・・・。
本当に動くの?
これだけ見ると一見プログラミン
グ言語かよ!とか思うかもしれま
せんがちゃんと動きます。
 実際に動かしてみましょう。

ほら!動いたでしょ?
しかし・・・


プログラミング言語の最初といえば
HelloWorld!
・・・しかし、プログラミング言語といえば
こんな感じで書くのが普通
解せない・・・



なんで、こんなワケ分からんので動くのか。
さらにいうと、このインタプリタは自分で作
りました。
制作時間:30分ぐらい。
実は簡単!
本当に簡単に作れるんです。
 人工知能の授業を落としてしまっ
た自分でも作れる位簡単です!

ソースの量
素直に作って、Javaのソースで130行
ぐらい
 たぶんもっと短くできます。

実装してみよう!



以上の通り、実はMisaインタプリンタの実装
は非常に簡単!
PCをお持ちの方はJava、C#、Rubyなどの好き
な環境でプレゼンと一緒にプログラミングし
てみては?
たぶん、気合をいれればプレゼン終わる頃に
は動いてるかもしれません。
Misaについて
Misaとは
Misa は、みさくら語で書けるプログラミ
ング言語です。
 ステキ漫画家みさくらなんこつ先生のセ
リフ回しにできるだけ近い表現で、プロ
グラムを記述することを目指して作られ
ました。
 (本家HPより引用)

みさくら語って何?




さっきのやつです。
知らない人はググッてください。
そこまでは今回のプレゼンでは説明しきれま
せん。
というか、大学の場で語るのは不適切な気が
します。察してください。
Misaの命令










Misaは以下の命令から成り立ちます。
命令文字
機能
>→~ー
ポインタを1進めます
<←★☆
ポインタを1戻します
+あぁおぉ
ポインタの指す値を1増やします
-っッ
ポインタの指す値を1減らします
.!
ポインタの指す値を出力します
,?
1文字入力を読み込んで、ポインタの指
す値
に設定します
[「『
ループの開始を意味します。ポインタの
指す
値が0ならループを終了して次へ進みま
す
]」』
ループの終了を意味します。この
位置まで来
ると、対応するループの先頭へ戻
ります
つまり・・・

さっきのコードの殆どはコメントだった
んです。
ナッ、ナンダッテー
実際の命令は・・・



それではさっきのコードの中から実際に意味が
あった部分を抜き出してみましょう。
これだけです。
っぉおっ~おぉおおぉおっおぉおぉおっ「☆ぁあああぁぁあ
あ~っ」☆!おっっぉ~ああぉおおおぉ「っおぉっ☆ぁお
おぉっぉ~っ」☆お!おおぉおぉおお!!おぉぉおッ!
「っ」~ぉおおぉおぉぉお「☆おおぉぉおっ~ッ」っッっぁ
あぁあっ!っぁ☆~あぁああぁぁあああぁぁ「☆おおぉぉお
おっーっ」☆!ーっおおぉおおぉおぉおおぉっっ「☆ぁぁ
あっあーっっあぁっ」☆!ぉおおぉっ!おっっっっっっっ!
おっおぉっっっおぉっっっっっっっっっ!
「あっっ」ーっっぉぉぉおおぉぉおおぉぉおっっ「ぉっ☆っ
おぉぉぉおおっ~っ」☆おぉっ☆ー!~ぁぁあぁあぁぁあ
あぁ!
比較してみると・・・
約700文字

ごっ、ごぉおっ、ご~きげんよおぉおおぉおほっ。ほおぉおぉおっ。
「ごきげん☆みゃぁああ”あ”ぁ”ぁああ~っ」
さわやかな朝の☆ご挨拶! お挨拶がっ。
澄みきった青空にこだましちゃうぉ~ああぉおおおぉん。
「は、はひっ、はろおぉっ☆わぁるどおおぉっぉ~っ」
こ、この文章は☆おサンプル! おおぉおぉおおサンプルプログラム!!
どんなおプログラム言語でも基本のご挨拶させていただくのぉぉおッ!
「ぽうっ」
長々と書くのがこ、ここでの~、ここでのぉおおぉおぉぉおたしなみぃぃいぃ。
「長いぃ。長すぎましゅう。ご挨拶にこんなプログラム長すぎまひゅぅうぅ☆
んおおぉぉ、ばかになる、おばかになっちゃいましゅ~ッ」
長いのがっ、バッファの奥まで入ってきましゅたぁあぁあっ!
ばっふぁ☆溢れちゃいまひゅぅ~。あみゃぁあ”あ”ぁ”ぁああ”あ”ぁぁ。
「で、出ます☆
ほひぃ☆!
「出た☆
んおおぉぉおおっ、エラー出ちゃいまひゅっ」
え、えらーっ、んお”お”ぉお”お”ぉおぉおおぉっっ。
出た出た出た出たぁぁあっ
えらあぴゅるーっって出たあぁっ」
はしたない☆! ぉおおぉはしたないっ! おはしたない言語ですっっっっっっっ!
おほっほおぉっっっほおぉっっっっっっっっっ!
「えらあらいしゅきぃぃぃいぃっっ」
止まらない すごい エラーみるく
こってりしたのがいっぱい出てるよぉぉぉおおぉぉおおぉぉおっっ。
「んほぉっ☆ っおぉぉぉおお国が分からなくなっちゃいまひゅう~っ」
ま、まだ出るぅ☆ 出てるのおぉっ☆ エラーまだまだ出ましゅぅぅ!
ばんじゃ~ぁぁあい、ばんじゃいぃぃ、ばんにゃんじゃぁんじゃあぁぁああぁい!
約290文字

っぉおっ~おぉおおぉおっおぉおぉ
おっ「☆ぁあああぁぁああ~っ」
☆!おっっぉ~ああぉおおおぉ「っ
おぉっ☆ぁおおぉっぉ~っ」☆お!
おおぉおぉおお!!おぉぉおッ!
「っ」~ぉおおぉおぉぉお「☆お
おぉぉおっ~ッ」っッっぁあぁ
あっ!っぁ☆~あぁああぁぁああ
あぁぁ「☆おおぉぉおおっーっ」
☆!ーっおおぉおおぉおぉお
おぉっっ「☆ぁぁあっあーっっ
あぁっ」☆!ぉおおぉっ!
おっっっっっっっ!おっおぉっっっ
おぉっっっっっっっっっ!
「あっっ」ーっっぉぉぉおおぉぉお
おぉぉおっっ「ぉっ☆っおぉぉぉお
おっ~っ」☆おぉっ☆ー!~ぁぁ
あぁあぁぁああぁ!
さらに冗長な部分を削る
と・・・
約290文字

っぉおっ~おぉおおぉおっおぉおぉ
おっ「☆ぁあああぁぁああ~っ」
☆!おっっぉ~ああぉおおおぉ「っ
おぉっ☆ぁおおぉっぉ~っ」☆お!
おおぉおぉおお!!おぉぉおッ!
「っ」~ぉおおぉおぉぉお「☆お
おぉぉおっ~ッ」っッっぁあぁ
あっ!っぁ☆~あぁああぁぁああ
あぁぁ「☆おおぉぉおおっーっ」
☆!ーっおおぉおおぉおぉお
おぉっっ「☆ぁぁあっあーっっ
あぁっ」☆!ぉおおぉっ!
おっっっっっっっ!おっおぉっっっ
おぉっっっっっっっっっ!
「あっっ」ーっっぉぉぉおおぉぉお
おぉぉおっっ「ぉっ☆っおぉぉぉお
おっ~っ」☆おぉっ☆ー!~ぁぁ
あぁあぁぁああぁ!
約185文字
>+++++++++[<++++++++
>-]<.>+++++++[<++++>]<+.+++++++..+++.[]>++++++++[<++++>].<>+++++++++++[<+++
++>-]<.>+++++++++[<+++>-]<.+++.------.-------.[-]>++++++++[<++++>]<+<>.>++++++++++.
つまり・・・

命令数を少なくする事+命令自体を文中でよ
く使われるような記号や文字にしてしまうこ
とで文章のように見せてたわけです。
Misaの技術的背景
Misaの技術的背景


Misaは基本的にはチューリングマシンです。
チューリングマシンってなんだ?
チューリングマシンとは
(1/3)


チューリングマシン (英: Turing Machine)
計算模型のひとつで計算機を数学的に議論す
るための、単純化・理想化された仮想機械で
ある。(wikipedia から引用)
チューリングマシンとは
(2/3)











チューリングの仮想機械は、
1. 無限に長いテープ
2. その中に格納された情報を読み書きするヘッド
3. 機械の内部状態を記憶するメモリ
で構成され、内部状態とヘッドから読み出した情報の組み合わせに応じて、次の動
作を実行する。
* ヘッド位置のテープの情報を読みとる
* ヘッド位置のテープに情報を書き込む
* 機械の内部状態を変える
* ヘッドを右か左に一つ移動する
上の動作を、機械は内部状態が停止状態になるまで反復して実行し続ける。
(またも引用元はwikipedia)
チューリングマシンとは
(3/3)


まあこんな感じです。
学部2年以上の人は授業で聞いたことぐらいは
あるのでは?
Misaの命令表をもう一度・・・












命令文字
>→~ー
<←★☆
+あぁおぉ
-っッ
.!
,?
機能
ポインタを1進めます
ポインタを1戻します
ポインタの指す値を1増やします
ポインタの指す値を1減らします
ポインタの指す値を出力します
1文字入力を読み込んで、ポインタの指す値
に設定します
[「『
ループの開始を意味します。ポインタの指
す
値が0ならループを終了して次へ進みます
]」』
ループの終了を意味します。この位置まで
来
ると、対応するループの先頭へ戻ります
ポインタがヘッドの位置とするのであれば、だいたい似てるのがわかると思い
ます。
若干拡張されてますけど。
値の増減の部分に関しては縮小してますね。
つまり何が言いたいかという
と・・・

8命令しかないけど基本機能は備えているので、
現代的なプログラミング言語と同じことがで
きる!(ただし、すげー冗長)
Let’s 実装???



さー皆さんMisaインタプリタを作ってみたく
なってきませんか?(ぇ
ちなみに、文字は置き換えれば例えば「あっ
たたったー」だけで作る北斗言語
「無駄!無駄!無駄!」で作るジョジョ言語
とかもできますよ!(たぶん)
Misaの実装解説
Misaの実装解説




さて、ここからはインタプリタの実際のコー
ドを元に解説をしてみたいと思います。
コードは公式版ではなく、自分が作ったJava
版を基にやります。
(公式版はC言語でマルチバイト文字の処理の
説明とかが面倒なので)
コードが若干汚いのはご愛嬌。
Misaクラスのメンバ変数




pos ポインタの位置
pc プログラムカウンタ
tapeLength テープの長さ
tape テープ
Main()

自身のインスタンスを作ってrunMisa()を読んで
るだけです。
RunMisa() 3つの変数



stack
納
loopEndPos
c
ループ構造のスタート位置を格
するための変数
ループの終了位置
現在の位置の文字
RunMisa() 実行部分
RunMisa()

文字に応じた処理 (1/5)
ポインタを1進める処理の場合、posをインク
リメント( 1増加)する。
RunMisa()

文字に応じた処理 (2/5)
ポインタが指し示す値をインクリメントする
場合、tape[pos]をインクリメントします。
RunMisa()


文字に応じた処理 (3/5)
出力命令が来たら出力します。
この時、tape[pos]はint型なのでchar型にキャス
トします。
RunMisa()

文字に応じた処理 (4/5)
ループ開始命令の時、 初回のループかつ、
ループ回数が0以上であれば、現在のpc(プログ
ラムカウンタ)をスタックにプッシュします。
RunMisa()

文字に応じた処理 (5/5)
ループ開始命令の時、ループ回数を指し示す
値が0だったら、ループエンドに飛んでス
タックをポップします。
残りは・・・
ポインタ戻し命令
 ポインタの位置の値のデクリメント命令
 などなど・・・


大体さっき説明したコードのちょっ
と変更すれば作れます!(コピ
ペ!)
そんなこんなで・・・
あれもう完成?
 ね、簡単でしょ?
 後はこれをベースにすれば、自分
オリジナルのオレオレプログラミ
ング言語が完成するわけです。

まとめ
一見難しくて普通には出来そうにな
いプログラミング言語。
 しかし、シンプルなものなら簡単に
作れる。そして、それなりに動く
よ!

余談



昨日、夜中にこの資料を作りながら、Misaの
インタプリンタを作成してました。
しかし、なぜかHello Worldの表示が微妙にお
かしい!!!
調べた結果、なんと本家のサンプルが間違っ
てました・・・orz
教訓
公式サイトでも信用するな!
どこにでもバグは存在する
ぞ!
質疑応答
なにか質問がある方は挙手!
みさくら語についてはノーコメント
終わり
ご清聴ありがとうございま
した。
