- 締切済み
コンパイルの逆はできますか??
プログラムの本にこんなことが書いてありました。 『人間にわかる文字をコンパイルして、CPUのわかる0101にします。』 これを見て思ったのですが、CPUのわかる0101文字を逆に人間にわかる文字に返すことは出来ますか?? 他にも、JavaやCで書いた命令をコンパイルし、CPUのわかる0101文字にしてから逆にコンパイルして、JavaをCに変えたり、CをJavaに変えたりできるってことですか??
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- cametan_42
- ベストアンサー率62% (165/265)
面白い質問だと思います。 > 『人間にわかる文字をコンパイルして、CPUのわかる0101にします。』 ちょっと説明を追加しましょう。 実は「CPUのわかる0101にします」と言うのは昔の言い方で、事実上、コンパイラってのは「単なる翻訳機」の事であって、必ずしもCPUの分かる0101に「だけ」する、とは限らないのです。 (一気に)翻訳しちゃえばコンパイラとしての要件を満たすので、別に対象が0101、メンド臭いんでマシン語と言いますが(笑)、とは限りません。マシン語を選ぶか否か、と言うのは設計者の任意です。 従って、 > JavaをCに変えたり、CをJavaに変えたりできるってことですか?? って質問に対してはYES、です。しかも別にマシン語経由しなくても、Javaのソースを構文解析して翻訳してCのソースコードに変換、ないしはCのソースコードを構文解析して翻訳してJavaのソースコードに変換する、ってのは原理的には充分可能で、もうその時点で「コンパイラ」です。 > CPUのわかる0101文字を逆に人間にわかる文字に返すことは出来ますか?? 理論上は可能ですが、実は通常のコンパイラってのもマシン語に直接変換する、ってケースは稀なんじゃないでしょうか。 実際はコンパイラがソースコードを解析して翻訳対象とするのはその一つ上の低級プログラミング言語であるアセンブリ言語への翻訳になってると思います。 アセンブリ言語で書かれたソースをアセンブラがマシン語に変換するケースが殆どじゃないでしょうか。 そこで、アセンブリ言語で書かれたソースを高級言語に変換するテクニックも「逆アセンブル」として知られてると思います。
それを行う、ディスコンパイラというツールが古くからあります。ディスアセンブラ(機械語コードをニーモニック表記に置きかえて読みやすくするツール)をより推し進めたもの。 その一例 http://www.atmarkit.co.jp/fdotnet/dotnettips/1055ilspy/ilspy.html > JavaをCに変えたり それはディスコンパイラを使うまでもなく、コンバータがあります。 https://www.infoq.com/jp/news/2012/09/J2ObjC