コンパイラと共有ライブラリ
Completion requirements
共有ライブラリ
コンパイラとインタプリタ
インタプリタ
- インタプリタは同時通訳.
- インタプリタがプログラムを一行ずつ実行.
- 文法エラーがあっても,その手前までは実行する (デバッグが簡単)
- 遅い.インタプリタがないと動かない.
- インタプリタがあれば,機種に依存することなく実行できる.
コンパイラ
- コンパイラ は翻訳家
- プログラムをマシン語コードに変換する.
- 早い.コンパイラが無くても,単独で実行可能.
- 機種(CPU)が違うと動かない(マシン語だから)
- 一個でも文法エラーがあると,全体の翻訳は失敗する.
- デバッグが難しい.
Java
- Java はコンパイラとインタプリタの中間
- Javac はプログラムを中間コードに変換 (コンパイラに似ている)
- 中間コードをJavaバーチャルマシンが実行する.(インタプリタに似ている)
- Javaバーチャルマシン があれば,機種に依存することなく実行できる.(インタプリタに似ている)
コンパイラとリンカ
- コンパイラ はソースコードを翻訳(コンパイル)し,オブジェクトファイルを生成する.
- リンカ は複数のオブジェクトファイルとライブラリを結合(リンク)し,実行形式のファイルを生成する.
- Java はコンパイラとインタプリタの中間
ソースファイル → オブジェクトファイル → 実行形式ファイル(ロードモジュール) ↑コンパイラ ↑リンカ
エラー
- エンピカ は 食べなさい (文法エラー.シンタックスエラー.コンパイルエラー)
- エンピカ を食べなさい (結合エラー.リンクエラー.エンピカって何?)
- エンピツを食べなさい (実行エラー.鉛筆は食べられません)
ライブラリ
- 予め用意している命令や変数 (鉛筆,食べなさい)
- 実行形式のファイルにじかに埋め込む場合 → 静的リンク,スタティックリンク
- 単体で動作可能.
- ファイルサイズが大きくなる.
- 使用メモリが増える.
- libXXX.a
- 実行時にライブラリを結合する場合 → 動的リンク,ダイナミックリンク
- Unix/Linuxでは共有ライブラリ,Windows では DLLと呼ぶ
- ファイルサイズが小さくてすむ
- 使用メモリが少なくなる
- プログラムの変更が簡単
- 実行時に必要なライブラリが無いと動かない
- バージョンが少しでも違うと動かない (Windows のDLL地獄)
- Unix/Linux → libXXX.so Windows → XXX.dll
- Unix/Linux では 共有ライブラリのデータベースを作成する
- データベースの内容のファイル /etc/ld.so.conf
- データベースファイル /etc/ld.so.cache
- データベースを更新するコマンド ldconfig
- 共有ライブラリの場所は LD_LIBRARY_PATH でも指定可能
Last modified: Friday, 18 April 2014, 5:15 PM