[]演算子オーバーロードとインデクサの違いって何?

abdev 3 Comments »

何度も話に出てきている通り、開発者向けにコッソリとリリースさせてもらっているAB5β4ではString型への添え字アクセスへの対応が微妙です(新String型への移行を全く行っていないAB5CP1では問題ないです)。例えば、

Dim s As String
Dim c As Char
s="test"
c=s[0]

このような記述は可能なのですが、下記のコードは未だエラーとなってしまいます。

Dim s As String
s="test"
s[0]=Asc("a")

本来であれば、文字列sの内容が “aest” に変化してほしいところ。AB5β4では、

s[0]=Asc(“a”)

の表記を

s.Chars[0]=Asc(“a”)

というふうにして一時的に凌いでもらうようお願いしているところです。しかしながら、AB4用に開発したソースコードにおいて、このようなStringアクセスが生じている部分をすべて書き換えてくださいなというお願いをするのは非常に酷な話ですし、AB5のうたい文句である下位互換性の信憑性を揺るがす問題であることも事実です。

そこで、[]演算子のオーバーロードロジックにもう一段階ひねりを加え、添え字アクセスによる代入も可能にしようと考えています。まず思い浮かぶのがC#で採用されるインデクサ。例えば、下記のようなコードでオブジェクトへの添え字アクセス(読み書き)を可能にしてくれます。

public class C
{
  int[] values = { 1, 2, 3 };
  
  public int this[int index]  // インデクサの宣言.
  {
    get { return values[index]; }
    set { values[index] = value; }
  }
}

public class TestIndexer
{
  public static void Main()
  {
    C c = new C();
    
    c[1] = 1;  // インデクサを使用した書き込み.
    Console.WriteLine(c[1]);  // インデクサを使用した読み込み.
  }
}

“public int this[int index]” という部分のindexの型をstringなどに書き換えれば、連想配列のような機能も実現可能とのこと。get/setアクセサを指定して云々というのがインデクサの仕様のようですが、このget/setアクセサに相当する演算子オーバーロード機能を盛り込むことで、完全にインデクサの仕様をカバーできるような気がします。例えば、先ほどのコードを次バージョンのABを想定して書き直すと、下記のような表現になります。

Class C
    values[3] As Long

    Sub C()
        values[0]=1
        values[1]=2
        values[2]=3
    End Sub

    'getアクセサ相当
    Function Operator[] (index As Long) As Long
        Return values[index]
    End Function

    'setアクセサ相当
    Sub Operator[]= (index As Long, value As Long)
        values[index]=value
    End Sub
End Class

Dim pobj As C()
pobj[1]=1
Print pobj[1]

当然ながら、Operator / Operator= のパラメータであるindexの型を書き換えることで、連想配列のように扱うことも可能になります。こうなってくると、オーバーロードチックに記述するのか、get/setアクセサを指定して記述するのかの違いなだけで、事実上はインデクサの機能と同等になるのではないかと考えられます。

どちらが直感的であるのかは使い手によって意見が食い違うところでしょう。私もC#を利用して積極的にインデクサという機能を使い込んだことがありませんので、両者が本当に同一の機能を提供するものなのかどうか、厳密にはわかりませんが、特段問題がなければ[]=演算子のオーバーロードを導入してそれをABのインデクサとして扱いたい考えです。

ガベコレの本格導入へ向けて

abdev ガベコレの本格導入へ向けて はコメントを受け付けていません

まずは調査から。一般的に、GCと言うとJavaや.NET言語で採用されている印象がありますね。確保されたメモリを自動的に解放してくれるというプログラマにとっては非常にありがたい機能、強いて言えば一度でもコレに慣れてしまうと、C言語のmalloc/freeには戻れないという話さえも耳にします(私の周りでもこの状態に当てはまる方が何名かいます)。

GCの実装は、言語が提供するか、ライブラリが提供するかに分別されます。JavaはVMが担当し、.NETはCLRが担当します(ガッチリと、言語が提供しています)。逆に、C/C++でGCを活用したい場合は、BoehmGCやboost::shared_ptrなど、外部ライブラリを取り込むことで実現できたりもします。これらの問題は手法ですので、将来的にABはこの方法でいきますということは、現時点では言及できません。

そして、GCにはいくつかの種類があるようです。それぞれのメリット・デメリットも様々。しかしながら、昨今のオブジェクト指向言語に一番適した手法が見いだされてきているようです。

  • 参照カウンタ方式 … オブジェクトポインタのコピーと破棄を監視し、参照カウンタの増減を行う。カウンタが0になったら自動的にdeleteしてあげる。
  • Mark & Sweep … メモリ使用量が増えるなどの一定条件が整った場合にGCを発動させる方式。スタティック領域とスタック領域(即ち、グローバル変数とローカル変数すべて)をスレッド毎にチェックし、使われていないオブジェクトポインタがあればdeleteしてあげる。
  • 世代型GC … Mark & Sweep方式を新世代、旧世代の2つの世代にわけて効率的に管理する手法。Javaが世代型GCの採用を行っているのは有名な話。

ネイティブコンパイラとして実装しやすいのは、まずは参照カウンタでしょうか。しかし、参照カウンタ方式はGCの負荷が分散されるメリットの反面、循環参照への未対応や処理速度の鈍化が慢性的な問題として浮上してしまうという非常に大きなデメリットも存在しています。これらの問題から、最近の言語が積極的に参照カウンタ方式のGCモドキを採用するという傾向は薄いようです。

私の頭の中でも、明確な実装手法が整理されていないのですが、どうやらMark & Sweepの手法をベースにした、保守的GCの機構を言語ベースで提供するというのが一番良い方法なのかもしれません。欲を言えば、優秀な仮想マシンが提供するGC機能をコンパイラが提供する一機能として実現していきたいものです。

どちらにせよ、ABはNew 〜 Deleteでオブジェクトの確保・破棄を行うのを一般的な手法として提示しているので、それらを根本から覆すことは避けようと思います。将来的に、GCNew、GC_mallocなどの機構を取り入れられれば良いかな〜と思っています。

Wikipedia – ガベージコレクション:

http://ja.wikipedia.org/wiki/%E3%82%AC%E3%83%99%E3%83%BC%E3%82%B8%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3

チューニングのためのJavaVM講座(後編)〜ガベージコレクタの仕組みを理解する〜:

http://www.atmarkit.co.jp/fjava/rensai3/javavm02/javavm02_1.html

文字列操作に強い言語

abdev 文字列操作に強い言語 はコメントを受け付けていません

皆さんは、文字列操作に強い言語といったら、何を思い浮かべますか?

私は正規表現を標準完備し、変数と文字列の親和性の高いPerl、PHP、Rubyなどを思い浮かべます。これらの言語はHTML、JavaScriptなどの二次的な言語(または自身の言語コード)の生成が要求されることから、文字列操作に特化した設計がなされているといっても過言ではありません。

どちらかというと、システム記述的な要素が高いC/C++、VB、C#などの言語(もちろんABもこの部類)は文字列を一つのパラメータとして重要視する傾向が高く、リテラル文字列との親和性の高さは二の次になっています。

C= C= C= C=┌( ・_・)┘→→→

開発者向けバージョンのAB5β4では、新しいString型が従来コードとの互換性を取り戻してきました。これを完全なものにすれば、AB4→AB5へ移行するユーザーの皆様に対して、下位互換という視点から貢献できそうです。更には、String型が列記として一つのクラスとして表現されるので、かなり細かく文字列操作メソッドを用意していくことが可能になります。

こんなタイミングですので、新String型の導入と同時に、ヒアドキュメントを扱えるようにリテラル文字列の仕様も企んでいる最中であったりもします・・・f(^^;;;

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS ログイン