マネージコーダーとネイティブコーダー


19

私はコーダーであり、ネイティブコードとマネージコードの両方の経験があります。PascalとCから始め、C ++に移行し、最終的にC#に移行しました。

去年かそこらで、私はほとんど独占的にC#でコーディングしてきましたが、私がC ++コーダーであったときに自然に来ていたものの多くを失いました。

数週間前、ネイティブC ++コードを書くために座ったとき、私はその複雑さ、癖、およびその特異性に徐々に慣れてきたので、いじくり回していました。サイズを渡さずに動的に割り当てられた配列を関数に渡すと、受信関数が配列の長さを知る方法がないことを完全に忘れていたと言うのはほとんど恥ずかしいです。

マネージドコードとアンマネージドコードを比較対照する無数の記事やドキュメントがあります。ネイティブコードは、最適化されていれば、マネージコードよりも大幅に高速かつ軽量に実行できることを知っています。一方、マネージコードには、ガベージコレクターと、CPU固有およびOS固有の実行時最適化があり、ネイティブコードをその費用で実行できます。

純粋に技術的な観点からは、明確な勝者はいません。

マネージコードは、コーディングと理解が非常に簡単であることは間違いありません。Win32 C ++とC#でシンプルなGUIを構築するために必要な行数の違いを見てください。

ネイティブコーディングの時代に戻って、私は主にスーパーコンピューターで実行される数学的シミュレーションを書きました。CLIいCLIがあり、ほとんどがアルゴリズムに焦点を合わせていました。現在、私はC#で記述して美しいGUIアプリケーションを作成していますが、母国語で同様の口径のものを作成しなければならない場合は失われます。QTなどのフレームワークを使用しても、C ++ / QTで何かを生成するには、C#の場合の2倍の時間がかかります。

大規模でフル機能のGUIアプリケーションをC / C ++で書いた人に会うたびに、a敬の念とjeのヒントを感じずにはいられません。

他の経験豊富なコーダーがマネージド言語とアンマネージド言語をどのように見ているのか興味があります。マネージコードはアマチュアっぽいと思いますか?ネイティブコーダーはよりハードコアだと思いますか?

java  .net 

回答:


26

私の現在の仕事は現在C ++ですが、私はもう何の違いにもほとんど気づかないほど十分に長い間いくつかの言語でプログラミングしました。私の観察は次のとおりです。

  • 他の言語との非効率性の多くは、ベストプラクティスとしてC ++プログラマーによって頻繁に再実装されます。少なくともデータ処理が集中していないコードでは、言語がこれらのことを自動的に行わないことによって得られる実行速度の利点を大幅に無効にするために、十分なnullチェック、配列境界チェック、型チェック、入力検証などを追加します。
  • その余分な定型句はしばらくすると染み込んだ習慣になるので、余分な作業のようには感じず、行方不明になったときに痛い親指のように突き出ます。
  • 「マネージド」言語でプログラムを作成するとき、メモリリークが発生しないように、メモリ割り当てについて考えます。私は明示的なを入れていないかもしれませんがdelete、ガベージコレクターが削除に適格であると判断するポイントについてはまだ頭の中で気づいています。Javaで開始した低メモリの問題を解決するのは、おそらくC ++で行ったよりもずっと困難でした。おそらく、C ++では無視するのがずっと難しいからです。
  • 動的型付けについても同様です。関数パラメーターが配列、int、または文字列であるかどうかを頭の中で追跡する必要があります。実際、そのタイプは私のためにそこに明確にリストされていないため、より多くの精神的な努力が必要です。
  • 現代のC ++スタイルは、C#以前の時代とは大きく異なります。人々は言語を変えるのではなく、既存のC ++機能を独自の方法で使用して、過去のメモリ管理の多くを回避する方法を「発見」しました。現在、メモリを自動的に解放する設計パターンは非常に一般的です。
  • 私の知る限り、コードを書くだけでGUIアプリケーションを作成することは可能ですが、QTデザイナーのようなグラフィカルデザイナーは非常に好ましい方法であり、コードはほとんどイベントハンドラーまたはランタイムのカスタマイズにのみ使用されます。
  • しばらく使用していない言語は、構文をほとんど覚えていても、常に少し不器用に感じます。私が1年間Pythonを書かないと、私が忘れてしまった多くの特異性があり、多くの人がpythonを「より簡単な」言語と客観的に考えているにもかかわらず、しばらくの間C ++よりも厄介に感じます。

これらすべての要素を組み合わせることで、私のメンタルモデルはC ++と他の言語でプログラミングするときの一貫性が維持され、違いは主に単なる構文的なものと感じられます。確かに、その多くは、C ++言語自体に固有の機能ではなく、トレーニング、習慣、コーディング標準、および最新のデザインパターンの結果ですが、比較は依然として有効です。

私が言いたいのは、私の経験上、プログラマーのトレーニングは彼が使用している言語よりもはるかに大きな違いがあるということです。


20

マネージドコードはアマチュアっぽいと思いますか?ネイティブコーダーはよりハードコアだと思いますか?

いや

エンジニアとプログラマーの違いがわかります。筋金入りのエンジニアは常に許容可能なランタイム標準で最短の時間で仕事を得るために適切だ言語/技術スタックを選択します。

最近のプロセッサパワーでは、より低いレベルのネイティブ言語を使用してマシンからできる限り多く取得する必要がある頻度がますます少なくなっています。通常、ビジネスケースではありません。生産性は、常に実行時間の数ミリ秒の差に勝ります。


1しかし、これは経済的な効果であることを念頭に置いてクマ-コンピュートサイクルは$ 1メートルの費用がかかるならば、極端な最適化が支配するだろう-あるいは我々はすべてのコンピュータと気にしないだろう...
ゲイリー・ロウ

10
全体的なパフォーマンスが低下することを除いて、Word6は最新のハードウェアで照明のように動作し、Word2010はロードするのに1分かかります。今日、プログラマーに追いつくために、その超高速ハードウェアが必要です!
gbjbaanb

2
@gbjbaanb:プログラマが何を選んでも、十分に大きなコードベースは遅くなります。IIRC、WordはまだC ++で書かれています(そして、レガシーのWord 6コードのかなりの部分がまだ残っていると確信しています)。
スティーブンエバーズ

2
@ gbjbaanb、Word 2010は、.NETでのWord 6の単なる書き換えではありません。さらに多くの機能が追加され、さらに多くの使用シナリオを処理する必要があります。これは、Word 6よりもはるかに大きなアプリケーションです。
MirceaChirea

6

悲しいことに、Microsoftは「マネージコード」をC#/。Netクラスライブラリと統合するように導いてくれました。

ここでは、2つの独立した、ほとんど無関係なものがプレイされています。

  1. クールな.Netライブラリ。

  2. マネージコード。

C#は、両方ともきちんとしたサポートされた使いやすいパッケージで1つの価格で提供しています。

C ++には、.Netが実行するほとんどすべてを実行する多数のクールなライブラリがあります。「ネイティブC ++」コードをC#/。Netコードよりも「複雑さ、癖、特異性」が多いと非難するのではなく、より良いC ++ライブラリを探すことができます。

より良いライブラリを使用すると、素敵なC ++コードも記述できます。

C / C ++で大規模なフル機能のGUIアプリケーションを書いた人を見るたびに、a敬の念とjeのヒントを感じずにはいられません

悪いポリシー。代わりに、使用したクラス定義のライブラリを見つける必要があります。あなたも、これらのライブラリを使用できます。

それはすべてツールです。ツールがなければ、私たちはただのズボンを着た動物です。

「ネイティブC ++」は、すべてのツールを破棄する必要があるという意味ではありません。良いツールを見つけなければならないということです。Microsoftはもはやあなたを助けていないので、適切なツールの組み合わせを見つけるのに時間を費やす必要があります。


「彼らが使用しているものを調べに行く」ための+1ですが、率直に言って、これはツールを使用する動物、または偶然にズボンを着用する動物にはあまり良くないと思います。
イアンパグスリー

@Ian Pugsley:ズボンを着ているが道具を使わない動物は、おそらく動物としての地位で大丈夫でしょう。しかし、あなたは、ズボンのない道具使用動物が動揺するかもしれないことは正しいです。私の妻は、例えば、ズボンを着用しないことを好み、道具を使用します。おそらく彼女はこの質問を読まないでしょう。
-S.ロット

希望しかありません(そして、かなり高い可能性に賭けます)。私が言っているのは、万が一に備えて、ズボンを履くのに十分なほど賢い動物を見下すつもりはないということだけです。
イアンパグスリー

ええ、C#の標準ライブラリとは異なり、C ++は古く、現代的なニーズ(GUI、クールなネットワークインターフェイスなど)がありません。
モシェレバ

マイクロソフトは、Windows 8でのC ++のサポートを再度行っています(Windows 8の開発面はすべてネイティブコードであり、C ++はC#とJavaScriptと共に一流の市民です):msdn.microsoft.com/en-us/library/windows/アプリ/…
ザック

5

ここでの問題は、筋金入りのプログラミングやそのようなものではなく、制御に関するものです。実際、C#は制御のコストで生産性を提供します。大量の制御を必要とするプログラムを作成している場合(このメモリは現在完全に割り当て解除されています)、C ++を使用する以外に選択肢はありません。すぐに実行する必要がある場合は、C#を使用する必要があります。問題は、C#のサポートライブラリがC ++に提供されているものよりもはるかに優れており、最新であるということです。たとえば、MFCは非常に古く、その手法はひどいものであることが知られています。ほとんどの場合、MFCは標準化のかなり前に書かれました。たとえば、Microsoftが新しいC ++ライブラリの提供に努力した場合、Visual Studio 2010で新しいPPLをチェックアウトすると、奇妙なことに、そのタスクはC ++で簡単になります。そして、彼らはそのように移行していると思う、

一方、マネージコードには、ガベージコレクターと、CPU固有およびOS固有の実行時最適化があり、ネイティブコードをその費用で実行できます。

多くのマネージド言語の支持者がこれを言うのを聞いたことがありますが、私は実際にそれが真実であると見たことはほとんどありません。実際、新しいCPUで利用可能な新しいCPU命令は、非常に筋金入りの数学を行わない限り、それほど多くの利点を提供しません。その場合、実行時にコンパイルまたは解釈するオーバーヘッドが許されません。 -timeを使用すると、IntelのC ++コンパイラを使用して、とにかくSSEの最新かつ最高のものを使用できます。C ++のコンパイラー最適化の範囲は、プログラムの実行中にJITをほんの少しの時間で実行する必要があるため、JITができることと比較して大規模です。一方、C ++コンパイラーは、コンパイルに甘い時間を費やすことでかなり伝説的です。

ガベージコレクションは、魔法のようなすばらしいものでも、そのようなものでもありません。アルゴリズムの選択です。すべての状況に適切ですか?ない遠C#でのIDisposableを混乱を見て、どのようにJavaはそれさえも問題にしようとする気にしませんでしたことで、C ++のデストラクタは、ファイルを閉じます一方、あなたのメモリを解放し、あなたのソケットを閉じ、などなどGCは、いくつかのプログラムに最適です、および他の一部のユーザー向けではありません。


SIMDよりもプロセッサ間の違いが多くありますが、C ++コンパイラはおそらくパイプラインをJITと同じくらい考慮しています。
ピーターテイラー

システムの状態を調べ、到達可能なピン留めされていないオブジェクト参照すべて特定できるランタイム環境では、C ++では不可能な方法で多くのGC関連コストを償却できます。JavaまたはC#では、指定されString foo,bar;たステートメントfoo=bar;は2つの命令を実行します-レジスタロードとレジスタストア。文字列の長さに関係なく一定の実行時間。C ++を近づけることはできますか?
-supercat

2

私の意見では、C#と比較すると、ネイティブC / C ++はC / C ++自体のアセンブラーのように見えます。抽象化の別の複雑なレイヤー(厳密に言えばそうではありませんが、そう言いましょう)は、いつものように、開発を容易にしますが、速度がいくらか低下し、メモリ使用量が過剰になります。それで、私がそれを見るように、それは単に異なるカテゴリーに分割され、プログラマーの新しいサブタイプを作成します。

ところで、抽象化のレベルであるC#は信じられないほど高速で、マイクロソフトは素晴らしい仕事をしました。


2

アマチュア系の言語ではなく、アマチュア系のプログラマーがいます。彼らはすべて(まあ、少なくともほとんど)彼らの目的を持っている言語。

現在、生産システムのテストに使用される保険計算エンジンで共同作業を行っています。実動システムはCで作成されており、エンジンはJavaで作成されており、長い間Cエンジンよりも優れており、同時に生産性も大幅に向上しています。Java自体がCよりも高速であるためではなく、十分に高速であり、アルゴリズムも優れているため、より簡単に実装できます。コードをより速く、より適切にテストおよびリファクタリングできます。

また、計算結果を本番データベースのコンテンツと比較するためのテストコードを作成しました。Cではなく、JavaではなくRubyです。繰り返しますが、それは十分に高速で、必要なコードがはるかに少ないため、実装、テスト、拡張が簡単です。

そして、どの言語を使用してもアマチュアっぽさは感じません。そのような気がするのは、起こるべきではない愚かなバグを作ったときだけです。


1

昨年私が働いている会社は、総当たりで通信CRCコードをリバースエンジニアリングしていました(最終的には入手しました)。3人の開発者がそれぞれ独自のバージョン、Borland C、C#.Net 2008、VB6を持っていました。VB6は明らかに低速で、Borland Cは高速でしたが、C#.netは速度を12倍速めました。期待していたものではなかった。


1
彼らは同じアルゴリズムを段階的に使用していますか?同じ出力を計算することもできますが、出力に到達するために使用される基本的な数学的なステップは異なる場合があり、パフォーマンスは基本的なステップのrawカウントによって決定されます。
-rwong

古いCコンパイラは、最新のプロセッサ命令(すなわち、SSE2以降)を使用することはできません
GrandmasterB

1
3つの言語はすべて、最適化されたネイティブコードにコンパイルされます(コンパイル中はVB6 / C ++、JIT中は.NET)。したがって、おそらくプログラミング言語間の違いではなく、プログラマー間の違いを測定していることになります。
ニキエ

@nikie JIT!=コンパイル。そして、コンパイラの品質は異なります。JITに関するすべての話にもかかわらず、C ++(API呼び出しなし、配列参照、ループ、単純な算術演算)で記述した場合、Javaよりもまったく同じアルゴリズムがはるかに高速に実行されるのを見てきました。
quant_dev

1
@quant_dev:私の経験で特効薬はありません;-) .NET JITでの私の経験では、JITとMSVC ++の違いは非常に小さいです。同じコードに対して、どちらの方法でも12倍は非常に疑問です。
ニキエ

1

さまざまなことに依存しますが、基本的には、他のすべてが同じであるということです。はい、ネイティブコードはマネージコードよりも「ハードコア」です。

ただし、通常のビジネスアプリケーションでは、通常の開発者はコードのビジネス以外の側面により多くの精神的なエネルギーを投入する必要があるため、これは通常悪いことだと思います。


1

私のプログラムは、JavaのようなC ++として最もよく説明できるものです。私の意見では、Javaで同じ低レベルプログラミングを実現できますが、C ++での低レベルプログラミングよりもはるかに困難です。ただし、通常、コードのごく一部でこの低レベルのプログラミングが必要であり、必要でない場合はマネージ言語の生産性が向上します。


1

ネイティブ開発者は通常、よりハードコアであり、そのように行動するため、よりハードコアであるという評判を得ます。ネイティブ開発者は、ハードクラッシュや無制限のメモリリークを避けられないため、ミスを許容しないシステムのトレーニングを受けています。特に、.NETを使用すると、すべてをtry / catchするなどの怠zyなハックが可能になり、開発者がコアの問題を理解する必要があると考える必要がなくなります( " InvalidOperationExceptionがスローされるだけです。説明できません。すべてをキャッチしましょう。コードは重要です!」)。これはまったく白黒ではありませんが、管理されていない世界で成長し、現在は管理されたコードでフルタイムで働いている私の観察です。

さらに、管理された開発者は、はるかにクリーンで組織化されたBCLにもアクセスする傾向があります。これは、彼らが実際に何が起こっているのかを探ることを奨励します。確かに、たとえばSTLやBoostについても同じことが言えますが、.NETクラスライブラリは、しばしば知的に怠laになるほど十分に優れていることがよくあります。

とはいえ、出荷可能な適切なマネージプログラムを作成するには多くの作業が必要です。つまり、メモリとCPUのプロファイリング、単体テスト、およびコード分析を、管理されていない開発者が行うのと同様の方法で行うことを意味します。管理されていない開発者はこれを理解する傾向があり、管理されている開発者はそうでない人をより多く含む傾向があります。

繰り返しますが、白黒ではありません。知的で怠laな管理されていない開発者と筋金入りの管理された開発者がたくさんいます。定義上、どちらも他のエリートよりもエリートではありません。


0

マネージドコードはアマチュアっぽいと思いますか?ネイティブコーダーはよりハードコアだと思いますか?

ありますギャップ二つの世界の間では、と私は理由を見ることができません。管理対象システムはどこか(「アセンブリ内で」最終、すべての実行など)ネイティブコードで書かれています。(まだ私の人生で)見たいのは、アプリケーションを構築するシステムです。このシステムでは、アプリケーションのすべてのサブタスクが適切な言語タイプで記述されます。


あなたが説明するシステムを構築するアプリケーションは、別の(そして、できればより良い)プログラミング言語です。
デヴィッドソーンリー

私は.NETに精通していませんが、知る限りでは混合言語システムであり、VMで実行される共通の実行可能形式、あらゆる.NET言語で使用できる大規模なライブラリを備えています。同じシステムがネイティブ/コンパイルされた世界でいいでしょう。もちろん、プラットフォームに依存しません。
ern0

0

Goがリリースされてから、ネイティブコードが簡単になりました。JavaとC#よりも読み書きが簡単だと思います。Goを使用したGUIプログラミングは、現時点ではあまりよくありません(オプションを簡単に確認しました)。C#と比較して
大きなコミュニティさまざまなライブラリが不足していると判断しないでください(たとえば)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.