プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.

Slides:



Advertisements
Similar presentations
プログラミング 関数編 情報科学科. プログラミングにあたって C 言語では、 main 内に処理を記述 1000 行になるような大きなプログラムでは、 プログラム全体が何をしているのかを把握 することが困難になる 他人が見ると非常に理解しにくい 作成者であっても時が経てば内容を忘れて、他 人が見た時と同じ状況になる.
Advertisements

C 言語講座 第 7 回 ポインター. メモリとアドレス(ポインターの前 に) コンピュータのメモリには 1 バイトずつ 0 番地、 1 番地、 2 番地・・・というように 住所が割り当てられている この住所をアドレスという。 メモリはデータをしまうもので それを引き出すためには メモリに番号(アドレス)を振っておけばよいな.
2.5 プログラムの構成要素 (1)文字セット ① ASCII ( American Standard Code for Interchange ) JIS コードと同じ ② EBCDIC ( Extended Binary Coded Decimal for Information Code ) 1.
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
プログラミング言語論プログラミング言語論 命令型プログラミング言語 水野嘉明
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
記憶クラス 変数をどのような記憶領域に割り当てるかを指定するのが記憶クラス 記憶クラスには、自動変数、静的変数、外部変数などがある。
情報処理Ⅱ 2005年12月9日(金).
第8回 プログラミングⅡ 第8回
プログラミング言語論 第4回 手続きの引数機構 変数の有効範囲
第4回放送授業.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
関数 関数とスタック.
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
プログラミング2 関数
プログラミング論 ファイル入出力
関数の定義.
第10回関数 Ⅱ (ローカル変数とスコープ).
アルゴリズムとデータ構造 補足資料11-1 「mallocとfree」
アルゴリズムとデータ構造 補足資料5-2 「サンプルプログラムsetop.c」
コンパイラ 2012年11月15日
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
プログラミング論 ファイル入出力
第5回放送授業.
データ構造と アルゴリズム 第五回 知能情報学部 新田直也.
プログラミング言語論 第四回 理工学部 情報システム工学科 新田直也.
オブジェクト指向プログラミングと開発環境
再帰的手続き.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
アルゴリズムとプログラミング (Algorithms and Programming)
参照されないリテラル 長谷川啓
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
ポインタとポインタを用いた関数定義.
11.1 標準ライブラリ関数 11.2 関数呼び出しのオーバーヘッド 11.3 大域変数 11.4 プロトタイプ宣言 11.5 関数引数
第5回 プログラミングⅡ 第5回
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
コンピュータアーキテクチャ 第 5 回.
Nakano School of Business 経営情報ビジネス科 【 Java概論(Test4)】
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
プログラミング 4 文字列.
コンパイラ 第12回 実行時環境 ― 変数と関数 ― 38号館4階N-411 内線5459
ソフトウェア工学 知能情報学部 新田直也.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
関数と再帰 教科書13章 電子1(木曜クラス) 2005/06/22(Thu.).
プログラミング演習I 2003年6月11日(第9回) 木村巌.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
第10回 関数と再帰.
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
情報処理Ⅱ 小テスト 2005年2月1日(火).
プログラミング言語論 プログラミング言語論 演習5 解答と解説 演習5 解答と解説 1 1.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング 2 静的変数.
Presentation transcript:

プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也

手続き 手続き:一連の処理を行う機能単位. 名前をつけることができ,その名前で何度でも呼び出すことができる. FORTRAN, Basic --- サブルーチン Pascal --- プロシージャ(手続き) C, C++ --- 関数 Java --- メソッド 名前をつけることができ,その名前で何度でも呼び出すことができる.

手続きの有効性 z = x * y を行うWhile プログラム z = 0; c = 0; while (c < y) { int plus(int z, int y) { int d = 0; while (d < y) { z++; d++; } return z; main() { int z = 0; int c = 0; while (c < y) { z = plus(z, y); c++; z = 0; c = 0; while (c < y) { d = 0; while (d < x) { z++; d++; } c++;

手続きの定義と呼び出し int plus(int z, int y) { int d = 0; while (d < y) { } return z; main() { int z = 0; int c = 0; while (c < y) { z = plus(z, y); c++; 関数plusの定義(関数宣言) 関数plusの呼出し

手続きの引数と戻り値 int plus(int z, int y) { int d = 0; while (d < y) { z++; } return z; main() { int z = 0; int c = 0; while (c < y) { z = plus(z, y); c++; 仮引数:定義側の引数 戻り値 実引数:呼出し側の引数

手続きの型 int plus(int z, int y) { int d = 0; while (d < y) { z++; d++; } return z; main() { int z = 0; int c = 0; while (c < y) { z = plus(z, y); c++; すべての関数は型を持つ. 関数定義と呼出し側で型が一致 してなければならない.

前方参照とプロトタイプ宣言 プロトタイプ宣言 後方参照 前方参照 int plus(int z, int y) { int d = 0; while (d < y) { z++; d++; } return z; main() { int z = 0; int c = 0; while (c < y) { z = plus(z, y); c++; int plus(int, int); main() { int z = 0; int c = 0; while (c < y) { z = plus(z, y); c++; } int plus(int z, int y) { int d = 0; while (d < y) { z++; d++; return z; プロトタイプ宣言 後方参照 前方参照

値を返さない手続き 値を返さない手続きは以下のように定義する. 値を返さない手続きの呼出し. C, C++, Javaの場合: 戻り値を void に. VBの場合: サブルーチンプロシージャとして定義. 値を返さない手続きの呼出し. void view(int a) { printf(“%d\n”, a); } main() { view(10); 式として扱われない. (値を評価できない.)

再帰呼び出し(1) (もちろん)関数の中で関数を呼出すことが可能. main() { printf(“%d\n”, max3(12, 15, 11)); } int max3(int x, int y, int z) { return max2(max2(x, y), z); } int max2(int x, int y) { if (x >= y) return x; else return y; }

再帰呼び出し(2) 関数の中で自分自身を呼び出すとどうなるか? int factorial(int x) { if (x == 1) { return 1; } else { return x * factorial(x – 1); } }

記憶クラス メモリ管理は古くて新しい問題 「忘れてもいいことはさっさと忘れる」が基本. 使えるメモリは有限. メモリの使い方は実行速度にも影響. さまざまな環境: 携帯電話,デジタル家電… 「忘れてもいいことはさっさと忘れる」が基本. 長く覚えておくための記憶領域: ヒープ領域 一時的に覚えておくための記憶領域: スタック領域

プログラムのメモリマップ 各プログラムに割り当てられるメモリの領域は以下のようになっている. 領域が増減する 1プログラムに 割り当てられる 0xffff番地 スタック領域 領域が増減する 1プログラムに 割り当てられる 領域 ヒープ領域 静的領域 書き換え不可能 プログラム領域 0x0000番地

各領域の説明 プログラム領域: 静的領域: ヒープ領域: スタック領域: プログラムの実行コード(機械語)が格納される. プログラムが持つ定数などが格納される. char *a = “This is a string.”; printf(“Hello World!!”); ヒープ領域: 大域変数(後で説明)が格納される. スタック領域: 自動変数(後で説明),関数の引数,戻り番地などが格納される.

自動変数 自動変数: 関数呼出し,ブロック開始時に生成される. 関数からの復帰,ブロック終了時に消滅する. スタック領域上に確保される. main () { int i, j; func(); } func() { int x, y; mainの中でのみ使用可能 mainを抜けると消滅 funcの中でのみ使用可能 funcを抜けると消滅

静的変数 静的変数: 自動変数と同様,宣言した関数内でしか見れない. 関数からの復帰時に消滅せず値が保持される. ヒープ領域に確保される. main () { int i, j; tick(); } tick() { static int count = 0; count++; 静的変数であることを示す記憶指定子 funcの中でのみ使用可能 次回呼出し時に値が残っている

大域変数 大域変数(外部変数): 関数の外で宣言する. 複数の関数で値を共有できる. プログラム実行中消滅しない. ヒープ領域に確保される. mainでもfuncでも使用可能 消滅しない int i, j; main () { i = 1; j = 2; func(); } func() { printf(“[%d,%d]”, i, j); [1,2]が表示される

変数のスコープと寿命 スコープ: その変数を見れる範囲 寿命: その変数に値が保持されている期間 スコープ 寿命 自動変数 関数内 関数呼出しの間 静的変数 プログラムの全実行 大域変数 プログラム全体

スコープと可視性 別々のスコープで同じ名前を使用できる. 名前が衝突したときは,内側のスコープを優先. main内における i ,j int i, j; main () { func1(); func2(); } func1() { func2() { main内における i ,j func1内における i ,j func2内における i ,j

スタック領域の詳細 関数呼出しに応じて スタック領域が確保される. main () { main用 int x = 1; 0xffff番地 main () { int x = 1; x = input(x); } int input(int y) { char s[10]; scanf(“%s”, s); printf("%s\n", s); return y + 1; main用 x y 戻り番地 s[0] s[1] : 自動変数用 28バイト 引数用 20バイト input用 0x0000番地

バッファオーバーフロー攻撃 scanfなどで戻り番地を上書きする. 戻り番地は29~32文字目 不正な コード main () { 0xffff番地 main () { int x = 1; x = input(x); } int input(int y) { char s[10]; scanf(“%s”, s); printf("%s\n", s); return y + 1; main用 x : 引数用 20バイト y input用 戻り番地 : 不正な コード 自動変数用 28バイト s[1] s[0] 0x0000番地