Diary Blog of Dary

temtanが書いた文章

ハイパーインターネット型言語 まなめ 2000 を公開しました

プログラム言語処理系を作成しました。Windows 上で動作します。ソースも公開しています。C 言語のみで作っています。

ダウンロードページ

スクリーンショットです。

このソフトウェアを紹介します。

まなめ 2000 って?

正式名称は「ハイパーインターネット型言語 まなめ 2000」(以下まなめ 2000)

皆さんはこんな事を思ったは無いでしょうか?

  • 「プログラミングをしてみたい…けど、普通のプログラム言語って難しい(>_<)」
  • 「インターネット上でよく見かけるフレーズ*1はすぐに使うんだぜ」

そんなあなたに贈るプログラム言語、それが「まなめ 2000」です!

プログラムの 1 例を紹介

たとえば、「要は、勇気がないんでしょ? 」や「死ねばいいのに」は、はてな村ではもうおなじみですよね。そんなフレーズを使ってプログラミングが出来るのです。

たとえば、以下は正式なまなめ 2000 用のプログラムです。

要は、勇気がないんでしょ? 
まなめ爆発しろ! 

これでも立派なプログラムであります。どうでしょう?はてな村の人々には見慣れたフレーズなんじゃないでしょうか?

ちなみにこのプログラムの実行結果は

勇気

と画面に出力されます。

「まなめ 2000」制作者が「まなめ 2000」を使う人に「まなめ 2000」の命令を軽く紹介するための 10 命令

それでは「まなめ 2000」をプログラムの命令を通して普通に紹介しますね。*2

爆発しろ!
まなめはうす爆発しろ!
まなめはうす爆発しる!

これらは立派なプログラムであります。

「まなめ」と記述してアキュムレータと呼ばれる特別なレジスタを指定して、「は」「う」「す」と記述することで、「は」レジスタと「う」レジスタと「す」レジスタを指定します。そして、「爆発しろ!」または「爆発しる!」と記述する事で、そのレジスタの値を出力する命令となっています。

レジスタとは、数値を保持出来るメモリ領域で、まなめヴァーチャルマッスィーン(正式名称)に備わっている機能です。

まなめヴァーチャルマッスィーン(正式名称)(以下まなめ VM)の概要図は以下のようになっています。

処理の中心となるのが、アキュムレータと呼ばれる特別なレジスタになります。このアキュムレータに値を取り込んだり、計算を行ったり、その値を他の場所に移したりします。

まなめ VM の詳しい解説は添付されているマニュアルを参照してください。

要は、勇気がないんでしょ?
要は、勇気がないんでしょ? 
要は、abcdがないんでしょ? 
要は、Zがないんでしょ? 
要は、\nがないんでしょ? 

これらは全て同じ命令で、アキュムレータに指定した値をそのまま直接取り込みます。最初の命令は「勇気」という文字列を、次は「abcd」、次は「Z」、最後は改行文字となります。

残念ながら 4 バイト、つまり半角 4 文字か全角2文字までしか指定できませんが、エスケープシーケンスで改行文字や他の特殊文字を取り込むことが出来ます。

ワシの波動球は108式まであるぞ
ワシの波動球は108式まであるぞ
ワシの波動球は256式まであるぞ
ワシの波動球は2147483647式まであるぞ
ワシの波動球は-108式まであるぞ

これら命令は、上記の「要は、勇気がないんでしょ?」と同じ、アキュムレータに直接値を取り込みますが、上記が文字列であったのに対し、こちらは数値をそのまま取り込みます。

指定出来る数値は整数のみの、-2147483648 〜 2147483647 の値となっています。

まなめとなまめ
まなめはうす
なまめはうす

まなめ VM にはアキュムレータ以外にも通常のレジスタが 3 つ(裏も合わせれば 6 つ)あります。アキュムレータとそれらレジスタの値をやりとりするのがこの「まなめ」または「なまめ」を使用します。

3 つのレジスタはそれぞれ「は」レジスタ「う」レジスタ「す」レジスタと呼ばれており、「まなめ」または「なまめ」と記述した後に指定することでやりとりするレジスタを指定します。

めまな?ぬまな?めなま?ぬなま?
めまなはうす
ぬまなはうす
めなまはうす
ぬなまはうす

これら命令は四則演算を実行します。上から順番に加減乗除となっています。これらも各種レジスタを指定するようになっています。

基本的に、アキュムレータに対し、指定したレジスタの値を加減乗除する命令となっています。

はい、2人組み作ってー
はい、(は)人組み作ってー

この命令は余りを求める計算です。アキュムレータの値を指定したレジスタの値(この場合「は」レジスタ)で割った余りを求め、その結果をアキュムレータに格納します。

マッチョとウィンプ
マッチョ
ウィンプ

これらの命令は、アキュムレータの値をインクリメント(要するに 1 を足す)するか、デクリメント(要するに 1 を引く)します。

どっちがどっちの命令なのかは想像にお任せします。

ゆっくり
ゆっくりしていってね!!! 
ゆっくりした結果がこれだよ!!!

これらの命令は、レジスタの値をレジスタ用スタックに保存します。

レジスタ用スタックとはまなめ VM に備わっている機能で、レジスタの値をスタック構造の領域に保存します。

死ねばいいのに
ようこそguri_2さん 
id:guri_2は死ねばいいのに 

ようこそooo0_temaki_0oooさん
かわいいよid:ooo0_temaki_0oooかわいいよ

ちなみに、プログラム例はあくまで例であって、例という意図の他に特に他意はありません。*3

この命令は、まず最初に「ようこそ○○さん」と名前を指定します。この時は特に処理は何もしません。あくまでこの場所に○○と名前と付けるだけです。

そして、他の場所から「id:○○は死ねばいいのに」と記述することで、この場所から指定した名前を付けた場所に処理が移るジャンプ命令になります。

「id:○○は死ねばいいのに」という記述の他にも、アキュムレータの値が 0 の場合のみ処理をジャンプする命令で「かわいいよid:○○かわいいよ」と記述する方法もあります。

これはひどい
ようこそguri_2さん
これはひどいid:guri_2

ようこそnitinoさん
id:nitino恐ろしい子

ちなみに、プログラム例はあくまで例であって、例という意図の他に特に他意はありません。*4

この命令は、一言で言うとサブルーチンコールをする命令で、先ほど紹介したジャンプ命令と同じく、「ようこそ○○さん」と記述した所に処理が移ります。

しかし、その後で以下の用に記述すると、「これはひどいid:○○」と呼ばれた所に処理が戻ります。

さあ、はやく作業に戻るんだ 

たとえば以下の用にプログラムを記述します。

#1
これはひどいid:guri_2
#2
  :
〜〜〜〜
ようこそguri_2さん
#3
  :
  :
#4
さあ、はやく作業に戻るんだ 
#5

ちなみに、プログラム例はあくまで例であって、例という意図の他に特に他意はありません。*5

こうした場合、処理の順番はプログラムは上から順番に #1 から始まるので

  1. #1
  2. #3
  3. #4
  4. #2

となります。#4 から #5 に処理が移ることありません。

このサブルーチン命令は複雑ですが、使いこなせば非常にコンピュータプログラムらしく動くようになります。特に、他の命令と組み合わせることで、非常に奥が深い機能となります。

もっとちゃんと知りたい人は

以上で軽く紹介しました。紹介なのでちょっとアレしてますがまあ見た目を重視したので許して。

他にも命令は沢山あります。詳しくはプログラムに同梱しているマニュアルの正式仕様を参照してください。


まなめ 2000 でどこまで出来るかというと、とりあえずハノイの塔を解くぐらいは出来ます。ハノイの塔を解くプログラムは中に同梱した(testset フォルダの中の99_hanoi.mnm)ので、そちらを見てみてくだしあ。


※追記

同梱していたマニュアルも Web 上においてみました。

まなめ 2000 マニュアル

*1:主にネットスラング

*2:あのネタのパロディを期待した人はごめんなさい

*3:本当だよ!

*4:本当だよ!

*5:本当だよ!