コンパイラと言語仕様/文法は同じですか?
-
11-10-2019 - |
質問
コンパイラを書くことができます。そこから入力言語の文法と意味をリバースエンジニアリングすることはできません。
つまり、コンパイラから言語の仕様をいつでも入手できますか?
からコンパイルしたいとしましょうか?ある言語には、コンパイラを読んでいる人が読んで理解できるようにしてほしくありませんか?
私は個人的には、コンパイラと言語仕様が同型であると感じていますが、これが間違っているかどうかは学問的な観点から興味があります。
解決
あなたが彼らがバイナリにのみアクセスできると言っていると仮定してください:
簡単な答え:人が十分に気にかけているかどうかではありません。
長い答え:人が非常に傾いていて自由な時間がたくさんあった場合、コンパイラをバイトレベルまでリッピングして完全にマッピングすることは常に可能です。そこから、ロジックツリーを把握し、言語を再構築することができます。
痛いでしょうが、これは「専用のユーザーがCDキー検証をクラックすることを妨げるアルゴリズムを作成できますか」と同じカテゴリに該当します。
さて、あなたが実際にコンパイラを人に与えたことがないなら(ある種のプロキシシステムを想像してください?)それを完全に行使できるものを生成します。
ソースコードにアクセスできることを暗示している場合:
いいえ。それを難読化することはできますが、コンパイラはまだ読みにくい場合でも、同じ論理ツリーを構築する必要があります。
これを行うための難解な方法があるかもしれません。ある種の暗号化されたバイナリ形式で言語ツリーを個別に提供し、コンパイラのソースを提供しなかった場合、ユーザーはNSAタイプに退屈していませんでした。
他のヒント
コンパイラは常にコンパイルする言語の仕様を明らかにしていると思います(これは非常に手のくが波していることを知っています)。
ただし、たとえば、アルゴリズムがコンパイラが停止するプログラムを見つける必要があるため、おそらくそれを行うアルゴリズムはありません(つまり、習得不可能です)。
いいえ、彼らは同じではありません。しかし、コンパイラは必然的に入力言語の文法を理解しており、(できれば)言語仕様に非常に正確に従います。したがって、コンパイラを理解するということは、それらを理解することを意味します。
もちろん、コンパイラソースコードを非常に重視して、誰もそれを読んで文法と言語のルールを抽出することを気にすることはありません。もちろん、それは開発者も傷つけます(そのがらくたを維持することは幸運です!)。
また、コンパイラのソースを読むことは、言語について何かを知りたい場合(それがどのように実装されているかではなく、より抽象的なレベルでどのように定義されるかについての私の最後のオプションになるでしょう - 私は仕様または他の権威あるソースに向かいます(公式のドキュメントなど)、コンパイラのコードが非常に理解できる場合でも、それははるかに簡単になるためです。
私の直感は、出力を検査することにより、コンパイラのセマンティック動作を決定できるということです。ただし、ドキュメントやコンパイラソースへのアクセスがなければ、実際の構文を取得できませんでした。ソースがある場合、これは些細なものになるので、コンパイラのソースがないと思っています。ツールとしてアクセスするだけです。
一般に、コードにセマンティクスに関する情報がある場合(そして、任意のインタープリターまたはコンパイラで定義された運用セマンティクスが常にある)、その情報を抽出することは常に可能です。唯一の問題は、このようなリバースエンジニアリングの複雑さです。したがって、難読化された言語と難読化されたコンパイラが必要です。
たとえば、Malbolgeの「Decompiler」をご覧ください。