サイトアイコン Embarcadero RAD Studio, Delphi, & C++Builder Blogs

Delphi 10.4の新機能: Code Insightの再設計

the future of starts demands massive productivity

10.4では、コード補完といくつかの機能を再実装しました。これは、ここ10年で最も大きなIDEの変更になります。

Code Insightとは?

はじめに背景を説明します。すでにCode Insightについてよく知っているという方は、飛ばしても構いません。

Code Insightは、エディタにおけるIDE生産性機能のセットに付けられた名称です。ここでは、次のような機能を指すこととします。

これらの機能は、Delphiで長年にわたって利用可能にしてきました。こうした機能は、IDEを使ってコーディングを行うメリットとして最も大きなものです。コード補完は、特に入力の手間を省きます。また、エラーインサイトは、コンパイルすることなく事前にコードが正しいかどうかを確認するのに役立ちます。

従来のCode Insight

言語の進化と時間の経過によって、これらの機能は、これまで望んでいたようには常に機能しなくなってきました。導入当初は、そのテクノロジーは最先端でしたが、現在は改善すべき箇所が明確になっています。

正しくないエラーに関するバグレポート(つまり、実際には、完全に正しいソースコードであっても、エディターや構造ビューに報告されるエラーのこと)を、しばしば目にします。あるいは、IDEがメインスレッドで動作しているため、コード補完リストを表示するためにIDEが働いている間、キー操作に応答しなくなるという問題もあります(キャンセルするには、ESCキーを押します)。また、大規模プロジェクトでは、コード補完用のデータ処理に、IDEが大量のメモリを消費してしまうケースもありました。さらに、これらの機能は複数のコードパーサーを使用して実装されており、コード補完とエラーインサイトは、それぞれ異なるコード解析を行っていました。そして、デバッグ中はCode Insightが無効になってしまうため、デバッグ中のコーディング作業には、生産性機能のサポートはありません。

これをこのままにしておきたくなく、10.4では次のような目標を設定しました。

これらすべてがDelphi 10.4で提供されます。

いかがですか?すごいですよね。これは、ここ15年でDelphi IDEに対する最大かつ最良の修正のひとつとなります。

(従来のCode Insightを必要とする方のために、いくつかの新しいバグ修正を加えて10.4でも存続しており、必要に応じて有効にすることができます。)

Delphi 10.4のCode Insightテクノロジー

10.4では、上述したCode Insightの機能は、「LSPサーバー」を用いて実装されています。このテクノロジーについて聞いたことがあるかもしれませんが、LSP(Language Server Protocol)は、多くの言語でCode Insightのような機能を実装可能にするための手法を標準化したものです。IDEは「言語サーバー」と通信します。これは、小さなヘルパーアプリで、IDEに表示する情報を計算し生成します。この通信は、定義されたプロトコル、すなわち言語サーバープロトコルを用いて行われます。

言い換えれば、プロジェクトを開く、キーボードをタイプするといった動作の中で、IDEはヘルパーアプリと対話し、「この場所における補完の結果は何ですか?」といった質問を定期的に発するのです。ヘルパーアプリは、常にコードを追跡し、IDEからの質問に答え、さらにコード内にエラーを検出したらそれも返します。

10.4におけるサーバーアプリはコンパイラを中心に構築されており、コンパイラをサービスとして利用してLSPの結果を提供します。つまり、「赤い波線」で示されるエラーを含め、IDE上に表示されるのは、すべてコンパイラ自体からのデータになります。

このことは、いくつかの意味を持ちます。

これは大変よい効果を生み出します。

とはいえ、説明はもう十分でしょう。実際の動作を見てみましょう。

Delphiの新しいCode Insightの動作

実際のところ、ブログ記事でリアルタイムレスポンスをご覧いただくのは難しいと思います。以下に示した画面ショットは、ちょうど入力をしている最中に表示された状態だと想定してください。Windowsの砂時計のカーソルは表示されません。

10.4がリリースされたときには、ここで想像したことが現実のものとしてご覧いただけるでしょう。

デバッグ中のCode Insight

最初の新機能は、大きな改善点で多くの説明は要りません。Code Insightをデバッグ中に利用できます。

アプリケーションをデバッグしているときに、コードも修正したい。そしてコード補完も使いたい。それが可能になります。

ご覧いただいている画面ショットは間違いではありません。コード補完とともにエラーインサイトもアプリケーションのデバッグ中に動作しています。

コード補完の結果

10.4でも、コード補完が働くという点では、IDEの応答性を妨げないという点を除けば10.3.3と同じと言えます。しかし、コード補完で必要とするものをより簡単に見つけられるようにする新機能が加えられています。10.4では、コード補完は、以前よりも多くの役立つ情報を表示するようになりました。それでも、10.3.3で表示された項目は、結果リストの一番上に表示されます。

こちらは、10.3.3で、VCLのTButtonインスタンスの後で「act」とタイプした場合のコード補完の結果です。

10.3.3では、わずかな結果しか表示されないことに注意してください。この場合は、1つだけです。従来のコード補完のリストは、タイプした文字列で「始まる」項目(前方一致)のみを表示していました。

こちらは、同じコード補完の10.4での動作です。

10.4では、タイプした文字列を「含む」すべての項目(部分一致)がリストされます。他のIDE、例えばVisual Studioなどでも同様の動作をしますが、現時点ではDelphiの方がより限定的です。これはむしろ、「コード補完による検索」が容易なので便利でしょう。

例えば、あるコントロールに「なんとかRect」とかいうプロパティがあったはずだけれども、名前をちゃんと思い出せないことがあったとしましょう。10.3.3では、ググって調べなければなりません。でも、10.4なら単に「rect」と入力するだけで、次のように表示されます。

このようにタイプしながら、コードを調べることができます。

より多くの項目が表示されることが、必ずしも必要とされるものとは限りません。従来の習慣からすれば、タイプした文字列から始まる項目だけを期待するかもしれません。デフォルトでは、10.3.3までの使い慣れた動作に近づけるために、補完リストを並べ替えて、タイプした文字列で「はじまる」項目を、その他のすべての候補よりも優先して上に配置するようにしています。つまり、候補リストは10.3.3と同じ結果を最初に表示しますが、10.4では、さらに追加の候補が表示されるのです。これらの追加の項目が探しているものと関係ない場合は、使う必要はありません。10.3.3で表示される項目のあとに表示されるので、じゃましません。

他のIDEのような動作が好みで、すべての候補を区別なく表示したい場合には、設定を変更できます。現時点ではレジストリキーによる設定になりますが、設定項目をUIとして公開する可能性もあります。つまり、VSCodeが提供する機能に慣れている方は、それも可能だということです。

10.4では、リストの一番上にタイプした文字列で「はじまる」候補が表示されるように並び替えられます。最初の項目は10.3.3の表示と同様で、10.4のデフォルト動作です。 10.4では、スコープのみでの並び替えも可能で、タイプした文字列を含むすべての候補が一緒に表示されます。これはVisual Studioや他のIDEに類似した動作で、デフォルトではオフになっています。

コード補完リストの項目選択

コード補完では、リスト内の最適な項目が、次に示した順序で自動的に選択されます(これにより、Enterキー、Spaceキー、または「.」などのキーを押すことで、そのアイテムを選択してコーディングを継続できます)。

タイプした文字列で「はじまる」候補を、「含まれる」候補よりも優先するということは、補完リストでは「SetParent」ではなく「Parent」が自動的に選択されることになります。最短一致による選択では、「ParentFont」ではなく「Parent」が選択されます(上記の画面ショットを参照)。一般的に、この方法がタイプした文字列に最も合致するものになるようです。もちろん、上下の矢印キーを押してスクロールさせ、合致する項目を選択することができます。

エラーインサイト

一連の画面ショットで、タイピングに応じてライブで更新されるエラーインサイトの表示を見ることができます。部分的に入力された「pare」は、有効なコードではなく、正確に「赤の波線」が表示されています(コード補完の候補から項目を選択すると、この波線は消えます)。エラーインサイトの結果は、コンパイラ自身から取得されるので、コンパイラの解釈を正確に反映してレポートします。

エディターや構造ウィンドウに、不正確なエラーが表示されることはもはやありません。表示される内容は正確です。

マルチプロセス アーキテクチャ

ここで説明する内容は、機能的には重要ではないかもしれませんが、技術的なレベルで興味深いトピックです。

LSPサーバーは、独立したプロセスとして実行されることに言及しましたが、これにはCode Insight専用の4GBメモリアドレス空間が利用可能であるなど、いくつもの利点があります。Windowsタスクマネージャーで実行中の10.4を見ると、複数のDelphiLSPプロセスが表示されます。1つ目は複数のエージェントを制御しています。そして、補完とその他の結果を提供するための専用エージェントが1つ、エラーインサイトを提供するためのエージェントが1つあります。

私の知る限り、エンバカデロのLPSサーバーは、マルチプロセスアーキテクチャを使用した唯一のLSPサーバー実装です。

品質

今回の実装にあたって、過去のコード補完に関係する多くの問題についても発見し、修正を加えました。

次のステップ

新しいコード補完は、10.3.3以前のコード補完とは異なります。タイプした文字列で「はじまる」候補を最初に持ってくるように調整するなど、できる限り同じにするように取り組んできました。すぐに慣れて、もう10.3.3には戻りたくないと感じるようになることを願っています。とはいえ、まったく同じものとは思ってもらいたくありません。いくつもの違いに気づくことでしょう。

Delphi 10.4の新しいCode Insightでは、多くの問題を解決し、IDEをより快適で応答性よく使えるように改善しています。もちろん、新たに追加された便利な機能については、言うまでもありません。上述した目標を達成するために、私たちは引き続きこの取り組みを継続していきます。しかし私たちとベータテスターの双方とも、10.4において、この機能がIDEに追加されたすばらしい機能であるということは一致した意見です。

さらに、2つの新機能も追加しました。コード補完によるコードの探索、デバッグ中のコード補完をはじめとするCode Insight機能の利用です。

新しいCode Insightは本当に待望の新機能です。非同期、レスポンシブIDE、最新のプロトコル、他言語のサポート、デバッグ中のコード補完。すばらしい機能です。10.4をはやく入手して、実際に試してみたいですね。

新しいLSPベースのCode Insightはすばらしい。これは革新的な製品になるだろう。

— Nick Hodges(ベータユーザー)

アップデートサブスクリプションに加入している方は、ベータビルドへのアクセスが可能です。現在でも10.4のベータプログラムに参加可能ですので、お問い合わせください。

この記事は、RAD Studioの将来のリリースに関するプレビューです。製品品質やスケジュール等の理由により、紹介した機能の提供が変更になる可能性があります。製品が正式にリリースされるまで、最終的な機能、スペック等について保証されません。

モバイルバージョンを終了