[OSASK 6485] test047.

  こんばんは、川合です。

  test046とtest047をベータリリースしました。

  test046はtest013(未公開)のマイナーチェンジ版で、XORでlineを
引いて、模様を描くだけです。これはあまり説明は要らないでしょう。

  test047は、sprintf()(というかcprintf()になっていますが)のサ
ンプルです。サンプルのみならず、OSASKの今までのライブラリが再編
されています。strncmp()もGOを作るときにバグフィクスしたので、バ
グフィクス版が入っています。

  今までは.libファイルがいくつもありましたが、これを2つに再編し
ました。OS(API)に依存するgg00libc.lib、そしてOSには依存しない
(コンパイラだけに依存する)golibc.libです。

  さらにGOのときに作ったライブラリから、以下を持ってきました。

  <stdio.h>
    sprintf()   %s と %d のみサポート
    vsprintf()

  <stdlib.h>
    abs()
    qsort()
    strtol()
    strtoul()

  <stddef.h>
    size_t

  <stdarg.h>
    va_start()
    va_end
    va_arg
    va_copy()
    va_list

  <setjmp.h>
    setjmp()
    longjmp()  valは1しか渡せません、たぶん

  <math.h>
    ldexp()
    frexp()

  <limits.h>
    たぶんフルセット

  <float.h>
    たぶんフルセット

  <errno.h>
    errno

  これらはOSに依存しない関数なので、簡単に持ってこられました。そ
れで、test047では、sprintf()を使って(というかvsprintf()を使って
)、cprintf()を作りました。

  この新しいライブラリは、guigui00.rulの変更をしないと利用できま
せんが、しかしソースやMakefileを変更する必要はありません。完全上
位互換です。・・・この新ライブラリにバグがなければ、の話ですが。

  さてこれがなぜ正式版ではなくtestのおまけなのかというと、作り直
したライブラリのテストをほとんどしていない上に、lib_putstringg0
などの書き加えるべき新関数を書き加えていないからです。テストをし
て書き加えたら、正式にリリースして、introaにもバンドルする予定で
す。

  まあとにかく、cprintf()で遊ぶことはできます。


FORM-Akkie さんは 2003/09/24 11:42:53 の「[OSASK 6483] FORM: Re:
 要望になってしまいますが」で書きました:

>お名前: ベイサイド

>... の部分さえ実装していただければあとは自分でなんとかします。

  これはですね、<stdarg.h>を使えば(NASK等に手を染めなくても)OK
だったのですが、まあGOの<stdarg.h>がそのまま使えるというのはご存
じなかったかもしれませんね・・・。これからはintroaにバンドルされ
る予定なので、この問題は解決するでしょう。

(sprintf()を)
>乱用する人はいるでしょうね(笑)
>
>ライブラリーをどれだけ小さく作れるが腕の見せ所でしょうか。

  いや、そうともいえません。僕は常々、ANSI-Cの標準ライブラリは駄
目なライブラリだと思っているので(確かにprintf族は便利です。問題
はfreadやfwriteなどで、標準ライブラリではメモリマップトファイル
を生かしにくい関数構成になっています。どんなOSでもメモリマップト
ファイルのほうが速いのに、です。だからこのライブラリを使う限り、
性能的には二流のプログラムしか書けません。移植性は高まりますが)
、OSASKではそもそもANSI-Cのライブラリを書きやすくするための配慮
をしていません。だからライブラリはあまり小さくならないでしょう。

  僕は、標準ライブラリを積極的に使ったプログラムを「ダメプログラ
ム」だと思っていますから、そのダメプログラムのために良いライブラ
リを作る気はほとんどなくて、まあ動けばいいや、程度です。標準ライ
ブラリを使って作っている時点で「小さくする気はない&速くする気は
ない」と言っているようなものかと。

  標準ライブラリは、入出力がしょぼいだけで、そのほかのところはそ
れほど悪くないです(というかいいものもあります)。だから、その辺
は利用してもいいと思いますし、ライブラリを小さくする努力はやるつ
もりです。

>初心者がHello Worldを試すために使うなら許されるのではないかと。
>どっちみちグラフィックアプリを作るならguigui00.libに頼るしかないわけですから。
>それでも質のよいコンソールゲーム(RPG,ADV)が出てくる可能性はあります。

  いやー、それでもprintf()を使わないほうが効率がいいんですけどね
え。printf()はただコンソールにだらだらと流すには悪くない関数です
が、表示位置やカラーを変更するにはエスケープシーケンスを使わなき
ゃいけないとか、そういう事があるわけです。

  最初にprintf()でスタートすると、たいていはそれを引きずります。
画面を消去するには、'\n'を30個くらい表示すればいいやとか、そうい
う発想になります。カラーを変更するのはエスケープシーケンスで、カ
ーソル移動もエスケープシーケンス。こんなのを相手にするためにcput
s()はエスケープシーケンス対応になったりすると思いますが、これは
非常にばかばかしい状況です。

  '\n'を30回表示するということは、全画面更新を30回もやることにな
ります。カーソルを左上に戻して、スペースで埋め尽くせば、負荷は
1/30で済みます。また、カーソル位置をエスケープシーケンスで表現す
るためにprintf()の%dを使って苦労して10進数文字列化し、それをcput
sのエスケープシーケンス読解ルーチンがせっせとバイナリに戻して、
しかるべき処理をするわけです。カラーコードも同じです。

  ・・・こんな無駄をやって楽しいでしょうか。ネットワークを通さな
きゃいけないとか、ファイルに保存しなきゃいけないというなら分かり
ますが、そんなのは通さなきゃいけないときにOSがやってあげればいい
ことです。アプリが常にやることではありません。僕はそう思います。
このせいでネットワーク越しでもないのにエディタの反応が悪かったり
するわけです。

  printf()でプログラムの書き進めた後で、ああこれは愚かだと気が付
いても、たいていは書き直しません。めんどくさいですからね。それが
心配です。printf()がなまじっか便利なだけに、なおさらなんです。

  だから僕の今の方針では、最初からlib_〜というAPI関数をいきなり
やるわけです。最初の障壁は確かにありますが、これしかないと言われ
れば、まあしぶしぶやるわけです。それで、そのまま着々と上達してゲ
ームを作ってくれたりするわけですが、それはみんな、小さくて速くて
無駄が少なくて、とてもOSASKらしいソフトウェアなわけです。

>そうなんです。デバッグのときに使いたいんです。
>現在でもコンソールなし版Wabaはコンソールあり版Wabaよりちょっと小さいですしね。
>
>int a = 10;
>char* b = "hoge";
>cputs("a = ", stdout);
>cputs(setdec(a));
>cputs(", b = ", stdout);
>cputs(b);
>cputs("\n");
>
>と書かなきゃいけないものが、
>
>printf("a = %d, b = %s\n, a, b);
>
>となると涙がでるほど嬉しいんですよ。

  そんな僕でしたが、この説明には心打たれるものがあり、ああ、ベイ
サイドさんのためにGOに作ったやつを持ってこようかな、と思ってしま
いました。Wabaの場合、本当にデバッグにしか使わなそうですもんね・
・・。

  ということで、test047に至るわけです。

  僕の今後の方針としては、sprintf()などは提供するが、introaなど
最初のほうでは絶対に説明しない、という方針で行きたいと思います。
introeあたりで、ちょこっとでてくるとか、そんな感じで。デバッグに
使うと便利だねーってことで。

>Wabaのエンジンはできるだけ効率を重視したいと思っていますが、Wabaで動くアプリは
>できるだけ楽をしたいというのが本音です。そのために私は一生懸命Wabaを作ってます。

  それは非常に理にかなっていると思います。

  WabaのエンジンはOSASKアプリですから、効率を重視していただける
と非常に嬉しいです。そしてWabaアプリは、プラットフォームを選ばな
いで実行できることが最大の特徴なのですから(=つまり、効率が特徴
ではないのですから)、それほど効率にこだわる必要はないでしょう。
効率が必要なら、Wabaアプリとしてではなく、OSASKアプリとして作れ
ばいいわけです。


  それでは。

--
    川合 秀実(KAWAI Hidemi)
OSASK計画代表 / システム設計開発担当
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/

ML番号でジャンプ
ML単語検索