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