MARUZEN&ジュンク堂書店 渋谷店でWhy Programs Fail, 2nd Editionの翻訳である
デバッグの理論と実践 (amazon)/Andreas Zeller著/今田昌宏、大岩尚宏、竹田香苗、宮原久美子、宗形紗織訳/中田秀基監訳/オライリージャパン/ISBN 978-4-87311-593-1/3,360円
を購入。
2012年12月25日
2012年12月24日
[eBook]Parallel Programming with OmniThreadLibrary
LeanpubでPrimoz GabrijelcicさんによるDelphi上のマルチスレッドライブラリOmniThreadLibrary(OTL)の解説書である
Parallel Programming with OmniThreadLibrary/Primoz Gabrijelcic著/Leanpub/30.00USD
を購入(PDF/EPUB/MOBIをダウンロード可能)。
この本は現在も執筆中で、状況はThe Delphi Geek: Parallel Programming with OmniThreadLibrary – Current Statusで確認できます。現時点(2012/12/24)ではだいたい半分ちょっとまで書き進んだ感じです。
Parallel Programming with OmniThreadLibrary/Primoz Gabrijelcic著/Leanpub/30.00USD
を購入(PDF/EPUB/MOBIをダウンロード可能)。
この本は現在も執筆中で、状況はThe Delphi Geek: Parallel Programming with OmniThreadLibrary – Current Statusで確認できます。現時点(2012/12/24)ではだいたい半分ちょっとまで書き進んだ感じです。
2012年12月21日
InterBase XE Update 5
InterBase XE Update 5がリリースされています。バージョンは10.0.5.595となっています。
InterBase XE Update 5 Readme (en)
Team Japan » InterBase XE Update 5 (10.0.5.595)
InterBase XE Update 5 is now available
29209 InterBase XE 32-bit Update 5 (10.0.5.595) for Windows, English
29210 InterBase XE 64-bit Update 5 (10.0.5.595) for Windows, English
29207 InterBase XE 32-bit Update 5 (10.0.5.595) for Windows, Japanese
29208 InterBase XE 64-bit Update 5 (10.0.5.595) for Windows, Japanese
29216 InterBase XE Update 5 (10.0.5.595) for Mac OS X
29217 InterBase XE Update 5 (10.0.5.595) for Linux, English
29218 InterBase XE Update 5 (10.0.5.595) for Linux, Japanese
29219 InterBase XE Update 5 (10.0.5.595) for Solaris
29214 InterBase XE Update 5 (10.0.5.595) ToGo Edition, Windows/MacOSX
InterBase XE Update 5 Readme (en)
Team Japan » InterBase XE Update 5 (10.0.5.595)
InterBase XE Update 5 is now available
29209 InterBase XE 32-bit Update 5 (10.0.5.595) for Windows, English
29210 InterBase XE 64-bit Update 5 (10.0.5.595) for Windows, English
29207 InterBase XE 32-bit Update 5 (10.0.5.595) for Windows, Japanese
29208 InterBase XE 64-bit Update 5 (10.0.5.595) for Windows, Japanese
29216 InterBase XE Update 5 (10.0.5.595) for Mac OS X
29217 InterBase XE Update 5 (10.0.5.595) for Linux, English
29218 InterBase XE Update 5 (10.0.5.595) for Linux, Japanese
29219 InterBase XE Update 5 (10.0.5.595) for Solaris
29214 InterBase XE Update 5 (10.0.5.595) ToGo Edition, Windows/MacOSX
2012年12月19日
IDE Fix Pack 5.2
Andreas HausladenさんのIDE Fix Pack 2009-XE2がアップデートされてVersion 5.2になっています。Delphi 2009用のIDE Fix PackがWindows 8上でクラッシュする問題が修正されています(Delphi 2009以外のものは5.1のままです)。
IDE Fix Pack 5.2 for Delphi 2009 – Windows 8 fix | Andy's Blog and Tools
IDE Fix Pack 5.2 for Delphi 2009 – Windows 8 fix | Andy's Blog and Tools
2012年12月12日
IDE Fix Pack 5.1
Andreas HausladenさんのIDE Fix Pack 2009-XE2がアップデートされてVersion 5.1になっています。
IDE Fix Pack 5.1 for 2009-XE3 | Andy's Blog and Tools
IDE Fix Pack 5.1 for 2009-XE3 | Andy's Blog and Tools
Category:
Add-ons,
Delphi 2009,
Delphi 2010,
Delphi XE,
Delphi XE2,
Delphi XE3
at
6:57:00
0
Comments
2012年12月10日
RAD Studio/Delphi/C++Builder XE3 Update 1
RAD Studio/Delphi/C++Builder XE3のUpdate 1がリリースされています。
28984 Delphi XE3 and C++Builder XE3 ISO (includes Update 1)
28985 Delphi XE3 and C++Builder XE3 ISO (includes Update 1)
Update 1 for RAD Studio XE3, Delphi XE3 and C++Builder XE3
RAD Studio XE3/Delphi XE3/C++Builder XE3 Update 1
RAD Studio XE3(Delphi XE3/C++Builder XE3) Update 1 における不具合修正リスト (en)
C++Builder 64 ビット Windows 版のリリース ノート - RAD Studio XE3 (en)
リリース ノート: Delphi XE3 および C++Builder XE3 Help Update 2 - RAD Studio XE3 (en)
C++Builder XE3のWindows x64版に関係するオンラインヘルプの項目:
28984 Delphi XE3 and C++Builder XE3 ISO (includes Update 1)
28985 Delphi XE3 and C++Builder XE3 ISO (includes Update 1)
Update 1 for RAD Studio XE3, Delphi XE3 and C++Builder XE3
RAD Studio XE3/Delphi XE3/C++Builder XE3 Update 1
RAD Studio XE3(Delphi XE3/C++Builder XE3) Update 1 における不具合修正リスト (en)
C++Builder 64 ビット Windows 版のリリース ノート - RAD Studio XE3 (en)
リリース ノート: Delphi XE3 および C++Builder XE3 Help Update 2 - RAD Studio XE3 (en)
C++Builder XE3のWindows x64版に関係するオンラインヘルプの項目:
- C++ 64 ビット Windows 版コンパイラ: BCC64.EXE
- サポートされているプラットフォームのコンパイラ ツール チェーン
(日本語は未更新)2013/01更新済 - C++Builder 64 ビット Windows 版の相違点
- 既存の C++ プロジェクトを 64 ビット Windows にアップグレードする
- より厳密な C++ コンパイラ(BCC64)
- C++Builder 64 ビット Windows アプリケーションのデバッグ
- C++Builder 64 ビット Windows 版の新機能
- BCC64 でサポートされているプロジェクト オプション
- BCC64 でサポートされていないオプション
- 64 ビット Windows C++ アプリケーションでプリコンパイル済みヘッダーを使用する
- C++11 の機能(BCC64)
- BCC64 のエラーと警告
- BCC64 のプリコンパイル済みヘッダー関連コマンド ライン オプション
- C++0x 属性の回避策
- 64 ビット インクリメンタル リンカ: ILINK64.EXE
- 64 ビット Windows 版プリプロセッサ: CPP64
- 64 ビット Windows 版ライブラリ マネージャ: TLIB64.EXE
- 64 ビット Windows 版ファイル ダンプ ユーティリティ: TDUMP64.EXE
OVERFLOWCHECKS/RANGECHECKSオプションの効果
このアーティクルはDelphi Advent Calendar 2012に参加しています(7日ぶり2回目)。
Delphiにはオーバフローチェックと範囲チェックというコンパイラオプションがあります。
オーバーフローのチェック(Delphi) - RAD Studio XE3
範囲チェック - RAD Studio XE3
いずれもプロジェクトオプションのコンパイラで指定するか、{$OVERFLOWCHECKS ON|OFF}{$RANGECHECKS ON|OFF}で任意の範囲に対して指定することができます。しかしデフォルトの状態ではどちらもOFFなので、ONにした場合の
が実際にどのようなことを示しているのかを知っている人は意外に少ないのではないでしょうか。そこでこれらのオプションによるペナルティがどのようなものなのかを確認してみます(Delphi XE2/Windows x86/Debugビルドで検証)。
まず{$OVERFLOWCHECKS ON}(短縮形{$Q+})です。
赤で示した2行が{$OVERFLOWCHECKS ON}で追加される命令になります。直前のadd命令の結果、OF(overflow flag)がセットされていればIntOver(System.pasのprocedure _IntOver)を呼び出して例外EIntOverflowが生成されます。{$OVERFLOWCHECKS ON}とすることで、
一方{$RANGECHECKS ON}(短縮形{$R+})ですが、これには配列および文字列の添字のチェックとスカラ型/部分範囲型変数への代入時の範囲チェックの2つの効果があります。まず添字のチェックですが、ちょっとわかりづらいので{$RANGECHECKS OFF}のものと両方を並べてみます。
{$RANGECHECKS OFF}の場合は単に文字列の格納されているアドレスに添字-(1*SizeOf(Char))を足した場所にアクセスしているだけですが、{$RANGECHECKS ON}では空文字列かどうかのチェック(赤字)と文字列長以内かどうかのチェック(青字)が行われていることを含め、添字の一時的なデクリメント(文字列の添字が1オリジンなので)など、結構複雑な処理が行われていることがわかります(こちらは例外ERangeErrorが生成されます)。
最後に部分範囲型の変数への代入を見てみます。
加算、減算とも計算後に一時的に部分範囲の最小値を引いて、部分範囲におさまっているかどうかのチェックを行い(赤字)、改めて最小値を足す(青字)など、これもまた複雑な処理になっています。
ということで、オーバフローチェックはFLAGSレジスタのOFを検査するだけなので比較的ペナルティは小さく、オーバフローを検出したい状況では積極的にONにしても問題なさそうです。一方範囲チェックは範囲の最小値が0でないと処理が複雑になることもあり、明示的に必要な範囲チェックのコードを記述したほうがいいような気もします。
Delphiにはオーバフローチェックと範囲チェックというコンパイラオプションがあります。
オーバーフローのチェック(Delphi) - RAD Studio XE3
範囲チェック - RAD Studio XE3
いずれもプロジェクトオプションのコンパイラで指定するか、{$OVERFLOWCHECKS ON|OFF}{$RANGECHECKS ON|OFF}で任意の範囲に対して指定することができます。しかしデフォルトの状態ではどちらもOFFなので、ONにした場合の
オーバーフローのチェックを有効にすると,プログラムは遅くなり,またいくらか大きくなるため,{$Q+} はデバッグにのみ使用してください。
範囲チェックを有効にすると、プログラムの処理速度が遅くなり、サイズも多少大きくなります。
が実際にどのようなことを示しているのかを知っている人は意外に少ないのではないでしょうか。そこでこれらのオプションによるペナルティがどのようなものなのかを確認してみます(Delphi XE2/Windows x86/Debugビルドで検証)。
まず{$OVERFLOWCHECKS ON}(短縮形{$Q+})です。
var
a: Integer;
b: Integer;
c: Integer;
begin
{$OVERFLOWCHECKS ON}
a := $44444444;
b := $44444444;
c := a + b;
{$OVERFLOWCHECKS OFF}
end;
このコードは以下のように展開されます。Unit1.pas.36: a := $44444444;
0051139C C745F844444444 mov [ebp-$08],$44444444
Unit1.pas.37: b := $44444444;
005113A3 C745F444444444 mov [ebp-$0c],$44444444
Unit1.pas.38: c := a + b;
005113AA 8B45F8 mov eax,[ebp-$08]
005113AD 0345F4 add eax,[ebp-$0c]
005113B0 7105 jno $005113b7
005113B2 E8BD39EFFF call @IntOver
005113B7 8945F0 mov [ebp-$10],eax
特定の整数算術演算(+,-,*,Abs,Sqr,Succ,Pred,Inc,および Dec)毎にこのコードが追加で生成される、ということのようです。
一方{$RANGECHECKS ON}(短縮形{$R+})ですが、これには配列および文字列の添字のチェックとスカラ型/部分範囲型変数への代入時の範囲チェックの2つの効果があります。まず添字のチェックですが、ちょっとわかりづらいので{$RANGECHECKS OFF}のものと両方を並べてみます。
var
s: String;
c: Char;
begin
s := 'TEST';
c := s[6];
{$RANGECHECKS ON}
c := s[6];
{$RANGECHECKS OFF}
end;
このコードは以下のように展開されます。Unit1.pas.52: c := s[6];
00511464 8B45F8 mov eax,[ebp-$08]
00511467 668B400A mov ax,[eax+$0a]
0051146B 668945F6 mov [ebp-$0a],ax
Unit1.pas.54: c := s[6];
0051146F B806000000 mov eax,$00000006
00511474 8B55F8 mov edx,[ebp-$08]
00511477 48 dec eax
00511478 85D2 test edx,edx
0051147A 7405 jz $00511481
0051147C 3B42FC cmp eax,[edx-$04]
0051147F 7205 jb $00511486
00511481 E8E638EFFF call @BoundErr
00511486 40 inc eax
00511487 668B4442FE mov ax,[edx+eax*2-$02]
0051148C 668945F6 mov [ebp-$0a],ax
最後に部分範囲型の変数への代入を見てみます。
type
TSubInt = 8..15;
var
a: TSubInt;
b: TSubInt;
c: TSubInt;
begin
{$RANGECHECKS ON}
a := 8;
b := 8;
c := a + b;
a := 9;
b := 8;
c := a - b;
{$RANGECHECKS OFF}
end;
加算と減算の両方を確認してみます。Unit1.pas.69: a := 8;
005114D8 C645FB08 mov byte ptr [ebp-$05],$08
Unit1.pas.70: b := 8;
005114DC C645FA08 mov byte ptr [ebp-$06],$08
Unit1.pas.71: c := a + b;
005114E0 33C0 xor eax,eax
005114E2 8A45FB mov al,[ebp-$05]
005114E5 33D2 xor edx,edx
005114E7 8A55FA mov dl,[ebp-$06]
005114EA 03C2 add eax,edx
005114EC 83C0F8 add eax,-$08
005114EF 83F807 cmp eax,$07
005114F2 7605 jbe $005114f9
005114F4 E87338EFFF call @BoundErr
005114F9 83C008 add eax,$08
005114FC 8845F9 mov [ebp-$07],al
Unit1.pas.72: a := 9;
005114FF C645FB09 mov byte ptr [ebp-$05],$09
Unit1.pas.73: b := 8;
00511503 C645FA08 mov byte ptr [ebp-$06],$08
Unit1.pas.74: c := a - b;
00511507 33C0 xor eax,eax
00511509 8A45FB mov al,[ebp-$05]
0051150C 33D2 xor edx,edx
0051150E 8A55FA mov dl,[ebp-$06]
00511511 2BC2 sub eax,edx
00511513 83C0F8 add eax,-$08
00511516 83F807 cmp eax,$07
00511519 7605 jbe $00511520
0051151B E84C38EFFF call @BoundErr
00511520 83C008 add eax,$08
00511523 8845F9 mov [ebp-$07],al
ということで、オーバフローチェックはFLAGSレジスタのOFを検査するだけなので比較的ペナルティは小さく、オーバフローを検出したい状況では積極的にONにしても問題なさそうです。一方範囲チェックは範囲の最小値が0でないと処理が複雑になることもあり、明示的に必要な範囲チェックのコードを記述したほうがいいような気もします。
2012年12月7日
第24回エンバカデロ・デベロッパーキャンプ
本日10:00から第24回エンバカデロ・デベロッパーキャンプが東京ビッグサイト(東京国際展示場)の会議棟6Fで行われます。今回も一部のセッションがUStreamで中継されますが、残念ながらG6は中継なしとのことです。
2012/12/11追記: いろいろ忙しくてアーティクルの更新を忘れていました。最後の最後にどんでん返しがありましたが、無事に終了しました。セッションスピーカ、参加者、関係者の皆さん、おつかれさまでした。今回のデベロッパーキャンプでの情報としては
- 【A1】HTML5チュートリアルセッション「HTML5によるモバイル/タブレットアプリケーション開発」
- 【B1】Delphiチュートリアルセッション「Delphiで学ぶ楽しいプログラミング基礎 - 出来るプログラマになる第一歩」
- 【A2】Delphi/C++Builderテクニカルセッション「“FireMonkey が得意とするビジネスアプリ” の考察」
- 【B2】C++テクニカルセッション「C++言語新機能を使おう!」
- 【G3】ジェネラルセッション「エンバカデロ・プロダクトアップデート」
- 【A4】Delphi/C++Builderテクニカルセッション「RAD Studio XE3によるWindows 8開発」
- 【B4】 Delphi/C++Builderテクニカルワークショップ「Delphi / C++Builder 旧バージョンアプリケーションの移行」
- 【A5】 Delphiテクニカルセッション「Delphi+Visual LiveBindingによるデータベースアプリケーション開発」
- 【B5】 C++テクニカルセッション「C++Builder 64-bit Deep Dive」
- 【G6】 Q & Aセッション「アスク・エンバカデロ」
2012/12/11追記: いろいろ忙しくてアーティクルの更新を忘れていました。最後の最後にどんでん返しがありましたが、無事に終了しました。セッションスピーカ、参加者、関係者の皆さん、おつかれさまでした。今回のデベロッパーキャンプでの情報としては
- C++Builder x64版は2012/12/10リリース予定(既にリリース済ですが)
- Mobile StudioはまもなくiOSについてベータ開始、春頃?リリース希望
- Mobile Studio for AndroidはiOSのあと、今年の前半にはリリース希望
- Mobile StudioのDelphiコンパイラは既にLLVMベースで動作?(未確認)
- Mobile Studioのベータに参加してこんな機能がほしいという希望を出してほしい
- Windows用のインストーラについては現在いろいろな製品を評価中
2012年12月6日
C++Builder 64-bit Compiler Preview
C++Builder 64-bit Compiler Previewが公開されています。
29197 C++Builder 64-bit Compiler Preview
YouTubeにも同じビデオがアップロードされています(限定公開のようなので上記のリンクからたどってください)。
29197 C++Builder 64-bit Compiler Preview
YouTubeにも同じビデオがアップロードされています(限定公開のようなので上記のリンクからたどってください)。
2012年12月3日
ジェネリックスの型パラメータに対する制約
このアーティクルはDelphi Advent Calendar 2012に参加しています。
ジェネリックスでは渡される型パラメータに関する制約を指定することができます。
ジェネリックスの制約 - RAD Studio XE3
ここで制約としてインタフェース型またはクラス型を指定すると型パラメータは必然的にそのクラス型、インタフェース型になります。またconstructorを指定すると型パラメータはクラス型になります(レコード型はパラメータを持たないコンストラクタを定義できないため)。classを指定するとこれもまたクラス型、インタフェース型になります(ヘルプ参照)。
では最後に残ったrecordを指定(レコード指定)した場合、型パラメータに許される型はレコード型だけなのでしょうか?実際にはレコード型だけではなく、いわゆる値型(参照型ではないもの)であればいいようで、IntegerやCardinal、あるいは部分範囲型や列挙型も指定することができます。
ただしString型は参照型でありながらクラス型ではないため、constructor以外の制約を指定された型パラメータにStringを指定するとコンパイルエラーになります("class"を指定すると
元ねたはDelphi XE2 Foundations。
2013/07/03追記: constructor制約については細川さんによる考察が参考になります。
ジェネリックスでは渡される型パラメータに関する制約を指定することができます。
ジェネリックスの制約 - RAD Studio XE3
ここで制約としてインタフェース型またはクラス型を指定すると型パラメータは必然的にそのクラス型、インタフェース型になります。またconstructorを指定すると型パラメータはクラス型になります(レコード型はパラメータを持たないコンストラクタを定義できないため)。classを指定するとこれもまたクラス型、インタフェース型になります(ヘルプ参照)。
では最後に残ったrecordを指定(レコード指定)した場合、型パラメータに許される型はレコード型だけなのでしょうか?実際にはレコード型だけではなく、いわゆる値型(参照型ではないもの)であればいいようで、IntegerやCardinal、あるいは部分範囲型や列挙型も指定することができます。
type
TConstraintTest<T: record> = record
class procedure TestProc(Value: Integer); static;
end;
class procedure TConstraintTest<T>.TestProc(Value: Integer);
begin
{ No operation }
end;
このようなジェネリックスを定義すると、type
TTestRange = 1..5;
TTestEnum = (One, Two, Three);
begin
TConstraintTest<TPoint>.TestProc(0);
TConstraintTest<Integer>.TestProc(0);
TConstraintTest<Cardinal>.TestProc(0);
TConstraintTest<TTestRange>.TestProc(0);
TConstraintTest<TTestEnum>.TestProc(0);
end;
これらはすべて正しくコンパイルされます。ただしString型は参照型でありながらクラス型ではないため、constructor以外の制約を指定された型パラメータにStringを指定するとコンパイルエラーになります("class"を指定すると
E2511 型パラメータ 'T' はクラス型が必要です、"record"を指定すると
E2512 型パラメータ 'T' は非 null 値型が必要ですとなる)。つまり文字列型を受け入れるためには型パラメータに制約を指定しないか、constructor制約を指定するかのいずれかが必要ということになります。
元ねたはDelphi XE2 Foundations。
2013/07/03追記: constructor制約については細川さんによる考察が参考になります。
Category:
Delphi 2009,
Delphi 2009 Ready,
Delphi 2010,
Delphi Programming Tips,
Delphi XE,
Delphi XE2,
Delphi XE3
at
0:01:00
0
Comments
2012年12月1日
2012/12開催のウェブセミナー
- 2012/12/10 23:00-2012/12/11 07:45(JST) CodeRage 7 - The Online C++ Developer Conference Day 1
- 2012/12/11 23:00-2012/12/12 07:45(JST) CodeRage 7 - The Online C++ Developer Conference Day 2
- 2012/12/12 17:00-18:00(JST) 12/12 - RAD Studio XE3 Webセミナーシリーズ - HTML5開発入門 - HTML5 Builderを利用して効率的に
- 2012/12/12 23:00-2012/12/13 07:45(JST) CodeRage 7 - The Online C++ Developer Conference Day 3
- 2012/12/19 17:00-18:00(JST) 12/19 - デベロッパーTV - いよいよ登場C++Builder 64-bit
登録:
投稿 (Atom)