新人をバイナリアンに育てる ~ その9 ~

新人で C の初心者高橋君。Linux のコマンドを理解し、Emacs(Mule) でメールが打てるようになりました。プログラムも配列を VRAM に見立てて線を書いたりしています。

いままで、報告の箇条書きのマークに ー をつかってましたが、ちゃんと - を使うようになりました。今まで混乱するから本人には伝えていなかったのですが、7週間たってようやくそういった細かいことを伝えてもいい時期になりました。それまでは、キャパオバーということで意図的に伝えてなかったのでした。

新人高橋君 日報 7/25(月) 18:12

作業報告します

今日行ったこと
 -"C言語入門書の次に読む本"を409ページ中39-54まで読み進める
 -"明解C言語"を325ページ中41-52まで読み進める

 -1行読んで、1文字目と空白で区切った列を文字列として表示するプログラムの作成

今後のtodo
 -"C言語入門書の次に読む本"を読み進める
 -"明解C言語"を読み進める


 -入力に応じて三角形、四角形、円を複数個描画その後にrawデータで保存するプログラムの作成

  -1行読んで、1文字目と空白で区切った列を”数字”として表示するプログラム 
  -1行読んで、1文字目に応じて、異なる関数を読んで、異なる表示をするプログラム
  -複数行読んで、1文字目に応じて、異なる関数を読んで、異なる表示をするプログラム
  -複数行読んで、最初の計画通り各コマンドを実行するプログラム

  -円を描画するプログラムの作成
 
 -図を回転させるプログラムの作成

社長コメント 7/25(月) 18:34

日々の報告として

問題点:
改善点:

をあげておくと、週の終わりにそれをまとめるだけになります。
例えば今日であれば、

問題点:
 関数内で ++ しても影響しない理由 => 調査が必要
 C言語で配列を関数の引数として渡した時の動き

それとも issue track をいれるかな、、、ソース管理(git)も課題だな、、、


>  -"C言語入門書の次に読む本"を409ページ中39-54まで読み進める
=>えらいね。ちゃんと記号を変え始めた。
こういう応答がコミュニケーションだね。


>   -円を描画するプログラムの作成
>  -図を回転させるプログラムの作成
これは今後の個人的な課題ということでやらないかもしれない。

予定としては
一行読んで実行するプログラム、それの改良
スタック型のプログラム
シリアル通信
ネットワーク
Z80
LCD

ってところか。予定は予定なので変わるかもしれない。

コメント

あれ?金曜日と同じ内容「1行読んで、1文字目と空白で区切った列を文字列として表示するプログラムの作成」でてこずっているのか?意外と、こういう文字列操作は C だと大変なのだろう。

ついに git の導入を考え始めます。あと社長のコメントもすぐにコメントするようになった。相手のかキャパに余裕が出てきたと判断したのか?あるいは業を煮やしたのか?

新人高橋君 日報 7/26(火) 18:42

作業報告します

今日行ったこと
 -"C言語入門書の次に読む本"を409ページ中55-74まで読み進める
 -"明解C言語"を325ページ中53-69まで読み進める

 -1行読んで、1文字目と空白で区切った列を文字列として表示するプログラムの作成
 -1行読んで、1文字目と空白で区切った列を数字として表示するプログラムの作成
 -C言語で配列を関数の引数としたときの動作の調査
  -プログラム中に[]を伴わずに単独で現れた配列名はその配列の先頭要素のポインタとみなされるらしい
   そのため文字列を表示させるプログラムでは動作したようだ

今後のtodo
 -"C言語入門書の次に読む本"を読み進める
 -"明解C言語"を読み進める


 -入力に応じて三角形、四角形、円を複数個描画その後にrawデータで保存するプログラムの作成

  -1行読んで、1文字目に応じて、異なる関数を読んで、異なる表示をするプログラム
  -複数行読んで、1文字目に応じて、異なる関数を読んで、異なる表示をするプログラム
  -複数行読んで、最初の計画通り各コマンドを実行するプログラム

コメント

まだまだ配列で右往左往しています。ポインタの理解はまだまだ先になりそうです。

新人高橋君 日報 7/27(水) 18:04

作業報告します

今日行ったこと
 -"C言語入門書の次に読む本"を409ページ中75-90まで読み進める
 -"明解C言語"を325ページ中70-85まで読み進める

 -1行読んで、1文字目と空白で区切った列を数字として表示するプログラムの作成
 -1行読んで、1文字目に応じて、異なる関数を読んで、異なる表示をするプログラムの作成


今後のtodo
 -"C言語入門書の次に読む本"を読み進める
 -"明解C言語"を読み進める


 -入力に応じて三角形、四角形、円を複数個描画その後にrawデータで保存するプログラムの作成

  -1行読んで、1文字目に応じて、異なる関数を読んで、異なる表示をするプログラム
  -複数行読んで、1文字目に応じて、異なる関数を読んで、異なる表示をするプログラム
  -複数行読んで、最初の計画通り各コマンドを実行するプログラム

 -やってみたいプロジェクトの計画

コメント

「1文字目と空白で区切った列を数字として表示するプログラム」atoi とかを使うということになるのでしょう。数字とascii 文字と配列の関係に自ら気付いてくれることを願って、あまり、指導していない。いいのか悪いのかは不明。わかった気になってもらっても困るしね。

新人高橋君 日報 7/28(木) 18:05

作業報告します

今日行ったこと
 -"C言語入門書の次に読む本"を409ページ中91-106まで読み進める
 -"明解C言語"を325ページ中88-101まで読み進める

 -1行読んで、1文字目に応じて、異なる関数を呼んで異なる表示をするプログラムの訂正
 -複数行読んで1文字目に応じて異なる関数を呼んで異なる表示をするプログラムの作成

 -やってみたいプロジェクトの計画
  -ある文章を読み、こちらが望む文字列(1つでも複数個でも)の統計情報をそれぞれ得るプログラムの作成をやりたいと思います

今後のtodo
 -"C言語入門書の次に読む本"を読み進める
 -"明解C言語"を読み進める


 -入力に応じて三角形、四角形、円を複数個描画その後にrawデータで保存するプログラムの作成
  -複数行読んで、最初の計画通り各コマンドを実行するプログラム

 -やってみたいプロジェクトの計画

社長コメント

>  -やってみたいプロジェクトの計画
>   -ある文章を読み、こちらが望む文字列(1つでも複数個でも)の統計情報をそれぞれ得る
> プログラムの作成をやりたいと思います
もういくつか出してみて。

野心的ななにかがあるのかな?

コメント

「1文字目に応じて、異なる関数を呼んで」case で分岐するプログラムだね。ascii コードは理解し始めた模様。やってみたいプロジェクトに統計情報を得るプログラムとなった。まぁ悪くないよね。自分で先を見据えられるかどうかがポイントだ。しかし、社長の私はダメ出ししている。ダメじゃん。

新人高橋君 日報 7/29(金) 18:17

作業報告します

今日行ったこと
 -"C言語入門書の次に読む本"を409ページ中107-121まで読み進める
 -"明解C言語"を325ページ中102-117まで読み進める

 -Emacs の設定の変更
 -テキストファイルを読んでこちらが入力した文字列の統計情報を得るプログラムの作成

 -週報作成

今後のtodo
 -"C言語入門書の次に読む本"を読み進める
 -"明解C言語"を読み進める


 -入力に応じて三角形、四角形、円を複数個描画その後にrawデータで保存するプログラムの作成
  -複数行読んで、最初の計画通り各コマンドを実行するプログラム

コメント

ひといきついて、自分の”やりたい”と言っていたことをしてもらうことにしたんだね。もちーベーションを高めたいという表れだ。入社したてはこんなもんだよね。でも、この悠長さで大丈夫か?2か月たったけどポインタの理解ができてないぞ。

おまけ:社長オブジェクト指向について延々と語る

> Lisp で書いているのだが、Lisp すごいね。
オブジェクト指向の良さは

  1. 情報の隠ぺい
  2. ポリフォリズム

特に、情報の隠ぺいは強力。問題を局所化できるので開発が楽。
Lisp は開発が決して楽ではない。
情報も隠蔽しない傾向にあるから、ノーガードの打ち合いみたいになる。
いろんなことができすぎるので、今の時代のセキュリティには合わない気もする。

C++/Java も含めてオブジェクト指向の抱える問題は、アプリケーション構築時のクラス概念の破綻だ。
だいたいにおいてきれいにいかない。
それは、オブジェクト指向が提供する哲学が、複雑なアプリケーションを網羅しないことを指す気がする。

クラスは継承される毎にたいていメンバー変数が増える。
上位クラスから見ると下位クラスは見えないし(当たり前)
下位クラスからのアクセスを上位クラスは隠蔽する。
下位のクラスは問題を局所化できる。
小さなプログラムなら非常にきれいに書ける。

変数という意味ではオブジェクト指向は、上位クラスから下位クラスに行くにしたがって
細かい条件に応じて、”つけたす”事ができる。これは、下位クラスが、具象化していき
より細かい条件を、細かく満たすことができることを指している。

一方、メソッドについては実は違う。
メソッドはオブジェクト指向では上位クラスが、意味的にはすべてのありとあらゆる
メソッドを用意していて、下位クラスはそれを選択して使うことになる。
よくある、
図形 -> 多角形 -> 三角、四角
は、すべてのありとあらゆる図形的なメソッドを図形が持つことを意味する。
だから、一番上のクラスは万能クラスなのだ。

また、クラスが持つ概念もアプリケーションが複雑になるにつれてあやふやになる。
図形程度だと問題は起きない。
しかし、複雑なアプリケーションを考えるとすぐに破たんする。
多重継承とか難しく考えなければならなくなる。
飛行機はタイヤがあるけど車?とか。

だから、オブジェクト指向的には
万能乗り物 -> 飛行機、車
位の階層でしかものを考えられない。
乗り物 -> 陸を走る、空を飛ぶ、海を渡る -> さらに細かいクラス
といった具合にきれいに階層化はならない。

だから、オブジェクト指向的なクラス階層を考えるとアプリケーションは破たんする。

オブジェクト指向がもたらすものはクラス階層ではなく、"ポリフォリズム"につきる。
これだけ。

ポリフォリズムというと難しく聞こえるが、要は API を用意して、それに合致する
個々の処理は、個々に任せるような仕組み。オブジェクト指向
個々=下位のクラスの仮想関数
となる。これはいったい何をしめしているのか?

API を用意して、その中身はブラックボックス化しようとしているに過ぎない。
結局、プログラマのやりたいことは
”問題を局所化”
”局所化された問題を解く"
である。
仮想関数で局所化された問題を解く仕組みが C++/Javaオブジェクト指向だ。
C++ の template は別の意味で問題を局所化する。
C# のデリゲートも別の意味で問題を局所化する。

いずれも API (かそれに類するもの)が決定され、中身を別途書く。
じつはそれってマクロじゃないか?というのが今回の結論。

for(int I = 0 ; I < 100; ++I ) {
なんか処理
}

このなんか処理のところを

  1. subroutine で呼ぶ -> 構造化!!
  2. iter->do_somtihng(); -> オブジェクト指向

何でもいいんじゃないか?
API が規定されてブラックボックス化できれば!!
テンプレートなんてマクロだしね。

lisp のマクロは言語レベルで高度なマクロを提供する。
そのために、ほとんどのケースで、オブジェクト指向もデリゲートもいらない。

ただ関数が呼ばれればよい。必要であれば関数のすげ替えをすれば
個々の対応ができる(仮想関数のようなこともできる)。

その代り、設計に頭をすごく悩ませることになる。慣れてくると加速するような気もする。
いろいろ設計して、結局 common lisp の用意するマクロがつかることがわかる、、、
ということは何度もある。だから、ほとんどのケースで既存のライブラリの使いまわしで
やれてしまう。

C++ は結局、ライブラリの再利用ができない。
Lisp は出来る。マクロという高度な抽象化ができるからだ。
C++ はテンプレートでそれを実現しようとしている。
テンプレートは難しすぎて、結局、だれも理解できないものができる。(Lisp も同じだが、、、、)

セキュリティの問題と難しさで世の中絶対にlisp の時代は来ないけど、
lisp を使えるようになって、マイライブラリが充実してくると、
たぶん、プログラムの構築スピードはとんでもないことになりそう