BrainFuck Part.3 <[+-.,]>

このエントリーをはてなブックマークに追加
482デフォルトの名無しさん:2012/12/27(木) 21:09:24.77
そろそろ実用的なライブラリを
つくれうぜ
483デフォルトの名無しさん:2012/12/27(木) 21:33:56.78
何番地と何番地を引数にして何番地に返すってか?
484デフォルトの名無しさん:2012/12/31(月) 01:42:33.47
実行環境で一番おすすめのってどれ?
ぐぐったらたくさん見つかるのだけどどれもイマイチ
485デフォルトの名無しさん:2012/12/31(月) 01:51:12.51
>>484
大して難しくないんだから自分で「イマイチ」じゃないように作ればいいじゃん。
尤も、他人に「イマイチ」である理由を説明できない位だと難しいかも試練が。
486デフォルトの名無しさん:2012/12/31(月) 03:03:23.04
487デフォルトの名無しさん:2012/12/31(月) 13:03:46.90
brainfuckでbrainfuckインタープリタを作ってみた
488デフォルトの名無しさん:2012/12/31(月) 13:18:52.64
489デフォルトの名無しさん:2013/01/09(水) 05:22:09.66
部室の入り口にbrainf*ckのコードが書いてあった
490デフォルトの名無しさん:2013/01/09(水) 21:44:15.84
>>489
うp
491デフォルトの名無しさん:2013/01/22(火) 23:39:43.75
変形版Brainfuck

ジャンプ先のプログラムカウンタの値を記憶するためのスタックを用意しておく

  > ポインタをインクリメント
  < ポインタをデクリメント
  + ポインタが示すメモリ位置のデータをインクリメント
  - ポインタが示すメモリ位置のデータをデクリメント
  . ポインタが示すメモリ位置のデータを出力
  , ポインタが示すメモリ位置のデータに入力
  * 現在のプログラムカウンタの値をスタックに入れる
  / ポインタが示すメモリ位置のデータがヌルでなければ、スタックから取り出した値までジャンプ
   ヌルならばスタックから値を抜き去り、次の命令にジャンプ


本家BFの場合は対応する括弧を調べる作業が必要だが変形版だとその必要はない
そのかわり後方へのジャンプはできないが、原理的には本家と同じくチューリング完全(…だと思う)
492デフォルトの名無しさん:2013/04/05(金) 03:22:33.38
ぼくもはじめます
493デフォルトの名無しさん:2013/04/13(土) 20:04:41.89
>>491
後方ジャンプがないとチューリング完全にならないと思う
494デフォルトの名無しさん:2013/05/04(土) 01:56:17.45
代入式を導入してみたい
495デフォルトの名無しさん:2013/05/05(日) 18:18:52.80
どこになにを代入すんだよ
496デフォルトの名無しさん:2013/05/05(日) 20:44:08.00
=(>>)
二つ後の値を現在の場所に代入

とか
497デフォルトの名無しさん:2013/05/05(日) 21:43:34.84
いっそのこと膨大な糖衣構文を作ったほうがいいかと
498デフォルトの名無しさん:2013/05/05(日) 21:51:36.40
"Syntactic sugar causes cancer of the semicolon."
499デフォルトの名無しさん:2013/05/05(日) 21:55:07.84
(>)|(>>)
1つ後の値と二つ後の値のビット論理和を現在の場所に代入

(>)||(>>)
ビット論理和じゃなくて普通の論理和
500デフォルトの名無しさん:2013/05/05(日) 21:59:04.74
(>)|(>>))
501デフォルトの名無しさん:2013/05/05(日) 22:00:24.43
((>)|(>>))|((<<)|(<))
1つ後の値と二つ後の値のビット論理和と
2つ前の値と一つ前の値のビット論理和の
ビット論理和を現在の場所に代入
502デフォルトの名無しさん:2013/05/05(日) 22:02:34.14
([[[[[)<
503デフォルトの名無しさん:2013/05/05(日) 22:14:45.86
Error: No right blanket
504デフォルトの名無しさん:2013/05/05(日) 22:40:48.91
Use newspaper, instead.
505デフォルトの名無しさん:2013/05/05(日) 22:52:05.37
([[[[[)< >(]]]]])
506デフォルトの名無しさん:2013/05/06(月) 00:41:08.24
メモリフィールドが階層的になってて
特定の番地を全ての階層で同期とかできると楽しそう
507デフォルトの名無しさん:2013/05/06(月) 08:26:09.23
オブジェクト指向のBrainFuckとか作れないかな?
508デフォルトの名無しさん:2013/05/06(月) 08:31:01.82
コンパイラ大きくしたら意味無いじゃん(至言)
509デフォルトの名無しさん:2013/05/06(月) 09:40:04.34
プリプロセッサを巨大化させよう(提案)
510デフォルトの名無しさん:2013/05/06(月) 13:55:57.84
fork機能つけようぜ
511デフォルトの名無しさん:2013/05/06(月) 19:27:05.67
brainfuck拡張するなら既存の言語でいいじゃん?
512デフォルトの名無しさん:2013/05/06(月) 19:33:06.10
ぐぬぬ
513デフォルトの名無しさん:2013/05/07(火) 03:27:27.06
ぐ  ポインタをインクリメント
ぬ ポインタをデクリメント
514デフォルトの名無しさん:2013/05/10(金) 21:00:06.63
入力された文字列の文字数の取得なんてできるんですかね
515デフォルトの名無しさん:2013/05/10(金) 21:04:10.53
[;>+<].

わかんね

そもそもint[]の要素数とか無いだろ
516デフォルトの名無しさん:2013/05/11(土) 01:48:40.71
文字入力は入力された一文字をポインタが指すメモリに代入するだけだろ
文字列を入力しているのは処理系がバッファを使ってるだけなんでは
517デフォルトの名無しさん:2013/05/11(土) 20:01:40.22
>>515
最後は「>.」じゃないかな
あと、文字数が256以上の時と、マルチバイト文字を含む場合にも対応できるようにしたいね
518デフォルトの名無しさん:2013/05/28(火) 14:26:09.78
ためしに 256回回る空ループを書いてみてくれ

それを見れば >>514 も安心して成仏することだろう
519デフォルトの名無しさん:2013/05/28(火) 21:10:00.01
+[+]

こんなんでいいの?
520デフォルトの名無しさん:2013/05/28(火) 23:01:12.42
文字入力は呼び出し側の責任としても
ループ回数はコード内に書かれるべき…じゃないのか
521デフォルトの名無しさん:2013/11/07(木) 04:13:05.65
BFのコンパイラ書いているのですが、最適化の議論ってどこかにありますか。
思いついて実装したのは、
@連続する+-や<>をまとめる(これは自明。>>>>> をadd r0, #5 にするとか)
Aメモリからレジスタに値をロード済みかを覚えておいてロード命令を減らす
です。
考えているだけのは、ループの頭でポインタの位置が不変かを判断し、ポインタの移動範囲を検出して、レジスタに割り当てるというものです。
例えば[>+<-]のようなループの場合、ポインタは当初の値(0)と次の値(+1)にしか移動しないので、これらの指すデータをレジスタに割り当て、
ループ脱出時にメモリに書き戻してやればいいかなと考えています。

動的コード生成をしているので軽い処理がいいのですがそうでないのも知りたいです。
対象CPUはARMで、使用マシンはなぜかHP50gっていうグラフ電卓です。
522デフォルトの名無しさん:2013/11/07(木) 12:32:42.32
面白そうなお題だな。
空き時間に考えてみよう。
523デフォルトの名無しさん:2013/11/07(木) 12:45:19.07
いっそC++へのトランスレータにして、後はC++コンパイラの最適化に任せるのはどうだろう。
524デフォルトの名無しさん:2013/11/07(木) 13:18:00.81
>522 アイデアが出たらぜひ教えて下さい。
>523 それって既にあるのでは。BFでプログラムするのと同様でパズルみたいなものと思ってください。

[>+<-]をコンパイルした実行命令数(N=ループ回数)
@素朴版 12N+3
Aロード最適化 11N+3
B>+< を最適化 9N+3
Cレジスタ最適化 5N+6
D手動コンパイル 4N+6

詳細は、
http://pastebin.com/pk8fST8h

レジスタ割当:
r0: 汎用
r1: ポインタ
r2: [r1, #1]
Aはr0と[r1]がエイリアスになっているかを覚えてロード命令を削減
Bは>+<のようなパターンでポインタのinc/decを省く。
CはAに加えてr2と[r1,#1]をエイリアスにする。
Dは自動化は考えずに手でガリガリ記述
525524:2013/11/07(木) 15:18:20.89
脳内コンパイラがこんなコードを生成しました。
ローカルな最適化では定数部を除いてこれ以上は無理そうですね。
ldrb r0, [r1]
ldrb r2, [r1, #1]
cmp r0, r0, #1
b l1
l0:
add r2, #1
subs r0, #1
l1:
bne l0
strb r0, [r1]
strb r2, [r1, #1]
実行命令数 7 + 3N

本来なら、
ldrb r0, [r1]
ldrb r2, [r1, #1]
add r2, r0
strb r2, [r1, #1]
mov r0, #0
strb r0, [r1]
実行命令数 6
とか定数命令でできるのですが、、、
526名無し募集中。。。:2014/06/08(日) 09:57:05.09 ID:TcDR/+bL
万能言語ならぬ全能言語

world* CreateWorld (darkness* Darkness) {
world* World = new World(Darkness);
World->Day = 1;
light* Light = CreateLight();
if (isGood(Light)) add(World, Light);
else throw BadCreation(Light);
Light->Name = "Day";
Darkness->Name = "Night";
++(World->Day); // World->Day = 2

/* 中略 */

bone* AdamsRib = (Adam->Rib[12])->Remove();
woman* Eve = CreateWoman(AdamsRib);
Eve->Name = "Eve";
add(World, Eve);
++(World->Day); // World->Day = 7
World->Sabbath->Interval = 7;
rest();
return World;
}
527デフォルトの名無しさん:2014/06/08(日) 09:59:54.00 ID:083ejc+8
誤爆申し訳ない
世界はBrainFuckで記述されたのかもしれない
528デフォルトの名無しさん:2014/06/08(日) 10:32:43.54 ID:397riybv
だれか BrainFuck の LLVM フロントエンド作らないかな
529デフォルトの名無しさん:2014/06/08(日) 11:29:37.30 ID:qU5LgJI1
神はこれを見てよしとされた。はassert文
530デフォルトの名無しさん:2014/06/20(金) 07:05:56.84 ID:ha/mjnLs
BFオワタ・・・
http://pc.watch.impress.co.jp/docs/news/yajiuma/20140620_654252.html

IT'S SHOWTIME
HEY CHRISTMAS TREE isLessThan10
YOU SET US UP @NO PROBLEMO
HEY CHRISTMAS TREE n
YOU SET US UP 0
STICK AROUND isLessThan10
GET TO THE CHOPPER n
HERE IS MY INVITATION n
GET UP 1
ENOUGH TALK
TALK TO THE HAND n
GET TO THE CHOPPER isLessThan10
HERE IS MY INVITATION 10
LET OFF SOME STEAM BENNET n
ENOUGH TALK
CHILL
YOU HAVE BEEN TERMINATED
531デフォルトの名無しさん
うつくしくない