今朝、C トランスパイラに Brainf**k を書きました。合計でおよそ 1 時間かかりました。
全体は C の 50 行以内にあります。ここで見ることができます。
これは難解なコーディング言語です。 1993 年にスイスの学生によって発明されたもので、チューリングが完全であるとみなされるためにほぼ最低限必要なものです。
これは、現存する最も有名なエソランの 1 つでもあります。
構文は非常に最小限です。8 文字のみで残りは無視されます。
>++++++++[<+++++++++>-]<.>++++[<+++++++>-]<+.+++++++..+++.>>++++++[<+++++++>-]< ++.------------.>++++++[<+++++++++>-]<+.<.+++.------.--------.>>>++++[<++++++++ >-]<+.
それが何をするか推測してください。推測してください。
こんにちは、ワールドです!プログラム。
基本的に、brainf**k では 30000 バイトの配列とカーソルが与えられます。 >でカーソルを移動できます。そして<。および - を使用してメモリを変更できます。これにより、セル内の値が増加または減少します。 [ と ] を使用してループを作成できます。最後に、 を使用して単一バイトを入力として読み取り、 ..
を使用して現在のセルの値を出力できます。
> ; Increments cursor position < ; Decrements cursor position + ; Increments cell value - ; Decrements cell value . ; Prints the current cell value as an ASCII character , ; Reads a singly byte and stores it in the current cell [ ; Opens a loop that continues until the cell value is 0 ] ; Closes a loop
これが Brainf**k に関するほぼすべてです。
私は以前、アセンブリ でより多くの関数型プログラムを作成したことがあります。
私がこのコンパイラを書いたのは、まったく退屈していて、大量のインタプリタを見つけたので、世界には頭脳の優れたコンパイラが必要だと思ったからです。
確かに、本当に優れた Brainf**k コンパイラが必要な場合は、チェックしてください
これです。
多くの理由:
そして最後の理由は、整数のオーバーフローです。通常、これは人々が嫌う悪いことです。おそらくそれが単体テスト (ああ) が発明された理由でしょう。しかし、ブレインファックは違います。メモリ テープの数値には 255 の上限があり、それを超えると 0 にリセットされることが期待されます。また、値が 0 を下回ると 255 にリセットされることになります。C はこれを独自に実行します。 ;コードを書く必要はありませんでした。
より高いレベルの概要:
brainf**k コードをファイルから code[] に読み取ります。
次に、基本的な C プログラムをセットアップします。
#include <stdio.h> int main() {char t[30000]={0};int p=0;
閉じ括弧が欠けていることに気づいたかもしれません。これは、その char[].
にさらにコードが追加されるためです。ご参考までに、char t[30000] はあなたに与えられたメモリです。テープの短縮形として t を使用しましたが、これらのプログラムは人間が判読できるように意図されていないため、短縮しました。
次に、単一文字の配列であるコード配列をループします。文字ごとに、C コードに変換します:
character | becomes |
---|---|
> | p |
< | p-- |
- | t[p]-- |
t[p] | |
. | putchar(t[p]) |
, | t[p]=getchar() |
[ | while(t[p] != 0) |
] | } |
これらのシンボルが何をするのかを理解するには、上記を参照してください。
これらの値はプログラム出力に追加され、有効な C コードが含まれます。
最後に、次のコードが最終出力に追加されます。
>++++++++[<+++++++++>-]<.>++++[<+++++++>-]<+.+++++++..+++.>>++++++[<+++++++>-]< ++.------------.>++++++[<+++++++++>-]<+.<.+++.------.--------.>>>++++[<++++++++ >-]<+.出力されたプログラムはこれで終わりです。次に、トランスパイラーは、ユーザーが必要に応じて操作できるように、このコードを標準出力に出力します。
最終的な考え
この記事を書いているときに、改善のためのアイデアがいくつかありました。より速くするために私にできることはあまりないと思いますが、より安全でより良いものにするためにできることはあります。
最終的なコードはここで確認できます。
ご希望に応じて、あらゆる種類の貢献を行うこともできます。
読んでいただきありがとうございます!
以上がこれまでに見たことのない最小のトランスパイラーの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。