どうでもいい情報置き場

2010-02-01

Whitespace基礎文法最速マスター

| 22:37

乗るしかない、このビッグウェーブに!

という訳でWhitespaceの基礎文法最速マスターです。

Brainf*ck基礎文法最速マスター - 医者を志す妻を応援する夫の日記」を読んで、Brainf*ckがあるなら変態言語の双頭をなすWhitespaceもあるべきと思い、書きました。

ちなみに僕は一度もWhitespaceでプログラムを書いた事がないので、間違っているところがあるかもしれませんが、Whitespaceハッカーの方は是非指摘してください!

基礎

ご存知の通りスペースとタブと改行記号のみの言語です。

IMP(Instruction Modification Parameter)、コマンド、パラメータの3つ組で命令を表現する。


IMPとして次のものがある。(以下では各要素、最後の改行は見やすさのために書いただけなので一つ取り除いて考えてください)

スタック操作: 
算術:	 
ヒープアクセス:		
フロー制御:

I/O:	


数値は2進数で表されており、スペースが0、タブが1を表し、改行記号で数値の終わりを表す。注意すべきは、最初の文字がスペースなら正の数で、タブなら負の数であり2の補数ではないという事です。


スタック操作は次のような種類がある。

数値をスタックに積む: [数値]
スタックの一番上を複製:
	
スタックのn番目をコピーして一番上に積む:	 [数値]
スタックの一番目と二番目を交換する:
	
スタックの一番上のものを捨てる:



算術は次の通り

足し算:  
引き算: 	
かけ算: 

割り算:	 
剰余:		

ヒープアクセスはスタックを見て、保存、検索するアイテムのアドレスを見つけます。要素を保存するにはアドレスをプッシュし、値をプッシュしてstoreコマンドを行います。要素を検索するには、アドレスをプッシュした後、retrieveコマンドを行います。

store: 
retrieve:	

フロー制御にはラベルを用いる操作がいくつかあります。ラベルとは改行記号で終わるスペースとタブの連続です。名前空間は一つしかないので、全てのラベルはユニークである必要があります。

プログラムの位置をマークする:  [Label]
サブルーチンを呼ぶ: 	[Label]
ラベルへ飛ぶ: 
[Label]
スタックのトップが0ならラベルへ飛ぶ:	 [Label]
スタックのトップが負ならラベルへ飛ぶ:		[Label]
サブルーチンを終え、呼び出し元へ戻る:	

プログラムを終了:


I/Oは次の通り

スタックのトップの文字を出力:  
スタックのトップの数字を出力: 	
文字を読み取り、スタックのトップにより与えられた場所に置く:	 
数字を読み取り、スタックのトップにより与えられた場所に置く:		

サンプルコード

Hello, World!

   	  	   
	
     		  	 	
	
     		 		  
	
     		 		  
	
     		 				
	
     	 		  
	
     	     
	
     			 			
	
     		 				
	
     			  	 
	
     		 		  
	
     		  	  
	
     	    	
	
     	 	 
	
  



処理系

ググるか、自分で実装してください。


参考資料

他の基礎文法最速マスターへのリンク

Rubyで作る奇妙なプログラミング言語 ~Esoteric Language~

Rubyで作る奇妙なプログラミング言語 ~Esoteric Language~