Last update
このページの目次
APIを使うためには、それぞれのAPIがどのように使われるために作られているかを知らなければなりません。
これは、あとの方で重要になってきます。
最近は、いろいろと本も見かけるようになりましたね。
でも、本で書かれているデザインパターンは、再利用のためのデザインパターンという場合が多いです。ただひたすら抽象化について書かれているように感じました。そういうのは、ふつーのプログラム作るときにはあんまり知らなくてもいいように思うのです。
Last update 2002.9.3
プログラミングをはじめたいという人は、どこからはじめればいいのかまず迷うようです。
昔は、雑誌に掲載されていたプログラムを入力する等々、いろいろ覚えられる機会もあったのですが、Windowsでは基本的にプログラム公開は困難で、フリーソフトでもソースコードはあまり公開されてきませんでした。
Linux等々でも、ソースコードはありますが、./configureと
makeだけで大抵済んでしまうので、ソースコードを眺める機会はますます減ってしまいました。
どの言語を使うのか決めてみる。
昔は、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 |
Last update 2002.09.03
今日は、ループや分岐処理についてみてみましょうかということで、ページ分けしてみました。
どの言語でも基本的に同じかなと。
基本的なのは、次のようなものでしょうか。
書式は、Javaの場合です。C言語やC++、phpもほぼ同様です。
例はどの言語でもない抽象的なものです。
書式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 "ということです"
書式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
問題
ループ後の変数の値は、どうなっているでしょう?
書式1 goto 名称
書式2 名称: (Javaの場合) *名称 (F-BASICの場合)
使わない方がよいといわれているgoto について
名称で指定したラベルの位置へ処理を移せるのですが、よほどのことがない限り、あまり使わないでください。使わなければいけないときは、本当に使わなければならないのか再度検討してみましょう。
書式2 はラベルです。
どこにでも置けるわけではないです。
goto を使わないと書けないような処理もありますよ。ほんとは。
switch 文のcase やdefaultもラベルですね。
いろいろあるのです。
大まかな機能をまとめてサブルーチンにしてしまいましょう的な機能達です。
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必要なライブラリ
で、コンパイルもリンクもしてくれる・・・んだったり。
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ではなかなかできないことです。
スプライト使いますか?
入門編・ツール編・ゲーム編・その他
スプライトメモリって、こんなになってたかな・・・。
パレットエリア キャラクタエリア パターンエリア ハードウェアスクロールのさざ波
TOWNSで利用可能なのは、ハードウェアスクロールです。
いくつかのユーザ作のRPG等では、スプライトを画面一面に並べてスクロールなどしているようですが、ハードウェアのスクロールを使う方がはるかに楽だったりします。ビデオ合成のいろいろ
ビデオ入力と画面を合成するのは、やっぱり楽しい。
Last update 2001.12.21
HEXって、16進数のこと、2進数はbinっていうこともあるかな?
コンピュータの中はすべて2進数ですべて0か1なんて言ってるけど、あれは半分ほんとで半分どうかな?って思うところがあるので気にしないでおこう。人間は、細胞や原子からできていると言っているのと同じ程度のもので、知らなくても使える。数値ではなく、データの固まりとしてしか処理されていないかもしれない。
日常で、お金の計算とかに普段使っているのは十進数と呼ばれる0〜9の数字を使うもの。
二進数というのは、数字に0と1しか使えない。それだけの違いなんだけど、1の次が10(「じゅう」と読まずに「いちぜろ」と読もう)になる。
十進数の9の次が10と同じように、二進数は1の次が10なのだ。二進数の10は、十進数の2と同じ意味、大きさを持つ。
2進数とブール演算
約1年ぶりにこんなところを更新する。
ブール演算というのは、コンピュータ内部でされる基本的な計算方法である。トランジスタやIC、LSIなんかが、この処理を膨大な数繰り返し繰り返し行っているわけだ。
ブール演算には、and、or、xor、not の4つがある。基本的なのはこれだけかな。桁上がりなんかはこれらを組み合わせて作ってあげないとありません。
| bit a | 0 | 0 | 1 | 1 |
| bit b | 0 | 1 | 0 | 1 |
| a and b | 0 | 0 | 0 | 1 |
| bit a | 0 | 0 | 1 | 1 |
| bit b | 0 | 1 | 0 | 1 |
| a or b | 0 | 1 | 1 | 1 |
| bit a | 0 | 1 |
| not a | 1 | 0 |
| bit a | 0 | 0 | 1 | 1 |
| bit b | 0 | 1 | 0 | 1 |
| a xor b | 0 | 1 | 1 | 0 |
| bit a | 0 | 0 | 1 | 1 | javaでの演算子 | |
| bit b | 0 | 1 | 0 | 1 | boolean型 | 整数型 |
| a and b = | 0 | 0 | 0 | 1 | && | & |
| a or b = | 0 | 1 | 1 | 1 | || | | |
| a xor b = | 0 | 1 | 1 | 0 | なし? | ^ |
| not a = | 1 | 1 | 0 | 0 | ! | ~ |
こんな表でわかるかな? 縦に見てください。 a と b を処理した結果が、計算結果になります。
たとえば、andの例では、左から 0 and 0 = 0、 0 and 1 = 0、 1 and 0 = 0、 1 and 1 = 1
というようになります。
a と b に c を加えてみても、同じです。
| bit a | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
| bit b | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 |
| bit c | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
| a and b and c | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
a,b,cのすべてのビットが1のときだけ、答えが1になります。これは、(a and b) and c という2つの計算の組み合わせでできます。
と、あまり続いていないので、80386リアルモードハンド逆アセンブル用資料を公開してしまう。
使い込んでいるが、たぶん、読みこなすのは難しいであろう・・・。
プロテクトモード用も、あるにはある。探してみれば?
起動する
BIOSがディスクを探して読み込んだら、読み込まれたプログラムは、OSを読み込み始める。
読み込まれたOSは、順番に実行されていくが、順番に実行されない場合というのがある。
タイムシェアリングシステム
と呼ばれるものは、CPUを複数のプログラムが時間を細かく区切って利用する。
Windows95/98などは、完全なタイムシェアリングシステムではないようだが、Linuxなどは、時間で区切って利用するので、どのソフトも他のソフトの動きにほとんど影響されずに動くはずである。
時間を区切っているのは、CPUではなく、タイマー用のハードウェアである。CPUは、どうやって、プログラム実行中に、タイマーからの通知を受け取るのだろうか。
CPUには、IRQという外部からの通知で、プログラムを一時的に中止して、登録された他の処理を実行できる機能を持っている。タイマーからの通知も、この機能を使って処理される。
リアルモードとプロテクトモードがあります。