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

Code Insightとは?

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

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

  • コード補完: 識別子の後にピリオド (.) を入力、または Ctrl+Space キーを押したとき、入力する内容を予測するドロップダウンリストボックスが表示されます。
  • パラメータ補完: メソッドの中括弧()内でCtrl+Shift+Spaceを押すと、オーバーロードされたメソッドの複数のバリエーションを含む、コードパラメータヒントを表示します。
  • 定義の検索: 識別子を右クリックして「定義の検索」をクリックすると、そのメソッド、変数、型などが定義されている箇所に移動します。またCtrlキーを押しながらエディタ上でマウスを動かすと、該当する識別子がハイパーリンクに変わり、クリックして宣言を見つけることができます。これは「コード参照」と呼ばれます。
  • ツールチップインサイト(Tooltip Insight): 変数や型の上にマウスを置くと、それに関する情報が表示されます。これにはXMLDocも含まれていることがあり、ヘルプインサイト(Help Insight)と呼ばれます(ドキュメントで名前を明確にする必要があります)。
  • エラーインサイト(Error Insight): コンパイルする前にコードのエラーを表示します。コードの下に表示される赤いジグザグの線は、「赤い波線」としても知られ、多くの人々が好む用語です。エラーは、[構造]ビューの[エラー]ノードに表示されます。

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

従来のCode Insight

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

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

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

  • Code Insightの非同期化 - 別のスレッドまたは別プロセス(あるいはその双方)で実行。その結果、タイピング時にバックグラウンドでCode Insightが働いていても、IDEは常に応答性を維持
  • IDEからコード補完のための潜在的なメモリ使用を削減、または完全に除去(どこで実行されているかを可視化)
  • エラーインサイトが常に正しい結果を返すことを保証 - コンパイラが出力するエラーを提示し、正しいコードの場合はエラーを返さない
  • IDEでDelphiのソースコードの解釈に単一のパーサーを使用するようにする。これにより、「真の単一のソース」すなわちIDE内でDelphiコードの解釈を統一することが可能に
  • 最新のテクノロジーを用いてDelphiコードツーリングアプローチをモダナイズ
  • コード補完に関する数多くのバグを同時に修正
  • そして、少なくとも1つの、もとい、2つ以上のコード補完に関する新機能を同時に提供

これらすべてが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上に表示されるのは、すべてコンパイラ自体からのデータになります。

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

  • 他のプロセスとの通信は非同期になります。IDE内では、別スレッドで実装されています。IDEが要求したデータが返ってくるのを待っている間でも、タイピングや、ファイルのクローズ、他のプロジェクトのオープンなどの操作を継続できます。
  • 処理は他のプロセスで行われます。つまり、結果を取得するための処理に使われるすべてのメモリ使用がIDE側にはないことを意味します。IDEにはより多くのメモリが残され、ヘルパーアプリは結果を提供するためだけの専用のメモリ領域をすべて利用できます。
  • モダンで標準化された、数多くの言語に適用できるプロトコルを使用
  • 画面に表示されるエラー情報は、コンパイラが表示するものと一致します。つまり、その情報は100%正確です。コードがコンパイル可能な場合は、エラーインサイトには一切エラーが表示されません。逆に、コードに赤い波線が表示されたり構造ビューにエラーがレポートされる場合は、コードはコンパイルできません。
  • デバッグ中にコード補完を利用できます。

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

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

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

Reduce development time and get to market faster with RAD Studio, Delphi, or C++Builder. Design. Code. Compile. Deploy.

Start Free Trial   Free Delphi Community Edition   Free C++Builder Community Edition   Upgrade Today