Braincunt の変更点


*目次 [#contents-]
#contents



*About [#about-]
--名称~

-名称~
Braincunt (ブレインカント)~
--概要~

-概要~
難解プログラミング言語 Brainfuck の派生言語です。~
メモリ空間を3次元に拡張し、ポインタの進行方向を指すベクトル回転命令を追加。~
また、オプションでいくつかの拡張命令などを追加可能。~
--理念~

-理念~
Brainfuckはデータ列を直接的・直感的に扱うことができる言語です。~
BraincuntはBrainfuckに空間という概念を追加し、方向や量を持ったデータへの処理をもしかしたら抽象的に記述できるかもしれません。~
具体的には、Braincunt実行エンジンによって画像データなどに対するピクセル処理・ボクセル処理などを実行できるアプリケーションを開発していく場合もあるかもしれません。~
--Brainfuckについて~

-Brainfuckについて~
【[[Brainfuck - Wikipedia:http://ja.wikipedia.org/wiki/Brainfuck]]】(Wikipedia)~
【[[Brainf*ck:http://www.kmonos.net/alang/etc/brainfuck.php]]】(k.inaba氏による解説やサンプル)~

-プロジェクトページ~
--[[Github:https://github.com/bolero-MURAKAMI/Braincunt]]~

-Bolero's website~
--[[http://www.boleros.x0.com/:http://www.boleros.x0.com/]]~



*基本仕様 [#spec-]

--メモリ~
3次元(左手系)のbyte型配列。~
配列は負のインデックスも有効で、最大の要素数は処理系依存。~
メモリの初期値は処理系依存。~
--ポインタ~
メモリの要素ひとつを指す暗黙のポインタ。~
x, y, z の組によって表わされる。~
ポインタの初期値は処理系依存。~
--ベクトル~
ポインタが進むべき方向を指す暗黙のベクトル。~
ベクトルの初期値は処理系依存。~
--Brainfuckとの互換性~
処理系依存とした部分とベクトル回転命令を除いて互換。~



*命令 [#command-]
**標準命令(Brainfuck互換) [#ra8415d9]

**標準命令(Brainfuck互換) [#s5ff1276]
 >
ポインタを(ベクトルの方向に対し)インクリメントする。~
 <
ポインタを(ベクトルの方向に対し)デクリメントする。~
 +
ポインタが指す値をインクリメントする。~
 -
ポインタが指す値をデクリメントする。~
 .
ポインタが指す値を出力する。~
 ,
1バイトを入力してポインタが指す値に代入する。~
 [
ポインタが指す値が0なら、対応する ] の直後までジャンプする。~
 ]
ポインタが指す値が0でないなら、対応する [ にジャンプする。~

**標準命令(Braincunt) [#c42f512b]
**標準命令(Braincunt) [#g1c4c1a0]
 r
ベクトルを左回りに90°ローリング回転する。~
 R
ベクトルを右回りに90°ローリング回転する。~
 y
ベクトルを左回りに90°ヨーイング回転する。~
 Y
ベクトルを右回りに90°ヨーイング回転する。~
 p
ベクトルを後回りに90°ピッチング回転する。~
 P
ベクトルを前回りに90°ピッチング回転する。~

**拡張命令(ビット演算) [#g2e40ae9]
**拡張命令(ビット演算) [#r0ea3770]
 |
ポインタが指す値と次のポインタが指す値をOR演算し、次のポインタに値を入れる。~
また、ポインタはインクリメントされる。~
 &
ポインタが指す値と次のポインタが指す値をAND演算し、次のポインタに値を入れる。~
また、ポインタはインクリメントされる。~
 ^
ポインタが指す値と次のポインタが指す値をXOR演算し、次のポインタに値を入れる。~
また、ポインタはインクリメントされる。~
 ~
ポインタが指す値をNOT演算する。

**拡張命令(算術演算) [#ica7ca1c]
**拡張命令(算術演算) [#da4aba43]
 :
ポインタが指す値と次のポインタが指す値を加算し、次のポインタに値を入れる。~
また、ポインタはインクリメントされる。~
 ;
ポインタが指す値と次のポインタが指す値を減算し、次のポインタに値を入れる。~
また、ポインタはインクリメントされる。~
 *
ポインタが指す値と次のポインタが指す値を乗算し、次のポインタに値を入れる。~
また、ポインタはインクリメントされる。~
 /
ポインタが指す値と次のポインタが指す値を除算し、次のポインタに値を入れる。~
また、ポインタはインクリメントされる。~
 %
ポインタが指す値と次のポインタが指す値を剰余算し、次のポインタに値を入れる。~
また、ポインタはインクリメントされる。~

**拡張命令(コピー・交換) [#tc627a27]
**拡張命令(コピー・交換) [#ob70cf69]
 =
ポインタが指す値を次のポインタが指す値にコピーする。~
また、ポインタはインクリメントされる。~
 `
ポインタが指す値と次のポインタが指す値を交換する。~
また、ポインタはインクリメントされる。~

**拡張命令(軸移動) [#u2dba29d]
**拡張命令(軸移動) [#d0bd4ecb]
 a
ポインタをX軸方向に対しインクリメントする。~
 A
ポインタをX軸方向に対しデクリメントする。~
 b
ポインタをY軸方向に対しインクリメントする。~
 B
ポインタをY軸方向に対しデクリメントする。~
 c
ポインタをZ軸方向に対しインクリメントする。~
 C
ポインタをZ軸方向に対しデクリメントする。~

**コメント拡張 [#f0abdb5b]
**コメント拡張 [#i48067d0]
 #
以降から次の改行コードまでをコメントとして読み飛ばす。~



*Braincunt.exe について [#exe-]

**About [#exe-about-]
--概要~
Braincunt のインタプリタです。~
コマンド入力で対話的に実行できます。~
また、エンジンの状態をシリアライズ/デシリアライズしたりできます。~

**バージョン履歴 [#exe-version-]
 0.2.1 (2010.11.06)
ブレークモード実装。~
シリアライズ化のフォーマットにデータ項目追加(後方互換)。~
 0.2.0 (2010.11.05)
画像のピクセルデータ読み込み、書き出し機能実装。~
 0.1.0 (2010.11.02)
基本機能実装。~

**ダウンロード [#exe-downloads-]
-アプリケーション~
 ■[[Braincunt.zip:http://www.boleros.x0.com/data/Braincunt.zip]]~
-サンプルソース~
 ■[[Braincunt_sample.zip:http://www.boleros.x0.com/data/Braincunt_sample.zip]]~

**起動方法 [#exe-startup-]
コマンドプロンプトから起動します。~
ダブルクリックで直接起動もできます。~
ファイルをD&Dで起動した場合、ファイルをBraincuntのソースファイルとして読み込みます。~
--起動例~
 braincunt hello.bcx --ext-bitwise --ext-arithmetic --ext-copyswap --ext-axis --ext-comment -h
hello.bcx をソースファイルとして読み込んで実行。~
複数の拡張命令を有効にする。~
起動時にヘルプを表示~

**コマンドラインオプション [#exe-options-]
 -h [ --help ]           Print out program usage. (this message)
ヘルプを表示する。~
 -i [ --input ] arg      Input file. (source code)
入力するソースファイルを指定する。複数指定可能。~
接頭辞の付かないオプションは--input指定と等価。~
 -break [ --break ]      Break mode (execution control)
ブレークモードで実行する。~
ブレークモードでは、プログラムが改行コードを読んだとき実行が一時停止する。~
 -p [ --pure ]           Pure Brainfuck operation. (command restriction)
Brainfuck互換の命令のみ有効にする。~
他の拡張オプションは無視される。~
 --ext-bitwise           Bitwise operation. (extended command)
拡張命令(ビット演算)を有効にする。~
 --ext-arithmetic        Bitwise operation. (extended command)
拡張命令(算術演算)を有効にする。~
 --ext-copyswap          Copy-swap operation. (extended command)
拡張命令(コピー・交換)を有効にする。~
 --ext-axis            Axis operation. (extended command)
拡張命令(軸移動)を有効にする。~
 --ext-comment           Comment process. (remove from code)
コメント拡張を有効にする。~
 --load-xml arg          Load serialized xml file. (braincunt engine)
XML形式でシリアライズされた状態を読み込む。~
他のオプションはこれを上書きする。~
 --load-text arg         Load serialized text file. (braincunt engine)
テキスト形式でシリアライズされた状態を読み込む。~
他のオプションはこれを上書きする。~
 --load-binary arg       Load serialized binary file. (braincunt engine)
バイナリ形式でシリアライズされた状態を読み込む。~
他のオプションはこれを上書きする。~
 --pic-input arg         Input file. (picture)
画像のピクセルデータをバッファに読み込む。~
現在の実装では、PNG形式のみ対応。~
 --pic-color arg (=rgba) Pixel order. (picture)
画像のピクセルデータをバッファに読み込み時、ピクセルの色要素の順序を指定する。~
現在の実装では、RGBA(rgba)とRGB(rgb)に対応。ビット深度は8で固定。~
 --pic-output arg        Output file. (picture)
プログラム終了時、バッファの内容をピクセルデータとして画像に書き出す。~
現在の実装では、PNG形式のみ対応。~

**コマンド [#exe-command-]
 i=[input code]
実行コードを入力する。コードは既存のコードの後ろに追加される。~
 p=[print code]
既存のコードを表示する。~
 s=[save code]
既存のコードをファイルに書き出す。~
 q=[quit]
プログラムを終了する。~
 r=[reset]
エンジンの状態をリセットする。拡張オプションはそのまま。~
 sxml=[save xml]
XML形式でシリアライズした状態をファイルに書き出す。~
 stxt=[save text]
テキスト形式でシリアライズした状態をファイルに書き出す。~
 sbin=[save binary]
バイナリ形式でシリアライズした状態をファイルに書き出す。~
 pout=[pic output]
バッファの内容をピクセルデータとして画像に書き出す。~

**作業フォルダ [#exe-working-]
ソースファイルが読み込まれた場合、ソースファイルのあるフォルダが作業フォルダになる。~
複数のソースが指定された場合、最初に読み込まれたソースファイルのあるフォルダになる。~
ソースファイルが読み込まれなかった場合、実行ファイルのあるフォルダになる。~

**データ表示 [#exe-show-]
 total step: num
実行された総ステップ数。命令として無効なトークンを含む。~
 dbuffer:
データバッファの内容。~
 z: {size-pivot}
{ Z軸方向のデータサイズ - インデックス0の位置 }~
 [z] y: {size-pivot}
[z座標] { Y軸方向のデータサイズ - インデックス0の位置 }~
 [z][y] x: {size-pivot} |hex...
[z座標][y座標] { X軸方向のデータサイズ - インデックス0の位置 }~
データ列中で、インデックス0の位置に * マークが付く。~
 dpointer: [x, y, z]
ポインタの指す位置。~
 front: +/- x|y|z
ポインタの移動すべき前方を指すベクトルの軸方向。~
 head: +/- x|y|z
ポインタの主観位置の上方を指すベクトルの軸方向。~

**画像データの扱い [#exe-image-]
--ピクセルデータ~
[x=0, y=0, z=1] を原点として、幅をx軸方向、 高さをy軸方向にとる。~
また、ピクセルはx軸方向に展開される。~
---例:RGBAオーダーの場合~
 R G B A R G B A R G B A ... →x
 R G B A R G B A R G B A ...
 R G B A R G B A R G B A ...
 ...
 ↓y
---例:RGBオーダーの場合~
 R G B R G B R G B ... →x
 R G B R G B R G B ...
 R G B R G B R G B ...
 ...
 ↓y

--メタデータ~
[x=0, y=0, z=-1] を原点として、x軸方向に画像のメタデータが格納される。~
複数バイトの値はビッグエンディアンで扱われる。~
 WWWW HHHH DDDD CCCC →x (計16バイト)
WWWW = 画像の幅(4バイト)。0は不正。~
HHHH = 画像の高さ(4バイト)。0は不正。~
DDDD = ビット深度(4バイト)。現在の実装では、8で固定。~
CCCC = ピクセルオーダーを表すマジックナンバー(4バイト)。現在の実装では、RGBA(0x06)とRGB(0x08)に対応。~