ホームページ >バックエンド開発 >C++ >これまでに見たことのない最小のトランスパイラー

これまでに見たことのない最小のトランスパイラー

DDD
DDDオリジナル
2024-12-17 21:28:15540ブラウズ

The tiniest transpiler you

今朝、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 コンパイラが必要な場合は、チェックしてください
これです。

なぜC?

多くの理由:

  • もっと練習したいです
  • 速いです
  • ほとんどが持ち運び可能です
  • それは蔓延しています
  • とにかくコードはあまり必要ありませんでした。

そして最後の理由は、整数のオーバーフローです。通常、これは人々が嫌う悪いことです。おそらくそれが単体テスト (ああ) が発明された理由でしょう。しかし、ブレインファックは違います。メモリ テープの数値には 255 の上限があり、それを超えると 0 にリセットされることが期待されます。また、値が 0 を下回ると 255 にリセットされることになります。C はこれを独自に実行します。 ;コードを書く必要はありませんでした。

どうやって?

より高いレベルの概要:

  • ファイルまたは標準入力からメモリにコードを読み取ります
  • 各文字を C コードに変換します
  • 完成した 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:関数テンプレートで Lambda 関数を使用するときに C 11 が型を推定しないのはなぜですか?次の記事:関数テンプレートで Lambda 関数を使用するときに C 11 が型を推定しないのはなぜですか?

関連記事

続きを見る