プログラミング言語/Brainfuck
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*Brainf*ck [#f7d1af24]
#contents
#br
*はじめに [#o7747c97]
なんか、Brainf*ckのページでも作ってみようかなーなんて。~
いっしょに楽しく学びましょう。
*言語の特徴 [#gbc97476]
命令が8つしかない。以下は[[Wikipedia:http://ja.wikipedia....
+> ポインタをインクリメントする。ポインタをptrとすると、C...
+ < ポインタをデクリメントする。C言語の「ptr--;」に相当。
+ + ポインタが指す値をインクリメントする。C言語の「(*ptr)...
+ - ポインタが指す値をデクリメントする。C言語の「(*ptr)--...
+ . ポインタが指す値を出力する。C言語の「putchar(*ptr);」...
+ , 1バイトを入力してポインタが指す値に代入する。C言語の...
+ [ ポインタが指す値が0なら、対応する ] までジャンプする...
+ ] ポインタが指す値が0でないなら、対応する [ にジャンプ...
*処理系 [#qc72773f]
**コンパイラ [#x749438d]
[[The Brainfuck Archive:http://esoteric.sange.fi/brainfuc...
~
BF2C.cをCのコンパイラでコンパイルすると、Brainfuckのソー...
Cに変換されたソースをもう一度Cコンパイラでコンパイルして...
こんな感じ。~
~
program.bf ー(BF2C.exe)→ program.c ー(Cコンパイラ)→ pro...
~
**インタプリタ [#w55428aa]
UNIX系OSでは、impl/interp/ 以下にインタプリタもあるような...
http://4mhz.de/bfdev.html
こんなんあったわよ
**Webインタプリタ [#cbbf7e2d]
Cをコンパイルするのが面倒だとか、メモリの中身や実行途中の...
[[ONLINE BrainF*ck interpreter for JavaScript:http://cfs....
*断り書き [#j7103556]
以下、このコーナーでは「メモリに先頭からa, b, c, d, … と...
[a][b][c][d]…
↑
と書くことにします。~
~
また、メモリのn番目を指したいとき、矢印の横に (n) と表記...
例えば「メモリの99番目から順に e, f, g, h, … と値がはいっ...
…[e][f][g][h]…
↑(100)
と表します。~
(追記してくださる方はこのルールに従うか、独自の書き方をす...
*Hello, World! [#jb4847a8]
さて、Wikipediaの[[Hello worldプログラムの一覧:http://ja....
+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++...
------------.<++++++++.--------.+++.------.--------.>+.
これを実行するとたしかに Hello, world! と表示されますが、...
~
まず一つ目の +++++++++ ですが、これは次の [ ] ループのた...
~
次に [ がありますが、今ポインタの内容は最初に9まで増やし...
そして >++++++++>+++++++++++>+++++<<<- が実行され、メモリ...
[8][8][11][5][0][0]…
↑
となります。~
~
[ ] ループはメモリの先頭のが0になるまで(つまり9回)繰り返...
[0][72][99][45][0][0]…
↑
となります。~
~
あとは勝手に横から書き換えてみる。
-先ず、"Hello"の出力について。
--右にポインタを移動して72(H の文字コード)を出力。
--もう一度右に移動すると99(c の文字コード)が入っているの...
--7足して108(l)を2回出力。
--3足して111(o)を出力。
-次に、", "の出力について。
--一つ右にポインタを移動すると45(- の文字コード)が入って...
--12引いて32( (空白))を出力。
-更に、"world"(Worldにあらず)の出力について。
--一つ左にポインタを戻し、8足して119(w)を出力。
--8引いて111(o)を出力。
--3足して114(r)を出力。
--6引いて108(l)を出力。
--8引いて100(d)を出力。
-最後に、"!"(感嘆符)の出力について。
--一つ右にポインタを移動してから1足して、33(!)を出力。
~
この段階でメモリの内容は
[0][72][100][33][0][0]…
↑
となります。
*if構文 [#pc01092f]
続くとか言っておきながら続く気配がないので勝手に横から書...
入力した文字が「@」かどうか判別する。
>,<++++++++[>--------<-]>>+<[>]>[~~@の場合>>]<<<[~~@...
では先頭から説明していきます。
>,
[0][s][0][0][0]
↑
仮に入力された文字コードをsとしておきます。一番左のメモリ...
<++++++++[>--------<-]>
先ほど空けた一番左のメモリに戻って8を足し0になるまで1を引...
[0][s-64][0][0][0]
↑
となります。
>+<
[0][s-64][1][0][0]
↑
[>]
sが64(@)の時、s-64=0なので、
[0][0][1][0][0]
↑
なにも起きません。
sが64以外(@ではない)時、s-64≠0なので、
[0][s-64][1][0][0]
↑(4)
結果2つ右にポインタが移動します。
>
さらに一つ右に移動するので、
sが64の時
[0][s-64][1][0][0]
↑
sが64以外の時
[0][s-64][1][0][0]
↑(5)
ポインタが指す値はs==64?1:0となりました。
[~~@の場合>>]
ここで[ ]が来ると、sが64ではない時何も起こらず
sが64の時だけ中が実行されます。
文字を出力する、という文を書く場合はメモリの(1)~(5)を弄...
これは、sが64ではない時、つまり[]内を実行しない場合の結果...
[0][s-64][1][0][0]
↑(5)
sが64かどうかにかかわらず結果こうなります。
さらに
<<<
[0][s-64][1][0][0]
↑(1)
sが64ではない時、ポインタが指す値は0ではないので
[~~@ではない場合[-]]
[]内を実行できます。C言語等のelse {~~}に相当します。[]...
*if構文その2 [#qadc256f]
上同様、入力値が@(ASCII:64(10))かどうかを判定する。
,>++++++++[-<-------->]<[#@以外の処理>>-<]>+[#@の時の処...
説明は省略。
*FizzBuzz [#f624a251]
++++++[->++++> >+>+>-<<<<<]>[<++++> >+++>++++> >+++>+
++++>+++++> > > > > >++> >++<<<<<<<<<<<<<<-]<++++>+++
>-->+++>-> >--->++> > >+++++[->++>++<<]<<<<<<<<<<[->-
[> > > > > > >]>[<+++>.>.> > > >..> > >+<]<<<<<-[> > > >...
++++>.>.>..> > >+<]> > > >+<-[<<<]<[[-<<+> >]> > >+>+<<<...
<[-> >+>+>-<<<<]<]>>[[-]<]>[> > >[>.<<.<<<]<[.<<<<]>]>.<...
<<<<<<<]
*Brainf*ck系言語 [#z8e76b58]
**命令置換系 [#k249ddd1]
Brainf*ckの性質上、 [ や . などを別の文字列と置き換えるこ...
簡単に別の言語(俺言語)ができてしまう。ここではその一部...
-プログラミング言語「長門有希
--…,「」および任意の命令区切りを使ってプログラムする言語。
--例えば 「………。…。…。…。…。…。…。…。…。…………。……長門有希...
--でも実態はただの BrainF*ck なのでまともなものはできそう...
-[[neko mimi Fu**:http://d.hatena.ne.jp/tokuhirom/2004101...
--ネコミミ!ネコミミモードキス…したくなっちゃった…おにい...
-[[Misa:http://homepage2.nifty.com/kujira_niku/okayu/misa...
--みさくら語でかける言語。
--→や「などを命令セットに使ってるので非常に自由な文章でか...
--一見ただの日本語文章のようだが、実行すると…?的な暗号用...
-[[あえぎ声記述言語:http://vipprog.tumblr.com/post/352570...
--やったーあえぎ声記述言語できたよー(^o^)ノ
***置換表 [#e2fb4802]
|Brainfuck|neko mimi Fu**|Misa|SIZE(10):プログラミング言...
|>|ネコミミ!|> → 〜 ー|………|ああッ|あ|ptr++;|
|<|ネコミミモード|< ← ★ ☆|…………|んんッ!|ほ|ptr--;|
|+|おにいさま|+ あ ぁ お ぉ|…|あッ|た|(*ptr)++;|
|-|私のしもべー|- っ ッ|……|んッ|ー|(*ptr)--;|
|.|や・く・そ・く・よ|. !|………………|イク!イっちゃう!|おま...
|,|フルフルフルムーン|, ?|……………|入ってるの感じちゃうぅ!...
|[|キスキス…|[ 「 『|「|してぇ!お願い!|っ|while(*ptr){|
|]|キス…したくなっちゃった…|] 」 』|」|やめないでぇ!|!|}|
|>|>|>|>|>|LEFT:*プログラミング言語「長門有希」は各命令を...
**仕様拡張系 [#ab7dab60]
Brainf*ckでは無理な(或いは膨大な処理が必要になる)基礎処理...
-[[BrainCrash:http://cfs.maxn.jp/neta/BrainCrash.php]]
--bit演算が命令に加えられたもの。
--0バイトで"Hello, world!"が出力できる言語でもある。
*参考資料 [#z5f19f1a]
-[[◆超言語:http://brainfuck.bake-neko.net/]]
終了行:
*Brainf*ck [#f7d1af24]
#contents
#br
*はじめに [#o7747c97]
なんか、Brainf*ckのページでも作ってみようかなーなんて。~
いっしょに楽しく学びましょう。
*言語の特徴 [#gbc97476]
命令が8つしかない。以下は[[Wikipedia:http://ja.wikipedia....
+> ポインタをインクリメントする。ポインタをptrとすると、C...
+ < ポインタをデクリメントする。C言語の「ptr--;」に相当。
+ + ポインタが指す値をインクリメントする。C言語の「(*ptr)...
+ - ポインタが指す値をデクリメントする。C言語の「(*ptr)--...
+ . ポインタが指す値を出力する。C言語の「putchar(*ptr);」...
+ , 1バイトを入力してポインタが指す値に代入する。C言語の...
+ [ ポインタが指す値が0なら、対応する ] までジャンプする...
+ ] ポインタが指す値が0でないなら、対応する [ にジャンプ...
*処理系 [#qc72773f]
**コンパイラ [#x749438d]
[[The Brainfuck Archive:http://esoteric.sange.fi/brainfuc...
~
BF2C.cをCのコンパイラでコンパイルすると、Brainfuckのソー...
Cに変換されたソースをもう一度Cコンパイラでコンパイルして...
こんな感じ。~
~
program.bf ー(BF2C.exe)→ program.c ー(Cコンパイラ)→ pro...
~
**インタプリタ [#w55428aa]
UNIX系OSでは、impl/interp/ 以下にインタプリタもあるような...
http://4mhz.de/bfdev.html
こんなんあったわよ
**Webインタプリタ [#cbbf7e2d]
Cをコンパイルするのが面倒だとか、メモリの中身や実行途中の...
[[ONLINE BrainF*ck interpreter for JavaScript:http://cfs....
*断り書き [#j7103556]
以下、このコーナーでは「メモリに先頭からa, b, c, d, … と...
[a][b][c][d]…
↑
と書くことにします。~
~
また、メモリのn番目を指したいとき、矢印の横に (n) と表記...
例えば「メモリの99番目から順に e, f, g, h, … と値がはいっ...
…[e][f][g][h]…
↑(100)
と表します。~
(追記してくださる方はこのルールに従うか、独自の書き方をす...
*Hello, World! [#jb4847a8]
さて、Wikipediaの[[Hello worldプログラムの一覧:http://ja....
+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++...
------------.<++++++++.--------.+++.------.--------.>+.
これを実行するとたしかに Hello, world! と表示されますが、...
~
まず一つ目の +++++++++ ですが、これは次の [ ] ループのた...
~
次に [ がありますが、今ポインタの内容は最初に9まで増やし...
そして >++++++++>+++++++++++>+++++<<<- が実行され、メモリ...
[8][8][11][5][0][0]…
↑
となります。~
~
[ ] ループはメモリの先頭のが0になるまで(つまり9回)繰り返...
[0][72][99][45][0][0]…
↑
となります。~
~
あとは勝手に横から書き換えてみる。
-先ず、"Hello"の出力について。
--右にポインタを移動して72(H の文字コード)を出力。
--もう一度右に移動すると99(c の文字コード)が入っているの...
--7足して108(l)を2回出力。
--3足して111(o)を出力。
-次に、", "の出力について。
--一つ右にポインタを移動すると45(- の文字コード)が入って...
--12引いて32( (空白))を出力。
-更に、"world"(Worldにあらず)の出力について。
--一つ左にポインタを戻し、8足して119(w)を出力。
--8引いて111(o)を出力。
--3足して114(r)を出力。
--6引いて108(l)を出力。
--8引いて100(d)を出力。
-最後に、"!"(感嘆符)の出力について。
--一つ右にポインタを移動してから1足して、33(!)を出力。
~
この段階でメモリの内容は
[0][72][100][33][0][0]…
↑
となります。
*if構文 [#pc01092f]
続くとか言っておきながら続く気配がないので勝手に横から書...
入力した文字が「@」かどうか判別する。
>,<++++++++[>--------<-]>>+<[>]>[~~@の場合>>]<<<[~~@...
では先頭から説明していきます。
>,
[0][s][0][0][0]
↑
仮に入力された文字コードをsとしておきます。一番左のメモリ...
<++++++++[>--------<-]>
先ほど空けた一番左のメモリに戻って8を足し0になるまで1を引...
[0][s-64][0][0][0]
↑
となります。
>+<
[0][s-64][1][0][0]
↑
[>]
sが64(@)の時、s-64=0なので、
[0][0][1][0][0]
↑
なにも起きません。
sが64以外(@ではない)時、s-64≠0なので、
[0][s-64][1][0][0]
↑(4)
結果2つ右にポインタが移動します。
>
さらに一つ右に移動するので、
sが64の時
[0][s-64][1][0][0]
↑
sが64以外の時
[0][s-64][1][0][0]
↑(5)
ポインタが指す値はs==64?1:0となりました。
[~~@の場合>>]
ここで[ ]が来ると、sが64ではない時何も起こらず
sが64の時だけ中が実行されます。
文字を出力する、という文を書く場合はメモリの(1)~(5)を弄...
これは、sが64ではない時、つまり[]内を実行しない場合の結果...
[0][s-64][1][0][0]
↑(5)
sが64かどうかにかかわらず結果こうなります。
さらに
<<<
[0][s-64][1][0][0]
↑(1)
sが64ではない時、ポインタが指す値は0ではないので
[~~@ではない場合[-]]
[]内を実行できます。C言語等のelse {~~}に相当します。[]...
*if構文その2 [#qadc256f]
上同様、入力値が@(ASCII:64(10))かどうかを判定する。
,>++++++++[-<-------->]<[#@以外の処理>>-<]>+[#@の時の処...
説明は省略。
*FizzBuzz [#f624a251]
++++++[->++++> >+>+>-<<<<<]>[<++++> >+++>++++> >+++>+
++++>+++++> > > > > >++> >++<<<<<<<<<<<<<<-]<++++>+++
>-->+++>-> >--->++> > >+++++[->++>++<<]<<<<<<<<<<[->-
[> > > > > > >]>[<+++>.>.> > > >..> > >+<]<<<<<-[> > > >...
++++>.>.>..> > >+<]> > > >+<-[<<<]<[[-<<+> >]> > >+>+<<<...
<[-> >+>+>-<<<<]<]>>[[-]<]>[> > >[>.<<.<<<]<[.<<<<]>]>.<...
<<<<<<<]
*Brainf*ck系言語 [#z8e76b58]
**命令置換系 [#k249ddd1]
Brainf*ckの性質上、 [ や . などを別の文字列と置き換えるこ...
簡単に別の言語(俺言語)ができてしまう。ここではその一部...
-プログラミング言語「長門有希
--…,「」および任意の命令区切りを使ってプログラムする言語。
--例えば 「………。…。…。…。…。…。…。…。…。…………。……長門有希...
--でも実態はただの BrainF*ck なのでまともなものはできそう...
-[[neko mimi Fu**:http://d.hatena.ne.jp/tokuhirom/2004101...
--ネコミミ!ネコミミモードキス…したくなっちゃった…おにい...
-[[Misa:http://homepage2.nifty.com/kujira_niku/okayu/misa...
--みさくら語でかける言語。
--→や「などを命令セットに使ってるので非常に自由な文章でか...
--一見ただの日本語文章のようだが、実行すると…?的な暗号用...
-[[あえぎ声記述言語:http://vipprog.tumblr.com/post/352570...
--やったーあえぎ声記述言語できたよー(^o^)ノ
***置換表 [#e2fb4802]
|Brainfuck|neko mimi Fu**|Misa|SIZE(10):プログラミング言...
|>|ネコミミ!|> → 〜 ー|………|ああッ|あ|ptr++;|
|<|ネコミミモード|< ← ★ ☆|…………|んんッ!|ほ|ptr--;|
|+|おにいさま|+ あ ぁ お ぉ|…|あッ|た|(*ptr)++;|
|-|私のしもべー|- っ ッ|……|んッ|ー|(*ptr)--;|
|.|や・く・そ・く・よ|. !|………………|イク!イっちゃう!|おま...
|,|フルフルフルムーン|, ?|……………|入ってるの感じちゃうぅ!...
|[|キスキス…|[ 「 『|「|してぇ!お願い!|っ|while(*ptr){|
|]|キス…したくなっちゃった…|] 」 』|」|やめないでぇ!|!|}|
|>|>|>|>|>|LEFT:*プログラミング言語「長門有希」は各命令を...
**仕様拡張系 [#ab7dab60]
Brainf*ckでは無理な(或いは膨大な処理が必要になる)基礎処理...
-[[BrainCrash:http://cfs.maxn.jp/neta/BrainCrash.php]]
--bit演算が命令に加えられたもの。
--0バイトで"Hello, world!"が出力できる言語でもある。
*参考資料 [#z5f19f1a]
-[[◆超言語:http://brainfuck.bake-neko.net/]]
ページ名: