Borland Developer Studio 2006 No.10
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/10/31(火) 11:44:29Borland Developer Studio 2006 ユーザーのための統一雑談スレッドです。
Borland Developer Studio 2006 についての技術的な質問、不具合のQC 報告依頼も歓迎します。
(注)本スレには被害担当艦としての機能はありません。
Borland Developer Studio 2006 についての、批判・怒りのバグ告発はアンチスレ↓へどうぞ。
http://pc8.2ch.net/test/read.cgi/tech/1153353434/
0084デフォルトの名無しさん
2006/11/06(月) 21:56:05登録ユーザーなのにDMが来ないので、メールで請求した。
めずらしく漏れていたので、DMシステムかなんかの不具合あり、
ようやく気がついたかも。
0085デフォルトの名無しさん
2006/11/07(火) 00:27:57そろそろHotFix 出るかなー。
0086デフォルトの名無しさん
2006/11/07(火) 04:13:42単に「優待価格でのバージョンアップの対象期間を延長した」というだけだ。
来年夏の Highlander まで、ずーっと延長するんだよ
0087デフォルトの名無しさん
2006/11/07(火) 12:21:410088デフォルトの名無しさん
2006/11/07(火) 14:38:54「この製品は8月までですよ。今買わないと値上がりするよー」
9月に入って
「ご好評のため,特売期間を一月延ばしました。10月までですよー」
10月に入って
「お客様が殺到しました。優待価格は年末まで延長。これが最後!」
どこかがチクれば,公正取引委員会から人が来る。強制力はないけど
いろんなところに名前が出る羽目になるわけだ。
Borland には限らないけど,原価があって無いようなソフトウェアの場合,
定価に対して期限を切らずにずーっと値引き価格で表記することが多い。
これは二重価格となって,監視の対象。
0089デフォルトの名無しさん
2006/11/07(火) 15:27:33じゃなくて、バージョンアップできなくなるよーだから
ちょっと違うんじゃないか。
既存ユーザーに対して売るかどうかなんて、某の自由だろう。
0090デフォルトの名無しさん
2006/11/07(火) 15:37:01ある身としては、いい傾向だと思うけど。
0091デフォルトの名無しさん
2006/11/07(火) 16:23:20坊にとってはむしろ好都合
いい宣伝になるw
0092デフォルトの名無しさん
2006/11/07(火) 18:06:39ソフトバンク商法か ww
0093デフォルトの名無しさん
2006/11/07(火) 18:41:010094デフォルトの名無しさん
2006/11/07(火) 20:13:300095デフォルトの名無しさん
2006/11/07(火) 23:38:060096デフォルトの名無しさん
2006/11/07(火) 23:44:570097デフォルトの名無しさん
2006/11/08(水) 03:28:210098デフォルトの名無しさん
2006/11/08(水) 10:31:13実際動作するし、正式にOS上の動作がサポートされる。
0099デフォルトの名無しさん
2006/11/08(水) 11:16:590100デフォルトの名無しさん
2006/11/08(水) 11:34:240101デフォルトの名無しさん
2006/11/08(水) 12:46:39まあ、膨大な過去の遺産が新しいOSでサポートされないことに大ブーイングが起きかけたので仕方なくサポートするようなもんだから。
新しいコントロールは出せないでしょう。
どうしてもやりたかったらWin32APIでやれないことはないけど・・・。
0102デフォルトの名無しさん
2006/11/08(水) 13:00:55くせには、ブビってWin32全部コールできるわけでもなし。
ブビドトネトはイラネし。
Windows Vistaへの対応状況
http://blogs.msdn.com/somasegar/archive/2006/09/26/772250.aspx
○ VB 6.0 - Supported
× VB.NET 2002 - Not supported
× VB.NET 2003 - Not supported
× VB 2005 - Not supported
△ VB 2005 SP1 - Supported (ただしUAC関連の問題あり)
VBワロスwwwwwwwwwwwwwwwww
0103デフォルトの名無しさん
2006/11/08(水) 13:28:080104デフォルトの名無しさん
2006/11/08(水) 18:23:27VB.NETは失敗しました
のでこれからがんばります。
て事かいな?
0105デフォルトの名無しさん
2006/11/08(水) 18:24:410106デフォルトの名無しさん
2006/11/08(水) 18:37:030107デフォルトの名無しさん
2006/11/08(水) 20:32:04× Delphi 1.0 − Not Supported
× Delphi 2.0 − Not Supported
× Delphi 3.0 − Not Supported
× Delphi 3.1 − Not Supported
× Delphi 4.0 − Not Supported
× Delphi 5.0 − Not Supported
× Delphi 6.0 − Not Supported
× Delphi 7.0 − Not Supported
× Delphi 8.0 − Not Supported
× Delphi 2005 − Not Supported
× BDS 2006 − Not Supported
× Turbo all version − Not Supported
大丈夫かね、VB のことなんか気にしてて
0108デフォルトの名無しさん
2006/11/08(水) 20:41:40ひでえな
これじゃBDSを買い控えればいいのか、Vistaを買い控えればいいのか
わからん。
0109デフォルトの名無しさん
2006/11/08(水) 22:54:55だし、これまでの経緯から察するに某は対応パッチをだすはずがないし、どうみても
正式対応するはずの Highlander 待ちが正解でしょ。
Turbo は、BDS のバラバラバージョンなんだから状況は同じ。
0110デフォルトの名無しさん
2006/11/08(水) 23:04:290111デフォルトの名無しさん
2006/11/08(水) 23:18:490112デフォルトの名無しさん
2006/11/08(水) 23:45:55BDS2006/Turbo でも非公式に対応TIPS が出てくるでしょ。
> 正式対応するはずの Highlander 待ち
4月あたりには出るだろうから、ちょうど良いね。
0113デフォルトの名無しさん
2006/11/09(木) 02:01:580114デフォルトの名無しさん
2006/11/09(木) 07:01:460115デフォルトの名無しさん
2006/11/09(木) 08:16:560116デフォルトの名無しさん
2006/11/09(木) 08:24:20直後にWindows Updateもしなけりゃならないし
10分かかった。
0117デフォルトの名無しさん
2006/11/09(木) 09:08:57>ttp://gigazine.net/index.php?/news/comments/20061107_longhorn/
>ttp://itpro.nikkeibp.co.jp/article/COLUMN/20061107/252873/
>読む限りでは,MicrosoftはWindows VistaでVisual Studio 2005を動作させることを,
>それほど簡単とは思っていないことがうかがえる。
>Microsoftは数カ月後に,Visual Studio 2005 Service Pack 1をリリースする予定だが,
>このSPで問題が解決されるかどうか,注意深く追いかける必要があるだろう。
バロスwwwww
0118デフォルトの名無しさん
2006/11/09(木) 09:15:510119デフォルトの名無しさん
2006/11/09(木) 09:59:39つまり、VS 2005で動く完成版は出ないことが示唆されています。今後きちんとしたIDEサポートを得るには、Orcasを使うしかないのです。
仕事でいち早くWCF・WPFを取り入れてみたいと考えてた方はどうしますか?メンバー全員に開発途中のOrcasを入れさせますか?VS 2005で未完成のNovember 2006 CTPをずっと使い続けますか?
考えられる限り最悪のシナリオだと思います。これでは、(WF以外は)Orcasが完成するまでRTWしてないのと同然ではないでしょうか。
0120デフォルトの名無しさん
2006/11/09(木) 10:06:42まぁしょうがない。
Office 組と Windows 組と開発ツール組が、互いに相手の胸の内を見ながら勝手に動いた
結果がこれだ。Vista の遅れで、Office 組に吸収された Windows 組は、これからどうするのか。
開発ツール組は、フレームワークと言語がヘジ、XAML/.NET 3.0 がチャック。それ以外にもコアメンバーの
ほとんどがボーランド出身だなぁ。
0121デフォルトの名無しさん
2006/11/09(木) 10:10:35当分の間はAero のないHOME しか売れないだろうし。
0122デフォルトの名無しさん
2006/11/09(木) 10:22:250123デフォルトの名無しさん
2006/11/09(木) 10:24:43David I とかも、Borland Japan 切り捨てて、ナカムラセンセ 雇ってあげりゃいいのに
-----
DelphiMLの方でもありましたが、
http://bdn.borland.com/article/33688
Hot Fix9でタブ切り替え時のメモリリークが解消された
らしいですが、使ってるうちにメモリがどんどん消費さ
れていくのはタブ切り替え時以外もメモリがリークして
るんだーろーな。仕事で2006使ってる人いますか?
自分は、2005も仕事で使ってました。ストレスをためな
がら。それに比べたら2006は天国ですが、delphi7以前
の安心感が戻ってくるのは何時でしょうか・・・。
0124デフォルトの名無しさん
2006/11/09(木) 10:38:12Aero のないWPF なんて・・・
0125デフォルトの名無しさん
2006/11/09(木) 10:39:17BDS ネタには、かなり食いつき悪いけど。
0126デフォルトの名無しさん
2006/11/09(木) 16:00:00ttp://bdn.borland.com/article/33778
朝8時から1時間ってことなので,聞けないよ..
だれか聞いてる奴いるか?
0127デフォルトの名無しさん
2006/11/09(木) 16:16:58http://www.youtube.com/view_play_list?p=47CF5AAABFA0324D
0128デフォルトの名無しさん
2006/11/09(木) 16:54:13よその歴史問題を語る前に、Delphiの暗黒史を総括しろ。
0129デフォルトの名無しさん
2006/11/09(木) 17:25:00これか?
2001年 中頃 「我々はWhistlerからBlackcombへは行かず、Longhornへ行く」と宣言。休暇の旅行のスケジュールと間違えられる。
2002年 10月 IRC・P2Pを駆使した斬新な手法で、初のLonghornお披露目。以後、このチャネルを通じて定期的に進捗報告が行われる。
2003年 春頃 順調な進捗報告が繰り返される。その一方で、偽Longhornでの一本釣りも忘れない。
2003年 5月 WinHEC 2003開催。ウィンドウがひらひら舞う姿に信者大興奮。
2003年 10月 史上最大のvaporwareの祭典、PDC 2003開幕。WinFXのあまりの壮大(な無謀)さに、開発者のテンションも最高潮。
0130デフォルトの名無しさん
2006/11/09(木) 17:26:002004年 8月 Longhornの2006年内のリリース、WinFSの延期、Avalon・IndigoのXPへの移植を約束。「現実的でよろしい」と好評を博す。
2004年 夏頃 なぜか、この頃からLonghornの話題が避けられるようになる。
2004年 11月 開発者向けにXP用のWinFXリリース開始。Longhornから目を逸らさせることに成功。
0131デフォルトの名無しさん
2006/11/09(木) 17:27:302005年 4月 WinHEC 2005で1年ぶりのLonghorn Previewリリース。WinFX・Sidebarが消え去ったことに騒然となるも、「ドライバ開発者向けなんだから別にいいだろ!」と逆切れで応戦。
2005年 7月 これまでのLonghornのイメージをこの世から抹殺すべく、改名発表。
2005年 7月 待望のVista Beta1リリース。「ロースペックマシンでもサクサク」と、大幅な機能削減の成果を強調。
2005年 夏頃? 「Longhornの計画は2004年にキャンセルされた」と怪情報が出回る。根拠がいろいろ思い当たるも、「そんなのアンチの妄言だ!」と思考停止で乗り切る。
2005年 9月 PDC 2005開幕。伝統の「PDCの法則」を死守する。
2005年 秋頃 Jim Allchin氏、「このミッションが終わったら、故郷に帰って家族と幸せに暮らすんだ」と言い始める。
2005年 10月 Ray Ozzie氏、「Vistaがコケても痛くも痒くもない今後の計画」をひそかに練り上げる。
0132デフォルトの名無しさん
2006/11/09(木) 17:28:432006年 5月 WinHEC 2006に合わせてVista Beta2リリース。PDC 2005以降のCTP乱発のせいで、もはや反応も薄い。
2006年 6月 .NET Frameworkの襲名披露式。断髪式と間違える人も。
2006年 6月 一連の出来事に対し、親分自らが落とし前をつけることで合意。ただし2年間の猶予期間あり。
2006年 6月 WinFS開発中止が決定。開発中止の発表よりも、まだWinFSを信じてた者が大勢いたことの方に衝撃が走る。
2006年 9月 Vista RC1リリース。記念に、Brian Valentine氏の卒業パーティーで盛り上がる。
2006年 10月 日本のMS社員がVistaに関する正論を口走り、ネットで高い支持を集める。
2006年 10月 Vista RC2リリース。もういい加減覚悟を決める。
2006年 11月 一足先にWinFX .NET 3.0 RTM。開発者の燃え尽き防止に、翌年まで開発ツールのベータテストを継続する配慮を見せる。
2006年 11月 ついにLonghorn Vista RTM。SP1からの本格導入に向けて、待望の船出を飾る。
0133デフォルトの名無しさん
2006/11/09(木) 17:30:23少しは内輪の話も乗せろ。
伴奏ばかり大きくて、主旋律が詰まらないJPOPめ。
0134デフォルトの名無しさん
2006/11/09(木) 18:59:02藤井のあれは ITMedia で某製品を取り上げてもらうための対価。
ITMedia に誘導するためのものでしかないから,人さえ集まれば音楽の話し
でも何でも良いのだ。
0135デフォルトの名無しさん
2006/11/09(木) 20:02:59ネットの力を生かせてないよな。
YouTube すら嫌な訳でしょ。観客を集めて、あっと言わせたい訳だ。
いかにも音楽部の定期演奏会的発想だよな。
0136デフォルトの名無しさん
2006/11/09(木) 20:52:40そんなこと,どこに書いてあるんだい?けど,内情はよくわかったよ。なるほどね
実演といっても第三回キャンプでは一コマだけじゃん。
0137デフォルトの名無しさん
2006/11/09(木) 21:19:27全部、俺の妄想。
でも次の工夫が出てこないと、そう見られても仕方ないんじゃね。
0138デフォルトの名無しさん
2006/11/09(木) 21:59:02藤井を無視して,David I に話しを持って行っちゃいな
0139デフォルトの名無しさん
2006/11/09(木) 22:14:270140デフォルトの名無しさん
2006/11/09(木) 22:22:58諦めるというか
まだ第3回だけど、もう第3回でもあり
そろそろ批判も受け始めるということだ。
0141デフォルトの名無しさん
2006/11/09(木) 22:34:25もうちょっと試行錯誤すべき。
ブログは週1にしてもいいんだし、翻訳が少し進まなくなっても
全体として作業量が維持されていれば、文句は来ない。
0142デフォルトの名無しさん
2006/11/09(木) 22:48:46> ナカムラセンセ 雇ってあげりゃいいのに
センセも最近はそう頻繁にウォッチしてない感じがする。
ただDelphiが復活してきたので、営業活動の一環として、MLに出没している気が。
だんだん過去の人になってきているし、BDNに記事でも書いてアピール汁。
0143デフォルトの名無しさん
2006/11/09(木) 23:05:56ぜんぜん復活してませんが。ユーザ激減。この板だって立ち枯れスレ多い。
BBSもMLもいたって低調。質問はなんだかあせってる初心者プロと
ウィンドウズの仕組みさえしらない超初心者が少し。
0144デフォルトの名無しさん
2006/11/09(木) 23:13:08あのヒゲおじさんだろ、D2005は某の最高傑作とか言ったのは。
セールストークにしてもひどすぎ。自分でも使ってないのが見え見え。
そもそものつまずきはD8のひどさだが、D2005が決定的にダメ。
以降は、なにやってもゾンビウォーク。駄目すぎ。
0145デフォルトの名無しさん
2006/11/09(木) 23:20:560146デフォルトの名無しさん
2006/11/09(木) 23:23:07でも、アンチって全然役に立ってないよね。
多少でも役に立っている人たちに文句を言う資格なし。
0147デフォルトの名無しさん
2006/11/09(木) 23:29:520148デフォルトの名無しさん
2006/11/09(木) 23:32:14WGAPlugin なんてのも強制されるし。MS のアプリって使いづらい。
0149デフォルトの名無しさん
2006/11/09(木) 23:38:34全体としてはどうだか分からんが
ネットでうろうろしてる初心者は少し増えたかもね。
0150デフォルトの名無しさん
2006/11/10(金) 01:06:28おまえも役に立ってなさそうだから、アンチに対してでさえも文句を言う資格ないよね。
0151デフォルトの名無しさん
2006/11/10(金) 02:52:08藤井が自分で翻訳している。って,心の底から信じてる?もう少し現実を見なさいよ。
彼は JBuilder を NTT に紹介したことだけで現在の地位にしがみついている人。
未だに二言目には「昔は良かった」しか言わない。そのときDelphi と BCB などの
残りの言語製品を人材ごと切り捨てた訳だ。
彼のブログからは Delphi に対する嫌悪しか伝わってこないだろ?
なにが「開発環境 2.0」だ。
0152デフォルトの名無しさん
2006/11/10(金) 02:54:180153デフォルトの名無しさん
2006/11/10(金) 04:29:20Borland Developer Studio 2006 アンチスレ
http://pc8.2ch.net/test/read.cgi/tech/1153353434/
0154デフォルトの名無しさん
2006/11/10(金) 04:43:250155デフォルトの名無しさん
2006/11/10(金) 04:46:15でも、まんせって全然役に立ってないよね。
多少でも役に立っている人たちに文句を言う資格なし。
0156デフォルトの名無しさん
2006/11/10(金) 06:13:320157デフォルトの名無しさん
2006/11/10(金) 08:25:55つまりガンはあいつか
0158デフォルトの名無しさん
2006/11/10(金) 10:18:240159デフォルトの名無しさん
2006/11/10(金) 11:10:13Delphiのことなどほっときましょう
0160デフォルトの名無しさん
2006/11/10(金) 12:06:34確か年末だよね。
http://www.atmarkit.co.jp/news/200605/26/borland.html
Ruby on rail 用IDE も出ないかな。
0161デフォルトの名無しさん
2006/11/10(金) 12:28:34日本語化の予定が無いから宣伝できないみたいだね。
0162デフォルトの名無しさん
2006/11/10(金) 13:24:300163デフォルトの名無しさん
2006/11/10(金) 13:26:38ブログも書いてない。
0164デフォルトの名無しさん
2006/11/10(金) 13:33:02来週のデベロッパーキャンプに参加してデモを見たら?
一緒にロードマップの変更も発表するようだし
0165デフォルトの名無しさん
2006/11/10(金) 13:35:49なんか古いんだよね。
他所はリリース前から、ブログで盛り上げるのに。
0166デフォルトの名無しさん
2006/11/10(金) 13:59:160167デフォルトの名無しさん
2006/11/10(金) 14:00:18じゃないんだってば。
... デモと同時にロードマップ更新のお知らせから読み取れるのはなんだ?
延期だよ
0168デフォルトの名無しさん
2006/11/10(金) 14:05:06急遽 Peloton を先に出すと決めた。がやってみたら Eclips 側の予定にうまく合わず翻訳版が
まず延期。そしてとうとう Peloton そのものが来年頭に行った。
0169デフォルトの名無しさん
2006/11/10(金) 14:25:31あらら。
嘘かホントか分からんが、Eclipse 上にIDE を作るリスクというのもゼロじゃないわけだ。
やっぱり自前路線しかないのかねー。
0170デフォルトの名無しさん
2006/11/10(金) 14:27:260171デフォルトの名無しさん
2006/11/10(金) 15:00:54> Highlander が来年夏に延びたため
えぇー!
0172デフォルトの名無しさん
2006/11/10(金) 15:03:16前もこのパターンで騙されたぞ。
0173デフォルトの名無しさん
2006/11/10(金) 17:16:270174デフォルトの名無しさん
2006/11/10(金) 17:28:570175デフォルトの名無しさん
2006/11/10(金) 17:38:44http://www.asahi.com/obituaries/update/1110/003.html
0176デフォルトの名無しさん
2006/11/10(金) 21:34:29> ただいまスタジオ、音声収録中
文句ある?
0177デフォルトの名無しさん
2006/11/10(金) 22:55:54翻訳の才能がないのに絶望しかかったけどとりあえずレベルのものができたので
勝手ながら公開する。気になる部分やもっといい訳があればご指摘願いたい。
とりあえず転載自由で。
ttp://blogs.borland.com/abauer/archive/2006/10/31.aspx
2006年10月31日
Assignedか、not Assignedか、それが問題だ...
news://forums.borland.com/borland.public.delphi.non-technical ニュース
グループに、Assignedが単なるnilとの検査よりもよいのかどうかに関するかな
り興味深い議論があります。おなじスレッドには私が他のポストでカバーして
もよいようなFreeAndNilについての取り留めのない議論もあります。Assigned
については、それが導入されたいくつかの理由を明らかにしたいと思いました。
これはまた(あなたが沼に出会ったときにそれをふさいでいる)覆いの下でDelphi
(BDS) IDEのVCLデザイナの内部がどのように動いているのかを覗き見るという
ことでもあります。
'if PointerVar <> nil then'はポインタ変数が意味のある値を保持しているか
どうかをチェックするために使用されてきました(もちろん以前にnilで初期化
されたと仮定すればですが)。このステートメントは適度によいコードを生成し、
明確で、意図した目的によくかないます。ではなぜ"Assigned"を追加したので
しょうか?Delphi 1において我々は"メソッドポインタ"あるいは"クロージャ"
とも呼ばれる概念を言語に導入しました(実際に純粋な意味で完全な"クロージャ"
ではありませんが)。メソッドポインタは単に実行時にメソッドの実体、そして
これは非常に重要ですが、オブジェクトの特定のインスタンスに、結び付けら
れます。実際のオブジェクトインスタンスの型が任意であるという点は興味深
い指摘です。実行時に要求される型のチェックはメソッドシグネチャがメソッ
ドの型に適合するかどうかだけです。これによりDelphiのデリゲーションモデ
ルはうまくいきました。
0178177
2006/11/10(金) 22:57:44きWin64の実装で)のメソッドポインタの実装は2つのポインタで構成されます。
一つはメソッドのアドレスを、もう一つはオブジェクトインスタンスを指しま
す。簡単な"if methodpointer <> nil then"ステートメントは結局どちらのポ
インタもnilであることをチェックするということになり、論理的に見えます
(いいですか?)。そのとおり。しかしここにはちょっとした障害があります。
デザイン時にネイティブVCLフォームデザイナは帽子からいくつかのトリックを
取り出します。我々にはコンポーネントのメソッドポインタの実体に値を割り
当てる何らかの方法が必要でしたが、しかしコンポーネントは何が割り当てら
れたのかを実際には確認せず、すぐにメソッドを呼び出そうとします(ば〜ん!)。
Assignedの話に入ります。Assignedという標準関数を加えることによって、我々
は"<> nil"の動作を保護してひねりを加えることができるようになりました。
大胆にもあなたが検証できるとおり、Assignがメソッドポインタの2つのポイン
タのうち1つだけをチェックするだけであることがわかります。もう1つのポイン
タは全くテストされません。IDEのオブジェクトインスペクタ上でメソッドをメ
ソッドポインタに"割り当てる"ときには、デザイナは実際にはメソッドポイン
タ構造体の(割り当てられず、テストされない)もう一つのポインタに内部的に
生成したインデックスを詰め込む、ということが行われています。そこであな
たのコンポーネントがメソッドポインタを通して呼び出しを行う前に
"if Assigned(methodpointer) then"の判定を行うならば、コンポーネントのコー
ドはデザイン時におかしな振る舞いをすることはないでしょう。そこでDelphi 1
以降、我々は熱心に"Assignを使え...Assignを使え...Assignを使え..."とみん
なの頭に吹き込んできました。それは機能してきたと思います。コンポーネン
トの作者にとって、メソッドポインタを通して呼び出しを行う前にAssignedを
使用してその値をテストすることは重要です。それ以外のケースでは多少泥臭
0179177
2006/11/10(金) 22:58:33必ず使用しています。それはおそらく私が"古い"からかもしれませんが、わか
りません。しかし、上にあげたような理由から、メソッドポインタをテストす
るときには常にAssignedを使用しています。
なぜ通常のインスタンスの参照やポインタについても常にAssignedを使用べき
なのかについて、いくつかのかなり変わった根拠を見てきました。私が見かけ
た変わった理由の1つは、"将来、'nil'が全て0のポインタ値以外に定義される
かもしれない"というものでした。そのようなことになったらnilの"値"もまた
その状態を反映して変更されるとは思いませんか?別の要素としては、一体ど
うして非0の値をnilとして使用する必要があるというのでしょうか?PChar
(char *)が常に0で終端されるように、nilもまた常に0であるべきだということ
は、私にとっては、コンピューティングにおける不変の法則の一つです。さて、
Pascalでは必ずしも'nil'が0である必要はありませんが、0であることは便利で
一貫していて、新しいプラットフォームやアーキテクチャにおいて変更が要求
されるならば、非常に切実な再定義の理由が必要である、ということがわかり
ました。いくつかのポイントについて、その他の不明瞭な擬似事実を明らかに
し、Delphi、VCL、IDEに関係するいくつかの決定とデザインの背後にある論理
を掘り起こすために、タイムマシンで時間をさかのぼることにします。さしあ
たり、"Assigned(someinstance)"も"<> nil"もお咎めなしです...しかしメソッ
ドポインタでは常に"if Assigned(methodpointer) then"です!
0180177
2006/11/10(金) 22:59:382006年11月01日
例外安全
1992年の終わりか1993年か、そのころに我々にはジレンマがありました。Turbo
Pascal(じきにDelphi言語のベースとなりました)に例外を追加しようとしてい
ました。Windows NTは本格的に開発が行われていました。この新しいOSには構
造化例外(Structured Exception Handling/SEH)と呼ばれる新式のものがありま
した。ここにおけるジレンマとはなんだったのでしょう?Delphiの最初のリリー
スがWin16としても知られるWindows 3.1がターゲットであったということを思
い出してください。ここにはOSレベルでサポートされたSEHはありませんでした。
またWindows NTはマスマーケット向けのコンシューマベースのOSとしてリリー
スされる予定ではありませんでした。さて、なにが問題なのでしょう?単に言
語にSEHを実装して先に進みましょう。問題は"安全"に関するものでした。もち
ろん、そこで我々は16bit版のDelphi言語にSEHの特定のインプリメンテーション
を追加しました。例外はあなたのコードをより安全にするのではないでしょう
か?OK、ここで鈍感で少々曖昧な態度をとることにしましょう。
我々が直面していた基本的な問題は部分的に生成されたオブジェクトという概
念でした。オブジェクトのコンストラクタの途中で例外がライズされたらどう
なるでしょうか?コンストラクタの実行から、例外ハンドラが実行され、デス
トラクタが呼び出される時点までどれだけ離れているのかわかりますか?コン
ストラクタは順調にフィールドを初期化し、他のオブジェクトを生成し、メモ
リバッファをアロケートし、などなど…。突然、ドーン!これらの操作のうち
の一つが失敗します(ファイルを開けない、コンストラクタのパラメータに不正
なポインタが渡される、など…)。コンパイラがコンストラクタの実行を囲んで
暗黙の例外ハンドラを挟み込んでいるため、例外を捕捉して即座に忠実にデス
トラクタを呼び出します。一旦それが完結し、部分的に生成されたオブジェク
トが破棄され、リソースが解放されたら、例外は継続、言い換えれば再生成さ
れます。このシナリオにおける問題は、デストラクタにはなぜ呼び出されたの
0181177
2006/11/10(金) 23:00:26はわかりますが、だからどうだというのでしょう?)。インスタンスが完全に生
成されたのか、そうでないのか、どれだけ生成が進行していたのか、デストラ
クタにはわかりません。
解決策は非常に簡単で、同時にいささか賢明であることがわかりました。Delphi
の全てのクラスには関連付けられた仮想メソッドテーブル(VMT)があるため、そ
れぞれのインスタンスはそのテーブルを指すように初期化される必要がありま
す。Delphiのクラスではコンストラクタ内から仮想メソッドを呼び出すことを
許しているため、コンストラクタが実行を許可する前にVMTへのポインタは初期
化されます。コンストラクタが実行される前にVMTポインタがセットされる必要
があるなら、なぜ完全なインスタンスを既知の状態に初期化しないのでしょう?
これがまさに行われることです。完全なインスタンスは0に初期化され、VMTポ
インタがセットされ、インタフェースを実装するのであればそれらのVMTポイン
タもまたセットされます。オブジェクトのコンストラクタのユーザコードが実
行開始される時点で、インスタンスのデータは既知の状態になっていることを
知っておいてください。このことを利用して、デストラクタは世界がめちゃめ
ちゃになる前に初期化のシーケンスでどれだけものが確保されたのかを容易に
見分けることができます。昨日の記事でFreeAndNilプロシージャについて触れ
たのを覚えていますか?注意すべき別の項目は非仮想のTObject.Freeメソッド
です。インスタンスのフィールドが非nilまたは非0の値を含むならば、初期化
が成功裏に行われたに違いなく、逆初期化を行っても構わないという想定をし
てもいいでしょう。これはコンストラクタ内でメモリの確保やオブジェクトの
生成を行う場合には(さらには他のいかなるオブジェクトのメソッドでも)さら
に重要になります。有効なポインタがいつそのフィールドにあるのかをデスト
ラクタは知っていなければなりません。つまり非nilの値は、メモリを解放しオ
ブジェクトを破棄することを意味します。
0182177
2006/11/10(金) 23:07:01ければならないというのは非常に面倒であり間違いの元でもある、ということ
もまた理解しました。TObject.Freeの話に進みましょう。System.pasを開いて
Freeの実装を見てみると、"if Self <> nil then Destroy;"と単純です。これ
でnilや確保していないインスタンスに対してFreeを安全に呼び出すことができ
ます。なぜならメソッド内でチェックが行われるからです。必要なのは
"FField.Free;"だけで、これであなたのデストラクタは"例外安全"となります。
GetMemで確保したメモリでも同じことです。FFieldがnilであっても
"FreeMem(FField)"を安全に呼び出すことができます。話を戻します。最後に、
string、interface、動的配列、バリアントのような一部の"管理型"ではコンパ
イラが生成するメタデータを使って自動的に処理される、ということに注意し
てください。オブジェクトのインスタンスのメモリが解放される直前に、イン
スタンスと、解放の方法がわかるようにフィールドの型とオフセットを含んだ
メタデータテーブルを受け取るようなRTL関数が呼び出されます。繰り返しにな
りますが、それぞれのfieldがnilであれば、何もする必要がなく単に通過する
だけです。
FreeAndNilについてはどうでしょう?鋭いあなたはこのプロシージャの実装が、
渡された参照にまずnilをセットし、それからインスタンスを破棄しているとい
うことに気が付いたかもしれません。実際にはNilAndFreeという名前であるべ
きではないでしょうか?ええ、そうかもしれません。しかし言いにくく、同様
に混乱を招きます。"じゃあ最初に参照にnilをセットして...どうやって破棄す
るんだ?"ではなぜこのような実装なのでしょう?例外安全が大きな理由です。
別のかなり不鮮明な理由は密接にリンクされたオブジェクトと関係しています。
他のオブジェクトを順番にリストに保持しているオブジェクトが"オーナ"オブ
ジェクトへの逆参照を持っていると思いますか?オブジェクトが破棄される順
番に依存していることで、他のオブジェクトに破滅が迫っていることを知らせ
0183177
2006/11/10(金) 23:08:47リンクしているので、存続期間を通してお互いにメソッドを直接呼び合います。
しかし破棄中は、破棄を投げている間に有無を言わさず他のインスタンスのメ
ソッドを呼び出すのは非常に危険であるかもしれません。オブジェクトを破棄
する前にインスタンスポインタをnilにセットすることで、単にnilかどうかを
チェックすることでもう一方のインスタンスを破棄している間にメソッドが呼
び出されないことを確実にすることができます。
ということで、あなたのオブジェクトを"例外安全"にするいくつかの秘訣と、
FreeAndNilを使ったほうがよいという2つのヒントが得られました。覆いの下を
覗き込んでコードを試すことで、実装の理由と方法をより理解できるようにな
ります。したがっていつでも"if FField <> nil then FField.Destroy"パター
ンを使用することができますが、"FField.Free;"を呼び出せばなぜ全ての作業
が行われるのでしょうか?このパターンでは"if FField <> nil then
FField.Free;"や"if Assigned(FField) then FField.Free;"は冗長です。
以上
3本目のtry...finallyはまた週明けにでも。
■ このスレッドは過去ログ倉庫に格納されています