機械語とライブラリ、OSとは
機械語ができるまで
先週のプログラムの実行方式の説明の続きとして、機械語ができるまでを説明。 高級言語→(コンパイラ)→中間コード→(リンカ)→機械語。 リンカの役割としてライブラリコードの組み込みも説明する。 ライブラリの実装方式として、静的リンク方式と動的リンク方式を解説。
OSとは
これまでの話の中にも何度もでてきた OS の役割を改めて説明する。 基本プログラム+開発環境+ユーザプログラムから成り、 OS によって、共通の操作性と資源(CPU,メモリ,時間,周辺装置等)の利用が 提供されている。 資源の利用では、ハードウェア保護や排他制御といった資源保護機能が大切な役割であることの説明。
時間が余ったので雑談として、携帯電話などの組み込み系では、資源保護機能が無いことを話す。 逆に資源保護が無いのなら、どうして携帯アプリがなぜ安全に動くのかを説明する。 i-mode+FOMA は、Java のおかげで危険を排除、au(BREW)は、安全確認したものだけをダウンロードできる…といった説明をする。
おもしろいアイディアだけど…
広告アイディアを、製品販売元とは関係なしにユーザが提案して、 広告を企業に『押し売り』しようという、ユニークなビジネスモデル。
だけど…
だけど、広告サンプルなのか本気なのかちょっと解らないけど、 物は???である。
- 007:背が伸びるつり革:身長の低い人向けの電車のつり革に、 専用の広告を…というアイディアなんだけど、 ある意味… 『チビにけんか売る気かぁ〜?』 というアイデアである。
- 006:このブツブツが目に入らぬか:盲人向けの道路の点字ブロックを ベネトンカラーのように配色し、広告ネタにしようというアイデア… だけど点字ブロックは、弱視の人が『黄色』で目立つ目印としても 利用していて、黄色以外だと視認性が落ちるという視点が抜けているんだなぁ…
ということで『押し売り』の名前通り、 相手にとっての視点が『びっみょ〜♪』に配慮に欠けている、変なサイトだったとさ。
トラックバック SPAM が大量に…
気づくとトラックバック SPAM が大量に書き込まれていた。 対応も面倒だし、トラックバック機能を止める。
2分木と演算子データの扱い
2分木構造の応用のネタとして、2項演算子による式の表現を2分木を用いて行う方法を説明。
式の表現方法
式の表現方法として、中置記法、前置記法 (ポーランド記法) ) FN ポーランド記法の由来は、提唱者がポーランド人だかららしい。 /FN 、後置記法 (逆ポーランド記法) 特に、逆ポーランド記法等は、書き方自体が演算子の優先順位を含んでいる点や、 コンパイラを作成する時などの機械語生成が容易、スタックで実装が容易といった点を説明する。 逆ポーランド変換も基本情報処理の問題として定番なので、説明したいけど時間がかかるし データ構造とは離れるので、紹介のみ。 式の優先順位や右結合・左結合といった用語も説明する。
2分木で式を表現
最後に2分木で式を表現・生成し、 その値を実際に再帰呼び出しで値を計算するプログラム例を説明する。
struct Expr { int data ; // 数値データの場合は、left=right=NULLとする。 struct Expr* left ; struct Expr* right ; } ; // 数値の木を生成 struct Expr* Integer( int x ) { struct Expr* ne ; ne = (struct Expr*)malloc( sizeof( struct Expr ) ) ; if ( ne != NULL ) { ne->data = x ; ne->left = ne->right = NULL ; } return NULL ; } // 演算子の木を生成 struct Expr* Operator( char op , struct Expr* l , struct Expr* r ) { struct Expr* ne ; ne = (struct Expr*)malloc( sizeof( struct Expr ) ) ; if ( ne != NULL ) { ne->data = op ; ne->left = l ; ne->right = r ; } return NULL ; } // 木のデータを式として評価する int eval( struct Expr* e ) { if ( e->left == NULL && e->right == NULL ) { return e->data ; } else { switch( e->data ) { case '+' : return eval( e->left ) + eval( e->right ) ; case '*' : return eval( e->left ) * eval( e->right ) ; } } } // 動作確認 void main() { // e = 1 + 2 * 3 ; struct Expr* e = Operator( '+' , Integer( 1 ) , Operator( '*' , Integer( 2 ) , Integer( 3 ) ) ) ; printf( "%d\n" , eval( e ) ) ; }
雷
説明の途中で、余りにも雷雨が激しいので、雑談として落雷や感電の説明をする。 んで、真面目な授業のネタよりも、こういう雑談の方が学生さんはよく覚えているのが、 現実だったりする。 (人間の体内は手足間で平均500Ω程)
表計算と電圧電流実験データ処理プログラム作成
表計算とプログラミング演習 を行うデータを使いながら実際に演習。 実験データ特有の有効数字などもネタに交えながら説明を行い、演習に取り組んでもらう。 時間内にレポートとして提出なので、 思ったより真面目に取り組んでくれたみたいで、成果があったように思う。
言語プロセッサ
ソフトウェア、プログラム、アルゴリズムの違いの説明。 CPU , メモリ , ROM , RAM の説明+コンピュータが起動した時 ROM,RAM がどう使われるか。 言語プロセッサということで、 機械語とインタプリタ、コンパイラ、バイトコードインタプリタ、エミュレータなどの説明。
ブラウザ更新
正式版の Internet Explorer ver.7 日本語版 が公開された。 Firefox 2.0 と共に、色々と入れてみる。
Firefox 2.0 のインストール時間と比べて、IE7の遅いこと….
bit演算とビットフィールド+演習
先週紹介したビットフィールドの説明を受け、 1つの数値に複数の整数値を保存するテクニックの紹介により ビット演算に慣れてもらう。
後半は、先週実施の構造体を使った処理の課題に取り組んでもらう。
プログラミングが苦手そうな学生さんから、 「プログラミングできないんだけど就職したらどんな仕事するんですか?」 と聞かれる。
電子系の開発系の仕事への興味を聞いたりしてみる。 ひとつ忠告として、 『「わからない」と言ってすぐに投げ出して手を動かせない奴は、 どんな仕事にしろ役に立たない』とアドバイス。