./index.html ../index.html

ObjectPascal Magic Programming
Delphi8 on Win32 Preview

Win32最後のバージョンと囁かれていたDelphi7ですが、先がある事が、私の中で確信になりました。

それは、これから始まりました。 IDE Integration pack for Delphi 8 & C#Builder 1.0という、C#BuilderやDelphi8のIDEであるBDS用のIDE拡張パッケージを書く為に必要なファイル群です。 その後、開発にDelphi7のIDEを用いるためのアドインまで登場しています。

さて、この中の、dcc32.exeが問題です。 起動してみると…。

C:\>"c:\Program Files\Borland\Delphi7\d8bin\DCC32.EXE"
Borland Delphi for Win32 compiler version 16.0
Copyright (c) 1983,2003 Borland Software Corporation

Syntax: dcc32 [options] filename [options]

  -A= = Set unit alias
  -B = Build all units
  -CC = Console target
  -CG = GUI target
  -D = Define conditionals
  -E = EXE output directory
  -F = Find error
  -GD = Detailed map file
  -GP = Map file with publics
  ...以下略...

これに反応しなければ、ObjectPascal Magic Programmingの看板が泣くというものでしょう。 私が追求せずして、誰が追及してくれるのでしょうか!?*1

IDE拡張パッケージを書く為以外に使ってはいけないと注意書があります。 また、Delphi8付属のパッケージの再配布は禁じられています。

…でも、実験ぐらいは勝手でしょう? 実用には使いません。 再配布もしません。 ここに誓います。

*.dcuは、SysInit.dcuしか用意されていません。 後は*.dcpのみで、これは、C:\Program Files\Borland\BDS\2.0\Bin\*71.bplに対応しています。 Delphi8のIDE拡張パッケージの開発用なのですから当然ですよね。

…でも、rtl71.bplと、vcl71.bpl(に含まれるユニット)があれば、相当のことができそうな気がしませんか?

論より証拠。

とりゃあ

class helperを使ったコンソールアプリケーションです。

やり方は簡単で、単に実行時パッケージを使って構築にチェックを入れて、余計なものは消してrtl;vclとするだけでした。 当たり前ですが、コンパイラにDelphi7のライブラリを食わせてもバージョン違いで跳ねられます。 パッケージのみ、ってわけですが、(半年ぐらい前に配られていた.NET previewならぬ)Win32 previewと考えることができそうです。

さあ、どこまで、.NET拡張が、ネイティブ側に実装されているか、試してみましょう!

class helper △

まずはやっぱりこれでしょう!

新しいコードの開発時に使用する設計方法とは考えないでください。クラスヘルパーは,言語とプラットフォームの RTL を結合するという本来の目的でのみ使用してください。

Delphi8のヘルプにはこんな風に書かれていますが、誰がどう見たって、Java→MixJuiceに相当する核弾頭機能にしか見えません。 class helperの前には、C#に予定されているpartial classすら霞んでしまいます。 無論私もDelphi8 for .NETでは使い倒すつもりですが、これがimplementsと排他なのは辛すぎます。 Win32側にさえサポートされたら、ilの都合なんてものは無くなるので、最強のオブジェクト指向言語(まいなすてんぷれーと)の誕生なんですが…でも、.NETのObjectクラスやComponentクラス等を、Delphiのそれとソースコード互換にするためだけに実装されたっぽいしなあ…

…なんて思って、半分あきらめてたのですが。

コンパイル通ります。 マジです。

結論から書けば、非仮想メソッドのみ可能でした。 TClassHelperBaseはTInterfacedObjectからの派生の様ですが、仮想メソッドを作ろうとすると、IInterfaceのメソッドが要求される上に、@GetHelperIntfがまともに実装されていないみたいで、アクセス違反で落ちます。 非仮想メソッドのみ=単なる構文糖…ですが、@GetHelperIntfのエントリが用意されているということは、正式発表の折にはフルサポートを…期待してもいいのか!? 勝手に期待してますよ!

名前空間 △

次はこれです。 単にわかり易い以上の意味は何も持たないのですが、ライブラリをグループ分けできるのは、省略だらけの混沌としたDelphi7以前のRTL/VCLのユニット名から考えれば、かなり嬉しいです。

で、結果は、単にユニット名に"."を使えるようになっていただけです。 programの後に書いたらデフォルトの名前空間で、"."が含まれていないユニット名はデフォルトの名前空間に属する~みたいなルールはありませんでした。 また、namespaces指令も未サポートというよりはナニソレ状態でした。

でも、ユニット名が区切れるようになっただけでも大きな進歩です。 とりあえずD言語のそれ並には使えるわけです。

sealed, final ○

機能します。 JavaにあってDelphiになかったものがようやく、です。

strict private, strict protected ○

機能します。 でも、有り難みは特に無しですが。

class var ×

だめでした。

class property ×

だめでした。 宣言はできるのですが、呼び出しでエラーになります。

型のネスト ×

同じく、宣言はできるのですが、呼び出しでエラーになります。

演算子オーバーロード ×

operatorキーワードを受け付けてくれません。

recordのメソッド ×

ネイティブ版にはobject型がありますから{$IFDEF}で何の問題も無いのですが。


それ以外の項目も、発見次第、逐次追加予定。 なお、あくまでIDE Integration用のコンパイラを私が勝手にテストしただけですので、この結果をもってどうこう言わないように。 心の中で拍手喝采だけしておきましょう。


*1 誇張があります。