記事一覧

(思案中)

無謀かもしれないけど、
作ろうと思ってるものは以下のとおり。

・仮想マシンモニタ
・continuation
・スレッドライブラリ
・分散共有メモリ

  • 2008年06月16日(月)11時43分

プログラムをつくる流れ

さてさて、
前回、とはいってもかなり前になりましたが、
メモリアドレスの話を少ししたところで、
実際にプログラムを作っていこうと思います。


プログラムを作る流れとしては、
みなさんいろいろなスタイルがあると思いますが、
今回は説明のために以下のフローで行います。

(1)使う場面を考える
(2)必要な機能を考える
(3)実現するためのパーツを考える
(4)パーツをどう実装するか考える
(5)実装してみる
(6)最適化



■ 使う場面を考える

まず、自分がどんなものを使いたいのかを考えます。
画像処理のプログラムなのか、インタフェースなのか、
はたまた他のプログラムから利用されるライブラリなのか。
どんな機能が今用意されていなくて、どんな機能を
どんな風につかいたいなぁと夢を膨らませていきます。
ここで膨れあげすぎると大変なことになりますが、
(2)以降をしっかりと段階を踏めばおそらく作れると思います。


■ 必要な機能を考える

次に、作りたいシステムをどんな機能から構成するかを考えます。
ざっくりと、作らないといけないものを考えて見ます。
画像を表示したり、画像をモノクロにしたり、といった感じです。
そのプログラムを使って何をしたいのかを列挙してみます。


■ 実現するパーツを考える

必要な機能がわかりましたので、
これをどうやって作るかを考えて見ます。
画像を表示する機能でしたら、画像をディスクから開いたり、
画像を表示するウィンドウを作ったり、実際に表示したり、となります。
特に作れるかどうかは考えず、ざっくりと切り分けてしまいます。


■ パーツをどう実装するか考える

終わりに近づいてきました。
そろそろ、パーツの実装方法を考えます。
それぞれのパーツをどんな処理から構築するかを考えます。
例えば、画像表示でしたら、ファイルをメモリ上に読み込んで、
メモリ上からディスプレイに転送してみる、という感じです。

しのみくす@でべるすはハードウェアを考えた
プログラミングを紹介していく予定ですが、
実際の機能をハードウェアに適したコードにすることは
だいたいこのあたりのフェーズでもりこんでいきます。


■ 実装と最適化

最後に実際にプログラムを書き込んでいきます。
バグに注意しながら、設計時に見落としていた、
ハードウェアとの親和性を高めていきます。



こんな感じでプログラムが組めるかもしれません。
もし、途中で問題がわかったら1個前に戻って、
設計をちょこっと修正してみるといいでしょう。

次回からは実際に何かしら大きな例を取って
ぐりぐりと設計をしていこうと思います。


※例に何を使うのかをかなり悩んでいます。

  • 2008年06月13日(金)11時14分

おいてあるばしょ

アップロードファイル 6-3.jpg

プログラムはプロセッサの読む操作手順ですが、
せっかくの操作手順も場所が判らなければ、
読むことができません。


パソコンの中で読まれるプログラムは、
すべてメモリの上に置いてあります。
そして、どこにどの操作手順があるのかを示すために、
それぞれの操作手順は"アドレス"という住所を持っています。


たとえば、
printf関数の先頭がアドレスを"0x300"、
"Hello~"と書かれているアドレスを"0x5000"とすると、
先ほどのプログラムの関数呼び出しは、
次は0x300を読んでね、という命令になります。

またprintf関数は文字列表示を依頼するので、
表示する文字列がどれかわからないといけません。
そのため、呼び出し元は文字列の場所 "0x5000" をちしきとして教えます。

#include <stdio.h>

int 
main (void)
{
	printf("Hello, World\n");
	// [call] 0x300 [with] 0x5000

	return 0;
}


もう一つ例をあげてみましょう。
今度は自分で関数を定義してみます。
sum関数は渡された数を足しあわせて返す関数です。

sum関数はプログラムですので、
パソコンのルールに従ってアドレスを持ちます。
sum関数の呼出にはこのアドレスが使われます。


例えば"0x400"がsum関数のアドレスとします。
すると、main関数からのsum関数呼び出しは、
次はアドレス"0x400"を読んでね、という意味になります。
そして、10、20という引数がこのアドレスを読むときに使うちしきになります。
#include <stdio.h>

int
sum (int a, int b)
{
	return a+b;
}

int 
main (void)
{
	int value;

	value = sum (10, 20);
	// [call] 0x400 [with] 10, 20

	return 0;
}

プロセッサは関数呼び出しを発見すると、
次によむ操作手順に移動します。
そして、呼び出し元からもらったちしきを使って
次によむ操作手順に従って処理をするのです。

 

  • 2008年03月10日(月)13時40分

がんばるぷろせっさ

アップロードファイル 5-1.jpg

プログラムはパソコンとのコミュニケーションツールです。


先に書いた文字表示を依頼するプログラムもそうですが、
電気屋さんに行ってパソコンを買うと必ずついてくるOSもプログラムです。
OSはパソコンにつながれたハードウェアの操作方法をすべて知っている、
とても大きなプログラムです。

では、この操作方法を誰が読むのでしょうか。


ここでこれらの指示を読むのがプロセッサです。
プロセッサはプログラムを読む能力を持つハードウェアです。
プロセッサははじめに例題のプログラムを読んで、
printf関数により"文字を表示するにはOSを読めばいい"ことを知ります。
次に、プロセッサはOSを読んで文字の画面の操作方法を知ります。

そしてこの操作方法をプロセッサが実際にやってみるのです。


実はパソコンにつながれたハードウェアは、
少なくとも1本の線がプロセッサまでつながっています。
プロセッサはこの線を使って、OSに書いてあった操作をやってみることで、
ディスプレイが操作されて文字を表示されるのです。


なんとなくパソコンの中身が見えてきましたね。


※プロセッサ = CPU

  • 2008年03月08日(土)13時39分

はじめて"かく"Cプログラム

アップロードファイル 4-2.jpg

音楽を聴いたり、絵を描いたり。


パソコンはなんでもできる代わりに、
とても複雑なのもパソコンです。

パソコンは、iTunesなどなどのアプリケーションと
WindowsのOS、プロセッサなどのハードウェア、
すべてが連携しあって動いています。

例えば、こんなプログラムの例をみてみましょう。
あちこちの本でよく見かける文字を出すプログラムです。

#include <stdio.h>

int
main (void)
{
	printf("Hello, World\n");
	return 0;
}


でも、実はこのプログラム自体は文字を表示しません。
このプログラムはOSへ文字表示を依頼するプログラムなのです。

printf関数は "文字表示を依頼しにいく関数" なので、
printf関数に 「Hello, World」 を渡してあげると、
printf関数はOSへ 「Hello, World」 の表示を依頼にしに行きます。
最後にOSがこの依頼に合わせて画面に文字を表示します。

たった数行のプログラムですが、パソコンはこれを実行するのに
アプリケーションやOS、ハードウェアを機能させているのです。


このサイトでの"プログラムをかく"ことは、
パソコンが実際になにをしてくれるのか、
パソコンの気持ちになってコミュニケーションを図ることです。
パソコンのことをもっと判ってあげられれば、
今は眠っているちからを引き出すことができるかもしれません。


では、次から実際にパソコンが何をしているのかを
具体的に例をあげつつ見ていきましょう。

  • 2008年03月08日(土)11時14分

しのみくす@でべるすとは。

「へちまみたいないい匂いがするガム」


日本語としては理解できますが、なんのこっちゃと思います。
どんなに単語を知っていて、文法が正しく組み立てられても、
話す人と聞く人の"認識"が同じでないと、しばしば会話は失敗するものです。


プログラムの世界も同じことがおこります。
プログラミング言語も日本語と同じで、
文法と、会話中に使える単語(命令)を決めています。
プログラマはこのルールに合わせて、プログラムを組み立てます。
では、このときに考えなければならない"認識"とは何でしょう。

パソコンのことを考えてあげることができれば
とてもよいコミュニケーションが図れるかもしれません。


そんなこんなで…
このサイトではプログラムをかくことを通して
パソコンの気持ちをわかってあげられる、

そんなことを目指していくサイトです。

  • 2008年03月07日(金)19時19分
Web Diary / Skin : Tototo / Mod : Shinobu Huyugiri