情報工学科 3年生対象 専門科目 システムプログラミング 第1回 導入 第2回 Linux、分割コンパイル 情報工学科 篠埜 功.

Slides:



Advertisements
Similar presentations
システムプログラミング 情報工学科 篠埜 功 情報工学科 3 年生対象 専門科目 第5回 シェルスクリプトの続 き レポート課題 main 関数の引数 usage メッセージ.
Advertisements

プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
プログラミングとは Q.プログラムとは何か? A.コンピュータを制御するための,コンピュータに対する命令(指示)の集まり.
C言語システムプログラミング クラス分け 1の人:紫合クラス(302教室) 学籍番号を3で割った余りが、 0の人:冬爪クラス(208教室)
シェル シェルスクリプト 最低限vi 山下 達也 (北大理・宇宙理学専攻) INEX 第4回/最低限 UNIX(Linux) その3
2014年度 プログラミングⅡ ~ Cプログラミングやってみよう ~.
Unix生活 Vol.1
シェル シェルスクリプト 最低限vi 山下 達也 (北大理・宇宙理学専攻) INEX 第4回/最低限 UNIX(Linux) その3
2015年度 プログラミングⅡ ~ Cプログラミングやってみよう ~.
1.コンピュータと情報処理 p.20 第1章第1節 3.ソフトウェア ソフトウェア 基本ソフトウェア
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第2回 UNIX・Linuxの基礎 担当:青木義満
Android と iPhone (仮題) 情報社会とコンピュータ 第13回
Java I 第2回 (4/18)
第3回 ファイルとフォルダ 伊藤 高廣 計算機リテラシーM 第3回 ファイルとフォルダ 伊藤 高廣
2013年度 プログラミングⅡ ~ Cプログラミングやってみよう ~.
システムプログラミング 第6回、7回 main関数の引数 usageメッセージ システムコールのエラーメッセージ ファイル
情報工学基礎(改訂版) 岡崎裕之.
山田 由貴子 (北大理・地球惑星科学専攻) 2004年10月29日
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
プログラミング入門2 第1回 導入 情報工学科 篠埜 功.
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
プログラミングとは Q.プログラムとは何か? A.コンピュータを制御するための,コンピュータに対する命令(指示)の集まり.
応用情報処理V 第1回 プログラミングとは何か 2004年9月27日.
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第1回 イントロダクション 担当:青木義満
情報工学科 3年生対象 専門科目 システムプログラミング 第2回 UNIX・Linuxの基礎(1) 担当:青木義満.
App. A アセンブラ、リンカ、 SPIMシミュレータ
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
応用情報処理V 第1回 プログラミングとは何か 2003年9月29日.
情報工学科 3年生対象 専門科目 システムプログラミング 第1回 導入 第2回 Linux、分割コンパイル 情報工学科 篠埜 功.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
精密工学科プログラミング基礎 第9回資料 (12/11 実施)
スクリプト言語を用いたPHITSの連続実行
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
計算物理学基礎 第1回 UNIXの基礎 C言語の基本.
型付きアセンブリ言語を用いた安全なカーネル拡張
ネットワークプログラミング 中村 修.
学籍番号順に着席のこと 001~056までは741教室へ 057~110までは743教室へ
プログラミング言語入門 手続き型言語としてのJava
OSの仕組みとその機能 1E16M001-1 秋田 梨紗 1E16M010-2 梅山 桃香 1E16M013-3 大津 智紗子
システムプログラミング 第3回、第4回、第5回、第6回 情報工学科 篠埜 功 makeコマンド 動的リンクライブラリ シェルスクリプト
実行時情報に基づく OSカーネルのコンフィグ最小化
パソコンのしくみ ハードウェア OS(Operating System) アプリケーション NEC DOS
JXTA Shell (1) P2P特論 (ソフトウェア特論) 第4回 /
地域情報学 C言語プログラミング 第1回 導入、変数、型変換、printf関数 2016年11月11日
精密工学科プログラミング基礎Ⅱ 第4回資料 今回の授業で習得してほしいこと: 文字列の扱い ファイル入出力の方法 コマンドライン引数の使い方
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語.
情報工学科 3年生対象 専門科目 システムプログラミング 第4回 シェルスクリプト 情報工学科 篠埜 功.
Linux の世界に 触れてみよう! 情報実験 第 3 回 (2005/10/21)
プログラミング演習I 2003年4月30日(第3回) 木村巌.
コンパイラ 2012年10月1日
プログラミング入門2 第13回、14回 総合演習 情報工学科 篠埜 功.
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
システムプログラミング 第6回 システムコールのエラーメッセージ ファイルシステム 情報工学科 篠埜 功.
vc-1. Visual Studio C++ の基本操作 (Visual Studio C++ の実用知識を学ぶシリーズ)
プログラミング基礎a 第9回 Java言語による図形処理入門(1) Javaアプレット入門
ネットワーク・プログラミング Linuxシステムとソフトウェア開発.
Make の使い方.
Visual Studio 2013 の起動と プロジェクトの新規作成 (C プログラミング演習,Visual Studio 2019 対応) 金子邦彦.
情報工学科 3年生対象 専門科目 システムプログラミング 第3回 makeコマンド 動的リンクライブラリ 情報工学科 篠埜 功.
情報工学科 3年生対象 専門科目 システムプログラミング 第3回 makeコマンド 動的リンクライブラリ 情報工学科 篠埜 功.
Cp-1. Microsoft Visual Studio 2019 C++ の使い方 (C プログラミング演習,Visual Studio 2019 対応) 金子邦彦.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング演習II 2003年11月19日(第6回) 木村巌.
1.2 言語処理の諸観点 (1)言語処理の利用分野
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
Presentation transcript:

情報工学科 3年生対象 専門科目 システムプログラミング 第1回 導入 第2回 Linux、分割コンパイル 情報工学科 篠埜 功

講義計画 OSの授業で学んだことをプログラミングを通して体験することを目的とする。 スクリプト言語を用いたプログラミング システムコールを使ったプログラム作成 ファイル操作 プロセス シグナル プロセス間通信 簡易なweb serverを作成する

参考書 C言語によるUNIXシステムプログラミング入門,河野清尊 著,オーム社 ¥2940(税込)

成績評価 レポート課題(数回、4割程度) 期末試験(6割程度) 特別な理由が無い限り,追試などは行わない

連絡先 篠埜 功 居室: 豊洲校舎 14階 14K32 E-mail: sasano@sic.shibaura-it.ac.jp 篠埜 功 居室: 豊洲校舎 14階 14K32 E-mail: sasano@sic.shibaura-it.ac.jp 講義用ページ: http://www.sic.shibaura-it.ac.jp/~sasano/lecture/lecture.html    ここへスライドのファイルを置く。授業の日程もここに記述する。

Operating Systemとは コンピュータのハードウェアを人間にとって使い易い形にして提供するプログラム ハードウェアの抽象化 ハードウェア資源の管理 複数のプログラムが同時に要求を出した場合などに対応 ハードウェア資源を効率的に利用 複数のプログラムが同時並行で動いているとき

講義の前提 オペレーティングシステムの講義内容の基本的な部分を理解している C言語によるプログラミングに慣れている 関連科目 オペレーティングシステム,プログラミング入門1,2

本講義の概要 OSについてLinuxを例として体験的に学習 Linux上で、シェル、C言語によるシステムプログラミング Windows ソースコードが公開されている ソースコードが非公開 ※情報工学科ではLinuxなどのUnix系OSに触れておくのは必須。

学習目標 オペレーティングシステムが提供するシステムコールを用いるプログラムが書けるようになる。 ネットワーク、ファイル操作等 ・プログラミングの幅(自由度)を広げることができる ・よりOSに近いレベルのプログラム開発を通して  OSの機能に対する理解度を深めることができる

システムコール システムコール カーネル:Linuxの核をなす部分。ハードウェア、プロセスの管理をする。 カーネル(kernel) ソフトウェア 我々が書く通常の プログラム システムコール カーネル:Linuxの核をなす部分。ハードウェア、プロセスの管理をする。 プログラムからシステムコールを呼び出すことにより、Linux kernelが管理しているハードウェア(ハードディスク、ネットワーク等)にアクセスしたり、他のプロセスと通信を行ったりすることができる。通常は直接システムコールは呼ばず、ライブラリ関数を呼び出す。(ライブラリ関数の中でシステムコールが呼ばれる。)

システムコールの例 User program Data File ・・・・・・・・・・・ ・・・・・・・・・・・ fscanf() read

シェル ユーザーとUNIXシステムの間のインタフェースとして機能するプログラム コマンド入力を受けつけ、解釈し、実行する。 csh, bash, tcsh等がある。 [課題] fingerコマンドで各自の使用しているシェルを確認せよ。 $ finger sasano のように、自分のユーザ名を引数として与えればよい。

シェルスクリプト ファイルに保存しておいてプログラムのように実行することができる(シェルスクリプト) シェルでは変数や繰り返し機能を用いることができる。 少し複雑な処理はC言語などでプログラムを書かなくても、シェルの機能で簡単に行うことができる。 ファイルに保存しておいてプログラムのように実行することができる(シェルスクリプト)

シェルスクリプトの例 あるディレクトリ中の、拡張子が.cのファイルすべてに対して、.bakという拡張子をつけてバックアップをとる。以下の内容のファイルをbackup.shという名前で作成せよ。 #!/bin/sh for file in *.c do echo $file cp $file $file.bak done exit 0

課題 ディレクトリを一つ作成し、そのディレクトリ内に.cを拡張子とするファイル(中身は何でもよい)を3つ程度作り、作成したシェルスクリプトをそのディレクトリで実行して確認せよ。

シェルスクリプトの利点 豊富なUNIXコマンド群を有効活用 例えば ディレクトリ内にある画像ファイル全てに対して,プログラムによりある処理を施したい ディレクトリ内にある画像ファイルのみを抽出,繰り返し演算 複数のファイルから,ある特定の文字列を含むファイルのみに対して何らかの処理をしたい 文字列検索による該当ファイル抽出,繰り返し演算

UNIXの誕生 UNIX AT&T ベル研究所で1970年代に開発。 当時、MulticsというOSが複雑になり過ぎており、単純なOSを作りたいということで作られた。 最初はアセンブリ言語で書かれていたが、当然移植性が悪かった。移植性を高くするためにC言語が開発され、CでUnixが書きなおされた。Cは高級言語であり、かつ細かい処理も書け、システムプログラミングに最適。

/bin/cshについて連絡 芝浦工大の環境において、/bin/cshは/bin/tcshへのリンクになっていました。

ユーザインタフェース(1) (参考書1.1節) GUI (Graphical User Interface) 画面でメニューやアイコンなどを見ながらマウスなどを使って操作 コマンド名を覚えなくてもアイコンで分かる。(たとえば、Word, Internet Explorerの起動アイコンなど) 1973年 XeroxがAlto(アルト)を開発。初めてGUIを搭載したコンピュータと言われている。 Apple社のMacintosh、Microsoft社のWindows、UNIX系OSのデスクトップ環境(X Window System上)

ユーザインタフェース(2) CLI (Command Line Interface)あるいはCUI (Character User Interface) MS-DOSにおいては、 C:\> などのプロンプトに続いてユーザがコマンドを入力 UNIX系OSにおいては、シェルのプロンプトに続いてユーザがコマンドを入力 コマンド名を覚えなければならない。 Windowsにおいては、MS-DOSのウィンドウ, UNIX系OSのデスクトップ環境においては、端末エミュレータのウィンドウを開くことによりCLIとなる。

GUIとCLIの比較(1) GUIは、マウスなどのポインティングデバイスを用いるので操作に時間がかかる。 (例)短い内容のテキストファイル(This is a test. など)を作成する場合 GUIでは、メインメニュー -> プログラム -> アプリケーション -> テキストエディタ ---- データ入力 ---- ファイル -> 名前を付けて保存 -> 名前の入力 -> 終了 CLIの場合(今、試しに行う。) $ cat > test.txt This is a test. <CTRL-Dを入力> $

GUIとCLIの比較(2) シェルのパイプ機能を使って、複数のコマンドをつなぎあわせて実行したりできる。 (例) lsでファイルが多すぎるときに一画面文ずつ表示 $ ls | less シェルのリダイレクト機能を使って入力元や出力先を切り替える (例) カレントディレクトリのファイル名一覧をファイルに書き出す $ ls > filelist.txt

Linuxの誕生 Linux Finland, ヘルシンキ大学の大学院生,Linus Torvalds(ライナス・トーヴァルド氏)開発,1991年 MINIX(Andrew Tanenbaumが教育用に作成したUnix風OS)を実用化しようとしたが,了承が得られず、Linusが自分で一から開発。インターネット上の多くのUNIXプログラマも協力し,発展

Linuxの特徴 GPLというライセンスに基づいて、誰でも自由に改変・再配布することが可能 他のOSに比べ、低い性能のコンピュータでも軽快に動作 ネットワーク機能やセキュリティーに優れ、安定 必要な機能だけを選んでOSを構築可能 システムの構築・運用に必要なソフトウェア群(コマンド、インストーラ、ユーティリティ)とともに配布。カーネルとこれらのソフトウェアをまとめた配布パッケージをディストリビューション(distribution)という

Linuxの特徴 オープンソース GPL(GNU General Public License) --- copyleft ソースコードが公開されている GPL(GNU General Public License) --- copyleft 改変等は自由だが、改変後の配布時にソースコードを開示しなければならない。 (参考) BSD license (Berkeley Software Distribution License)はcopyleftではない。OSではFreeBSDなど、OS以外ではPostgreSQLなどがBSD license。BSDをベースにしたライセンス(BSD style lisence)ではApache、Python等。

Copyright と Copyleft 使用許諾契約書 Copyleft 通常の商用ソフトウェアは,ソフトウェアの使用に関しての制限を設ける Copyleft フリーソフトウェアの使用に関して他者が制限を設けることを禁じる GPLに従って配布されているソフトウェアの例 gcc: Cコンパイラ emacs: テキストディタ

C言語プログラミング (参考書1.2節) コンパイラとインタプリタ Cコンパイラ(gcc)の使い方 Cコンパイラの処理の流れ(詳細) 静的リンクと動的リンク

コンパイラとインタプリタ (参考書1.2.1節) コンパイラ(compiler) インタプリタ(interpreter) コンパイラとインタプリタ (参考書1.2.1節) コンパイラ(compiler) ある言語のプログラムを別の(低レベルの)言語のプログラムに翻訳(translate)するプログラム 変換前のプログラム:ソース(原始)プログラム 変換後のプログラム:オブジェクト(目的)プログラム インタプリタ(interpreter) プログラムを直接、解釈実行するプログラム。ある言語のインタープリタは、その言語を解釈実行する機械(であるように振る舞うソフトウェア)。

コンパイラ プログラムを翻訳 オブジェクトプログラムを生成 コンパイラ アセンブラ C,Fortran,COBOLなどの高級言語を機械語に翻訳。アセンブラを内部で呼び出す。 アセンブラ アセンブリ言語を機械語に翻訳 ソースプログラム C,Fotran,COBOL アセンブリ言語 コンパイラ アセンブラ オブジェクト プログラム 機械語

インタプリタ ソースプログラムを直接解釈して実行 BASIC, Java Script, Perl, Ruby等。 ソースプログラム BASIC,Perl, Java Script, Ruby 【解釈、実行】

コンパイラの構成 字句解析 構文解析 オブジェクト コード 種々のフェーズ

コンパイル方式 vs インタプリタ方式 実行速度 コンパイル方式 >> インタプリタ方式 コンパイル方式 >> インタプリタ方式 コンパイル方式:機械語に翻訳してから実行 インタプリタ方式:直接解釈して実行 コンパイル方式の方が実行速度は高速 実行の手間 コンパイル方式 < インタプリタ方式 コンパイル方式:プログラムを修正したらコンパイルし直す必要がある。 インタプリタ方式:プログラムを修正後、すぐ実行できる。 移植性 (参考) Java Virtual Machine

インタプリタ方式の普及 CPU速度の向上 移植性 コンパイル方式:機械語に変換(CPU、OSに依存) インタプリタ方式:同一のプログラムが全てのコンピュータで動かせる

gcc(GNU C Compiler)の使い方 (参考書1.2.2節) ($ man gcc で使い方が表示される。) Optionの例 (オプションは書かなくてもよい。) -o name 実行ファイルをnameという名前で生成 -c 分割コンパイル(リンクはしない) -lxxx ライブラリファイルlibxxx.a を検索。libc.aはdefaultでリンク。libm.aは算術演算 ライブラリで,-lmで指定。   $ gcc –print-file-name=libm.a でリンク時に使われるlibm.aの絶対パスが表示される。 filenameの拡張子(gccは拡張子によって処理を切り替える) xxxx.c C言語ソースファイル xxxx.s アセンブリ言語ソースファイル(-S オプション) xxxx.o オブジェクトファイル(-c オプション) 他にも拡張子がいくつかある。

ライブラリ ライブラリ 再利用を目的として作成されたコンパイル済み関数群(例:mathライブラリ libm.a 等) 置き場所 /lib, /usr/lib など。 gccはデフォルトでは標準Cライブラリ(libc.a)内の関数しか検索しないため,追加したいライブラリがある場合には明示的に指定する。 算術ライブラリ使用例:  gcc program.c -o program /usr/lib/libm.a もしくは      gcc program.c -o program -lm  (リンカがlibm.aを検索する) -Lオプションでライブラリを探すディレクトリを追加指定できる。

ライブラリ 静的ライブラリ オブジェクトファイルの集合体(拡張子***.a) 例: /usr/lib/libc.a(標準Cライブラリ), /usr/lib/libm.a(算術ライブラリ) ライブラリに格納されているプログラムで使う場合, 関数を宣言しているヘッダーファイルをインクルード プログラムコードとライブラリがリンカによって結合され, 1つの実行可能プログラムを生成 動的リンクライブラリ dynamic link library(あるいは共有ライブラリ shared library)がある。(次回説明) Linuxでは拡張子は.so、windowsでは.dll リンク時ではなく、プログラム実行時にメモリー上にロードされる。これにより、実行形式ファイルのサイズが小さくなる。

ヘッダーファイル ヘッダーファイル ライブラリ関数の型の宣言等が記述されているファイル。プリプロセス時に読み込む。 Cの場合 stdio.h (標準入出力ヘッダー) stdlib.h (標準ライブラリヘッダー) math.h (算術関数用ヘッダー) /usr/include, その下のサブディレクトリ -I(エルの小文字ではなく、アイの大文字)オプションでヘッダーファイル検索ディレクトリを追加指定できる。

分割コンパイル C言語プログラムを一つのファイルに全部書くのではなく、複数のファイルに分けて記述する。 それぞれのCファイルは個別にコンパイルできる(分割コンパイル)。.oファイルが生成される。 $ gcc –c test.c などを実行すると、test.oというファイルが生成される。 再配置可能なコードが生成される。リンク時に解決。 一つのファイルを修正した場合、他のファイルのコンパイルをやり直さなくてよいので、修正時のコンパイル時間が短縮される。(ただし、リンクのやり直しは必要)

分割コンパイルによるコンパイル手順(例) 2つの整数値(int型)の足し算を行う関数addを定義したC言語ファイルadd.cを作成し、分割コンパイル(add.oが生成される) $ gcc -c add.c ヘッダファイルの作成 関数addのプロトタイプ宣言 int add (int, int); を記述したファイルadd.hを作成 add関数を呼び出すmain関数を記述したC言語ファイルmain.cを作成 add.hをインクルード (#include “add.h” をファイルの先頭に記述) gcc -c main.c リンクし、実行形式ファイルをmainというファイル名で作成 ・  gcc -o main main.o add.o

演習課題 2つのint型の足し算をする関数addを定義したCファイルadd.cを作成 add関数のプロトタイプ宣言をadd.hに作成 add (3,4) のような計算を行うmain関数をmain.cに記述 さきほどの手順で、分割コンパイルをし、リンクして実行形式ファイルmainを作成 mainを実行

ライブラリの作成 ライブラリ化したい関数を記述したソースファイルを作成。(add.c, mult.cなど) アーカイバ ar でアーカイブを作成 関数のプロトタイプ宣言を記述したヘッダーファイルを作成

ライブラリ(アーカイブ)作成手順(例) 複数のオブジェクトファイルをアーカイバ ar を用いて一つのファイルにまとめる。(ar はオブジェクトファイルに限らず使えるが、普通はライブラリ作成に用いる。) add.o, mult.o からアーカイブ libaddmult.a を作成 ar crv libaddmult.a add.o mult.o addとmultのプロトタイプ宣言をaddmult.hに作成 リンク $ gcc -L. main.o -laddmult あるいは $ gcc –L. main.c –laddmult でもよい。 あるいは $ gcc main.c libaddmult.a でもよい。 (実行ファイルをa.out以外にする場合は-oオプションで指定) (参考)ライブラリや実行可能プログラムに含まれる関数を調べるコマンド(nm)が使える。

演習課題 2つのint型の足し算をする関数addと掛け算をする関数multをadd.c, mult.cに作成 add.o, mult.oをarでまとめてlibaddmult.aを作成  mult (add (3,4), 3)のような計算を行うmain関数をmain.cに記述 リンクして実行