高級言語でプロトタイプを作成することは一般的ですか?[閉まっている]


18

私は現在、(C)で実際の経験がほとんどない言語での現在のプログラミング能力をはるかに超えるプロジェクトに着手するというアイデアをいじっています。全体的な設計を進めるために、私がよく知っている(Perl / Python / Ruby / C#のような)高級言語でプロトタイプを作成することは価値があるでしょうか?

最終的に、最終製品はパフォーマンスに敏感であるため(データベースエンジンです)、Cを選択しますが、Cをよく知らないと木のために森を失うことになるのではないかと思います。

同様の質問を探しているうちに、プログラマーがPrologでプロトタイプを作成し、それをアセンブラーで試していたという1人の仲間がいることに気付きました。


4
最初にCで必要なものをコーディングし、次にそれを逆アセンブルし、結果のアセンブリを手動で調整することでアセンブラーを作成する人のことを聞いたことがあります。
user16764

9
パフォーマンスがアルゴリズムの選択と実装を修正し、恥ずかしいほどの並列問題のための並列コードを作成し、適切なデータ表現を作成することになることを忘れないでください。デザインが正しくなるまでCについて心配する必要はありません。
ピータースミス

1
@ user16764:実際にそうしました。言語がFortranであったことを除いて。しかし、私たちはあなたが説明したとおりにコンパイラの出力を手で微調整しました。
S.Lott

Cは必ずしも高速ではありません。特にパフォーマンスがIOバウンドの場合。CPUに縛られたパフォーマンスであっても、Cの専門家でない場合、最適化されたVMはおそらく自分で書いたものよりも優れている可能性があります。
ジギー

私はこのプロトタイピング手法をよく使用します。問題は最も自然な言語で表現され、最終的にDSLとして実装されます。次に、プロトタイプが完成したら、DSL部分を低レベルの言語に再コーディングする代わりに、パフォーマンスが許容できるまでこのDSLコンパイラの実装を改善します。
SKロジック

回答:


27

Cを使用しても、アプリケーションが自動的に高速になるわけではありません。プラットフォームに別のプログラミング言語を選択できる場合は、それを強くお勧めします。

ビル・ハーランは述べて

最適化されたコードを修正するよりも、正しいコードを最適化する方が簡単です。時期尚早の最適化は、実際には長期的に最適化を妨げます。不要な最適化は設計をゆがめ、モジュール性と情報隠蔽を破壊し、コードの修正をはるかに困難にします。潜在的なバグの発見には時間がかかります。プロファイリングを行ったり、マシンやコンパイラを変更したりすることで、コードの計算作業を誤って判断したことがよくあります。何だと思う?現在、最適化は必要以上に困難になっています。

パフォーマンスの問題を本当に予測できる場合は、C ++の使用を検討してください。cprogramming.comの言葉はとてもいいです:

しかし、特にC ++を必要に応じてCプログラミングスタイルで記述できる場合、Cのパフォーマンスをわずかに向上させるためにC ++の再利用性を放棄する価値があるかどうか疑問に思うかもしれません。


あなたの実際の質問によりよく答えるために:プロトタイプを作成するだけでなく、より高レベルの言語でコードを記述し、パフォーマンスの問題が発生した場合は低レベルの言語でのみ最適化します。


25
+1:また、Perl、Python、RubyはC関数を呼び出すことができるため、必要に応じてCでパフォーマンスに影響を受けやすい部分を作成できます。
ラリーコールマン

Javaでマシンビジョンコードのプロトタイプを作成しました。判明したのは、実際には十分な速さでした。Cへの
再コーディングは

Javaでリアルタイムコードを記述しました。その特定のプロジェクトでは、ファイルアクセスはC ++で行われ、リアルタイムコードはJavaで行われました-クレイジー!ただし、リアルタイムコードは非常に高速でした。それほど複雑ではありませんでしたが、信じられないほどの量のデータをすぐに処理しました。ですから、パフォーマンスに敏感なアプリケーションには、間違いなく高級言語を使用できると思います。
コンフィギュレー

@ティムウィリスクロフト:私は「プリミティブ固定アンチパターン」のためにグーグルで検索するときにのみこのページをめくるようです。それは何ですか?
SingleNegationElimination

@TokenMacGuy:プリミティブな強迫観念がより多くのヒット(同じアンチパターン)
ティムウィリスクロフト

7

a)Cに直接翻訳する言語の部分はそれほど単純ではなく、b)Cに直接翻訳しない部分はCで書き直すのが難しいので、それを行うことは価値がないでしょう。そもそもCで書いたなら。


+1-特に、言語に精通していない場合はオブジェクト指向コードをCにシフトするのは難しいか、手続き型の方法で記述すると高レベル言語を使用するのが難しくなるためです。
ジェッティ

はい、正確に。魔法や砂糖を使いすぎた場合のように、Cに簡単に変換できない上位概念を考えているのではないかと心配しています。
マークカンラス

4

これは、カテゴリに「はい」または「いいえ」の答えがある質問ではありません。逸話で私に重量を量らせてください。

例1

Javaで書かれたゲームをFlash、AS3に移植する仕事がありました。表面的には、これは比較的スムーズに進む可能性があります。結局のところ、ソースゲームの形で完全に組み込まれた機能仕様を既に持っているので、そのような仕事は平均的なクライアントの仕事よりも明確であると考えることができます。JavaとAS 3はどちらも高レベル言語であり、AS3はパッケージ構造、単一継承/複数インターフェース、(オプトイン)強い型付け、パブリック/保護/プライベート変数の概念など、Javaと共通する多くの特徴を共有していますおよび関数宣言。当時、私はまだJavaに非常に精通しており、元のソースコードベースにはまったく新しいものでした。それで、私はただそれが速くて簡単であると期待して私が見つけることができるものを見るために飛び込みました。

結局のところ、コードの作成者は、Javaから未定義の他の環境に移植できる抽象エンジンを作成しようとしました。これにより、移植が簡単になることを期待できました。残念ながら、代わりに私が発見したのは、スレッドの恩恵を受けずに、Flashの上にFlash自体を再発明する見込みがあることです。結局のところ、文字通りの移植は悪い考えだったでしょう...パフォーマンスの悪夢です。その上、ゲームは独自のカスタム外部スクリプト言語を実装しました。これは、元のソースデータファイルをすべて使用することを望んでいた場合、その言語のパーサーとレクサーを作成することを意味していました。

最終的に、時間と予算の制約を考えると、元のソースコードはあまり役に立ちませんでした。ゲームのロジックの制御フローを正確に模倣する方法を知っていたことは、それを持っていることの最も有用な部分でした...しかし、そのために元のソースが本当に必要でしたか?おそらくない。

しかし、その例はあなたの状況の逆のようなものなので、それほど適切ではないかもしれません。私は、自分が非常に馴染みのある環境で開発をスピードアップすることを当時知らなかった言語で記述しなかったコードベースを使用したいと考えていました。ここに別の例があります

例2

Java開発者がポータブルコードベースを作成しようとしていたことに注意して、私は自分のFlashの仕事で似たようなことをすることを始めました。たとえば、flash.display。*クラスの拡張にあまり依存しないコードを書くこと、コンポジションを使用してビューを作成します。flash.event。*にそれほど依存せず、代わりに、特に言語やプラットフォームに縛られていない、独自の軽量メッセージパッシングシステムを作成します。私は最近、上記のフレームワークを使用してゲームを終了し、Unity 3DプロジェクトとしてC#(JavaやAS3によく似たものとして私が知っている言語)に簡単に移植できるかどうかを確認したいと考えました。結局のところ、これははるかに成功しました!C#よりもAS3の方が流thinkに考えているので、すでに記述されたアルゴリズムを使用することで時間を大幅に節約できます。私がしなければならなかったのは、単に構文を変更するだけでした。

ですから、私自身の個人的な経験だけでは、答えが常に「はい」または「いいえ」になるとは言えません。あなたが選択した高水準言語である特定の言語イディオムにどれだけ依存しているか、そしてそれらを再作成することがCで簡単か難しいかを考慮する必要があります。


2番目のストーリーは、私がどのように感じているかを示しています。私はプロトタイプの実装を汎用かつマジック/トリケリーを自由に保とうとします。その結果、ほとんどのアイデアがCに翻訳できるとは限りません。明らかに悪魔は詳細にあります。
マーク・カンラス

@Mark Canlas「悪魔は細部に宿る」絶対に。言語や環境間でコードを移植したことがない場合、潜在的な問題をすべて遭遇するまで予測するのが難しいという理由だけで、最初の試みが失敗する可能性があると思います。
scriptocalypse

2

擬似コードから始めることは価値があると思います。プロトタイプを別の言語で書くことは、時間の浪費のように思えます。なぜなら、あなたのより高いレベルの言語は、擬似コードほど「C」に翻訳される可能性が低いからです。

また、擬似コードを使用することにより、システムが実際にどのように機能するかについての理解を深めることができます。

擬似コードに取り組んでいるのと同じ期間に、Cを勉強する必要があります。その後、計画が完了するまでに、実際に実装する準備ができているかもしれません。

別の言語でそれを書く理由として提案されているのは、設計を進めるためであるため、代わりにいくつかのUML図またはそのような性質を使用して開始することができます。


2

アルゴリズムのプロトタイプを作成することができます-間違いなく「非常に高度な」言語(Matlab、Rubyなど)を使用して、コアロジックの設計エラーを解決します。これを使用して、アルゴリズムが正しく機能することを証明し、「低レベル」言語でゼロから実装します。

C ++またはJavaまたはC#を「高レベル」として、Cを「低レベル」として選択した場合、読みやすさの向上はそれほど重要ではなく、「翻訳」は依然としてかなり痛みを伴い、かなりのバグがあります。起こりやすい。アイデアは本質であり、高レベルの実装におけるプロジェクトのエンジンは、1つまたは2つ以上の画面を占有してはならず、把握しやすく、読みやすいものであり、すべての注意事項は痛みを伴う明白なものである必要があります。図。


2

データベースエンジンの主な目的は、低レベルI / Oを最適な方法で処理し、bツリーやリンクリストなどの複雑な構造を効率的に処理することです。

確かにC / C ++の問題ですが、かなり優れたJava実装がいくつかありますが。

高レベルの言語では、適切に機能する正しいアルゴリズムを開発するのがはるかに簡単です。通常、いくつかのバリエーションを試して結果を比較するケースです。次に、「勝利」アルゴリズムをCに変換できます。

妥協案として、最初の実装を高レベルのJVM言語(Jython、Groovyが思い浮かぶ)の1つで記述し、実装が安定したらクラスごとにJavaに移動することができます。


2

私はそれが一般的だとは思わないが、それは終わった。私が一緒に仕事をしたことのある最も鋭い建築家の1人は、Pythonで彼のモデリングを行い、そのコードをC ++で実装していました。

一般に、これを価値のあるものにするためには、ターゲット言語で簡単に簡単に表現できない複雑で高度に最適化可能なアルゴリズムを実行する必要があると思います。ほとんどの「現実世界/ビジネス」の状況では、ターゲット言語と同じ言語で高レベルの意図を比較的簡単に表現でき、その言語の実装はパフォーマンス要件を満たしているため、より高いレベルでモデル化する必要はありません。レベル言語。

あなたがより高いレベルの言語のより良い知識を持っているあなたの状況を考えると、私はこの方法論が短期的にうまく機能するのを見ることができました。物事を順調に進めるためのロードマップを提供するだけでなく、質問がある場合は、より正確に質問することができます。


1

現在、私は「パフォーマンスのため」にCで書かれたプロジェクトに取り組んでいます(これが元の動機でした)が、実際にプロファイルを作成すると、ほとんどの時間を他のシステム(DB、 Java、ソケットの「イベント」)。

間違ったアルゴリズムを使用すると、Cでもパフォーマンスが低下します(たとえば、キーの線形検索を行う場合、「Cはハッシュテーブルを持たず、他のライブラリを使用したくないため」、ハッシュテーブル、またはC ++、Java、C#、Pythonなどのような類似の言語で実行してください)。

何らかの理由でCでそれを行うことを余儀なくされている場合、あなたが知っている他の言語でのプロトタイピングは、実際のC実装を行う「問題」を知っているプロトタイプである場合にのみ悪い考えではありませんCに自信がありません(たとえば、C / C stdライブラリにはコンテナがなく、単なる「プレーン」配列であることがすぐにわかります。非stdライブラリが必要です)。さらに、Cはオブジェクト指向ではないため、オブジェクト指向の方法でプロトタイピングを行う場合は難しくなります。

要約すると、最善のことは、「プロトタイプ」言語で実際の実装を行い、実際に必要な場合はCPUを集中的に使用する関数をCで作成することです。ただし、Cもちろん、実装を書く前に。


1

高度な言語で記述されたパフォーマンスが重要なアプリケーションは多数あります。

過去にアセンブラーとCでプログラミングしましたが、金属に非常に近い感じがしますが、最近はその使用が非常に制限されています。

パフォーマンスを妨げるものは非常に多いので、言語自体が制限要因となる部分に到達することはないでしょう。これは、C vs C#であることを考慮しています。

言語ごとに10〜15%のパフォーマンスの向上が得られるとします。これは、正しいアルゴリズムを実装する際の桁違いの増加と比較して何もありません。

C#でプログラミングしている場合は、アルゴリズムとデータ構造のアーキテクチャと実装に集中する時間がはるかに長くなるため、より高いレベルの最適化につながります。

現実の世界では常に時間に制約があるため、プロジェクトの適切な部分に時間を費やしてください。


0

私はあなたの計画が実際にCで作成することについて興味がありますか?プロトタイプを作成してからCを学習し、Cで再コーディングしますか?私には、これは「胃よりも大きい目」ということわざに少し似ているように見えます。多くのプログラマーは、新しいテクノロジーを習得している間に、私はそう思っています。つまり、最終的に作成する必要があると感じる言語の内外をまだ知らなくても、明らかにパフォーマンスに敏感なものを設計しようとしているということです。基本的には、Cアプリの設計を開始する前に最初にCを学習するのに時間がかかる場合はCを知ってから、目的のアプリケーションの作成方法についてより多くの洞察を得ることができます。おそらく私は質問を間違えたので、あなたはこれを別のプログラマーに渡してCでプログラムをビルドするつもりです。


時々「それをしないでください。」あるに正しい答え「私はXをどのように行うのですか?」
ラリーコールマン

0

解決しようとしている問題の理解を得るために、時にはプロトタイピングが行われます。そして時々、基礎となる技術に慣れていない場合に基礎となる技術を知るために。

上記のケースでは、Pythonなどのスクリプト言語でプロトタイプを作成し、Cで実際のコードを作成することを検討しています。

いくつかの可能性の評価:

1。Pythonでプロトタイプを作成し、Cでソフトウェアを記述します。

スクリプト言語でのプロトタイピングは、入力に対する出力をすばやく確認したい場合に役立ちます。。これは、主に問題を解決するためのロジックをテストする必要がある場合に役立ちます。また、他の人のためにデモをすばやくまとめたい場合にも便利です。

pythonで記述したコードは、最終的なソフトウェアでは使用されません。しかし、Pythonを読んでCで書くことができる人にプロトタイプを渡す場合に役立ちます。ここで、プロトタイピングはアイデア伝えるのに役立ちます。

この方法は、ソリューションの論理的な実現可能性をテストするのに適しています。

2。Cでプロトタイプを作成し、Cでソフトウェアを記述します。

Cのプロトタイピングは、2つの利点があります。1つは、プロトタイプの作成中に、言語、ライブラリ、API、落とし穴などの関連部分理解できるようにすることです。2つ目は、最終ソフトウェアの構築中にプロトタイプ自体から開始できるため、時間とのコードを再利用

この方法は、ソリューションの論理的および技術的実現可能性の両方をテストするのに適しています。

3。手元の問題に応じて、プロトタイプを作成するための非コーディング方法を検討できます。

プロトタイプを作成したいロジックやアイデアがあれば、擬似コードフローチャートブロック図紙の上のも良いです。

UIプロトタイプである場合は、UIモックアップツールを検討するか、もう一度検討してください。


0

私はあなたがよく知っている言語(Pytho / Ruby / C#ではない)でプロトタイプを作成する必要があると思います。

  1. 言語が提供する機能/ライブラリを最大限に活用します。
  2. 言語の制限ではなく、デザインの選択に時間を費やします。

後で、プロファイリングツールを使用して、ボトルネックの領域を見つけることができます。C / C ++で再実装します。上記の手順を数回繰り返して、プロトタイプが「十分に高速」である可能性があることを知っている人がいます


0

あなたが説明したアプローチであなたが何を得ているとは思わない、そして何人かの人々はその理由をいくらか詳細に説明している。

私が関わったプロジェクトの1つでは、この種のアプローチを使用しました。Cell/ BEおよびPower7アーキテクチャ向けの数学ライブラリの開発です。関数は(CoCoNUTを使用して)Haskellでモデル化され、出力関数は特定のターゲットアーキテクチャ用に最適化されたアセンブリでした。

この場合、目標は、調整されたアセンブリ命令と複数のアーキテクチャをターゲットとする能力を備えた高性能です。

食べ物は、飢えないことを願っています:)


0

高性能のデータベースエンジンを使用するには、おそらく次のものが必要です。

  • マルチスレッド、
  • 明示的なメモリ管理、
  • 非同期通知、
  • セマフォまたは同期プリミティブ、
  • 低レベルのファイルシステム機能に簡単にアクセスできます。

選択するアルゴリズムは、パフォーマンスにとって重要です。

一般的なアドバイスは、高レベルの言語から始めて、最適化が必要な部分のみを低レベルの言語に移行することです。

ただし、選択する高レベル言語は、作成する必要があるアルゴリズムをサポートできる必要があります。ここでの効率的なアルゴリズムは、最終的にスレッド化の制御、メモリの効率的な使用、および最高の低レベルファイルシステム操作の使用によって支配されます利用できます。したがって、最終目標がパフォーマンスである場合、使用する必要があるプリミティブをサポートしない言語でプロトタイプを作成することはできません。

プロトタイプをテストする必要がある場合(または他の人がそのインターフェイスに対してソフトウェアを開発する必要がある場合)、目的のAPIをサポートする言語で作業する必要もあります。その後、他の人がコードをテストできるようにし、最適化しながら独自の回帰テストを実行できます。

これらの考慮事項は、おそらくこの場合の高レベルのプロトタイピングのための多くの言語を除外します-おそらくあなたが言及したすべてのもの(おそらくC#を除く)。ただし、もちろん、任意の言語(英語を含む)で擬似コードを作成できます。必要に応じて、プロジェクトの一部(お好みの関数など)を好みの言語でプロトタイプ化することもできます。

C ++とCの密接な関係(および無視できるパフォーマンスの違い)は、最終製品でCよりもC ++を好まない理由がほとんどないことを意味します。

(特定の目的のために高性能データベースエンジンが必要であるという前提で答えています。意図が控えめであれば、おそらく既存のエンジンを既製で入手するでしょう。)


-2

UnixがCで書かれた素晴らしい製品だから、Cの名声は十分に値すると思う。Ken Thompson(アセンブリ言語でUnixの最初のバージョンを書いた後)はFortranでUnixを書き始めましたが、1週間または1か月後にあきらめ、同僚のKen Ritchieによって開発されていたCを使い始めたと言われています同じ時間。

FortranがCやC ++よりも高速であることを最近読んで驚いた。

リチャード・マリンズ


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