6: 2011-07-02 (土) 10:06:02 sero[6] [7] | 現: 2024-01-08 (月) 12:59:02 lina[8] [9] | ||
---|---|---|---|
Line 20: | Line 20: | ||
- で、作った。ファイル名: input.c | - で、作った。ファイル名: input.c | ||
#include <guigui01.h> | #include <guigui01.h> | ||
+ | |||
void G01Main(void) { | void G01Main(void) { | ||
static const unsigned char cmdusage[] = { | static const unsigned char cmdusage[] = { | ||
Line 29: | Line 29: | ||
char * const p0 = g01_bss1a1, *p = p0; | char * const p0 = g01_bss1a1, *p = p0; | ||
int flag = 0; | int flag = 0; | ||
+ | |||
g01_setcmdlin(cmdusage); | g01_setcmdlin(cmdusage); | ||
+ | |||
for (;;) { | for (;;) { | ||
int c = jg01_inkey3(); | int c = jg01_inkey3(); | ||
Line 37: | Line 37: | ||
c = '\n'; | c = '\n'; | ||
g01_putc(c); | g01_putc(c); | ||
+ | |||
if (!flag) { | if (!flag) { | ||
if (c == 'q') | if (c == 'q') | ||
Line 52: | Line 52: | ||
} | } | ||
*p = '\0'; | *p = '\0'; | ||
+ | |||
g01_getcmdlin_fopen_s_3_5(0); | g01_getcmdlin_fopen_s_3_5(0); | ||
jg01_fwrite1f_5(p - p0, p0); | jg01_fwrite1f_5(p - p0, p0); | ||
Line 60: | Line 60: | ||
- まとめ:hidetol_8 + ソースの入力ツールinput.g01 を使ってnaskで開発ができる。 | - まとめ:hidetol_8 + ソースの入力ツールinput.g01 を使ってnaskで開発ができる。 | ||
+ | |||
+ | ** g01-computer? [#ebba0f54] | ||
+ | - (概念的な話なのでこの節は読み飛ばし可) | ||
+ | - 想像してみよう。あなたのPC(Windows/Linux)から通信のケーブルが伸びている。その先には5インチHDDくらいの大きさの黒い箱がつながっていて、上面には"g01-computer"と刻印がある。 | ||
+ | - この箱はコンピュータでありx86のCPUを積んでいることはほぼ確実だが、その他のハードウェア構成は不明である。あるプロトコルに基づいてPCと接続されていることも分かっている。 | ||
+ | - PCでefg(あるいはhijk)を起動すると、指定されたプログラムがg01-computerで実行される。 | ||
+ | -- (何らかの方法でPCとg01-computerはストレージを共有している、すなわちファイルは自由に読み書きできると仮定する) | ||
+ | - つまり、「efgはg01プログラムの実行環境(仮想マシン)である」という通常の解釈のほかに「efgは接続された架空のコンピュータの端末エミュレータである」という解釈もできるわけだ。 | ||
+ | - この企画が実現しようとしているのは、後者の解釈における架空のコンピュータ"g01-computer"上での''セルフ開発''である。 | ||
+ | - このコンピュータ用のアセンブラとリンカがすでに作成されているのだから、あとは端末からの入力をそのままファイルに書き出すプログラムがそのコンピュータ上で動けば(理論上)セルフ開発が実現できる。 | ||
** Getting started [#c8332d6f] | ** Getting started [#c8332d6f] | ||
Line 74: | Line 84: | ||
- 実行 | - 実行 | ||
../z_tools/hijk hello | ../z_tools/hijk hello | ||
+ | |||
+ | ** ラインエディタ → 中止 [#j2a9ff6f] | ||
+ | - 最小限のツールセット(上記)でもプログラムが作れることは実証できた。 | ||
+ | - しかし、ミスタイプがあるたびに入力を最初からやり直すことは、ある程度以上の規模のプログラムにおいて、現実的でない。そしてこの規模の限界は相当小さい。 | ||
+ | -- hello, worldくらいならともかくも、入力のやり直し中にさらにミスタイプすることは十分に起こりえる、というか起きないほうがおかしい。 | ||
+ | - (ミスタイプのたびに入力をやり直すなんてパンチカード・紙テープの時代みたいだ) | ||
+ | - だから、実際の開発ではテキストの編集操作が行えるテキストエディタが必要となる。 | ||
+ | - ところで、この企画はセルフ開発がテーマだった。だからこのテキストエディタもg01プログラムとして作成する必要があるし、その上、''作成に使える道具は最小限のツールセットだけ''だ。 | ||
+ | - 上で述べたことから、テキストエディタの作成自体もそれなりに困難な作業になってしまうので、できるだけ簡単に作れるエディタが望ましい。 | ||
+ | |||
+ | - じゃあ仕様から。テキストの編集は行を追加・削除することで行う。つまり作成するエディタはラインエディタとなる。 | ||
+ | - これ以外の機能は持たせない。つまり、起動すると新規ファイルを作成する→行を追加していく→間違えた行を削除し正しい行を追加する→終了時にファイルに書き込む、という入力作業になる。 | ||
+ | |||
+ | - と、2010-07-01の昼頃からこの仕様を考えた。これから、紙の上でnaskプログラムを作成する。 | ||
+ | |||
+ | - プログラム作成の手順は次のようにすることを考えた。 | ||
+ | ++ まず、"_G01Main: ret"という何もしないプログラムを作成する。 | ||
+ | ++ これに、機能をひとつ付け加えたプログラムを紙の上で作る。 | ||
+ | ++ 元のプログラムをcpy.g01でバックアップし、input.g01で新しいプログラムを入力する。 | ||
+ | ++ 動作を確認し、次の機能の作成に移る。 | ||
+ | ++ 以上を、プログラムが完成するまで繰り返す。 | ||
+ | - この手順だと、書くべきプログラムの量は増えるが、全体を一気に入力する方法に比べてデバッグがやりやすいと考えた。 | ||
+ | |||
+ | - 2011-07-13現在、上の手順を2回繰り返し、コマンドラインパラメータの定義と、入力ファイルを開き(デバッグ用に)そのまま出力する機能が実装された。 | ||
+ | -- &ref(lineedit.nas); | ||
+ | - この時点でプログラムは607バイトあり、この入力に約5回タイプミスをしてやり直した。 | ||
+ | - 手元にラインエディタ全体で約2.5KBを下回ることはないという見積もりがあるので、プログラムの長さはこの約4倍以上になる。 | ||
+ | - 簡単な計算によりこのプログラム全体をタイプミス無しに入力できるまでのやり直し回数の期待値は600回余りとなる。 | ||
+ | - これは(不可能でないまでも)現実的な値でないので、もっと短いプログラムでソースコードの入力支援を行う必要があると結論し、ラインエディタの作成を中止した。 | ||
- まだ未完成。進展があったら更新。 | - まだ未完成。進展があったら更新。 | ||
+ | |||
+ | ** 展望 [#za6ea769] | ||
+ | - この企画でやってみたいことの列挙 | ||
+ | :: Hello, world | GUIGUI01によるセルフ開発が可能であることの実証 (完了) | ||
+ | :: ラインエディタ | テキストデータの入力支援 | ||
+ | :: (詳細未定) | プログラムの入力支援 | ||
** コメント欄 [#yd6c8bdd] | ** コメント欄 [#yd6c8bdd] | ||
- おもしろそう! -- ''k-tan'' &new{2011-07-01 (金) 09:18:22}; | - おもしろそう! -- ''k-tan'' &new{2011-07-01 (金) 09:18:22}; | ||
+ | - なるほど、確かに外部プログラム起動の機能はほしいですね。 -- ''k-tan'' &new{2011-07-04 (月) 07:29:45}; | ||
#comment | #comment |
(This host) = http://osask.net