9

C++ 標準委員会は、その複雑で強力な機能を定義し、C との下位互換性を維持するために懸命に取り組んでいますが、私の個人的な経験では、ツールがないために C++ でのプログラミングの多くの側面が面倒であることがわかりました。

たとえば、私は最近、いくつかの C++ コードをリファクタリングしようとしました。多くの shared_ptr を T& に置き換えて、大規模なライブラリ内で不要なポインターの使用を削除しました。そこにあるリファクタリングツールのどれもこれを安全に行うのに役立たないので、私はほとんどすべてのリファクタリングを手動で実行しなければなりませんでした。

デバッガーを使用して STL データ構造を処理することは、見知らぬ人が同意しないときに電話番号をかき集めるようなものです。

あなたの経験では、C++ に欠けている重要な開発者ツールは何ですか?

4

12 に答える 12

26

私の夢のツールは、コンパイル時のテンプレートデバッガーです。通常のデバッガーが実行時に行うのと同じように、テンプレートのインスタンス化をインタラクティブにステップ実行し、インスタンス化されるときにタイプを調べることができるもの。

于 2009-08-10T18:23:33.970 に答える
11

あなたの経験では、C++ に欠けている重要な開発者ツールは何ですか?

コード補完。真剣に。リファクタリングはあると便利な機能ですが、コード補完は API の検出可能性と使いやすさにとってより基本的で重要であると思います。

基本的に、C++ コードの理解を必要とするツールは最悪です。

于 2009-08-10T18:02:25.883 に答える
8

クラス メソッドのコード生成。宣言を入力すると、定義を理解できるはずです。そして、私が話題にしている間に、常に宣言に行く「goto宣言/goto定義」を修正できますか?

リファクタリング。はい、プリプロセッサが原因で正式に不可能であることはわかっていますが、コンパイラは変数名の検索と置換を手動で行うよりもうまく行うことができます。また、ローカル、メンバー、およびパラメーターを構文で強調表示することもできます。

糸くず。では、先ほど定義した変数は、より高い変数に影響を与えるのでしょうか? C は 1979 年に私にそう言ったでしょうが、2009 年の C++ はどうやら私が自分で調べることを好むようです。

いくつかの適切なエラー メッセージ。クラスのメソッド内で同じ名前のクラスを定義しないと約束するなら、「}」が抜けていることを教えてくれると約束してくれませんか。実際、コンパイラは履歴についてある程度の知識を持っている可能性があります-したがって、以前に作業していたファイルにバランスの取れていない「{」または「(」を追加した場合、メッセージでこれについて言及することを検討できますか?

STL エラー メッセージ (別のコメントを引用して申し訳ありません) は、"/dev/random" を読み、"!/bin/perl" を先頭に置き、その結果に税コードを実行したように見えませんか?

便利なものについての警告はどうですか?「boolパフォーマンス警告として使用される整数」は役に立ちません。パフォーマンスに違いはありません。選択の余地はありません-それはライブラリが行うことであり、すでに50回言われています。しかし、「;」を見逃すと クラス宣言の終わりから、またはメソッド定義の終わりからの「}」から、あなたは私に警告しません.結果を解析するための最も可能性が低い(しかし理論的には)正しい方法を見つけるために道を踏み外します.
これは、このブラウザーに組み込まれているスペル チェッカーのようなもので、スペル ミスを喜んで受け入れてくれます (そのスペルは、去勢されたオスのヤギを表す古風な用語だからです! ソプラノの草食動物について何回書きますか?)

スペルチェックはどうですか?40 年前、メインフレームの Fortran コンパイラにはスペル チェック機能があったため、「WRITE」のスペルを間違えても、翌日にはカードの山と気の利いたエラー メッセージに戻ることはありませんでした。行 X で「WRIET」が WRITE に変更されたという警告が表示されました。これで、コンパイラは問題なく続行し、10,000 行前に prinft のスペルが間違っていることを通知する前に、大量のブラウズ ファイルとデバッガ出力を作成するのに 10 分を費やします。

ps。はい、これらの多くは Visual C++ にのみ適用されます。

pps。はい、彼らは今私の薬と一緒に来ています。

于 2009-08-10T18:59:36.020 に答える
6

C ++の主な問題は、解析が難しいことです。そのため、ソースコードで動作するツールはほとんどありません。(そして、それがコンパイラの歴史の中で最も恐ろしいエラーメッセージのいくつかで立ち往生している理由でもあります。)その結果、ごくわずかな例外(私はdoxygenとVisual Assistし​​か知りません)を除いて、それは実際のコンパイラにかかっていますコードの記述とマッサージを支援するために必要なすべてをサポートします。コンパイラは伝統的にかなり合理化されたコマンドラインツールであるため、これは豊富なエディタサポートを構築するための非常に弱い基盤です。

約10年間、私はVSで働いています。その間、そのコード補完はほとんど使用可能です。(はい、私はデュアルコアマシンで作業しています。他の方法でこれを言うことはなかったでしょうね?)Visual Assistを使用する場合、コードの完成は実際には非常に優れています。VS自体とVAの両方に、最近ではいくつかの基本的なリファクタリングが付属しています。それもまた、それが目指すいくつかのことにほとんど使用可能です(それでもコードの完成よりも著しく少ないですが)。もちろん、検索と置換がボックス内の唯一のツールである15年以上のリファクタリングでは、私の要求はおそらく他の言語と比較して非常に悪化しているので、これはあまり意味がないかもしれません。

しかし、私が本当に欠けているのはまだです。私のコードが移植されるすべてのプラットフォームでの完全に標準に準拠したコンパイラーと標準ライブラリーの実装。そして、これは、最後の標準のリリースから10年以上後、次の標準のリリースの約1年前と言っています。(これはこれを追加するだけです:C ++ 1xは2011年までに広く採用されています。

これらが解決されると、時々言及され続けることがいくつかありますが、どのベンダーがまだ10年以上前の標準への準拠と戦っています(または、実際にはいくつかの機能の場合のように、それをあきらめています)、実際に取り組むために回り込んだことはありません:

  • 使いやすく、賢明で、理解しやすいコンパイラメッセージ(comoは実際にはかなり良いですが、それは他のC ++コンパイラと比較した場合のみです)。手を投げるだけでなく、「何かがおかしい、続行できない」と言うリンカー(第一言語としてC ++を教えたことがあれば、私が何を意味するのかわかるでしょう)。コンセプト('ナフは言った)
  • operator<<()オーバーロードが内部でランタイム解析を呼び出すことによって私たちに与えるコンパイル時の利点をすべて捨てないIOストリームの実装printf()(DietmarKühlはかつてこれを実行しようとしましたが、残念ながら彼の実装は技術なしで死にました普及する)
  • 豊富なデバッグサポートを提供するすべてのプラットフォームでのSTL実装(Dinkumwareはすでにその点でかなり優れています)
  • コンパイル時と実行時のチェックをより厳密にし、パフォーマンスを向上させるために、本のすべてのトリックを使用するすべてのプラットフォームでの標準ライブラリの実装(yasliに何が起こったのか?)
  • テンプレートメタプログラムをデバッグする機能(はい、jalfはすでにこれについて言及していますが、あまり頻繁に言うことはできません)
  • ツールを役に立たないものにするコンパイラlint(ベンダー、恐れる必要はありませんlint、それは単なる希望的観測です)

これらすべてと、私が言及するのを忘れた(自由に追加できる)他の多くの問題が解決された場合、JavaやC#などとほぼ同じリーグで機能するリファクタリングサポートを利用できると便利です。しかし、その時だけ。

于 2009-08-10T19:52:15.367 に答える
6

MS Visual Studio C ++について言えば、Visual Assistはコードを完成させるための非常に便利なツールであり、いくつかのリファクタリング(たとえば、すべての/選択された参照の名前変更、find / goto宣言)がありますが、JBuilderやIntelliJなどのJavaIDEの豊富さを見逃しています。

私がまだ見逃しているのは、セマンティック差分ツールです。2つのファイルを行ごとに比較するのではなく、ステートメント/式を比較するツールです。私がインターネットで見つけたのは、いくつかの放棄された試みだけです-もしあなたがそれを知っているなら、コメントで書いてください

于 2009-08-10T19:57:32.393 に答える
5

コンパイル モデルの最適化を試みるコンパイラ。

必要に応じて単純にヘッダーをインクルードし、すべてのコンパイル単位でそれらを再度解析するのではなく、最初にヘッダーを一度解析して、それらの完全な構文ツリーを構築してみませんか (どのマクロが定義されているかまだわからないため、プリプロセッサ ディレクティブを含める必要があります)。 )、ヘッダーが含まれるたびにその構文ツリーを単純に実行し、既知の #defines を適用してそれを削除します。

プリコンパイル済みヘッダーの代わりとして使用することもできるため、この構文ツリーをディスクにダンプするだけで、すべてのヘッダーを個別にプリコンパイルできます。単一のモノリシックでエラーが発生しやすいプリコンパイル済みヘッダーは必要ありません。また、ヘッダーが変更された場合でも再構築を最小限に抑えて、再構築の粒度を細かくすることができます。

私の他の提案と同様に、これを実装するには多くの作業が必要ですが、それを不可能にする根本的な問題は見当たりません。

#include の数ではなく、ヘッダー ファイルの数に比例して、コンパイル時間を劇的に高速化できるようです。

于 2009-08-10T20:26:47.123 に答える
4

高速で信頼性の高いインデクサー。派手な機能のほとんどは、この後に来ます。

于 2009-08-10T18:25:45.230 に答える
4

コーディング標準を適用するための共通ツール。
すべての一般的な標準を採用し、プロジェクトに応じてオン/オフを切り替えることができます。

現在のところ、usullay が代用しなければならない perl scrips の束だけです。

于 2009-08-10T19:27:11.267 に答える
3

C++ ツールの状態にはかなり満足しています。私が考えることができる唯一のことは、VS/gcc に Boost をデフォルトでインストールすることです。

于 2009-08-10T18:26:11.687 に答える
3

リファクタリング、リファクタリング、リファクタリング。そしてタイピングしながらコンパイル。リファクタリングに関しては、最近のほとんどの Java IDE でできることの少なくとも半分が欠けています。Visual Assist X は長い道のりを歩んでいますが、多くのリファクタリングが欠けています。C++ コードを作成する作業は、今でもほとんど同じです。C++ コードを書く。IDE が高レベルのリファクタリングをサポートすればするほど、構造がより柔軟になり、構造が柔軟になり、構造を反復して改善することが容易になります。Intellij のデモ版を入手して、不足しているものを確認してください。これらは、数年前から私が覚えているほんの一部です。

  • インターフェイスの抽出: 共通のインターフェイスを持つビュー クラスを取得し、共通の関数をインターフェイス クラスに移動し (C++ の場合、これは抽象基底クラスになります)、指定された関数を抽象として派生させます。

  • より良い抽出方法: コードのセクションをマークし、そのコードを実行する関数を ide に記述させ、正しいパラメーターと戻り値を構築します。

  • 使用している各シンボルのタイプを把握して、シンボル->... などの派生値に対してコマンド補完が正しいだけでなく、現在の式で使用できるタイプを返す関数のみを提供できるようにします。為に

    UiButton ボタン = ウィンドウ ->...

... では、実際に UiButton を返す関数のみを挿入します。

于 2009-08-10T19:26:01.037 に答える
2

テンプレートを多用するコードでも、インテリジェントなインテリセンス/コード補完。

もちろん、関数テンプレート内にいる場合、コンパイラはテンプレート パラメーターについて確かなことを言うことはできませんが(少なくとも概念がなければ)、多くの推測と見積もりを行うことができるはずです。関数で型がどのように使用されるかに応じて、可能な型を絞り込むことができるはずです。つまり、一種の保守的なアドホック コンセプトです。関数内の 1 行がテンプレート型で .Foo() を呼び出す場合、明らかに Foo メンバー メソッドが存在する必要があり、Intellisense は関数の残りの部分でもそれを提案する必要があります。

関数が呼び出された場所を調べ、それを使用して少なくとも 1 つの有効なテンプレート パラメーターの型を決定し、それに基づいて関数内で Intellisense を提供することもできます。

関数がintテンプレート パラメーターとして a を使用して呼び出される場合、明らかに、の使用intが有効である必要があるため、IDE はそれを関数内の "サンプル タイプ" として使用し、それに基づいて Intellisense の提案を提供できます。

JavaScript は VS で Intellisense をサポートしたばかりで、多くの同様の問題を克服しなければなりませんでした。もちろん、C++ のレベルの複雑さでは、途方もない量の作業になります。しかし、それは素晴らしい機能です。

于 2009-08-10T20:02:54.190 に答える
2

独自のツール: 命名規則。

于 2009-08-10T18:36:28.437 に答える