• 締切済み

コンパイルの逆はできますか??

プログラムの本にこんなことが書いてありました。 『人間にわかる文字をコンパイルして、CPUのわかる0101にします。』 これを見て思ったのですが、CPUのわかる0101文字を逆に人間にわかる文字に返すことは出来ますか?? 他にも、JavaやCで書いた命令をコンパイルし、CPUのわかる0101文字にしてから逆にコンパイルして、JavaをCに変えたり、CをJavaに変えたりできるってことですか??

みんなの回答

回答No.2

面白い質問だと思います。 > 『人間にわかる文字をコンパイルして、CPUのわかる0101にします。』 ちょっと説明を追加しましょう。 実は「CPUのわかる0101にします」と言うのは昔の言い方で、事実上、コンパイラってのは「単なる翻訳機」の事であって、必ずしもCPUの分かる0101に「だけ」する、とは限らないのです。 (一気に)翻訳しちゃえばコンパイラとしての要件を満たすので、別に対象が0101、メンド臭いんでマシン語と言いますが(笑)、とは限りません。マシン語を選ぶか否か、と言うのは設計者の任意です。 従って、 > JavaをCに変えたり、CをJavaに変えたりできるってことですか?? って質問に対してはYES、です。しかも別にマシン語経由しなくても、Javaのソースを構文解析して翻訳してCのソースコードに変換、ないしはCのソースコードを構文解析して翻訳してJavaのソースコードに変換する、ってのは原理的には充分可能で、もうその時点で「コンパイラ」です。 > CPUのわかる0101文字を逆に人間にわかる文字に返すことは出来ますか?? 理論上は可能ですが、実は通常のコンパイラってのもマシン語に直接変換する、ってケースは稀なんじゃないでしょうか。 実際はコンパイラがソースコードを解析して翻訳対象とするのはその一つ上の低級プログラミング言語であるアセンブリ言語への翻訳になってると思います。 アセンブリ言語で書かれたソースをアセンブラがマシン語に変換するケースが殆どじゃないでしょうか。 そこで、アセンブリ言語で書かれたソースを高級言語に変換するテクニックも「逆アセンブル」として知られてると思います。

noname#228894
noname#228894
回答No.1

それを行う、ディスコンパイラというツールが古くからあります。ディスアセンブラ(機械語コードをニーモニック表記に置きかえて読みやすくするツール)をより推し進めたもの。 その一例 http://www.atmarkit.co.jp/fdotnet/dotnettips/1055ilspy/ilspy.html > JavaをCに変えたり それはディスコンパイラを使うまでもなく、コンバータがあります。 https://www.infoq.com/jp/news/2012/09/J2ObjC

関連するQ&A

  • 逆コンパイル

    C#で書いた単純なプログラムをコンパイルして、それをテキストエディタで開いたところ、なんだかソースコードのような文字列がかなりそのまま実行バイナリの中に含まれています。 これって簡単に逆コンパイルとかされないでしょうか。 プログラムのバイナリを圧縮や暗号化して、実行時にそれを展開するような方法があると聞いたのですが、それはC#でもできますか? 別のプログラムは圧縮ファイルを解凍するような方法じゃなくて、1つのプログラム内でそういうことできませんか?

  • 「逆コンパイル」ってできるんですか?

    自力なり、ツールをつかうなりして逆コンパイルすれば、EXE形式から、Cなどのプログラム言語に変換することができるんですよね。 そうすると、ソフトを作っている会社なんかは、自社が力をそそいで作ったプログラムを簡単に真似されたりすると思うんですけど、それでいいんでしょうか。 それから、 ウィンドウズのEXEから、ソースコードに変換することはできないんですか? すごい労力になるけど、やることは可能な気がするんですが。

  • javaの逆コンパイルを防ぐ方法はありますか?

    javaの逆コンパイルを防ぐ方法はありますか? javaのクラスファイル(.class)を公開したいと思います。 しかしjadやJadClipseなどの解析ソフトを使うと、簡単にソースコードが解析されてしまいます。 逆コンパイルを防ぐ方法があれば教えて下さい。 困っています。よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 【逆コンパイル】JadEclipseの使い方

    JadとJadEclipseのプラグインを導入して、設定も全て終了したのですが、 いまいち逆コンパイルのやり方がわかりません。色々検索はしてみたのですが、設定のやり方ばかりで・・・ .jam .jarファイルがあるのですが、これを逆コンパイルしたいのですが、可能でしょうか?また、どうやってデコンパイルをすればいいのかわかりません。 最近Javaをはじめてまだまだ初心者なので面倒くさい質問かと存じますが、 どうぞよろしくお願いします。

  • コンパイルができません

    「なぜ、あなたはJavaでオブジェクト指向開発ができないのか」 という本を使って今勉強しているのですが、Lesson9のフレームワークを使ったプログラムで シンボルを解決できません。 シンボル: クラス Card とエラーが出てコンパイルできなくなりました。 仕方なく「http://www.gihyo.co.jp/books/support.php/4-7741-2222-X#sampledata」にあるこの本のサンプルファイルをダウンロードして実行してみましたがやはり同じエラーがでてコンパイルできません。 javac ○○.java ではコンパイルできないのでしょうか? エディタは「JmEdit2」というのを使っています。

    • ベストアンサー
    • Java
  • コンパイルが通らない

    うちのPCでは確実にコンパイルが通って、実行までできたプログラムが他の人のPCではコンパイルが通らなかったり実行ができません。 実行する際には javac nishi.java java nishi とやると以下のようなエラーがでて実行ができません(コンパイルは通ります。決してjava nishi.classとかjava nishi.javaといったお約束の間違いは行っていません) Exception in thread "main"java.lang.NoClassDefFoundError:nishi また違うファイルではこっちでコンパイルが通るのにあっちではコンパイルが通らなかったりします。バージョンが違うためでしょうか?僕のバージョンが1.5.08?で相手が1.4.2くらいです。だからコンパイルが通らないの?

  • java にてコンパイルできない。

    java にてコンパイルできない。 javaにてコンパイルそのものができません。 下記がその状況です。 java>javac test.java Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/tools/javac C:\java>set JAVA_HOME JAVA_HOME=C:\Program Files\Java\jdk1.5.0 ネットで調べてコンパネの環境設定でPATH、CLASSPATHの設定等は変更しました。 現在のところ上記の設定はJAVAのものしか入っておりません。 他のPCでは正常にコンパイル実行できますので文法の間違いはないものと思われます 何か考えられることはありますでしょうか

  • 逆コンパイルマニアが多いのでしょうか?

    ウインドウズOSをはじめとするマイクロソフト製品に、 アルゴリズムやプログラム記述上の欠陥過失があることを マッキントッシュのユーザーグループで多く話題にされているのを見ます。 そこで、ごくごく単純素朴な疑問なのですが、 ソースコードの見比べをしないとわからない内容だと思いますので、 オープンソースでもないのに中身がわかる、というのは、マックファンの皆さんは多分MS製品を逆コンパイルをしてアップルのプログラムと比較しているのだと思うのですが、 そもそも逆コンパイルによって生成されたソースコードの記述文というのは「原本」とはかなり違ったアバウトなものになる、という逆コンパイラの一般論的な説明文をパソコン用語辞典などで拝見しています。 アップルの製品は逆コンパイルして生成される記述文であっても、やはり美しくて感心するようなものなのでしょうか??? またプログラミング上の美しさや間違いというものは、逆コンパイルで本当に判明できるものなのでしょうか?

  • Javaのコンパイルがうまくいきません

    SunからJavaをインストールしたあと、購入した本の手順に指示に従って出力しようと試みているのですが、コマンドプロンプトでプログラムを保存しているフォルダまで移動したあと、javac Hello.javaと入力してエンターキーを押してコンパイルしようとしたら、’javac’は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとしても認識されていません。というメッセージが現れて、次へ進めません。(メモ帳にプログラムは書いて、Cドライブに保存しています。)よろしくお願いします。

  • コンパイル

    Cで書いたプログラムをWindowsXPに入っている コマンド プロンプトでコンパイルしたくて、 いま、やり方が書いてある本を見ながらやってるのですが、 例えばaaa.cをコンパイルするとしたら、 C:\***>+++ aaa.c とやるんと書いてあって、 本には+++にgccかbcc32って書いてあるんですけど、 それだと 『"gcc"は内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイル として認識されていません』 『"bcc32"は内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイル として認識されていません』 って出るんです。 じゃあgcc、bcc32の代わりに何を入れたらいいのでしょうか??