C#とC++を無理矢理戦わせたい人専用スレ
C#とC++
敢えて適材適所に挑戦し、どちらが優れているかを議論します
ファイッ >>2
WPFスレから出てって欲しかっただけなんだが C#は、VB.NETと対になって説明されることが多い。
ということは、表面的な違いだけで C# は本質的には VB ということ
なのではなかろうか。 逆だろ。VB.NETが従来のVisual Basicとは違って本質的にはC#ということ。 >>6
このような場合、折衷案として、C# と VB.NET が本質的には同一、という
ことになります。 C# == VB.NET
と
VB.NET == C#
は、数学的には同値です。 適材適所というか、c++の便利機能がc#で削ぎ落とされていてしんどい。
constな引数やメソッド
ある程度型安全なダックタイピングのジェネリック
目指してる方向性が違うようだから仕方ないと割り切ってるけど。 C++は本格言語。
C#はスクリプト言語。
比べるほうがおかしい。 >>11
C#もJavaもある種のRAD開発言語的な要素を含んでいると考えて
いいんでしょうね。 それぞれの登場時期には、既に C++言語が、gccによってどんなCPUに対しても
native binaryを出力できるようになっていたのに、どうしてJavaやC#がどうして
native binaryを出さずに、仮想コードを出す仕様にしたかについては誰でも
時々疑問に思うと思うんですが、自分なりに出した答えは:
1. gccは有ったが、それをバックエンドに使おうとすると、gcc のソースの一部
をJavaやC#のコンパイラの中に組み込むか、中間コードを C 言語の形式で出力して
gccをバックエンドとして動かす必要があった。これはライセンス、gcc環境のサイズの
大きさ、言語処理系会社としてのプライドなどの観点から問題があった。
2. 実は、そもそも gcc が対応していないアーキテクチャも世の中にはあって、
その環境でも Java や C# を動かしたい場合には、駄目であった。
また、新しいCPUが出てきたときには、gccの方を修正しなくてはならなく
なるが、gccのソースを解読するのは難しいので難しい。
3. C言語が対応しているCPUであっても、そもそも、プログラミングのフレームワーク的な
構造が、Windowsとは全く異なっているプラットフォームが時々ありえる。
例えば時代が違うかもしれないが、Objective-Cの環境でWindows風のプログラミングを
するのは難しい。そもそも、GUIプログラムは特殊言語で書くようになっているプラット
フォームや、Waitや効率的なメッセージループを書けないプラットフォームが存在しており、
そのような環境に同じソースコードで書いたプログラムを移植するには、インタプリタ的にも
動作しうる仮想コードで無いと困ることがある。 >>14
4. 例えば、サーバーなどでは、インタプリタ言語しか許可されて無い事がある。
この場合、そのインタプリタ言語で仮想マシンを作ってしまえば、JavaやC#
の仮想コードを動かすことが出来る。gccのようにバイナリに直す仕様に
していたならば、そもそもこのような環境には対応できなかったことになる。 >>15
5. 当時のWin3.1系だと、アプリのバグはOS全体を停止させてしまうことが有った。
このような環境だと native のコードにしてしまうよりも、Javaのように
仮想コードをインタプリタで解釈実行できる機会を与えた方が安全であった。
Win3.1系に限らず、native コードに致命的バグが有った場合に、OSにまで
被害を及ぼさずに安定して停止させるのは、OS開発者に精密な設計を要求する。
それに比べて、仮想コードを解釈実行するなら、致命的バグが有ったら安全に
エラーを出力することは、とても容易に出来る。
サーバーマシンなどの信頼性を要求する環境では、OSにバグがあった場合でも
絶対にOSをダウンさせたくない。そのような目的では仮想コードを解釈実行する
方式は有効である。 >>14
「3」に関して。
Javaの登場時期と外れているが、例えば、iOSアプリは原則、Swiftで書かなければ
ならない。Swift は、native binaryに変換はされるが、OSのAPIの関数呼び出し規則の
仕様が非公開。だから、Swift以外の言語を独自にnative binaryに直した場合、
OSのAPIを呼び出す方法には、Appleの公式なドキュメントが無いので、
独自にリバースエンジニアリングをして対応する必要がある。
native binaryにいきなり直さずに、フロントエンドの処理系がJavaをパースして、
Swift言語に直すのも一つの方法である。
しかし、仮想コードに直す方式なら、このような場合でも対応できる。
仮想マシンをSwiftで書いておけば良いのだから。 >>17
補足すると、iOSのアプリをC/C++言語で書く方法は、Apple公式では
公開されていないらしい。手短に書けば、C言語からOSのAPIを呼び出す
方法が公式ドキュメントでは分からない。そもそも、OSのAPIがCの関数ではなく、
Swiftの関数として定義されてしまっているのだから。
Windowsを使っていると、C言語やアセンブラからOSのAPIであるところの
Win32 APIを呼び出す方法が厳密にドキュメント化されているのが当たり前になっているが、
少なくとも iOSではそうはなっていないようだ。
当たり前すぎて気づかないが、DOSやWindowsは、native binary重視の環境だったの
かもしれない。実際、Unix系OSは、そもそも binary 互換性は重視しておらず、
同じOSであってもバージョンが変われば再コンパイルして対応するような、
ソースレベル互換の文化である。Windowsはバイナリ互換の文化である。 >>11
なんでスクリプトだと思ってるの?
Unityで誤解してる?
ちなみに、C#からC#スクリプトを呼び出せます。 c++はソースコードにパスワード埋め込んでも解析出来ない?
c#は完全に逆コンパイルできるからソースコードにリテラルでパスワード埋め込んでも隠せないけど
汎用性がーとかは別として >>21
ん?C++詳しくないんだけどリテラル文字列を勝手に暗号化してくれるの? 内部で色々演算駆使してその結果がパスワードになるとかでも無い限り結局リテラルがそのままバイナリに現れるから同じ
探しやすさで言えばC#のほうが探しやすいだろうけど、探す気になってる人&探す技術が多少なりともある人から見れば大差は無いかと思う ネイティブC と C#(.NET)じゃ速度が違いすぎだろ。
今でもコントロールが描かれる順番が分かるくらい。 アプリを使うユーザー側から見れば
C#アプリ「まず.NETのなになにバージョンが必要です インストールされていますか?」
C++アプリ「(大抵)そのまま使えます」
この差でC++の圧勝だな
C++でも追加ライブラリが必要なこともあるだろとかいう奴がいるが
C#はその追加ライブラリのほかにさらに.NET環境というバカでかいものが必要とされてる
という大きすぎるハンデを抱えている >>26
WindowsUpdateで.NETの最新版自動でインストールされるじゃん >>25
.NET製のアプリは遅いものは本当に極端に遅い。
マザーボードのドライバなどのインストーラーが極端に遅くて困った。
昔は.NET製ではなかったのでこんなこと無かったのに。
35年前に戻ったみたいな遅さ。 >>26
まるでC++にはランタイムライブラリが無いような言い分だな
.NET Framework は Windowsにデフォでインストールされるって知らないの? 遅くないC#アプリもあることは有るようだけど、MS純正のVisual Studio、
Expression Web 4や、PIXELAという会社のStationTVというテレビキャプチャ
ボードのテレビ視聴/番組予約/録画管理ソフト、AsusやGigaByte製のM/B用の
ドライバインストーラはどれも非常に遅かった。
ExpressionWeb 4なんかは、その先祖はもともとC++で書かれたFrontPageだったが
そっちは快適に使えていたのにC#製になったとたん、激遅になってしまって使ってない。
FrontPageは有料だったのになぜか売られなくなってしまい、ExpressionWeb4は無料化した。
無料でも遅すぎて使いたくない。 >>26
VC++でアプリ作ったらなんかランタイム必要とかなかったっけ?
なんか前自作アプリ別のマシンで動かそうとして動かなかった記憶があるのだけれど VC++ランタイムはピンズドのバージョンがないと叱られる
サイドバイサイドができるのとバーター スタティックにリンクすれば不要だし、ダイナミックにリンクすれば必要。選択式。
スタティックが多いかね。
70-250kぐらいファイル大きくなるだけだから。
.NETだとスタティックにリンクすると仕組み上10-30Mになっちまうから... c ++はスマートポインタ頑なに使わないやつとかそもそも知らないやつとか多い。
そして落ちる