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

C++Builderの開発者必見!! 「注目いただきたいプレビューを紹介」

future of cbuilder

数週間前、RAD Studio/C++Builder/Delphi 11.3をリリースしましたが、この品質リリースは最近のバージョンの中で最も優れていると広く賞賛されています。このリリースは、C++向けの品質リリースである11.1.5を含む、11.xのいくつかのリリースをベースとしています。このような品質の背景から、RAD StudioにおけるC++BuilderとC++の将来についての計画を紹介したいと思います。

複数の分野でC++Builderの計画に関する質問が寄せられています。例えば、C++20やC++23といった新しいC++規格のサポート、デバッガの改善、 大規模なプロジェクトに関連する問題の解決、STLの品質、コード補完、ナビゲーション、リファクタリングなどの生産性、そしてAndroid や Linux などの他のプラットフォームのサポートなど。

これらのご要望に対して、以下の2つのステップでアプローチしていきます。

  1. Clangのアップグレード: ただし、単純にClangを「アップグレード」するだけでなく、エンバカデロで「doing it right(正しいことをする)」と呼ぶ、今までとは異なるアプローチを取っている
  2. Visual Assistの主要機能をC++Builderへ統合

この2つのアプローチは、エンバカデロが現在進行中で、これから実装予定の内容に関して私たち自身も非常に「わくわく」しています。「論より証拠」ということで、このブログでは進行中の機能やいくつかのスクリーンショットも紹介しますので、ぜひ最後までご覧ください!

Clang15へのアップグレード

C++BuilderのコンパイラはClangをベースにして、エンバカデロの言語拡張機能を加えています。この言語拡張は、Delphiとの相互運用性のために行われています。ご存じない方もいらっしゃるかもしれませんが、2つの言語を同じアプリケーションにコンパイルすることができ、C++のクラスをDelphiで定義されたクラスから継承させることも可能です。またC++は変換されたヘッダーを介してDelphiで実装されたコードの使用や参照が可能で、Delphiイズムのようなプロパティを使用したりすることもできます。

2018年にはClangバージョン5にアップグレードし、C++17のサポートを実現しました。

しかし、これは多くの点で以前のアップグレード (2018 年に 3.3 から 5 へ) のようなアップグレードではありません。

これまでエンバカデロでは、常に独自の方法で実装を進めてきました。例えば、さまざまな理由からWin64ではオブジェクトファイル形式としてELF64(一般的にはUnix/Linuxのオブジェクトファイル形式)をデバッグ情報形式としてDWARFを使用しています。

C++Builderではコア部分でClangとの相違点があり、それがエンバカデロにおけるメリットとなっています。例えば、Delphiとの互換性、言語拡張、フォームとフレームを開発し、VCL と FireMonkey を使用できる点も含めて、それらの違いが非常に重要となっています。

しかし現在の Clang の実装には、固有の価値のないカスタム要素がいくつか含まれており、C++Builderの全体的な素晴らしい利点を追加することなく、徐々にメンテナンスコストを向上させる状況になりつつあります。エンバカデロでは、レガシーな理由からプラットフォームの慣例とは異なっていますが、もしプラットフォームの慣例に従うとしたら、エンバカデロがツールチェーンで維持するカスタマイズが少なくなり、カスタム ツールが少なくなり、互換性が大幅に向上することになります。

その結果、Clangのアップグレードは、既存のコンパイラの単なるアップグレードではなく、エンバカデロのコンパイラのコアとなるキーアーキテクチャのアップグレードになる予定です。つまり、よりプラットフォーム標準のアプローチを採用する予定です。COFFオブジェクトファイル(Windowsの「ネイティブ」または慣例的なフォーマット)を生成し、デバッグには PDB 形式を使用します。そしてilinkではなくLLVMリンカを使用します。これによって、エンバカデロにとって本当に重要な違いに集中できることを意味するだけでなく

、LLVMリンカなどのオープンソースツールとプロジェクトを再利用できることを意味します。 言い換えれば、Clang を変更して利点を追加するのであって、レガシー技術を最新の Clang に移行するのではありません。

より多くのツールとの互換性、他のデバッガの使用やコアダンプの解析の容易化、リンカの有効性を向上させる新技術など、ユーザーにとってメリットは非常に大きいです。これによってC++BuilderをC++Builderたらしめているものである、価値の高い言語と統合技術を手に入れることができ、製品全体の堅牢性、互換性、最新性が大幅に向上します。

ランタイムとSTL

C++ツールチェーンのランタイムは、以下の3つのレイヤーを持っています。

  1. Cランタイム – C言語スタイルの基本メソッド、CスタイルのファイルIOなどを提供
  2. C++ランタイム – 例外処理など、C++のコアとなるマジックを提供
  3. STL – 上記の両方を使用

歴史的に見ても、旧ボーランド社の時代からエンバカデロ独自のCおよびC++ランタイムを持っています。また、いくつかの POSIX メソッドを含む、Windows C ランタイムの標準以上のメソッドも提供しています。しかし、最近ではCランタイムはオペレーティングシステムに組み込まれたWindowsの標準的なコンポーネントであるため、UCRT(ユニバーサルCランタイム)を使用し、その上にエンバカデロのカスタムメソッドまたは拡張メソッドを追加することを検討しています。

Clangのアップグレードの作業は現在も進行中で、少し前から行われています。まだ流動的な部分もあり、その中にはエンバカデロが使用するSTLも含まれています。

リリース計画

アップグレードは、最初はWindows 64ビット向けに計画されています。これは、多くの開発者が移行しているプラットフォーム(64ビット)を第一目標とし、まずは1つのWindowsプラットフォームへの対応に集約いたします。(複数のプラットホームに分散させるとアップグレードの作業がなかなか進まないため、まずはWindows 64へ集中)。将来のリリースでは、同じ技術とアプローチでWindows 32ビットも移行する予定です。

ではWindows以外のプラットフォームはどうなるの? という疑問があると思います。

Clangの古いバージョン(バージョン5)で他のプラットフォームに移動することは、理想的な状況ではありませんでした。そのためWindowsのアップグレードが完了したら、新しいコンパイラを他のプラットフォームに展開できるようになります。

常にClangの最新バージョンを提供

次のリリースでWindows 32ビットや他のプラットフォームに展開するだけでなく、Clangを最新の状態に保つことも計画しています。エンバカデロでは、今後は常に最新の状態を保ち、製品のアップデートリリースごとに新しいバージョンの Clang を提供するつもりです。

Clang と LLVM は急速に進歩しており、製品のアップデートをリリースした後も、リモート リポジトリからの変更を継続的に統合する予定です。 

Delphiとは異なり、C++Builderはポイントリリース間でABIの互換性を維持しません。つまり、各製品のアップデートリリースごとにリンクするC++オブジェクトファイルやバイナリを再構築する必要があります(Delphiが生成したC++スタイルのオブジェクトファイルやライブラリは安定していることに注意してください、それはC++コンパイラによって作成されたものだけです)。これによってエンバカデロでも迅速に動くことができます。(この場合、迅速に動くということは、最新の状態を維持すると言う意味です。)

重ねて申し上げますが、エンバカデロでは今後、製品のリリースごとに新しいバージョンのClangを提供する予定です。これにより常に最先端に近いバージョンのコンパイラとツールチェーンを使用することができます。

Clangのアップグレードのまとめ

エンバカデロでは、Clangをバージョン15にアップグレードする予定です。従来の技術を導入するのではなく、COFFやPDBのようなプラットフォーム標準のフォーマットを使用します。これにはItaniumではなくMSスタイルのマングリングも含まれており、「Windowsで普通なことはC++Builderでも普通である」ということをモットーにWindows標準へ準拠させるために全面的に取り組んでいます。これにより、LLVM リンカなどのツールを使用して、従来のilinkを完全に置き換えることができます。さらにPDBのようなフォーマットを理解するために作成されたプロファイラのような他のツールも使えるようになるかもしれません。

またランタイムを見直し、より信頼性の高い新しいSTLを使用する予定です。言語レベルのおおよそのサポートはC++20と多くのC++23になります。 最初はWin64向けにリリースし、Win32やその他のプラットホームも順次リリースする予定です。以前の RTL およびツールチェーンとの互換性が重要です。最後に、C++Builder のすべてのバージョンとアップグレードで、最先端に近い最新の高品質のツールチェーン (コンパイラ、STL など) を使用できるように、継続的にアップグレードしています。

これはC++Builderにとって非常にエキサイティングであり、強固な基盤とアプローチです。エンバカデロの社内では「doing it right(正しいことをする)」と呼ばれていますが、その通り、エンバカデロはC++Builderを正しい方向へと向けています。この計画やアプローチに、私たちと同じようにお客様にもワクワクしていただければ幸いです。

プレビュー

上述しましたC++Builderの作業は進行中ですが、プレビュー段階でのスクリーンショットをいくつか紹介いたします。C++Builder言語の拡張機能(プロパティ、declspecs、Delphiスタイルのクラスと継承、クロージャなど)の拡張機能の追加に取り組んでいます。

エンバカデロには「ワンボタン アプリ」と呼ばれる内部段階があり、ボタンを持つVCLアプリケーションを作成して実行し、それをクリックすると、この時点ですべての主要な要素が動作するようになっているのです。ただし、まだその段階には至っていません。

以下のスクリーンショットは、コマンドラインのアプリケーションです。しかし、これらのスクリーンショットは、C++Builderの拡張機能を使用し、COFFとPDBで構築され、Delphiのランタイムとリンクしているアプリです。今後は問題があれば修正し、もっと多くの情報を共有できれば、最終的にはベータテストとフィードバックが行える段階までフェーズを移行できるものと考えております。

下図は、現在進行中のClangのアップグレードでコンパイルされたプロパティテストとなります。

PDBファイルを生成していることに注目してください。

下図は、IDE内でデバッグしているスクリーンショットです。

ここでは、C++Builderの主要なイズムがいくつかテストされているのを見ることができます: classid(メタクラスを返す)、publicプロパティ、Delphiスタイルのクラスです。

Eventビューの下部には、使用しているLLDBのバージョン15が表示されています。その上には、最新のClangでコンパイルされ、最新のLLDBを使用し、当社の拡張機能を使用したソースコードで、PDBフォーマットからデバッグ情報をロードして、このC++コードをデバッグする当社のIDEの内部ビルドが表示されています。

Visual Assistの統合

ClangのアップグレードだけでC++Builderにとって驚くべきニュースですが、それ以外にもあります。

数年前、IderaはVisual AssistというC++やC#の開発者向けの生産性向上ツールで非常に有名なものを買収しました。Visual Assistは、コード補完、リファクタリング、ナビゲーション、その他多くの機能を提供し、Visual Studioの欠点を補っています。Visual Assist は、Visual C++ を使用するよりも優れた C++ エクスペリエンスを提供すると言っても過言ではありません。 したがって、C++Builder のギャップを埋めるためにも使用するのは、とても自然です。

Visual Assistは膨大な製品ですが、C++Builderに導入したい主要な分野がいくつかあります。コード補完の支援、リファクタリングの追加、リファレンスの検索など、コード周りのナビゲーションの提供です。これには複数のステップがあります。Visual AssistはC++Builderの言語拡張をサポートしており(Visual Studioの顧客に提供されるビルドはこれがオンになっていない)、現在、VAの主要機能の統合に取り組んでいます。現在、RAD Studio IDE自体への統合に取り組んでいます。

エンバカデロでは、最も価値の高い機能を最初に提供するロールアウトを計画しています。最初のリリースでは、1 つまたは 2 つのリファクタリングとナビゲーション、そしてもちろんコード補完などの機能の提供となりますが、 その後のリリースごとに、より多くの機能を統合していく予定です。

プレビュー

上記の動画では、最初のVisual Assist機能であるFind Symbolを使用した内部 IDE ビルドを確認できます。 この機能により、コード外の VCL ヘッダーなどのコードを含むコードベースを検索し、シンボルの場所にすばやく移動できます。 プロパティ (このダイアログに表示されるシンボル) などの C++ 拡張機能のサポートをテストできるため、これは最初の機能として適しています。

「grid row」と入力すると、FMXのヘッダーも検索され、172個の一致の中からTCustomGrid.Rowが最も可能性が高いものとして選択されます。現在のプロジェクトグループ内のみを検索する場合は、Grid.Rowsが選択されます。FireMonkeyとローカルプロジェクトのシンボルを合わせた226,236個を検索して、最初の結果を見つけるのにわずか 0.7 秒しかかかりません。

最新のClang、COFF、Visual Assist?

Clangをアップグレード

製品リリースごとに最新バージョンのClangを提供

全く新しいリンカー

新しいSTL

COFFとPDB、そしてそれがもたらす相互運用性

新しいコード補完

Visual Assist C++のナビゲーションとリファクタリング

エンバカデロでも今回紹介した情報にどれだけ「わくわく」しているのか、そしてお客様にこの情報をお届けすることをどれほど楽しみにしていたか、言い表すことはできません。C++Builderの開発者にとって非常にメリットが大きい今回のC++BuilderのClangアップグレードですが、お客様へ実際にお披露目できるようには、もう少しお時間をいただくことになります。どうかお客様も「わくわく」してお待ちください。

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