「プログラミング/共通知識」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
→‎コンパイル: 機械語とOSの関係に誤解があった。
タグ: 2017年版ソースエディター
137 行
 
=== コンパイル ===
ソースコードを全部一気予めに機械語に翻訳してから、機械語のファイルを実行するという方法もあります。プログラムのコードを機械語に変換することを、'''コンパイル'''と言います。コンパイルするためのソフトウェアのことを'''コンパイラ'''といいます。コンパイルが必要な言語をまとめて'''コンパイル型言語'''と言うことがあります。また[[W:実行時コンパイラ|実行時コンパイラ]](JIT; Just-In-Time Compiler)との対比で、[[W:事前コンパイラ|事前コンパイラ]](AOT;)と呼ばれます
 
コンパイル型言語は
* [[C言語]]
* [[C++]]
* [[Fortran]]
* FORTRAN
などがあります
 
コンパイル型言語では、ソースコードが書かれたファイルと、実行ファイルとは、別のファイルです。
コンパイル型言語では、コード入力用に用いるファイルと、実行ファイルとは、別のファイルです。そのためソースコードを変更してもコンパイルしなければ変更が反映されません。コンパイル型言語の実行ファイルは、機械語で書かれています。コンパイル型言語のプログラムの実行では、機械語で書かれた実行ファイルをそのまま実行するので処理が高速です。実行ファイルの言語は、OSやハードウェアそれぞれに合わせた機械語になっています<ref>OSごとに使われるレジスタなどが異なる</ref>。WindowsをターゲットにしたファイルをLinuxにコピーしても動作しない。実行ファイルから元々のソースコードを取り出すこと ('''デコンパイル''') は一般的には厳しいです。機械語にはそのOSに合わせてメモリやCPUがどんな動作をすべきかという指示だけが書かれてあり、けっしてその動作の目的は機械語には書かれていません。機械語に変換された実行ファイルは、配布するプログラムのもともとのコード内容を秘密にしたいときに便利というメリットもあります。プログラムのコードをコンパイルしたファイルを実行ファイルにまとめる前のファイルを'''オブジェクトファイル'''言う。ソースコード→オブジェクトファイル→実行ファイルという形。
そのためソースコードを変更してもコンパイルしなければ変更が反映されません。
コンパイル型言語の実行ファイルは、機械語で書かれています。
コンパイル型言語のプログラムの実行では、機械語で書かれた実行ファイルをそのまま実行するので処理が高速です。
実行ファイルは、それぞれのハードウェアに合わせた機械語になっています<ref>異なるハードウェアの実行ファイルは、通常は仮想機械環境を使わない限り実行できません。</ref>。
Windowsをターゲットにした実行ファイルをLinuxにコピーしても実行できません<ref>同じハードウェアでも異なったOSで相互に実行ファイルが実行できない理由は、いくつかありますが、実行ファイルの形式の違いとOSの提供するシステムコールの違いが主なもので、この2つを克服した[[W:Wine|Wine]](LinuxでWindowsの実行ファイルを実行可能にする環境)や[[W:Windows Subsystem for Linux|WSL]](WindowsでLinuxの実行ファイルを実行可能にする環境)では異なったOSの実行ファイルの実行を実現しています。</ref>。
実行ファイルから元々のソースコードを取り出すこと ('''デコンパイル''') は一般に困難です。
機械語にはそのハードウェアたいする命令だけが書かれており、ソースコードは機械語には書かれていません。
機械語に変換された実行ファイルは、配布するプログラムのソースコードを秘密にすることが可能というメリットもあります。
プログラムのコードをコンパイルしたファイルを実行ファイルにまとめる前のファイルを'''オブジェクトファイル'''言います。
ソースコード → オブジェクトファイル → 実行ファイルという流れになります。
{{See also|w:機械語}}
 
=== 違いは? ===