こんばんは、川合です。 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/