すべての文字列が有効なプログラムであるプログラミング言語はありますか?


10

固定アルファベット(ASCIIなど)の場合、これらの文字の可能なすべての置換が、実行可能な意味的に有効なプログラムであるようなチューリング完全プログラミング言語は存在しますか?

無限ループも意味的に有効であると見なします。

Markdownなどの一部のデータ形式は、普遍的な意味論的有効性(すべての入力が有効)を持っていることは知っていますが、このプロパティを備えたプログラミング言語を思いのままにすることはできません。


@PhilipKendallこれは有効な(縮退している場合)回答です。もちろん、ほとんどすべてのプログラムはすぐに未知の空間にJMPしてクラッシュします。しかし、だからといって意味がないわけではありません。超最適化を思い出させます。
mp-

あなたがアスキー文字を与えられたときそれがそれを印刷して次の文字に移動するとき、あなたが些細な言語を持っていると仮定します。それは技術的にあなたの定義を満たします。すべての入力が有効です。生産的なことは何もできないので、それはかなりばかげた言語になりますが、もちろん実用性については触れていません。
Neil、

@ニール:それはチューリング完全な言語ではありません。
Doc Brown、

回答:


10

無効なオペコードや引数がないため、すべてのオクテットシーケンスを有効なZ80コードとして解釈できます。同じことが他のさまざまなプロセッサにも当てはまると思いますが、私は個人的にZ80を知っています。

このような低レベルのものについては、「プログラムを実行する」ことが何を意味するのかについて疑問にぶつかる可能性があります。

  • 初期化された空間の外にジャンプするとどうなりますか?
  • とにかく「プログラム」はどのように終了しますか?

1
「初期化されたスペースの外にジャンプした場合どうなるか」 -「この場合、アドレス0にジャンプする」というルールを追加するだけで、処理が非常に簡単になります。これらのエッジケースに対処するためにいくつかの追加のセマンティクスを定義するのは難しくありません。
Doc Brown

1
初期化された空間の外へのジャンプは構文的に有効であり、おそらく意味的にも有効です(たとえば、その明確に定義されたセマンティクスはsegfaultを生成することです)。
リーライアン

9

プログラミング言語についてのそのような質問は、ほぼ普遍的に「はい」で答えられます。要求されたプロパティを持つ言語が現在ない場合、そのプロパティを持つ(おもちゃの)言語を作成するためのチャレンジとして誰かがそれを見ると思うかもしれません。

アルファベット文字のすべての順列が構文的に有効である言語の例として、空白文字言語があります。この言語のアルファベット自体は、スペース、タブ、および改行で構成されています。


4
また、空白文字以外の文字はコメントとして無視されるため、空白文字のすべての順列だけでなく、実際にはASCII文字のすべての順列も構文的に有効です。
イェルクWミッターク

1
要点を述べると、ホワイトスペースのチュートリアルを少し見てみると、スタック操作[スペース]の後に[タブ]文字を続けてはならないようです。しかし、これらの特殊なケースのために言語を拡張することは簡単だと思います(たとえば、No-Opセマンティクスを与えることによって)。
Doc Brown、

@docbrown、例では[Space] [Tab]のシーケンスが表示されるので、どこから結論を得たのかわかりません。
Bart van Ingen

@BartvanIngenSchenau:チュートリアルを見てください。スタック操作は、[Space]に続いて、別の[Space]または[LF]で始まる4つの可能なコマンドのいずれかによって始まります。シーケンス[Space] [Tab]は、数字の一部として、または別のコマンドの一部として発生する可能性がありますが、[Space]によって導入されたスタックコマンドの後の[Tab]は有効な文字ではありません。
Doc Brown

0

(文字の)文字列を解決する理由 その質問を「任意の一連のトークン」に言い換える必要があります。ビットではなく、ビットは20世紀のコンピューターのようです。

したがって、無限ループは問題ないと言えます。ゼロ除算はどうですか?有効性の定義に十分寛容な場合は、「はい」になる可能性がありますが、ほとんどの組み合わせはまだ意味がありません。したがって、技術的に有効なプログラムは常に入手できるかもしれませんが、意味的に有効なプログラムはほとんど入手できません。


「ビットはとても20世紀のコンピューター風」:これはどういう意味ですか?
Giorgio

文字列、文字、ビットは技術的な詳細であり、本質的には命令とオペラントについて話しています。それらがどのように実装されるかは、問題とは無関係です。
Martin Maat 2018

はい、しかし、この観察は50年前にも当てはまりました(正式な言語はさらに古い)ので、私はまだあなたの意味が理解できるかどうかわかりません。
ジョルジオ

私は問題を論理的な本質にまで引き下げたかっただけです。文字列やバイトではなく、命令と引数についてです。それらを任意の方法で混同して、有効なプログラムを確実に取得できますか?
Martin Maat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.