情報工学科 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 など利用 参考資料 コンパイルオプション一覧
© Copyright 2024 ExpyDoc