オペレーティングシステム2

情報工学科 3年生対象 専門科目
システムプログラミング
第2回
UNIX・Linuxの基礎
担当:青木義満
[email protected]
UNIXの誕生
• UNIX
– 電気通信分野の巨人AT&T ベル研究所で
1970年代に開発。
– 現在,PCワークステーション,マルチプロ
セッササーバー等でマルチタスク/マルチ
ユーザーのOSとして広く利用
Linuxの誕生
• Linux
– UNIXに触発され,UNIXライクなカーネルを自
由に配布できる形で実装。
– Finland, ヘルシンキ大学の大学院生,Linus
Torvalds(ライナス・トーヴァルド氏)開発,
1991年
– 小規模なUNIXシステムのMINIX(Andrew
Tanenbaum氏)を元に開発,インターネット上
の多くのUNIXプログラマも協力し,発展
Linuxの特徴
• GPLというライセンス体系に基づいて、誰でも自
由に改変・再配布することが可能
• 他のOSに比べ、低い性能のコンピュータでも軽
快に動作
• ネットワーク機能やセキュリティーに優れ、安定
• 必要な機能だけを選んでOSを再構築可能
• システムの構築・運用に必要なソフトウェア群(コ
マンド、インストーラ、ユーティリティ)とともに配布。
カーネルとこれらのソフトウェアをまとめた配布
パッケージをディストリビューション(distribution)と
いう
UNIX・Linuxの哲学
• シンプル
– 「Keep It Simple, Stupid」, KISSの精神
• 目的の明確化
– 1つのプログラムに1つの作業(目的を絞り
込む)
• 再利用可能な要素
– アプリケーションのコアとなる部分をライブ
ラリ(関数群)として利用可能とする
UNIX・Linuxの哲学
• フィルタ
– 入力を目的に応じて変換して出力する機能
• オープンなファイル形式
– 設定ファイル,データファイルにASCIIテキスト
ファイル
• オープンソース,copyleft の精神
– Free Softwareの思想
– GPL(GNU General Public License)
Copyright と Copyleft
• 使用許諾契約書
– 通常の商用ソフトウェアは,ソフトウェアの使用に
関しての制限を設ける
• Copyleft
– フリーソフトウェアの使用に関して他者が制限を
設けることを禁じる
GPLに従って配布されているソフトウェアの例
gcc: Cコンパイラ
emacs: テキストディタ
UNIX/Linuxプログラミングへの誘い
• C言語プログラミング (復習も兼ねて)
– コンパイラとインタプリタ
– Cコンパイラ(gcc)の使い方
– Cコンパイラの処理の流れ(詳細)
– 静的リンクと動的リンク
コンパイラとインタプリタ
• 言語プロセッサ(言語処理系)
– ソースファイルを機械語のプログラムに変換
– 変換前のプログラム:ソース(原始)プログラム
– 変換後のプログラム:オブジェクト(目的)プログラム
• 2方式の言語プロセッサ
– 翻訳ソフトウェア(コンパイラ)
– 解釈ソフトウェア(インタプリタ)
翻訳ソフトウェア(コンパイラ)
• ソースプログラム全体を一括翻訳
• オブジェクトプログラムを生成
• コンパイラ
– C,Fortran,COBOLなどの高級言語に対する翻訳ソフト
ウェア
• アセンブラ
– アセンブリ言語に対する翻訳ソフトウェア
ソースプログラム
翻訳ソフトウェア
一括入力
C,Fotran,COBOL
アセンブリ言語
オブジェクト
プログラム
コンパイラ
アセンブラ
機械語
アセンブリ言語
【解読】
【実行】
実行
結果
解釈ソフトウェア(インタプリタ)
• ソースプログラムの一文ずつを解析して実行
→ インタプリタ
• BASIC,Java Script, Perl 等のスクリプト言語
ソースプログラム
BASIC,Perl,
Java Script, Ruby
解釈ソフトウェア
インタプリタ
【解読・実行】
実行
結果
コンパイラの構成
字句解析
構文解析
(パーザ)
コードの最適化
(オプティマイザ)
オブジェクト
コード生成
コンパイル方式 vs インタプリタ方式
• 実行速度
– コンパイル方式 >> インタプリタ方式
• コンパイル方式:機械語を即実行
• インタプリタ方式:一文ずつ解釈して実行
• 約倍~数十倍コンパイル方式の方が高速
• 実行の手間
– コンパイル方式 < インタプリタ方式
• コンパイル方式:修正後,要コンパイル
• インタプリタ方式:修正後,直ちに実行可能
インタプリタ方式の普及
1. CPU速度の向上
•
•
例)インタプリタ50秒,コンパイラ1秒の処理
CPU100倍高速化
→ インタプリタ0.5秒,コンパイラ0.01秒
2. 移植性の向上
•
•
コンパイル方式:機械語に変換(CPU依存)
インタプリタ方式:同一のソースが全てのコン
ピュータで動かせる
Cコンパイラの使い方
• GNUプロジェクトのgcc(GNU C Compiler)が有名
(フリーソフト,ダウンロードしてインストール可能)
$ gcc option filename
Optionの例
-o
ファイル名を指定して実行ファイルを生成
-c
リンケージエディタ(ld)を実行せずに結果を
xxxx.o(オブジェクトファイル)を生成
-lx
リンケージエディタ(ld)においてライブラリファイルlibx.a
を検索。libc.aはdefaultでリンク。libm.aは算術演算
ライブラリで,-lmで指定。
filenameの種類
xxxx.c
xxxx.s
C言語ソースファイル
アセンブリ言語ソースファイル
xxxx.i
xxxx.o
プリプロセッサにかけられたC言語ソースファイル
オブジェクトファイル(機械語)
cppコマンド
#で始まる行が解釈・展開される
#includeで指定されたヘッダファイルが取り込まれる
cpp, cc1, as, ldコマンドの実行を制御
オプションやファイル名の拡張子により
コマンドを起動
cc1コマンド
字句・構文解析,最適化→アセンブリ言語コード生成
asコマンド
オブジェクトファイル生成
アドレス未決定
ldコマンド
複数のオブジェクトファイルを集め,
実行形式ファイルを生成
ファイル名指定しないと”a.out”を生成
標準プログラム
•
システム,アプリケーションプログラムの置き場所
1. システムが提供する汎用プログラム群
•
/usr/bin
2. 特定のホストコンピュータを対象として管理者が追加し
たプログラム群
•
/usr/local/bin
1、2を明確に分けることで,システムのアップグレードなど
保守を容易にしている
ヘッダーファイル
• ヘッダーファイル
– 定数の定義,システムとライブラリ関数の呼び出
し宣言等が収められたファイル
• Cの場合
– stdio.h (標準入出力ヘッダー)
– stdlib.h (標準ライブラリヘッダー)
– math.h (算術関数用ヘッダー)
– /usr/include, その下のサブディレクトリ
• システム関数用ヘッダー
– /usr/include/sys など
ライブラリ
•
ライブラリ
– 再利用を目的として作成されたコンパイル済み関数群(例:stdio, mathライブラリ等)
•
置き場所
– /lib
– /usr/lib
•
gccはデフォルトでは標準Cライブラリしか検索しないため,追加したいライブラリがあ
る場合には明示的に指定する
算術ライブラリ使用例: gcc program.c -o program /usr/lib/libm.a
もしくは
gcc program.c -o program -lm (libm.aの短縮形)
•
静的ライブラリ(アーカイブ)
– すぐに使える状態でまとめられたオブジェクトファイルの集合体(拡張子***.a)
• 例: /usr/lib/libc.a(標準Cライブラリ), /usr/lib/libm.a(算術ライブラリ) 等
– ライブラリに格納されているプログラムで使う場合,
• 関数を宣言しているヘッダーファイルをインクルード
• プログラムコードとライブラリがコンパイラとリンカによって結合され,
1つの実行可能プログラムを生成
•
その他,動的ライブラリ(共有ライブラリ) → 各自静的ライブラリとの違い調べる
実際にgccコマンドを使用
• 1つのソースファイルから
– オブジェクトファイル(ーcオプション)
– 実行ファイル(-oオプション)
を生成
• 複数のソースファイルから,
– 複数のオブジェクトファイル(ーcオプション)を生成
– 上記オブジェクトファイルから静的ライブラリを生成
– 1つの実行ファイル(-oオプション)を生成
分割コンパイル
という
ライブラリを用いたプログラム開発手順
• ライブラリ化したい関数を記述したソースファ
イルを作成。(func1.c, func2.c)
• 関数のプロトタイプ宣言を記述したヘッダー
ファイルを作成。
• main関数のみのソースファイル main.cを作
成
具体的手順
1.
2つの関数を含む小さなライブラリの作成
•
•
func1.c, func2.c
オブジェクトファイル生成
•
gcc -c func1.c func2.c
自作ライブラリ用のヘッダファイルの作成
2.
•
ライブラリに含まれる関数群のプロトタイプ宣言
ライブラリを使用したメインプログラムの作成
3.
•
•
自作ヘッダーファイルのインクルード
main関数の作成(ライブラリ関数使用), コンパイル
•
gcc -c program.c
・ 作成済みのオブジェクトファイルとリンク, 実行ファイル生成
・ gcc -o program program.o func1.o func2.o
ライブラリ(アーカイブ)作成手順
• 複数のオブジェクトファイルを結合させ,ライ
ブラリ(アーカイブ)を作成
• 例
– func1.o, func2.o から lib.a という名のライブラ
リを作成(アーカイブコマンド:ar を使用)
• ar crv lib.a func1.o func2.o
– ライブラリの使用
• gcc -o program program.o lib.a
– ライブラリや実行可能プログラムに含まれる関数
の調べるコマンド(nm)
強力な開発支援ツール “make”
• コンパイルを要するソースファイルの数が多くなった場合,手間がかかる
• 1つのヘッダファイルを複数のソースファイルで使用している場合,ヘッダ
ファイルの修正→ 関連する全てのソースファイルの際コンパイル
• そこで・・・・
– “make” ユーティリティ
•
•
•
•
変更によって影響を受けるファイルを確実に再コンパイル
プロジェクト構成ファイル群のバージョン管理
強力なプロジェクト管理ツール
makefile により,アプリケーションを構築する方法,各種設定を行う
非常に便利!!
makefile の構文
• ファイル間の依存関係とファイル生成ルール
を定義
• 依存関係の例
ソースファイル: main.c, 2.c, 3.c
ヘッダファイル : a.h, b.h, c.h
myapp : main.o 2.o 3.o
main.o : main.c a.h
2.o : 2.c a.h b.h
3.o : 3.c b.h c.h
実行ファイルmyappがmain.o, 2.o, 3.oに依存
1つのファイルを更新
→ 関連するファイルを自動的に再コンパイル
makefile ルールの説明
• ターゲットの作成方法を記述したルール
• makeコマンドが2.oを再コンパイル
– gcc -c 2.c
• タブにより,具体的なファイル生成ルールを記述。
• makefile の一例
TAB
myapp : main.o 2.o 3.o
gcc -o myapp main.o 2.o 3.o
main.o : main.c a.h
gcc -c main.c
2.o : 2.c a.h b.h
gcc -c 2.c
3.o : 3.c b.h c.h
gcc -c 3.c
実践 makefileとmakeコマンド
• 用意するファイル
– ソースファイル:main.c, a.c, b.c
– インクルードファイル:a.h, b.h
– makefile: Makefile1
• makeコマンド
– make -f Makefile1
(-f オプション:メイクファイル名を指定)
• ソースファイル,ヘッダファイルを変更し,その際の
makeコマンドの実行結果を確認する
実践演習
ソート関数群のライブラリ
1.
–
sort_func.c, sort_func.h
•
•
整数型配列を受け取り、ソートを行う関数群の記述されたファイル
ソートを行う関数は、最低2つの手法を用意すること(バブルソート、単純選択法、クイックソート、等々)
サーチ関数群のライブラリ
2.
–
search_func.c, search_func.h
•
•
整数型配列を受け取り、キーボードから入力された値を配列中からサーチする関数の記述されたファイル
(線形探索、二分探索、等々)
サーチを行う関数は、1種類の実装でも構わない。
メイン関数ソースファイル
3.
–
main.c
3のmain.cでは適当なサイズの整数型配列を用意し,ソート関数群,
サーチ関数群を使用してデータの並び替え(昇順、降順選択可能と
すること)と、値の探索を行うこと。
実行ファイル生成にはメイクファイルを作成し,makeコマンドを使用すること!
課題の提出方法
□下記のファイルをメール添付にて青木まで送信
・sort_func.c
・search_func.c
・main.c
・Makefile
□提出先
・青木:[email protected]
□メール題目:system1 学籍番号 苗字
例)system1 L05001 aoki
□提出期限
・10月8日(火)19時まで
コマンドの詳細を調べる
• man (マニュアル表示コマンド)を活用
• 例:「ls」,「gcc」コマンドについて調べたい
– man ls
– man gcc
• コマンドの処理内容,様々なオプションの解
説
• わからないことはこれで調べる!(Englishだ
けど・・・) → http://www.alc.co.jp など利用
参考資料
コンパイルオプション一覧