私は現在、(C)での実世界での経験がほとんどない言語での現在のプログラミング能力をはるかに超えるプロジェクトに着手するというアイデアを楽しんでいます。全体的な設計を進めるために、私がより精通しているより高いレベルの言語(Perl/Python/Ruby/C#など)でプロトタイプを作成することは価値がありますか?
最終的に、最終的な製品はパフォーマンスに影響されます(データベースエンジンです)ため、Cを選択しますが、Cを十分に理解していないと、ツリーのフォレストを失うことになると思います。
同様の質問を検索していると、プログラマーがプロローグでプロトタイプを作成してから、アセンブラーでクランクアウトするという仲間の言及に気づきました。
Cを使用しても、アプリケーションが自動的に高速になるわけではありません。プラットフォームに応じて異なるプログラミング言語を選択できる場合は、それを強くお勧めします。
最適化されたコードを修正するよりも、正しいコードを最適化する方が簡単です。時期尚早の最適化は、実際には長期的には最適化を妨げます。不要な最適化は、設計を歪め、モジュール性と情報の隠蔽を破壊し、コードの変更をはるかに困難にします。潜在的なバグの発見には時間がかかります。プロファイリング、またはマシンやコンパイラの変更によって、コードの計算作業を誤って判断したことがよくあります。何だと思う?現在、最適化は必要以上に困難です。
パフォーマンスの問題を本当に予測できる場合は、C++の使用を検討してください。 cprogramming.comはそれを非常にうまく表現しています :
ただし、Cでパフォーマンスを少し向上させるためにC++の再利用性を放棄する価値があるかどうかは疑問に思われるかもしれません特にC++は、必要に応じてCプログラミングスタイルで記述できる場合。
実際の質問により的確に答えるために、私はコードをプロトタイプだけでなく、高水準言語で記述し、パフォーマンスの問題が発生した場合にのみ低水準言語で最適化します。
A)Cに直接翻訳されるこれらの言語の部分は単純ではなく、b)Cに直接翻訳されない部分は、CよりもCで書き直すのが難しいため、これを行うことは価値がありません。そもそもCで書いたのなら。
これは、明確な「はい」または「いいえ」の答えのある質問ではありません。逸話を量ってみましょう。
例1
私はJava=で書かれたゲームをFlash、AS3に移植するという任務を負っていました。表面的には、これは比較的スムーズに進む可能性があります。結局のところ、そのような仕事をより明確にすることができます。 -ソースゲームの形式で完全に組み込まれた機能仕様を既に取得しているため、平均的なクライアントの作業よりもカットされます。JavaおよびAS 3はどちらも高水準言語であり、AS3パッケージ構造、単一継承/複数インターフェース、(オプトイン)強力な型指定、パブリック/保護/プライベート変数および関数宣言の概念など、Javaと共通の多くの特性を共有します。 Javaで、元のソースコードベースから完全に新しくなったので、すばやく簡単に実行できることを期待して、見つけた内容を確認しました。
結局のところ、コードの作成者は、Javaからいくつかの未定義の他の環境に移植できる抽象エンジンを作成しようとしました。これにより、移植が簡単になることを期待しました残念ながら、代わりに私が発見したのは、スレッドの利点なしに、Flashの上にFlash自体を再発明する可能性を検討していたことです。文字通りのポートは、結局のところ、単に悪い考えでした。 。パフォーマンスの悪夢その上、ゲームは独自のカスタム外部スクリプト言語を実装したため、元のソースデータファイルをすべて使用したい場合は、その言語のパーサーとレクサーを作成する必要がありました。
結局、時間と予算の制約を考えると、元のソースコードはあまり役に立ちませんでした。それを持っていることの最も有用な部分は、ゲームのロジックの制御フローを正確に模倣する方法を知っていたということでした...しかし、そのための元のソースが本当に必要でしたか?おそらく違います。
しかし、その例は状況の逆のようなものなので、それほど関連性がないかもしれません。自分が作成していないコードベースを、自分が非常に精通している環境での開発をスピードアップするために当時は知らなかった言語で使用することを望んでいました。これが別の例です
例2
Java開発者が移植可能なコードベースを作成しようとして何をしていたかを指摘して、私はFlashの仕事で自分のために同様のことをし始めました...拡張にあまり依存しないコードを書きましたたとえば、flash.display。*クラス、およびコンポジションを使用してビューを作成します。flash.event。*にそれほど依存せず、代わりに、特に言語やプラットフォームに関連付けられていない、独自の軽量メッセージパッシングシステムを作成します。最近終了しました上記のフレームワークを使用しているゲームで、C#(JavaおよびAS3に類似していることで私が知っている言語)をUnity 3Dプロジェクトとして簡単に移植できるかどうかを確認したい)結局のところ、これははるかに成功しました!私はC3よりもAS3の方が流暢に考えているので、アルゴリズムを既に記述しておけば、時間を大幅に節約できます。関係する言語がそもそも非常に似ているとき。
したがって、私自身の個人的な経験だけでは、答えが常に「はい」または「いいえ」になるとは言えません。選択した高水準言語でたまたま特定の言語イディオムにどれだけ依存しているか、そしてCでそれらを再作成するのが簡単か難しいかを考慮に入れるべきです。
私はそれは一般的ではないと思いますが、それは行われています。 Python=)で彼のモデリングを行い、そのコードをC++で実装するために、私がこれまでに使用した最も鋭いアーキテクトの1人が使用しました。
一般に、これを価値のあるものにするためには、ターゲット言語で簡単に表現できない複雑で高度に最適化可能なアルゴリズムを実際に実行する必要があると思います。ほとんどの「現実の世界/ビジネス」の状況では、ターゲットとする同じ言語で高レベルの意図を比較的簡単に表現でき、その言語での実装はパフォーマンス要件を満たしているため、上位でモデル化する必要はありません。レベル言語。
あなたがより高いレベルの言語についてより良い知識を持っているあなたの状況を考えると、私はこの方法論が短期的にうまく機能しているのを見ることができました。順調に進むためのロードマップを提供するだけでなく、質問があれば、より正確に質問することができます。
アルゴリズムのプロトタイプを作成できます。コアロジックの設計エラーを解決し、間違いなく「非常に高レベル」の言語(たとえば、Matlab、おそらくRuby)を使用します。これを使用して、アルゴリズムが機能し、正しく機能することを証明してから、「低レベル」言語でゼロから実装します。
C++を選択しても、JavaまたはC#を「高レベル」として、Cを「低レベル」として選択しても、それほど多くは得られません。まだかなり苦痛でかなりバグが発生しやすいでしょう。アイデアは本質です。高レベルの実装でのプロジェクトのエンジンは、1つか2つの画面を超えてはならず、把握しやすく、読みやすく、すべての注意点があります。痛々しいほど明白である-本質的には、実行可能な実行可能なブロック図。
データベースエンジンは主に、低レベルのI/Oを最適な方法で処理し、Bツリーやリンクリストなどの複雑な構造を効率的に処理することを目的としています。
かなり良いJava実装がそこにありますが、それは間違いなくC/C++の問題です。
高水準の言語では、適切に実行される正しいアルゴリズムを開発する方がはるかに簡単です。通常、いくつかのバリエーションを試し、結果を比較するケースです。次に、「勝つ」アルゴリズムをCに変換できます。
妥協案として、より高いレベルのJVM言語(Jython、Groovyが頭に浮かぶ)のいずれかで初期実装を記述し、実装が安定したら、クラスごとにJava)に移動します。
疑似コードから始めることは価値があると思います。別の言語でプロトタイプを作成することは、潜在的な時間の無駄のように思われます。これは、上位レベルの言語が疑似コードのように「C」に変換される可能性が低いためです。
また、疑似コードを使用することで、システムが実際にどのように機能するかをよりよく理解できます。
疑似コードで作業しているのと同じ期間に、Cを勉強する必要があります。次に、計画が完了した時点で、実際に実装する準備ができている可能性があります。
それを別の言語で書くことを提案した理由は、設計を進めるのを助けることだったので、代わりにいくつかのUMLダイアグラムまたはそのような性質を使用して開始することができます。
より高水準の言語で書かれた多くのパフォーマンスクリティカルなアプリケーションがあります。
過去にアセンブラーやCでプログラミングしたことがあるので、メタルにとてもクールな感じですが、最近は使用が限られています。
パフォーマンスを阻害するものはたくさんあるので、言語自体が制限要因となる部分に到達することはないでしょう。これは、C vs C#であることを考慮しています。
言語によってパフォーマンスが10%〜15%向上するとします。これは、正しいアルゴリズムを実装する際の桁違いの増加と比較して何もありません。
C#でプログラミングしている場合は、アルゴリズムとデータ構造のアーキテクチャと実装に集中する時間がはるかに多くなるため、より高度な最適化につながります。
現実の世界では、常に時間の制約があるため、プロジェクトの適切な部分に時間を費やしてください。
現在、「パフォーマンスのため」(これは元々の動機でした)でCで書かれたプロジェクトに取り組んでいますが、実際にプロファイリングすると、ほとんどの時間が他のシステム(DB、 Java、ソケット上の「イベント」)。
間違ったアルゴリズムを使用すると、Cでもパフォーマンスが低下します(たとえば、「Cにはハッシュテーブルがなく、他のライブラリを使用したくないため」というキーの線形検索を実行した場合)、 C++、Java、C#、Pythonなどのハッシュテーブルなどの言語を使用してください。
何らかの理由でCでそれを強制される場合、あなたが知っている他の言語でのプロトタイピングは私にとってそれほど悪い考えではありませんif ifあなたが実際に行っている「問題」を知っているプロトタイプCの実装。Cに自信がないと難しいです(たとえば、C/C std libsにはコンテナーがなく、「プレーンな」配列しかないことがわかります。非stdライブラリが必要です)。さらに、CはOOではないので、OOの方法でプロトタイピングしている場合は、より困難になります。
要約すると、「プロトタイピング」言語で実際の実装を行い、実際に必要な場合はCでCPUを集中的に使用する関数を記述します。言語、そしてもちろん実装を書く前に。
あなたがあなたが説明したアプローチによってあなたが何かを得ているとは思いません、そして何人かの人々が理由をいくらか詳細に説明しました。
私が関わってきた1つのプロジェクトは、この種のアプローチを使用しました。Cell/ BEおよびPower7アーキテクチャー用の数学ライブラリー開発です。関数はHaskellで(CoCoNUTを使用して)モデル化され、出力関数は特定のターゲットアーキテクチャ用に最適化されたアセンブリにありました。
この場合の目標は、調整されたアセンブリー命令と複数のアーキテクチャーをターゲットにする機能を備えた高性能です。
でも食べ物は、飢えないようにね:)
プロトタイピングは、解決しようとしている問題を理解するために行われることがあります。また、基礎となるテクノロジーに精通していない場合は、その基礎となるテクノロジーについて知ることもあります。
上記のケースでは、pythonなどのスクリプト言語でプロトタイプを作成し、Cで実際のコードを作成することを検討しています。
いくつかの可能性の評価:
1。 pythonでプロトタイプを作成し、Cでソフトウェアを記述します。
スクリプト言語でプロトタイピングすると、入力に対する出力をすばやく確認したい場合に役立ちます。これは、問題を解決するために主にlogicをテストする必要がある場合に役立ちます。また、他の人のためにdemoをすばやくまとめたい場合にも役立ちます。
pythonで記述したコードはすべて、最終的なソフトウェアでは使用されません。しかし、プロトタイプをpythonここでプロトタイピングがアイデアを伝えるに役立ちます。
この方法は、ソリューションの論理的な実現可能性をテストするのに適しています。
2。 Cでプロトタイプを作成し、Cでソフトウェアを作成します。
初めてのCでのプロトタイピングには、2つの利点があります。 1つは、プロトタイプを作成している間に、言語の関連部分を理解する、ライブラリ、API、落とし穴などを理解することです。2つ目は、最終的なソフトウェアをビルドする間に、開始プロトタイプからそれ自体が時間を節約し、コードを再利用します。
この方法は、ソリューションの論理的および技術的な実現可能性の両方をテストするのに適しています。
。手元の問題に応じて、プロトタイプを作成するための非コーディング方法を検討できます。
プロトタイプにしたいロジックやアイデアがある場合。 疑似コード、フローチャートおよびブロック図紙の上でも良いです。
UIプロトタイプの場合は、UIモックアップツールを検討するか、もう一度、紙を検討してください。
慣れ親しんだ言語(Pytho/Ruby/C#ではない)でプロトタイプを作成して、次のようにする必要があると思います。
その後、プロファイリングツールを使用してボトルネックの領域を見つけることができます。 C/C++で再実装します。上記の手順を数回繰り返します。プロトタイプが「十分に高速」である可能性があることがわかっています。
実際にCで作成する計画は何ですか?プロトタイプを作成してからCを学び、Cで再コーディングしますか?私にとっては、これは「胃よりも目が大きい」ということわざのように思えますが、多くのプログラマーが新しいテクノロジーを習得しているときに引っ掛かっています(私は知っています)。つまり、最終的には書き込む必要があると感じる言語の内外をまだ知らなくても、明らかにパフォーマンスに敏感なものを設計しようとしているということです。基本的には、Cアプリの設計を開始する前に、最初にCの学習に時間を費やすほうがよい場合は、Cを知ってから、必要なアプリケーションの作成方法についてさらに洞察を得ることができます。おそらく私は質問を間違えたので、Cでプログラムをビルドするためにこれを別のプログラマーに引き渡すつもりです。
高性能データベースエンジンの場合、おそらく次のものが必要です。
選択するアルゴリズムは、パフォーマンスにとって重要です。
一般的なアドバイスは、高水準言語から始めて、最適化が必要なビットのみを低水準言語に移行することです。
ただし、選択する高水準言語は、記述する必要のあるアルゴリズムをサポートできる必要があります。ここでの効率的なアルゴリズムは、最終的にはスレッド化の制御、メモリの効率的な使用、および利用可能な最高の低レベルファイルシステム操作。したがって、最終目標がパフォーマンスの場合、使用する必要のあるプリミティブをサポートしていない言語でプロトタイプを作成することはできません。
プロトタイプをテストする必要がある場合(または他の人がそのインターフェースに対してソフトウェアを開発する必要がある場合)、目的のAPIをサポートする言語で作業する必要もあります。次に、他の人がコードをテストして、最適化しながら独自の回帰テストを実行できるようにします。
これらの考慮事項は、おそらくこの場合の高レベルのプロトタイピングのために多くの言語を除外します-そしておそらくあなたが言及したすべての言語(おそらくC#を除いて)。もちろん、任意の言語(英語を含む)で疑似コードを作成することもできます。必要に応じて、プロジェクトの一部(ソート関数など)を好みの言語でプロトタイプ化することもできます。
C++とCの間の密接な関係(および無視できるパフォーマンスの違い)は、最終製品でCよりもC++を優先しない理由がほとんどないことを意味します。
(私は特定の目的のために高性能のデータベースエンジンが必要であるという前提で答えています。もしあなたの意図がより控えめであるなら、おそらくあなたは既成の既存のエンジンを取り上げるでしょう)。