プログラマーはコードがどのように走ったのか知りたいと思っています

3581 ワード

プログラマはJava言語を使用して累積和を実現する方法で、ファイルをSample.javaと命名します.
public class Sample {
    public static void main(String[] args) {
        System.out.println(sum(10));
    }

    private static int sum(int n) {
        int res = 0;
        for (int i = 1; i < n; i++) {
            res += i;
        }
        return res;
    }
}

プログラマーは直接クリックして実行したくなくて、javacを使ってSample.javaファイルをコンパイルして、Sample.javaの所在するディレクトリの下で見ることができて、Sample.classファイルを生成しました.
では、アセンブリ言語なら、具体的な手順はどうでしょうか.
しかし、アセンブリ言語とは何ですか.アセンブリ言語は実際にはハードウェアと密接に関係しており、つまり実際のハードウェア環境から離れられず、プラットフォームをまたいで実行できない.アセンブリ言語はCPUの動作をアシストで表すためである.CPUの構造が異なり、アセンブリ言語呼び出しも異なる場合があります.
では、補助記号はどういう意味ですか.アセンブリ言語の各行は、CPUに対する命令を表し、その構文構造は操作コード+操作数である.もちろんretのようなオペレーティングコードのみが存在し、関数に処理を返す呼び出し元を表す.
操作コードはCPUに対する命令であり、動詞であり、その操作コードはデータであり、CPUに格納されたレジスタであり、目的語である.例えばmov a b;bの値をaに割り当てることを表す.add a b; aとbの値を加算し、結果をaに付与することを表す.
CPUはこれらの補助記号を直接理解できるのではないでしょうか.もちろんできません.
計算上のすべてのアドレスとデータは0と1で構成されていることを知っています.アセンブリ言語のアシストをテキストファイルに書き、コンパイルするときにローカルコンピュータのアプリケーションを呼び出します.masm.exeというコンパイラです.
テキストファイルをターゲットファイルにコンパイルすると、このときのターゲットファイルがマシン言語になり、ローカルのCPUに直接理解されるようになります.このターゲットファイルを他のコンピュータの異なるシリーズのCPUで理解すれば、読めないかもしれません.例えば、火星文が読めません.
このターゲットファイルはローカルCPUで直接解析して実行できますか?いいですが、直接間違えられます.
このターゲットファイルが1つしかないので、このターゲットファイルとシステムのライブラリファイルがどのように関係しているかはまだ分かりません.したがって、関連するターゲットファイルを特定のプラットフォームで実行可能な実行可能ファイルに組み合わせるには、次の図にリンクが必要です.
ライブラリファイル名の接尾辞も.Oまたは.OBJです.ここで,.ASM.OBJ,.EXEはdosまたはwindowsシステム下のファイル,.S,*.OはLinuxカーネルを持つシステム下のファイル接尾辞名であるが,Linuxカーネルはファイル接尾辞名でこれが何のファイルであるかを判断するのではなく,一般的にファイル属性で判断され,実行可能ファイルはLinuxカーネルに接尾辞名がなくlsコマンドでこのファイルが緑色であることが実行可能ファイルであることを示す.
さて、C/C++言語であれば、そのコンパイルプロセスはどのようになるのでしょうか.
前処理は、(include)を含むファイルを元のファイルに挿入し、マクロ定義を展開し、条件コンパイルコマンドに従って使用するコードを選択し、最後にこれらのコードを「.i」ファイルに出力してさらなる処理を待つ.
変換はC/C++コード(例えば上の「.i」ファイル)をアセンブリコードに「翻訳」することである.
コンパイルは、アシスト記号で表されるアセンブリ言語を一定のフォーマットに合致する機械言語に翻訳する.
リンクは、アセンブリで生成されたOBJファイル、システムライブラリのOBJファイル、ライブラリファイルをリンクし、最終的に特定のプラットフォームで実行可能な実行可能プログラムを生成します.
さて、Javaプログラムを忘れたと書いてある本題です.
Javaとは、プログラミング言語としてのJavaと、プログラム実行環境としてのJavaの2つの意味があります.これがJavaの特殊な場所で、特殊はJavaにJava仮想マシンがあります.
Javaプログラムもコンパイルする必要がありますが、マシン言語ではなくバイトコードファイルにコンパイルし、Java仮想マシンで解釈でバイトコードを実行します.
コンパイルはJavaソースコードをJava仮想マシンが実行できるバイトコードファイルに「翻訳」し、ハードディスクに保存する.
ロードとは、メモリに生成されたバイトコードファイルのコピーをJava仮想マシンにロードすることである.
Java仮想マシンにロードされたバイトコードの実行方法は、インスタントコンパイラとバイトコード解釈器の2つで、以下の図に示されています.
インスタントコンパイルと解釈実行の違いは次のとおりです.
    :                     。

    :      ,                。

ソフトウェアとは、Java仮想マシンがシステムにとって、ある高度な言語で作成されたアプリケーションである.
もちろん、Java仮想マシンはJavaプログラムにとって実行環境です.比較分析では,Javaソースコードをアセンブリ言語ソースコード,バイトコードをローカルCPUで実行可能なマシン言語,Java仮想マシンをローカルCPUとして想像できる.
だからJavaはプラットフォームにまたがっているのです.Java仮想マシンはアプリケーションだからです.しかし、異なるシステムでは、アプリケーションも異なるので、システムが異なり、Java仮想マシンも異なるが、バイトコードファイルは変わらず、他の異なるシステム上の仮想マシン解析に直接実行することができる.
Java仮想マシンはバイトコードを実行し、バイトコードはJavaにとって16進数である.ローカルCPUはマシンコード(マシン言語)を実行し,マシンコードはシステムにとってバイナリである.ただし、バイトコードファイルをローカルに置くのは0と1で構成されていますが、ローカルシステム解析では実行できません.Java仮想マシンの即時コンパイルや解釈が必要です.
「百聞は一見にしかず」、メモ帳で開くとどうなるか見てみましょう.
これを開くのは文字化けしているのではないでしょうか.これはclassを接尾辞名とするバイトコードファイルがJavaに保存されているのは16進数なので、16進数を見てどう思いますか?
私たちはSublime Text 3でバイトコードファイルを開くことができますが、開く前にSublime Text 3はHexViewerプラグインをインストールする必要があります.16進数を見ることができます.具体的なインストールプロセスはネット上で検索することができます.開くと、次の図のようになります.
すべての数字が16進数であることがわかります.次にJava仮想マシンにロードされます.具体的には、インスタントコンパイルで実行するか、解釈で実行するか、大きなプロジェクトでインスタントコンパイルと解釈で実行するかは、Java仮想マシンが異なるシーンで異なる最適化手段を使用しているため、共同で協力することができます.本文の友达が好きで、微信は「アルゴリズムに遗策がない」の公众号を検索して、もっとすばらしいアルゴリズムのアニメーションの文章を见ます