Gauche:Windows/VC++:log:old_2005

Gauche:Windows/VC++:log:old_2005

0.8.3 移植第3版

千代郎(2005/05/28 11:19:13 PDT)
〜おくればせながら、この版を、らむ太くんお誕生のお祝いとして捧げます〜

とりあえず、バイナリ版のみ公開します。

オリジナル版のライセンスに従い配布しています:

LGPLのもと配布しています(第2版と同じものです):

全て、http://www.geocities.jp/chiyorou2005/Gauche/ に置いています。

著作権情報については、各アーカイブの文書を参照してください。

主な進展

テスト状況

○=pass, 成功
△=途中でエラー

ライブラリ(.scm)
system.scm △ selector.scm △ www.scm △ logger.scm △ process.scm △ load.scm ○ file.scm ○ rfc.scm ○ srfi.scm ○ io.scm ○ primsyn.scm ○ error.scm ○ module.scm ○ macro.scm ○ number.scm ○ string.scm ○ keyword.scm ○ hash.scm ○ procedure.scm ○ dynwind.scm ○ object.scm ○ exception.scm ○ colseq.scm ○ regexp.scm ○ mb-chars ○ parseopt.scm ○ parameter.scm ○ hook.scm ○ text.scm ○ gettext.scm ○ util.scm ○ match.scm ○ io2.scm ○ version.scm ○ listener.scm ○

外部ライブラリ(.DLL)
auxsys △ uvector ○ binary ○ vport ○ mt-random ○ charconv ○ digest ○ sxml ○ dbm(dbm.gdbmのみ)○

最初にくらべ、だいぶましになりましたが、手ごわいのが残ってきました...。あとは、process.scm がなんとかパスできるかもしれません。selector.scm は、最後まで無理でしょう。外部ライブラリは、net が移植可能かも。


ヘルプ・ファイルとの連携

千代郎(2005/05/28 11:19:13 PDT)
 VC++版 最新版では、Gaucheヘルプ・ファイルを利用できます。

はじめに

 Gaucheに慣れ親しむ上で、リファレンスが引きやすいかどうかは、(私を含め)初心者にとって大きな問題です。 Gaucheには、info という interactive モードで使える関数があり、シンボルを引数にすることで、 INFOファイルの該当箇所を表示させることが出来ます。Windows環境でも、INFOファイルがビルドされて いれば、この機能を使うことができます(VC++版では、移植されていません)。

しかし、Windows使用者にとっては、ヘルプ・ファイルのほうが、馴染みがあります。 そこで、info関数と同じように簡単に、HTMLヘルプ・ファイルを利用できる、win-info 関数を作成しました。 この関数は、内部で、HtmlHelp() API を用います。HtmlHelp() API は、HH_KEYWORD_LOOKUPコマンド付きで呼ぶことで、キーワードの検索から表示までを全てやってくれます。

以下では、win-info 関数によって、 Gaucheリファレンス(HTMLヘルプ版)を使う方法を説明します。

ヘルプ・ファイルの準備

 まず、ヘルプ・ファイルを用意します。既存のものでは、ささださんが公開されているものがあり、仕上がりが美しいのでお薦めです(入手法は、Gauche-devel-jp アーカイブを参照してください→http://lists.sourceforge.jp/mailman/archives/gauche-devel-jp/2004-July/001008.html )。

こだわりのある方は、gauche-ref.texi などから、texi2html + HTML Help Workshop で自作してもよいです。 ただし、HTMLファイルの文字コードを(日本語の場合は) Shift_JIS で作成するなど、それなりに設定を行ってやらないと、HTML Help Workshop がすぐにハングします(かなり出来が悪いです)。また、HtmlHelp() API からキーワードとして検索できるためには、検索したいシンボル名が、HTMLヘルプ・ファイルでキーワードとして登録されている必要があります。

もちろん、ヘルプ・ファイルとして用意するのは、英語版/日本語版のどちらでも構いません。

※texi2html: http://www.nongnu.org/texi2html/
※HTML Help Workshop: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/htmlhelp/html/hwMicrosoftHTMLHelpDownloads.asp

ヘルプ・ファイルのインストール

 Gauch-0.8.3w/doc ディレクトリ(libgauche.dll からの相対位置を用い、gauche-config --infodir の値は無視します)に、ファイル名を "gauche-ref.chm" としてコピーしてください。

win-info

 用意したヘルプ・ファイルを Gauche から利用するために、win-info 関数を用意しています(移植第3版以降)。

Function: win-info symbol

シンボルが見つかった場合には、該当ページを表示し、#tを返します。 見つからなかった場合には、#f を返します。ヘルプ・ファイル自体が見つからない場合には、どのようなキーワードに対しても、#f が返ります。

使用例:

gosh> (win-info 'apropos) ;; 使い始めに、ヘルプ・ファイルが開く。
#t
gosh> (win-info 'srfi-1) ;; 別の項目に移る。... 以下同様。
#t

;; この間に、ヘルプ・ウィンドウを手動で閉じなければ、

gosh> (exit) ;; gosh の終了とともに、閉じる。

最後に

 この関数は、現在は、Scm_Init_winlib() で登録されるようになっていますが、このような機能が言語のコアにあるのは変なので、将来的には、gauche.interactive.win-info など、ライブラリへ切り分けるべきでしょう。


time

 Gaucheでは、全ての環境には対応していませんが、time マクロ(gauche.time モジュールで定義)が提供されており、関数の実行時間を測定することが出来ます。しかし、この便利なマクロは、内部で sys-gettimeofday および sys-times を使用するため、これまで、VC++版では使うことができませんでした。

今回、これを、高精度タイマー QueryPerformanceCounter() WinAPI および、GetProcessTimes() WinAPI を利用して使えるようにしました。

まず、WinAPI へのインターフェースを winlib.stub に追加しました。

Function: win-query-performance-counter

高精度カウンタのカウント数(システム起動時からの値)を <uint64> で返す。

Function: win-query-performance-frequency

高精度カウンタの周波数(1秒あたりのカウント数)を <uint64> で返す。

Function: win-get-times

カレント・プロセスに関する経過時間を取得する。戻り値は、 リスト (ユーザー時間 システム時間 時間解像度) である。値は全て、<uint64>。

そして、これらを用いて、lib/gauche/time.scm の time マクロを書き換えました。

使用例:

(define (tarai x y z)
     (if (<= x y)
          y
          (tarai (tarai (- x 1) y z)
                 (tarai (- y 1) z x)
                 (tarai (- z 1) x y))))
(use gauche.time)
(time (tarai 12 6 0))
=>
;(time (tarai 12 6 0))
; real   3.380
; user   3.355
; sys    0.000
12

測定ごっこ

 time マクロが使えるようになったので、興味本位で (tarai 12 6 0) の実行時間を比較してみました。 現在手元の環境で使える Gauche 0.8.3 について、3回ずつ測定を行いました。 測定環境:
WindowsXP Professional 2002, SP1
Pentium M processor 1.40 GHz
1.00 GB RAM

結果

cygwin版

real 3.504 3.507 3.570
user 3.434 3.486 3.465
sys 0.010 0.000 0.000

MinGW版:time使用不可(sys-times提供なし)

VC++版(最適化なし), libgauche.dll = 820 kB

real 5.800 5.730 5.754
user 5.688 5.648 5.678
sys 0.000 0.000 0.000

VC++版(サイズの最適化 option /O1), libgauche.dll = 532 kB

real 3.756 3.767 3.763
user 3.715 3.705 3.725
sys 0.000 0.000 0.000

VC++版(速度の最適化 option /O2), libgauche.dll = 672 kB

real 3.380 3.377 3.379
user 3.355 3.335 3.345
sys 0.000 0.000 0.000

ちなみに、今回の移植第3版バイナリは、VC++7.1, /O2 オプションでビルドしたものです。


Gaucheを、VC++に移植するに当たって判明したこと(まとめ):

(今後、同じようなことを試みる方の参考になればと、まとめてみました。)

Gauche-0.8.3w-01

⇒詳細は、Gauche:Windows/VC++:log:detail_2005

Gauche-0.8.3w-02

⇒詳細は、Gauche:Windows/VC++:log:detail_2005_2

Gauche-0.8.3w-03


コメント、議論

Shiro (2005/04/10 03:22:24 PDT): おお、新たな展開が。 とりあえず古い内容をログに移行しておきました。

emeitch(2005/04/10 20:01:42 PDT):移植お疲れ様です!さっそくコンパイルさせていただきました。 とりあえずこちらでのビルド環境での結果を報告させていただきます。(Windows2000 sp4、VC++ 7.1、WSH ver. 5.6)
初回、 readme_1st.txt に従い、make.bat まで行いました。その途中、Makefile.inで言うと、79行目 del gosh$(EXEEXT)で、削除対象ファイルが無いとのエラーで、delコマンドからエラーのリターンコードが返され、makeが途中で終了しました。とりあえず、srcフォルダに、ダミーのgosh.exeを突っ込んで、また0からmakeしたら通るようになりました。その後、gosh起動までは確認いたしました。とりいそぎ、ご報告まで。
⇒詳細は、Gauche:Windows/VC++:log:detail_2005

千代郎(2005/04/25 03:21:15 PDT):そろそろ、これまでの改訂をもとに、Gauche-0.8.3w-02 にまとめたいと思います。-01に関する内容を、別ページに移動させました。 ⇒詳細は、Gauche:Windows/VC++:log:detail_2005

Shiro(2005/05/01 00:20:12 PDT): 素晴らしい。 0.8.4の方に反映できるかなあ。
⇒詳細は、Gauche:Windows/VC++:log:detail_2005_2

chicken?(2007/01/23 21:42:12 PDT): クレクレで申し訳ないですが開発者用ソースはアップして戴けないのでしょうか。

SCM_SIGCHECK

千代郎(2005/05/02 06:49:53 PDT): Shiro様
いきなり質問ですいません。教えていただきたいのですが、 ディレクトリ・エントリを列挙する目的のコードで、 2箇所にある、SCM_SIGCHECK(vm) は、どういう目的のものですか?
⇒詳細は、Gauche:Windows/VC++:log:detail_2005_2

「改善:内部コマンドの実行」について

Shiro (2005/05/01 00:20:12 PDT): 上の「改善:内部コマンドの実行」についてですが、 sys-fork-and-exec等の低レベルAPIは、なるべく生のAPIに近い (Schemeレイヤでは生のAPIに対して必要最低限の加工しか行わない) ということを意図しているので、便利な機能はなるべく上位のAPIに入れて もらえると嬉しいです。(例えばsys-systemやgauche.processで文字列を コマンドとして渡す場合は、UNIXでもシェル経由になるとドキュメントしてあり、 組み込みコマンドが使えることになります)。
⇒詳細は、Gauche:Windows/VC++:log:detail_2005_2

統合に向けて

Shiro(2005/05/24 15:59:40 PDT): 現在、0.8.4はリリーステスト段階に入りつつあるので、 0.8.4での統合というのは無理そうです。いくつか御指摘を受けた細かい部分は 修正してあります。

0.8.4では、システムAPI系はほとんどいじっていませんが、compile.c回りに 大幅な変更があります。ですのでまたportの手間を取っていただかないとならない かもしれません。

千代郎さんの環境からはsourceforgeのCVSにアクセスできますか? それなら、千代郎さんにパッチを送ってもらう→CVSツリーに統合→千代郎さんが チェックアウトして検証、というサイクルで開発を回すのが良いように思います。

More ...