しいしせねっと Amazon.co.jp アソシエイト
[技術資料室]
[オブジェクト指向編]

プログラミング基本編

Last update

このページの目次


デザインパターンって

APIを使うためには、それぞれのAPIがどのように使われるために作られているかを知らなければなりません。
これは、あとの方で重要になってきます。
最近は、いろいろと本も見かけるようになりましたね。
でも、本で書かれているデザインパターンは、再利用のためのデザインパターンという場合が多いです。ただひたすら抽象化について書かれているように感じました。そういうのは、ふつーのプログラム作るときにはあんまり知らなくてもいいように思うのです。

言語はどこから入門すればいいのか

Last update 2002.9.3

プログラミングをはじめたいという人は、どこからはじめればいいのかまず迷うようです。
昔は、雑誌に掲載されていたプログラムを入力する等々、いろいろ覚えられる機会もあったのですが、Windowsでは基本的にプログラム公開は困難で、フリーソフトでもソースコードはあまり公開されてきませんでした。
Linux等々でも、ソースコードはありますが、./configureと makeだけで大抵済んでしまうので、ソースコードを眺める機会はますます減ってしまいました。

  1. 基本的な動作を知る(各言語で共通)
  2. 言語を決める
  3. 言語仕様に詳しくなる
  4. 基本APIを知る
  5. アルゴリズムを使えるようになる(APIを作る)
  6. 目的を決める
  7. 目的別のAPIやアルゴリズムを調べる

どの言語を使うのか決めてみる。
昔は、BASICしかなかったので、BASICから覚えていったものですが、今は、多種多様な言語があり、どこから覚えればいいかはなかなか決められないかもしれません。
基本的には、C言語やJavaからでいいのではないかなぁと思います。
いきなりC言語からはじめるのは難しいところもありますが、なんとかなる・・・でしょう。
Javaの場合、Applet、アプリケーション、Sevlet の3パターンがあります。どこからはじめてもいいのですが、目的にあったところからはじめましょう。最近はAppletはあんまり使われていないのと、自由度はアプリケーションの方が幅広いので、アプリケーションからでもいいかもしれず。違いから調べてみてもいいのでしょうね。

Javaで入門するとして・・・PCが、ソフトウェアがいろいろあって、いろいろなことができるのと同じように、Javaにもいろいろな機能があります。まずは、自分で使いたい機能があるかどうか、また、言語の基本機能を使ってみるところからはじめてみるのがいいのではないでしょうか。
その前に、開発環境をそろえなければいけませんが、java.sun.com から J2SDKをダウンロードしてインストールしてしまいます。環境変数等、いろいろ設定しなければならない部分も少しだけあります。

書籍・雑誌を買ってみる?
書籍は、全くなにもわからないところから、なんとなくわかるようになるのに必要でしょうか。
あった方がいいです。でも、入門と書かれていてもあんまりよくないものもありますから、2〜3冊は読んでみる覚悟でいたほうがいいです。プログラミング系の雑誌等あれば、まずはそこから定期的に講読してみるのもおすすめかもしれません。Cマガジンとか・・・ん・・・Software Design はもうちょっとあとからでも・・・。Java Pressは難しいかな。最近はJava等のプログラム系雑誌もいろいろあります。日経ソフトウェア? あれはちょっとちがうけど。

で、とりあえずはじめる?
どんな事ができるのか知ってみるのがいいでしょうね。
Javaなら、テスト用のクラスを1つ用意して、main関数の中だけで書き書きできればいいです。
まだまだクラスとかそういうのはあとから覚えましょう・・・って、まぁ、プログラムというのは、ディスク上に記録されていて、メモリ上に読み込まれてCPUで実行されるという基本的な原理は知ってる・・・かな。そのへんから知っていると、あとからより詳しいプログラムが書けるようになるのだけど。知っているということで・・・前提。知ってて。お願い。これはまた別の機会に書く・・・お気軽にリクエストくださりませ。

動作は常に確かめること
読むだけでは、まず使えるようになりません。1つ1つの例題などを、自分で書いてみて、作ってみて、実行してみて、うまく動かない場合はどういうときなのか、という失敗のパターンも知っておかなければいけません。
入門書は、読むだけではだめで、実行してみるべきです。
準備する/設計する -> 書く(作る/コーディング) -> コンパイル -> 実行 -> 修正(デバッグ)
最初は、設計と、コードを書く段階をいっしょにしてもいいですし、コンパイル、実行、修正までを何回も何回も繰り返していくことで、よいプログラムができあがっていきます。

目標を決める?
現存する仕様に忠実なプログラムを作ってみることをひとつの目標にしてみるといいかもしれません。それができると、次はそれを改造したくなってきたりします。

今自分がなにをしようとしているか、常に意識する事
1つ1つのステップを経てプログラミングができることは重要なのですが、あまりにこまかな部分に目を向けてしまうと、最終的になにがやりたかったのかを忘れてしまいがちです。時々は、自分がやるべきものの全体像を思い出すようにしましょう。

ためしてみる

必要な知識
開発ツールの使い方(ここでは各ツールの使い方は省略しています)

とりあえずプログラムはこんな感じでさくっと作ってみましょう。コンパイル方法等は省略。コンソール(コマンドプロンプト、DOS窓等等)の使い方は知っておきましょう。

public class Hello {
public static void main(String[] argv) {
System.out.println("Hello, world.");
}
}
Hello.java

プログラムは、OSによってメモリ上に読み込まれて、OSが読み込んだプログラムの開始地点から実行してちょといってくれます。ここんところももうちょっと詳しくみるといろいろあるのだけれど、とりあえず今は難しくないように略します。Java や C言語では main というところ(C言語では関数、C++/Javaではメソッドという)から実行をはじめてくれるように準備してくれます。基本的には、どの言語でもmain やプログラムの最初の行から実行していってくれます。(VC++のMFCアプリケーションでもそれらしいところがあります。Applet では init() だったりします。)
このプログラムは、C言語の入門などで定番といってもいいもので、コンパイルして実行すると、コンソール上にHello, world. と表示する単純なプログラムです。System.out.println() というのは、テキストを表示する機能です。他にもウインドウを作ったり、音を鳴らしたりいろいろな機能があり、組み合わせて実行することでプログラムができていきます。
"Hello, world." の部分を"おっはー"とかいろいろ書き換えれば、他のメッセージも表示できます。表示したい文字は、""で囲むというのは、C/Java等々のルールで、各言語の言語仕様というもので決められています。最終的には言語仕様を読めば、どういうプログラミング言語なのかはわかるはずです。入門書のおまけで書かれていたりすることもありますからだいたいわかるようになってからでも探してみましょう。

プログラムの基本的な成り立ちのひとつ、プログラムはひとまずこれくらいにしておいて、次はデータへとまいりましょう。
プログラムは、プログラムのコードとデータに分かれているのです。という説明も入れておきましょか?

次は、変数、計算編かな

このプログラム、Hello, world. 以外のことを表示しようとすると、毎回プログラムの"Hello, world."の部分を書き換えて、実行しなければなりませぬ。というわけで、他のメッセージを表示できるように…。

メモメモ
その次は関数か。関数の前に変数の概念は必要です。
FIFOとかLIFO とか、スタックとかレジスタも、はやめに・・・。
さらに次は構造体で、クラス、オブジェクト? その前に分岐か・・・。
さらにさらにプロセスとスレッドといろいろ・・・。
先は長い。

言語的基本機能

Last update 2002.09.03

今日は、ループや分岐処理についてみてみましょうかということで、ページ分けしてみました。
どの言語でも基本的に同じかなと。
基本的なのは、次のようなものでしょうか。
書式は、Javaの場合です。C言語やC++、phpもほぼ同様です。
例はどの言語でもない抽象的なものです。

if 分岐

書式1 if () { 処理1 } else { 処理2 }
書式2 if (式1) { 処理1 } else if (式2) { 処理2 } else { 処理3 }
書式3 if (式1) if (式2) { 処理1 } else { 処理2 } else { 処理3 }
書式4 if 式 then 処理1 else 処理2 endif (BASICの場合)

の結果が真のとき 処理1が実行され、偽のとき処理2が実行されます。処理2は省略可能です。
式の内容は、java であれば、true(真) か false(偽) 、C言語などでは 0(偽)か0以外(真)ということで判断されます。
このために、式の中での演算がC言語等々でいろいろできるようになっています。下の方にちょこっと書いているブール演算なども参考にしてください。
if 文をぬければ、処理1のあとも処理2のあとも続きの命令が実行されます。
代入(=)と比較演算(==)を間違うことがときどきあったりしてしまいます。
書式2は、if文で式1式2の複数の条件を判定しますが、書式1処理2部分にif 文を記述したのと同じ意味です。
書式3のように書式1処理1にifを追加することもできます。このときは 内側のif 文を{}で囲むようにした方がよいでしょう。そうしないと処理2を省略しても処理3を省略したときの処理のようになってしまいます。処理2は、式2が偽のとき、処理3式1が偽のときに実行されます。

書式1的な例:
if ( a == 100 ) {
 print "100 です";
} else {
 print "100じゃないです";
}
print "ということです"

for ループ

書式1 for (式1; 式2; 式3) { 処理 }
書式2 for 変数 = 開始値 to 終了値 step 間隔 : 処理 : next (BASICの場合)

for 文は、変数を1つ使った一定回数の繰り返しの処理によく使われます。
式1 開始値により変数を初期化します。
式2 終了値は終了条件式です。
式3 間隔は、カウントに使われます。
式1が実行され、式2により条件が評価され、真であれば処理が実行されます。
処理の次に式3が実行され、再び評価されます。
最初に式2が偽になれば、処理は1度も実行されずに次の処理に移ります。

例:
for (i = 0; i < 100; i++) {
print "まわるまわる"; print i
}
print i

問題
ループ後の変数の値は、どうなっているでしょう?

continue と break

continue の場合の動作はどうなるでしょう?

while ループ

書式 while () { 処理 }

for ループを簡単にしたようなものです。
が偽になるまで処理をくりかえします。
最初にが偽のときは処理は一度も実行されません。
処理の中での結果が偽に変わるようにしないと、無限ループになります。

do while ループ

書式 do { 処理 } while ();

while ループの処理の実行/評価順序を逆にしたものです。
最初に処理が実行され、そのあとはじめて式が評価されます。
式が偽のときは、次の処理へ移ります。
処理 while () { 処理 } と同様の動作をします。処理を2度かかなくてもよいのが do while です。
しかし、処理の一部が違う時は、この書き方ができなかったりもします。

switch case 分岐

数値により複数の分岐をするという特殊な分岐処理です。
書式1 switch(整数式) { case 0: 処理0; break; case 1: 処理1: break; case 2: ... default: 処理x; break; }
書式2 on 式 goto アドレス1, アドレス2, ... (BASICの場合)
書式3 on 式 gosub アドレス1, アドレス2, ... (BASICの場合)

整数式の結果によって、複数の処理に分岐する場合に使用します。
if 文の羅列よりすっきりします。
結果 が case x: の xに該当するときは、その処理が実行され、break で switch 文を抜けます。
break がなければ、 次の case まで続けて実行されてしまいます。
どのcase にも該当しない場合は default: の処理xが実行されます。

break; は、if や while の処理ループを抜けて次の処理を実行したい場合でも使う事ができます。
このとき、式は評価されないので偽になる必要はありません。
処理の途中で処理を終え、を評価したい場合は continue が利用できますが、できれば使わないほうがいいかもしれません。

CやJavaでBASICのようなラベル分岐がしたい場合、Javaならリフレクション機能を使った配列、C言語なら関数の配列を利用してみることもできます。

go to と ラベル

書式1 goto 名称
書式2 名称: (Javaの場合) *名称 (F-BASICの場合)

使わない方がよいといわれているgoto について
名称で指定したラベルの位置へ処理を移せるのですが、よほどのことがない限り、あまり使わないでください。使わなければいけないときは、本当に使わなければならないのか再度検討してみましょう。
書式2 はラベルです。
どこにでも置けるわけではないです。
goto を使わないと書けないような処理もありますよ。ほんとは。

switch 文のcase やdefaultもラベルですね。

サブルーチン、関数、メソッド、gosub

いろいろあるのです。
大まかな機能をまとめてサブルーチンにしてしまいましょう的な機能達です。
C言語、C++では関数、C++、Java等のオブジェクトではメソッド、BASICではgosub などなどによるサブルーチンかな。

まずは、ん・・・。
最初のプログラムは main だけがありましたが、複雑なプログラムになってくると、様々な機能を作らなくてはならなくなってきます。機能が多くなってくると、mainだけでは限界があります。mainだけで書く人もいるのですが・・・読みにくいので、よほどのことがない限りやめましょう。ここで登場するのは、サブルーチンと呼ばれるものです。

参考文献
Oh!FM 創刊的な号

サブルーチンとその仕組み

サブルーチンは、main等から、別の機能を呼び出すものです。サブルーチンを多く用意しておくことで、メインの部分のプログラムが作りやすくなります。また、メインから分けることで、各機能の役割がはっきりします。
サブルーチンというのは、プログラムから簡単に呼び出すことのできる機能であり、サブルーチンの処理が終了すると、元のプログラムの続きから実行を続けられるものです。
先程のプログラムでは System.out.println("Hello, world.") という部分がサブルーチンであり、画面に文字を表示するという機能を持っています。システムで用意されているものは、「画面に文字を表示する」という目的と、その文法、簡単な使い方さえ知っていれば、それ以上のことを知っていなくても文字を表示することができます。
これらのサブルーチンを組み合わせることで、多くの機能を持ったソフトウェアを作ることができるようになります。言語にはいろいろなサブルーチンがまとめて標準ライブラリという形で提供されていますが、自分で自由なサブルーチンやライブラリを作成することもできます。

ポイント?
呼び出す側と呼び出される側、この区別が入門段階で区別できない人が多いようです。
例を用意してみる予定。
使う方法と、つくる方法を順番に理解してください。

呼び出す側
 関数を使う事で、呼び出しができます。

呼び出される側
 関数を定義することで、他から呼び出しができるようになります。

C言語では、ヘッダファイルが重要になってきます。

機能的には、
計算に関係するもの(sin cos 等の関数等)
文字列の操作に便利なもの
入出力に関係するもの(キーボード、マウス、ファイル、音声、画面等)
等々、いろいろなものがあります。

もうひとつの分け方

プログラムは、初期化、メイン、終了の3つの処理に分けることができます。
画面の初期化、描画、終了、データの初期化、更新、表示、終了など、各機能を初期化と終了等々に分けておいて、main の中でそれらの機能の初期化処理をまとめて呼び出してやることで、プログラムの開始に必要な処理を1箇所にまとめて書くことができます。

サブルーチンの仕組み(どこへ入れようかな)

サブルーチンを実現しているのは、スタックと呼ばれる構造です。
スタックは、CPUが処理している変数を一時的に保管しておくメモリ上の領域であり、少々特殊な仕組みを持っています。
プログラムは、メモリ中に読み込まれて実行されますが、このときメモリにはアドレスというものが割り振られています。たとえば、1MB(メガバイト) のメモリ中には、0から1048575までの番号が割り振られています。
サブルーチンを呼び出すときには、呼び出す前のプログラム中のアドレスをスタックに記憶させておき、サブルーチンが終了した時点でスタックから元のプログラムのアドレスを読み込んで、そこから続きを実行できるようになっています。スタックは、最後に書き込んだ情報が最初に読み出せるようになっているので、サブルーチンから、さらに別のサブルーチンを呼び出して戻ってくることもできるようになっています。
Java等の言語では、あまり気にする必要はありませんが、アセンブラでもJavaでも、サブルーチンを呼び出す原理は同じです。

サブルーチンと変数

構造化プログラミング と イベントドリブンプログラミング、オブジェクト指向プログラミングん〜、いろいろ概念があるやね・・・。

構造化プログラミング
これを最初にやっておかないといけなかったかな。
プログラムとは、構造化されておるぞというお話。
今まででてきた制御文(if、for、while 等々)とサブルーチンなどが関係して。
構造体とはあんまり関係ない・・・かなぁ。

肝心なのはアルゴリズム
->[アルゴリズム編](予定)

ときにはオブジェクト指向
たとえオブジェクト指向であっても、main はあるので何らかの構造化、サブルーチンという概念はある。Javaも例外ではない。オブジェクトだけで動力源がなくては動きません。
-> [オブジェクト指向編](予定)

システム関数(機能)とユーザ定義関数(機能)

その他の特殊技法

たとえば、C言語では関数を変数に代入することができます。
そして、変数は配列をつくることもできます。
関数の配列をつくることができるので、switch 文のような、もっと効率のよい分岐処理も行えます。
Javaも、リフレクションにより、同様の処理が可能なのです。
オブジェクト指向における、クラス、インターフェイスでも、基本的にはおなじです。クラスは継承することができますから、おなじメソッドに違う機能をもたせることが可能です。ただ、同一オブジェクトのメソッドを動的に変更することはできないので、そのような処理をしたい場合は、工夫する必要はあります。

もうちょっと、こういうところをうまく活用してすっきりしたプログラムを組みたいものですが、わかりにくいということで嫌われる場合もあるようです。


リンクするのか

普段、やっぱり気にしないといけないのかな・・・ソースファイルをコンパイルして、実行ファイルをつくる方法。

Javaは、簡単ですが、C言語などはどうなのでせぅ。
試しに、gcc の場合では、どうなってるのかなと。
ソースファイルは、まず、コンパイルされて、オブジェクトコードになります。この時点では、CPUが理解するコードになっているのですが、アドレス等の情報が半固定だったりします。Java の class ファイルも、これと同じような状態です。
この中間的なファイルをつくるのは、1つ1つのオブジェクトを毎回作っていると時間がかかるので、変更したものだけコンパイルして、残りのものとつなぎ合わせるという意味合いなどがあります。また、複数の違う言語で作っても、おなじオブジェクト形式であれば、いっしょに利用できるのでという意味もあったりします。
で、次に実行できるようにリンクなどします。

gcc -o 実行名 ソース名 -l必要なライブラリ

で、コンパイルもリンクもしてくれる・・・んだったり。


ぱらぱらと書いてみてますが。。

プログラムの基本といえば、書いて、使うことでしょうか。
スクリプト言語や、またまた、いろいろな言語などでは、定義と、実行がありますねぅ。
スクリプト言語だと、この2つが同時というか、順番混ぜ混ぜでされることもあります。そういうところを追いかけてみると、なんとなく納得、とかしてみたり。

FM TOWNS F-BASIC386入門

Last update 1999.8.14

F-BASIC386は、富士通FM TOWNS用の 32ビット BASIC言語です。
ビデオ取り込み・出力や動画、ゲームのキャラクタ処理、MIDI、などなどいろんなことができてしまいます。

初級省略
画面からはじめましょう
線を引く、色を塗る、キャラクターを作ってアニメーションさせる。
アイデアさえあれば、どんな言語でもどんなOSでもソフトは作る事ができます。
まずは画面上に絵を書き上げるプログラムを作りましょう。
TOWNSは、画面を2枚重ね合わせることができます。
一枚を32768色低解像度(320*240)、もう一枚を16色(640*480)としておけば、多色画面の上に普通サイズの文字をのせることもできます。F-BASIC386の画面モードは、TOWNSの3つの画面モードをサポートしています。
ここでは色数が多くて複雑なことを考えなくてもよい32768色画面を使います。

スプライトを使う

F-BASICのスプライト命令は多少複雑で、どこからはじめてよいのかわかりにくいものです。
まずはスプライトの仕組みを理解しなければなりません。

スプライトRAMは、3種類の領域があります。
スプライトの画像を保存するパターンエリア、どのパターンを画面上のどの位置に表示するかという情報のキャラクタエリア、16色スプライトのパレットを保存するパレットエリア。
16色スプライトを使えばメモリは節約でき、多くのキャラクタパターンを定義できるのですが、今回は32768色で使います。
DirectXなどの入門書のほとんどは、こんな感じで一部のモードだけ紹介して、DirectXのすべてを知っているかのように書いているので、困ったものですが。ということで、16色の使い方もフォローしなければ。
(TOWNSの)スプライトは、1パターンの大きさが、16*16ドットです。このパターンを、32768色の場合は224個(だと思う)定義できます。

ビデオ・ディジタイズ

ビデオ入力を、VRAM上に取り込みます。
加工するのが楽しい。

スーパーインポーズ?

ビデオの画面の上に、キャラクタなどを合成します。
合成した映像は、そのままビデオ出力されます。

これらは、Windowsではなかなかできないことです。

FM TOWNS High C Compiler

last update 2000.1.23
スプライト使いますか?
入門編・ツール編・ゲーム編・その他

パレットエリア
キャラクタエリア
パターンエリア
スプライトメモリって、こんなになってたかな・・・。

ハードウェアスクロールのさざ波

TOWNSで利用可能なのは、ハードウェアスクロールです。
いくつかのユーザ作のRPG等では、スプライトを画面一面に並べてスクロールなどしているようですが、ハードウェアのスクロールを使う方がはるかに楽だったりします。

ビデオ合成のいろいろ

ビデオ入力と画面を合成するのは、やっぱり楽しい。


コンピュータの内部、2進数、16進数

Last update 2001.12.21

Intel x86 CPUの内部

リアルモードとプロテクトモードがあります。

Get Thunderbird


[しいしせねっと]