入力言語の文法と意味をリバースエンジニアリングできないコンパイラーを作成できますか。
つまり、コンパイラから常に言語の仕様を取得できますか?
からコンパイルしたいとしましょう?? いくつかの言語に、しかし私はコンパイラを読んだ人々が読んで理解できるようにしたくないですか?
個人的にはコンパイラと言語仕様は同形だと感じていますが、これが間違っているかどうかは学術的な観点から興味があります。
入力言語の文法と意味をリバースエンジニアリングできないコンパイラーを作成できますか。
つまり、コンパイラから常に言語の仕様を取得できますか?
からコンパイルしたいとしましょう?? いくつかの言語に、しかし私はコンパイラを読んだ人々が読んで理解できるようにしたくないですか?
個人的にはコンパイラと言語仕様は同形だと感じていますが、これが間違っているかどうかは学術的な観点から興味があります。
彼らがバイナリにしかアクセスできないと言っていると仮定すると:
簡単な答え: 人が十分に気にかけていれば、そうではありません。
長い答え: 人が非常に熱心で自由な時間がたくさんある場合、コンパイラをバイトレベルに落として完全にマップすることは常に可能です。そこから、ロジック ツリーを見つけ出し、言語を再構築することができます。
面倒ですが、これは「専用ユーザーが CD キー検証をクラックするのを防ぐアルゴリズムを作成できるか」と同じカテゴリに分類されます。
さて、実際にコンパイラを人に渡したことがなければ (ある種のプロキシ システムを想像してみてください)、ユーザーが言語仕様をブルート フォースするのに非常に長い時間がかかると言うのが妥当かもしれません。それを完全に実行できるものを生成することはありません。
ソースコードにアクセスできることをほのめかしている場合:
いいえ。難読化することはできますが、コンパイラは、読み取りがどれほど困難であっても、同じ論理ツリーを構築する必要があります。
これを行うには難解な方法があるかもしれません..言語ツリーを暗号化されたバイナリ形式で個別に提供し、コンパイラのソースを提供しなかった場合..ユーザーはNSAタイプに飽きていませんでした.
コンパイラは、コンパイルする言語の仕様を常に明らかにしていると思います (これは非常に手荒なことだと認識しています)。
ただし、そのためのアルゴリズムはおそらくありません (つまり、決定不能です)。たとえば、そのアルゴリズムは、コンパイラが停止するプログラムを見つける必要があるためです。
いいえ、それらは同じではありません。しかし、コンパイラは必然的に入力言語の文法を理解し、(できれば) 言語仕様に非常に正確に従います。したがって、コンパイラを理解することは、それらを理解することを意味します。
もちろん、コンパイラのソース コードを非常に難読化して、誰もそれを読んで文法や言語の規則を抽出しようとしないようにすることは可能です。もちろん、それは開発者をも傷つけます (そのがらくたを維持して頑張ってください!)。
また、言語について何か知りたい場合 (言語がどのように実装されているかではなく、より抽象的なレベルでどのように定義されているかについて) 知りたい場合は、コンパイラのソースを読むのが最後の選択肢になります。仕様またはその他の信頼できるソース (公式ドキュメントなど)、コンパイラのコードが非常に理解しやすい場合でも、はるかに簡単になるためです。
私の直感では、コンパイラの出力を検査することで、コンパイラのセマンティックな動作を判断できると思います。しかし、ドキュメントやコンパイラ ソースへのアクセスがなければ、実際の構文を取得することはできません。ソースがある場合、これは簡単になるため、コンパイラのソースはなく、ツールとしてアクセスするだけでよいと思います。
一般に、コードにセマンティクスに関する情報がある場合 (そして、任意のインタープリターまたはコンパイラーで定義された操作上のセマンティクスが常に存在する場合)、その情報を抽出することは常に可能です。唯一の問題は、そのようなリバース エンジニアリングの複雑さです。したがって、難読化された言語と難読化されたコンパイラが必要です。
たとえば、Malbolge の「逆コンパイラ」を見てください。