320 likes | 560 Views
情報工学科 3 年生対象 専門科目. システムプログラミング. 第2回 UNIX ・ Linux の基礎(1). 担当:青木義満. UNIX の誕生. UNIX 電気通信分野の巨人 AT & T ベル研究所で 1970 年代に開発。 現在, PC ワークステーション,マルチプロセッササーバー等でマルチタスク/マルチユーザーのOSとして広く利用. Linux の誕生. Linux UNIX に触発され, UNIX ライクなカーネルを自由に配布できる形で実装。
E N D
情報工学科 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の哲学 • フィルタ • 入力を目的に応じて変換して出力する機能 • オープンなファイル形式 • 設定ファイル,データファイルにASCIIテキストファイル • オープンソース,copyleft の精神 • Free Softwareの思想 • GPL(GNU General Public License)
Copyrightと Copyleft • 使用許諾契約書 • 通常の商用ソフトウェアは,ソフトウェアの使用に関しての制限を設ける • Copyleft • フリーソフトウェアの使用に関して他者が制限を設けることを禁じる GPLに従って配布されているソフトウェアの例 gcc: Cコンパイラ emacs: テキストディタ
UNIX/Linuxプログラミングへの誘い • C言語プログラミング (復習も兼ねて) • コンパイラとインタプリタ • Cコンパイラ(gcc)の使い方 • Cコンパイラの処理の流れ(詳細) • 静的リンクと動的リンク
コンパイラとインタプリタ • 言語プロセッサ(言語処理系) • ソースファイルを機械語のプログラムに変換 • 変換前のプログラム:ソース(原始)プログラム • 変換後のプログラム:オブジェクト(目的)プログラム • 2方式の言語プロセッサ • 翻訳ソフトウェア(コンパイラ) • 解釈ソフトウェア(インタプリタ)
オブジェクト プログラム ソースプログラム 翻訳ソフトウェア 一括入力 実行 結果 C,Fotran,COBOL アセンブリ言語 コンパイラ アセンブラ 機械語 アセンブリ言語 【実行】 【解読】 翻訳ソフトウェア(コンパイラ) • ソースプログラム全体を一括翻訳 • オブジェクトプログラムを生成 • コンパイラ • C,Fortran,COBOLなどの高級言語に対する翻訳ソフトウェア • アセンブラ • アセンブリ言語に対する翻訳ソフトウェア
解釈ソフトウェア インタプリタ 解釈ソフトウェア(インタプリタ) • ソースプログラムの一文ずつを解析して実行 → インタプリタ • BASIC,Java Script, Perl 等のスクリプト言語 ソースプログラム 実行 結果 BASIC,Perl, Java Script, Ruby 【解読・実行】
コンパイラの構成 字句解析 構文解析 (パーザ) コードの最適化 (オプティマイザ) オブジェクト コード生成
コンパイル方式 vs インタプリタ方式 • 実行速度 • コンパイル方式 >> インタプリタ方式 • コンパイル方式:機械語を即実行 • インタプリタ方式:一文ずつ解釈して実行 • 約倍~数十倍コンパイル方式の方が高速 • 実行の手間 • コンパイル方式 < インタプリタ方式 • コンパイル方式:修正後,要コンパイル • インタプリタ方式:修正後,直ちに実行可能
インタプリタ方式の普及 • CPU速度の向上 • 例)インタプリタ50秒,コンパイラ1秒の処理 • CPU100倍高速化 → インタプリタ0.5秒,コンパイラ0.01秒 • 移植性の向上 • コンパイル方式:機械語に変換(CPU依存) • インタプリタ方式:同一のソースが全てのコンピュータで動かせる
Optionの例 -o ファイル名を指定して実行ファイルを生成 -c リンケージエディタ(ld)を実行せずに結果を xxxx.o(オブジェクトファイル)を生成 -lx リンケージエディタ(ld)においてライブラリファイルlibx.a を検索。libc.aはdefaultでリンク。libm.aは算術演算ライブラリで,-lmで指定。 Cコンパイラの使い方 • GNUプロジェクトのgcc(GNU C Compiler)が有名 (フリーソフト,ダウンロードしてインストール可能) $ gcc option filename filenameの種類 xxxx.c C言語ソースファイル xxxx.i プリプロセッサにかけられたC言語ソースファイル xxxx.s アセンブリ言語ソースファイル xxxx.o オブジェクトファイル(機械語)
cppコマンド #で始まる行が解釈・展開される #includeで指定されたヘッダファイルが取り込まれる cpp, cc1, as, ldコマンドの実行を制御 オプションやファイル名の拡張子により コマンドを起動 cc1コマンド 字句・構文解析,最適化→アセンブリ言語コード生成 asコマンド オブジェクトファイル生成 アドレス未決定 ldコマンド 複数のオブジェクトファイルを集め, 実行形式ファイルを生成 ファイル名指定しないと”a.out”を生成
標準プログラム • システム,アプリケーションプログラムの置き場所 • システムが提供する汎用プログラム群 • /usr/bin • 特定のホストコンピュータを対象として管理者が追加したプログラム群 • /usr/local/bin 1、2を明確に分けることで,システムのアップグレードなど 保守を容易にしている
ヘッダーファイル • ヘッダーファイル • 定数の定義,システムとライブラリ関数の呼び出し宣言等が収められたファイル • 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 の構文 • ファイル間の依存関係とファイル生成ルールを定義 • 依存関係の例 ソースファイル: 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つのファイルを更新 → 関連するファイルを自動的に再コンパイル
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コマンドが2.oを再コンパイル • gcc -c 2.c • タブにより,具体的なファイル生成ルールを記述。 • makefile の一例
実践 makefileと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 ls • man gcc • コマンドの処理内容,様々なオプションの解説 • わからないことはこれで調べる!(Englishだけど・・・) →http://www.alc.co.jpなど利用
参考資料 コンパイルオプション一覧