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

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
→‎コマンドラインと慣れ親しむ: macOS 10.15 Catalina(2019) からディフォルログインシェルが、それまでの bash から zsh に変わった。
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
→‎コンパイル: 言語処理系の主要な実装がコンパイラなプログラミング言語を'''コンパイル型言語'''と呼びます。;コンパイル型言語の一覧を歴史の古い順に、Java追加
タグ: 2017年版ソースエディター
139 行
 
=== コンパイル ===
ソースコードを予めに機械語(ネイティブコード)に翻訳し、機械語のファイルを実行するという方法もあります。
プログラムのソースコードコードを機械語に変換することを、'''[[W:コンパイル|コンパイル]]'''と言います。
コンパイルするためのソフトウェアのことを'''[[W:コンパイラ|コンパイラ]]'''といいます。
言語処理系の主要な実装がコンパイルが必要プログラミング言語をまとめて'''[[W:コンパイル型言語|コンパイル型言語]]'''と言うことがあり呼びます。
また[[W:実行時コンパイラ|実行時コンパイラ]](JIT; Just-In-Time Compiler)との対比で区別するため、[[W:事前コンパイラ|事前コンパイラ]](AOT;Ahead-Of-Time)と呼ばれます。
 
コンパイル型言語は
* [[Fortran]]
* [[COBOL]]
* [[C言語]]
* [[C++]]
* [[FortranJava]]
などがあります。
 
コンパイル型言語では、ソースコードが書かれたファイルと、実行ファイルとは、別のファイルです。
そのためソースコードを変更してもコンパイルしなければ変更が反映されません。
コンパイル型言語の実行ファイルは、機械語で書かれています<ref>UCSD-PascalのP-Codeや、JavaのByte-codeの様な中間コードを生成し、中間コード・インタープリタが実行する言語処理系もあります。</ref>
コンパイル型言語のプログラムの実行では、機械語で書かれた実行ファイルをそのまま実行するので処理が高速です。
実行ファイルは、それぞれのハードウェアやオペレーティング・システムに合わせた機械語形式になっています<ref>異なるハードウェアの実行ファイルは、通常は仮想機械環境を使わない限り実行できません。</ref>。
Windowsをターゲットにした実行ファイルをGNU/Linuxにコピーしても実行できません<ref>同じハードウェアでも異なったOSで相互に実行ファイルが実行できない理由は、いくつかありますが、実行ファイルの形式の違いとOSの提供するシステムコールの違いが主なもので、この2つを克服した[[W:Wine|Wine]](GNU/LinuxでWindowsの実行ファイルを実行可能にする環境)や[[W:Windows Subsystem for GNU/Linux|WSL]](WindowsでGNU/Linuxの実行ファイルを実行可能にする環境)では異なったOSの実行ファイルの実行を実現しています。</ref>。
実行ファイルから元々のソースコードを取り出すこと ('''[[W:逆コンパイラ|デコンパイル]]''') は一般に困難です。
機械語にはそのハードウェアたいする命令だけが書かれており、ソースコードは機械語には書かれていません<ref>ただし、デバッグや動的リンクの為のシンボルは実行ファイルに含まれている場合もあり、デコンパイルの難易度を下げます。</ref>
機械語に変換された実行ファイルは、配布するプログラムのソースコードを秘密にすることが可能というメリットもになる特徴があります。
プログラムのコードをコンパイルしたファイルを実行ファイルにまとめる前のファイルを'''オブジェクトファイル'''言います。
ソースコード → 1つの実行ファイルが、複数のオブジェクトファイル → 実行ファイルという流から構成さになることがあります。
     (コンパイル)       (リンク)
ソースコード1 ⇒ オブジェクトファイル1 ⇒ 実行ファイル
ソースコード2 ⇒ オブジェクトファイル2 ↑
        :            ↑
ソースコードn ⇒ オブジェクトファイルn ↑
という流れになります。
{{See also|w:機械語}}