Delphi 10.3 Rio リリース

#Delphi 10.3 Rio

2018/11/22 AM 01:00 (JST) に最新の Delphi 10.3 Rio（でるふぁい じゅってんさん りお）がリリースされました。

この記事では大きな変更があった IDE と言語機能の変更について述べていきます。

全ての新機能については、下記をご覧下さい。

[Delphi 10.3 新機能](http://docwiki.embarcadero.com/RADStudio/Rio/ja/%E6%96%B0%E6%A9%9F%E8%83%BD)

# インストール～起動まで

今回は IDE の大規模な改修が入ったので、インストールから起動までの画面を見てみます。

#### インストーラー(オフラインインストーラー)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12977/7d4a2ada-cd54-9e22-d532-0ca06d8916cd.png)

インストーラーは下記の２種類あります。

* GetIt インストーラー
* Offline インストーラー

GetIt インストーラーはクラウドベースのインストーラーで必要なファイルをダウンロードしてインストールします。
オフラインインストーラーは ISO ファイルで提供され、必要なファイルを ISO イメージから読み出してインストールします。
ネットにアクセスしないのでオフラインインストーラーの方が早そう、という予想に反し、GetIt インストーラーの方が高速です[^1]。

にも関わらず、僕が好んでオフラインインストーラーを使うのは、過去バージョンを保存しておけるためです。

[^1]: GetIt インストーラーができたのはエンバカデロ・テクノロジーズの社長であるアタナス・ポポフ氏がインストーラー遅いから速いの作れや！ってなってできた物です。なので速いのです。

#### スプラッシュ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12977/4b5ecc08-2d7e-f54d-8b47-26a07f66c2c7.png)

スプラッシュの画像はあまり変わり有りませんね。

#### テーマ選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12977/169659db-35a9-3968-1a4d-34d8650837c8.png)

ライトテーマとダークテーマは修正が入り、ライトテーマは薄い青(#E7EFF5)がベースになり、ダークテーマも青みがかった黒(#36414A)がベースになりました。

#### パーソナライズ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12977/416b3673-6dee-5afd-77b0-603b393bf5b9.png)

こちらも以前と変わり有りませんね。

#### 起動直後の IDE
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12977/f8990af3-3aa3-66da-d386-f0b38796eb1d.png)

Tokyo のダークテーマより見やすくなったと思います。
色以外だと「デスクトップの配置」がタイトルバーに表示されるようになっているのが大きな変更箇所でしょうか。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12977/03f5ac01-7594-a151-4260-6e492ea95b4d.png)

一番左のウィンドウに三日月が付いているアイコンには、デスクトップの配置を保存したり、テーマを切り替えたりといった機能が纏められています。

#### タブ
タブの見た目もフラットな見た目に変更されています。
例えば、Classic デスクトップのコンポーネントパレットのタブなどです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12977/b0b5a8b5-5a17-32dd-9406-e4b9fc23ddd7.png)

#### コードエディタ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12977/f3c4f855-7bec-237a-cbdb-fefba1892e48.png)

個人的についに！と思ったのがここ。
プロパティがちゃんとあるべき場所であるコンテキストメニューの一番最後に移動しました。
それ以外については大きな変更は無さそうです。

#### オプション
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12977/775c857c-a85d-187b-74eb-59ce91668de7.png)

オプション画面はこのような感じで全体的にモダンな見た目になっています。
灰色で影がつくようなデザインから、Windows 10 の Modern UI テイストになっています。

#### プロジェクトオプション
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12977/a163fa34-bbb9-299f-de24-a7847d174841.png)

プロジェクトオプションも変更され、すっきりとした見た目になっています。
また、一部で言われていた Windows 用の設定なのに icns 指定ができる macOS 用設定なのに ico が指定できるといったことも改称されています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12977/1df91768-5de2-d8b7-ecf6-a1440562aed4.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12977/248dcef3-2828-7ffc-6c10-879df4a3c80f.png)

#### GetIt

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12977/39547dd1-1cc7-63df-707b-14d5d8b05f01.png)

GetIt も今までのアイコンが並んでいるスタイルから、アイコンと説明部が並ぶスタイルに変わりました。
非常にわかりやすくなりました。

#### バージョン情報
![image.png](https://qiita-image-store.s3.amazonaws.com/0/12977/69f6a212-07d1-7301-e0a3-9584c2a8c333.png)

現時点での 10.3 Rio のバージョンは 26.0.32429.4364 となっています。
パッチやマイナーバージョンアップで、このバージョンは変わっていきます。

#### DocWiki
DocWiki も全体の雰囲気に合わせてデザインが変更されています。

[RAD Studio Rio ヘルプ](http://docwiki.embarcadero.com/RADStudio/Rio/ja/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8)

# 言語の変更箇所

ここからは言語に関する変更を見ていきます。
Object Pascal に大きな変更が加わっています。

### インライン変数宣言

なんと言ってもまずはコレ。

```pascal
procedure Foo;
begin
  var A: Integer;
  A := 0;
end;
```

と、こんな風に変数宣言ブロック無しでいきなり変数を宣言できるようになりました。
さらに

```pascal
procedure Foo;
begin
  var A: Integer := 0;
end;
```

と、宣言と初期化を一緒にできます。
ここで、注意したいのは

```pascal
procedure Foo;
begin
  var A: Integer := 0; // OK
  var B: Integer = 0;  // NG
end;
```

と、大域変数の宣言方式ではなく := が必要になるところです。
恐らくこれは後述の型推論による型宣言を省略したときに代入の一貫性を持たせるためだと思われます。

インライン宣言された変数のスコープはブロック（begin end や repeat until など）毎のスコープになります。

```pascal
procedure Foo;
begin
  // 複文でスコープを設定する
  begin
    var A: Integer := 0;
  end;

  // この位置では A は見えない。
  Writeln(A); // NG
end;
```

ちなみに、TIntefacedObject を利用したインターフェースの自動開放もブロックスコープ毎になります。

```pascal
type
  IBar = interface
    procedure Hello;
  end;

  TBar = class(TInterfacedObject, IBar)
  public
    procedure Hello;
  end;

{ TBar }

procedure TBar.Hello;
begin
  Writeln('Hello, Rio !');
end;

procedure Foo;
var
  i: Integer;
begin
  begin
    var B: IBar := TBar.Create;
    B.Hello;
  end; // B はここでリリースされる
end;
```

さらに今までの変数ブロック方式では絶対に無理だった型推論も搭載されました。
↓こんな風に右辺値から左辺の型を推論し型を決定してくれます。

```pascal
procedure Foo;
begin
  var A := 20; 
  var B := TList<String>.Create;
  try
    B.Add('Bar');
  finally
    B.DisposeOf;
  end;
end;
```

型推論が威力を発揮するのは for to do / for in do ループです。
インデックスにわざわざ型を指定しなくても良くなります。
特に Dictionary では TPair<T, U> を指定するのが面倒だったため非常に有用ですね

```pascal
procedure Foo;
begin
  var D := TDictionary<String, Integer>.Create;
  try
    D.Add('Bar', 0);

    // 型を省略
    for var Item in D do
      Writeln(Item.Key, ' = ',  Item.Value);
  finally
    D.DisposeOf;
  end;

  // 型を省略
  for var i := 0 to 10 do
    Writeln(i);
end;
```

~~ただし、TDictionary については for-in 文の前に別の for 文があると推論が上手くいかずに実行時エラーになるため、型を指定してあげなくてはならないようです([RSP-21632](https://quality.embarcadero.com/browse/RSP-21632))。~~ 10.3.2 で修正済み

##ARC 廃止
現状では、Linux 向けコンパイラのみ Windows コンパイラと同じメモリ管理モデルに戻ったとのことですが、将来的には全てのコンパイラで ARC が廃止される予定になっています。
2020/08/24 追記：[10.4 Sydney では全コンパイラで ARC が廃止されました。](https://qiita.com/pik/items/a00f16c6eb457d3f35f0)

これは VCL や FMX の Owner モデルと都合が悪かったり、メモリモデルが２種類（ARC と非 ARC）となるとコードが煩雑になる、自動的に挿入される解放コードによって実行速度が遅くなる、といった複数の問題に直面したため、ARC を廃止するという方向になったようです。

例えば、以下のようなコードは

```pascal:ARCが有効な場合
procedure Foo;
var
  P: TObject;
begin
  P := TBar.Create;
  // なにか処理
end;
// ここを抜けると P が廃棄される
```

下記の様に普通に生成と破棄をセットにして書き直さねばなりません。

```pascal:ARCが無効の場合
procedure Foo;
var
  P: TObject;
begin
  P := TBar.Create;
  try
    // なにか処理
  finally
    P.DisposeOf;
  end;
end;
```

勘違いしないで欲しいのですが TInterfacedObject を使った参照カウント管理の仕組みは生きています。
つまり、TOCImport や TJavaImport は TInterfacedObject を継承しているため各 OS の API にアクセスするコードはそのまま有効です。

## Linux での Ansi 文字列のサポート

Windows と同等のコンパイラになったという副作用から AnsiString, AnsiChar が使えるようになっています。
ただし、使えるようになっただけで、通常の String (UnicodeString) が推奨なのは言うまでもありません。

ちなみに、今までは下記の様なコードで変換していました（~~iOS / Android は今でも同じです~~ 10.4 Sydney では全てのコンパイラで AnsiString/AnsiChar がサポートされています）。

```pascal
var
  M: TMarshaller;
  P: TPtrWrapper;
begin
  P := M.AsAnsi('UnicodeString'); // TPtrWrapper に変換され
  Bar(P.ToPointer) //ToPointer メソッドで Ansi 文字列へのポインタがとれる
end;
```

## Managed Record

10.3 Rio でサポートされる予定だった "Managed Record" に関しては今回は見送りとなりました。
10.4 以降でサポートされる予定だそうです。
2020/08/24 追記：[10.4 Sydney でサポートされました。](https://qiita.com/pik/items/6e8c3df6095581bf39ee)

[Deferring Delphi Managed Records Support](http://blog.marcocantu.com/blog/2018-november-deferring-managed%20records.html)

# その他
#### C++Builder
C++Builder 側では C++17 に対応したりデフォルトコンパイラが Clang ベースの物になるなど大きく進化しました。

#### VCL
VCL では、高 DPI サポートが強化されました。
また、 Win32 API, WinRT API が更新されました。

#### FMX
FMX は Android API 26 に対応し、Google Play の新しい要件をクリアできるようになりました。
iOS12, macOS Mojave もサポートされました。
Android では、Android Z オーダーサポートや、一部のコントロールではネイティブコントロールがサポートされました。
個人的に嬉しいのは新設された TPermissionsService クラスによって統合的にアクセス許可を得られるようになったことです。

#### RTL
RTL の変更点は主にスピードアップです。
TStringHelper や JSON の処理、TList<T>, TMemIniFile などがスピードアップされています。

# まとめ
駆け足になりましたが、IDE と言語機能について紹介しました。
Rio は思ったよりも大きな変更になりました。
今後も Delphi を発展させるための礎を築いたのかな、と感じています。
引き続き Community Edition も提供されていますし、今後の発展を願ってやみません！