[#11357] [PATCH] an analogue of `long long' — "Nobuyoshi.Nakada" <nobu.nakada@...>

なかだです。

18 messages 2000/11/01
[#11358] Re: [PATCH] an analogue of `long long' — matz@... (Yukihiro Matsumoto) 2000/11/01

まつもと ゆきひろです

[#11364] Re: [PATCH] an analogue of `long long' — EGUCHI Osamu <eguchi@...> 2000/11/02

えぐち@エスアンドイー です。

[#11440] class Character (was: Ruby I18N) — Yasushi Shoji <yashi@...>

[ruby-dev:11428] からの続きですが、threadは切りました。

14 messages 2000/11/08
[#11442] Re: class Character (was: Ruby I18N) — TAKAHASHI Masayoshi <maki@...> 2000/11/08

高橋征義です。用語について。

[#11443] Re: class Character (was: Ruby I18N) — Yasushi Shoji <yashi@...> 2000/11/08

At Wed, 8 Nov 2000 20:44:55 +0900,

[#11520] A problem of Socket methods on Windows — OKA Toshiyuki <oka@...>

岡と申します。

22 messages 2000/11/15
[#11523] Re: A problem of Socket methods on Windows — "Nobuyoshi.Nakada" <nobu.nakada@...> 2000/11/15

なかだです。

[#11528] Re: A problem of Socket methods on Windows — matz@... (Yukihiro Matsumoto) 2000/11/15

まつもと ゆきひろです

[#11532] Re: A problem of Socket methods on Windows — "Nobuyoshi.Nakada" <nobu.nakada@...> 2000/11/15

なかだです。

[#11534] Re: A problem of Socket methods on Windows — OKA Toshiyuki <oka@...> 2000/11/15

岡です。

[#11535] Re: A problem of Socket methods on Windows — "Nobuyoshi.Nakada" <nobu.nakada@...> 2000/11/15

なかだです。

[#11538] Re: A problem of Socket methods on Windows — "Nobuyoshi.Nakada" <nobu.nakada@...> 2000/11/15

なかだです。

[#11662] IO (Re: fork problem?) — Tanaka Akira <akr@...17n.org>

In article <E140cR3-0002ls-00@ev.netlab.zetabits.co.jp>,

22 messages 2000/11/28
[#11663] Re: IO (Re: fork problem?) — matz@... (Yukihiro Matsumoto) 2000/11/28

まつもと ゆきひろです

[#11664] Re: IO (Re: fork problem?) — Tanaka Akira <akr@...17n.org> 2000/11/28

In article <E140fxW-0002u9-00@ev.netlab.zetabits.co.jp>,

[#11665] Re: IO (Re: fork problem?) — Tanaka Akira <akr@...17n.org> 2000/11/28

In article <hvor93w5wb8.fsf@coulee.m17n.org>,

[#11669] Re: IO (Re: fork problem?) — Tanaka Akira <akr@...17n.org> 2000/11/29

In article <hvoofz05uwz.fsf@coulee.m17n.org>,

[#11672] Re: IO (Re: fork problem?) — matz@... (Yukihiro Matsumoto) 2000/11/29

まつもと ゆきひろです

[#11675] Re: IO (Re: fork problem?) — Koji Arai <JCA02266@...> 2000/11/30

新井です。

[#11677] Re: IO (Re: fork problem?) — matz@... (Yukihiro Matsumoto) 2000/12/01

まつもと ゆきひろです

[ruby-dev:11476] Re: Proposal of "Array of CharCode"

From: " たけ (tk)" <ggb03124@...>
Date: 2000-11-11 12:51:35 UTC
List: ruby-dev #11476
たけ(tk)です。

Yukihiro Matsumoto さん曰く。
》| 16ビットを越える大きな文字コード系の内部データは、4バイトプレーンな
》|文字コードそのままにするのがいいのではないか、という提案です。
》
》この「内部データ」ってなんでしょう?
》Regexpの内部データ? 文字列の内部データ?

 この「内部データ」というのは Regex が、与えられた文字列(バイト列)を 
re_compile_pattern でコンパイルして作った内部データの意味でした。「文字
列」ではありません。

 Regex.c の内部データでの文字コードの形式はというのは、「MBC2WC(c, p)」
マクロの定義部分を見れば分かります。そこで、与えられたバイト列を4バイト
のデータに変換しています。その逆方向、その内部データからバイト列へのエン
コードの様子は print_mcb を見ると分かります。それらを見ると、内部データ
は、

 (1)EUC と SJIS の場合には、2個のバイト列を単純に hi*256+lo で合成
した数値。(JIS の文字コードに戻しているわけではない)。

 (2)UTF8 の場合には、不定長のバイト列を UTF8 のエンコーディング方式
に従ってデコードして戻した文字コード。

になっています。

 従って、UTF8 の文字列(バイト列)は、Regex.c の内部で用意されたデコー
ダによって、32ビットの文字コードそのものに復元して保存されています。

》|に変えるだけで、「とりあえずの文字コード取り出し」は終了してしまう。
》
》やはり文字列の内部データのつもりみたいですねえ。

 こちらの方は直接的には「Ruby から Regex に渡すデータの形式に関する提案」
です。

 上で見たのは Regex.c での UTF8 でエンコードされたバイト列の扱いなので
すが、そこでは、Regex.c でバイト列←→文字コードのエンコード/デコードの
ルーティンを持っている。しかしエンコード/デコードは本来、文字コード系に
属する事柄なので、その文字コード系を管理するクラスで行うべきこと。
Regex.c などの汎用ルーティンで行うべきことではない。

 なぜ、Regex.c で自前の UTF8 デコード/エンコードルーティンを持っている
かというと、エンコーディング/デコーディングというのは、アルゴリズムに属
することであって、データではないから、です。従って、Regex に渡すデータが
「エンコードされたデータ」であることを維持するなら、新たなエンコーディン
グ方式のバイト列を扱おうとすれば、Recex.c の中でそのアルゴリズムに対応し
たルーティンを追加するか、外部のルーティンを呼び出すほかないわけです。

 「本来のあり方」を実現する方法としては次の2通りが考えられる。

 (1)エンコードしたデータを Regex に渡して、Regex がデータの送り主の 
CharCodeType クラスのルーティンを呼び出してデコードする。

 (2)初めからデコードしたデータを Regex に渡す。

 最初「(1)エンコードしたデータを渡す」方法を工夫しようかと思ったので
すが、CharCodeType クラスを Ruby スクリプトでも扱えるようなクラスにする、
という(たけ(tk)の)方針からいくと、呼び出しのための手続きが複雑になりそ
うであり、オーバーヘッドも問題になりそう。

 後者の方法が可能であれば、Regex での処理は簡単になり、どんな文字コード
系でも統一された方法で扱えるようになる。

 そこで、「(2)初めからデコードしたデータを Regex に渡す」方法が可能
かどうか/妥当かどうかを検討するためには、何故エンコードするのか、という
問題に突き当たる。

 何故エンコードするのか。エンコーディングの目的は下記の通り。

(1)システムのIOがバイト単位のデータの配列(バイトストリーム)を前提
としている。

(2)バイトデータの中にIOの制御のためのデータも入れられるようになって
いる。

(3)16ビット、32ビットのデータをそのままの状態でストリームとしてシ
ステムに渡すと、制御コードが予期しない部分に入ってしまい、誤動作を起こす。

(4)それを防止するために、制御コードとバッティングするバイトデータを含
まないように注意して複数のバイト列に変換する。

ということ。

 そうであれば、アプリケーションの内部データや、アプリケーションの内部の
各モジュールの間でのデータ交換のためのデータは、エンコードしたバイト列で
ある必要はない。Regex と Ruby との間のデータのやりとりはアプリケーション
の部分どうしの関係でのデータのやりとりに属する。

 実際問題として Ruby から Regex にデータを渡す場合を考えると、Regex に
対して、「生の32ビットの文字コードである」旨の通知をしておけば、Regex 
では上記のような簡単な「文字コード取得ルーティン」で受け取ることが出来る
ようになる。(もちろん、EUC でエンコードされたデータであることを通知して
から(mcbtype==MBCTYPE_EUC)、今まで通りのデータを渡しても良い)。

 −−

 もうちょっと別の視点から見てみると、ストリーム型のデータを渡すときの基
本単位を byte(INT8) にするか、INT32 にするか、という違いにすぎない、とも
言えます。

 現在のOSやネットワークは INT8 のストリームを基本にしているので、それ
らとのやりとりではエンコードしなければならない。しかし、アプリケーション
の内部でのストリームはエンコード/デコード不要のストリーム(Array of
INT32)でも良いのではないか。ということです。

》ある文字コード系が4バイトプレーンなのは当然許すわけですが、
》統一して内部データとして持つというのは前提から採用できないよ
》うな。

 具体的には次のような方法を想像しています。

(1)CharCodeType クラスのメソッドとして、エンコードされたバイト列から
デコードされた INT32 の配列に変換するメソッドを用意しておく。

(2)String クラス/Regex クラスの内部のデータはエンコードされたバイト
列とする。

(3)String::EUC クラス/Regex::EUC クラスのデータはデコードされた文字
コードの配列とすることが許される。(強制はしない。クラスの作成者の判断に
任される)。

(4)Ruby から Regex にデータを渡す場合には、re_mcbinit(MBCTYPE_EUC)で
今まで通りにバイト列で渡すか、re_mcbinit(MBCTYPE_INT32)で文字コードの配
列(Array of INT32)として渡すかを選択することが出来るようにする。

(5)Regex では re_mcbinit(MBCTYPE_INT32)が指定された場合には、上記の文
字コード取得ルーティンで文字コードを直接取り出す。

たけ(tk) ggb03124@nifty.ne.jp
http://member.nifty.ne.jp/take_tk

In This Thread