別のブログでDelphiコンパイラで長い文字列や複数行の文字列リテラルのサポートについて紹介いたしましたが、これ以外にも12.0ではDelphi 言語に関連する変更が予定されています。
その1つが、弱いエイリアス(weak alias)のデータ型の概念の導入です。弱いエイリアス型とは、名前は異なりますが、元の型の完全な置き換えとして機能する型のことです。言語規約により、通常のエイリアスのデータ型には、元のデータ型と同じ振る舞いをする新しいデータ型が導入されます。
この新しいエイリアスが導入される理由は、開発者が32ビットと64ビットのアプリケーションで同じようにコンパイルおよび動作する単一ソースコードのアプリケーションを維持できるようにするためです。例えば、これに関連するシナリオとして、コードの互換性のために使用されるデータ型「NativeInt」 が抱える問題があります。DelphiのInteger型は、ターゲットの CPU ビット数に関係なく、常に 32 ビット数値にマップされますが、NativeInt 型は CPU に適応します。 32 ビットターゲットでは 32 ビット (つまり、Integer のエイリアス)、64 ビット ターゲットでは 64 ビット (つまり、Int64 データ型のエイリアス) となります。言い換えれば、NativeInt は指定されたターゲットの Pointer 型にマップされます。
この仕様はこれまでのDelphiの過去バージョンでもそうでしたが、12.0でも変わりません。ただ、新しいエイリアスの変更は、型の互換性、および型に基づいたメソッドをオーバーロードする方法に影響します。
以前は、データ型(Integer、NativeInt、Int64)は別物として扱われ、これらのデータ型に基づいてオーバーロードされた関数を作成できました。 しかし、NativeIntはプラットフォームに応じて “Integer” または” Int64”の「強力なエイリアス」でした。これにより、コンパイラがユースケースに応じて適切な区別することができず、あいまいな呼び出しによって多くの問題が発生していました。
Delphi 12.0では、NativeInt は「弱いエイリアス」になり、今までのような方法で使用できなくなり、別の型として認識されますので、以下のようなオーバーロードはできなくなりました。
[crayon-673f6cffc5ed0667617091/]12.0では、NativeInt は「弱いエイリアス」になり、今までのような方法で使用できなくなり、別の型として認識されますので、Delphi では以下のようなオーバーロードはできなくなりました。
上図の例では、 3 行目でコンパイルエラーが発生します。12.0では再宣言されていると判断されているためです。32ビット整数と64ビット整数の扱い方を区別したい場合は、以下のように定義する必要があります。
[crayon-673f6cffc5ed8863253940/]もしくは、以下のコードのように特定のプラットフォームに依存するコードを定義します。
[crayon-673f6cffc5edc906796115/]今回の変更によって既存のコードに影響を与える可能性があることは承知しています。この妥協案は32 ビットコードを壊さないようにするためのものですが、開発者は64ビットで動作するようにコードを更新する必要があるかもしれません。
エンバカデロでは、一部のRTL データ構造とメソッドを大幅に変更し、未解決の問題の一部を解決しましたが、いくつかの非互換性が存在していることも確認しています。この変更は、長期的には32ビットと64ビットの互換性をより良く維持するために必要であり、既存の一部のコードに影響を与える可能性があるにもかかわらず、この変更がDelphi言語の将来にとって重要であると考えました。
RAD Studio/Delphi/C++Builder 12.0の詳細について、日本時間11月10日午前1時に開催される “What’s Coming“ウェビナーにご参加ください。
※免責事項:このブログ記事で説明しているRAD Studioの将来のバージョンにおける新機能や改善点は、いずれも開発が完了しGA版がリリースされるまでコミットされません。