C++ から Python に移行する必要がありますか?…それとも別の言語でしょうか?[閉まっている]

StackOverflow https://stackoverflow.com/questions/8748

  •  08-06-2019
  •  | 
  •  

質問

私が働いている会社では、多くのファイルベースのトランザクション処理を行っています。この処理は、多数の企業の多数のシステムに適合するように、多数の形式間でのファイルの変換を中心としています。

処理にはほとんどの場合、 XML ステージには、多くのテキスト解析、データベース検索、データ変換、データ検証が含まれる場合があります。

現在、これらすべてのタスクを実行するプログラムは次のように書かれています。 C++ そして、それらはすべて 1 つの平均的なサーバー上で非常に高速に実行されます。私は、新卒プログラマーが馴染みやすい、より「現代的な」言語を使用する可能性を調査しています。(正しいメモリ割り当て C++ 最近では多くの新人プログラマーに問題が発生しているようです)

提供された簡単な情報に基づいて、Python などの言語は必要な機能とパフォーマンスを提供し、メモリ割り当て (およびその他のさまざまな機能) に対処できるでしょうか。 C++ 関連) 問題が発生しますか?

変更を加えるたびにプログラムをコンパイルする必要がないというアイデアが気に入っています。インタプリタ型言語はおそらく現在得られるパフォーマンスと同じには達しないだろうと私は理解しています。

私たちのシステムは、 Linux これに基づいて、いくつかのオプションも制限されます。

で利用可能な機能とパフォーマンスに関するコメント Python または代替言語の提案をいただければ幸いです。

役に立ちましたか?

解決

変更を加えるたびにプログラムをコンパイルする必要がないというアイデアが気に入っています。インタプリタ型言語はおそらく現在得られるパフォーマンスと同じには達しないだろうと私は理解しています。

これが最大の問題です。パフォーマンスの低下に耐えることができますか。Python を使用してみることもできます。 現在の C++ モジュールで拡張する パフォーマンスの重い部分に。それでも、C++ の才能がないことが唯一の理由である場合、システム全体を切り替えるのは大変な労力のように思えます。C++ を知っている人を雇うほうが安価なオプションのように思えます。

他のヒント

プログラムを迅速に動作させることと、プログラムを迅速に動作させることのどちらがより重要ですか?

多数の大きなファイルを扱う場合は、C++ を使い続けて、大学院生のプログラマにポインタとは何か (!) を教えたほうが良いかもしれません。

それ以外の場合は、スクリプトベースのソリューションを検討することを強くお勧めします。一度慣れてしまえば、スクリプトベースのソリューションでの開発は非常に高速になるからです。正直に言うと、少なくともほとんどの人にとっては、もっと楽しいことです。

レコードごとの処理負荷が高くない場合は、パフォーマンスの低下がほとんどないことに驚くかもしれません。ファイル IO はほぼ確実にコンパイル済み (C) ライブラリで処理されるため、インタープリタのオーバーヘッドは比較的低い可能性があります。試してみる価値はあると思います。

命令型言語の中で、Perl は明らかな選択肢であり、Python は人気があり、Ruby は注目を集めています (おそらく、最初の 2 つよりもクリーンな OO 機能です)。次に、関数型言語のもう少し難解な領域がありますが、私にはそれらについてコメントする資格はありません。

Python ではおそらく、アプリケーションで使用する低レベルのもののほとんどが削除されるでしょう。メモリ割り当てはもう問題になりません。また、少なくとも私の大学では Python をプログラミング言語として採用しているようです。学生が始めるのに正式なものをすべて書く必要がないからです。Python はコンパイルされた C++ プログラムほど高速ではない可能性が高いため、唯一の問題はパフォーマンスの部分です。

検討しているプログラミング言語を理解するために数週間かかることをお勧めします。ルビーもチェックしてみます。Haskell を少しいじってみませんか?

私の理解では、Python はあなたが話しているすべてを処理するのに十分な機能を備えているようです。XML、データベース検索、検証、解析。簡単で楽しいプログラミング体験という理由だけでなく、通常は安全な選択です。行き詰まった場合には、喜んで助けてくれるこの言語に関する素晴らしいコミュニティがあります。

もう 1 つの方法は、C++ プログラムに Python を埋め込むことです。アプリケーションの大部分を同じに保ち、頻繁に変更される部分や、スクリプト言語が提供する柔軟性が必要な部分については Python を呼び出すことができます。

から Python ドキュメント

前の章では、Pythonを拡張する方法、つまり、C関数のライブラリを添付してPythonの機能を拡張する方法について説明しました。また、逆の方法でそれを行うことも可能です:Pythonを埋め込み、C/C ++アプリケーションを濃縮します。埋め込みにより、アプリケーションは、CまたはC ++ではなくPythonでアプリケーションの機能の一部を実装する機能を提供します。これは多くの目的に使用できます。1つの例は、Pythonでいくつかのスクリプトを作成することにより、ユーザーがニーズに合わせてアプリケーションを調整できるようにすることです。一部の機能をPythonでより簡単に記述できる場合は、自分で使用することもできます。

こんなことは言いたくないのですが、次の開発者がなじみやすいものを望んでいるなら、Java を選んでください。Java は、新卒者が最もよく知っている言語です。コンパイルは必要ですが、コンパイル時間は C++ よりも短くなります。Linux だけでなく、他のほとんどの場所でも実行できます。優れたガベージコレクターが付いています。かなり速いですね。そして、開発者はそれに精通していると言いましたか?いいえ、Python のように「クール」ではありませんが、非常に実績のある言語です。

正直に言うと、C++ は苦手でも、Python ならともかく、いずれにしても素晴らしいと考えている新しい開発者がたくさんいるとは思えません。Python をよく使う人は、手動によるメモリ管理を平気で行う傾向があります。実際、メモリ管理が苦手な人は、すべての言語が苦手な傾向があります。

確かに、言​​語を切り替えたいほどメモリ管理が苦手な開発者がいるのは心配です。それは問題を示している兆候ですが、問題が言語にあるのかどうかはわかりません。

コンパイル言語を使い続けることに問題がないのであれば、私は C++ を使い続け、適切なライブラリのセットを選択し、初心者に正しい使用法と確実なパターンの遵守を教えることをお勧めします。

快適なライブラリのセットを見つけることができれば、初心者でもしっかりしたコードの書き方を簡単に学ぶことができます。私の (現在の) 個人的な好みは Qt クラス ライブラリです。なぜなら、メモリの処理が簡単かつ安全で、快適に扱えるからです。また、XML の解析と生成のサポート、正規表現の組み込み、ネットワーク機能、クロスプラットフォームなどの機能も備えています。また、非 GUI システムにも非常に役立ちます。

私にとって、それはプレーンな C++、std ライブラリ、STL を使用することと、Qt のような強力なライブラリを使用することの間には大きな違いがあります。おそらく、ブーストグッズを検討することも非常に価値があります。

グルービーを試してみることをお勧めします。XML サポートは適切であり、解析とデータ検証はそれほど難しくありません。

しかし、移住は最も明るいアイデアではないかもしれないと指摘する人もいる。新しいプログラマーが既存のフラグメントを複製するだけのエラーが発生しやすい新しいコードを作成する代わりに、C++ ライブラリを使用できるように、一般的なものを「マッチャー オブジェクト」と「検証オブジェクト」に分割することはできないでしょうか?

また、C++ の IO のような C ではなく最新のファイル IO (iostreams) を使用するようにしてください。これはメモリの問題に大いに役立つはずです。

また、Boost ライブラリにも注目すると役立つかもしれません。

Python のパフォーマンスは非常に大きな問題となる可能性があります。かつて、タスクのリストに最適化アルゴリズムを含むプログラムを作成する必要がありました。私は Python から始めて、非常に高速かつクリーンに作成しましたが、結果が得られるまでに長い時間がかかることがわかりました。それを一行ずつC++に書き直すとオーバーになりました 100倍 速度向上…

したがって、ご覧のとおり、5 ~ 10% のパフォーマンスの低下が問題ではない場合もあります。あなたの場合はそれを調査する必要があります(ちょっとしたテストでしょうか?)。

または、解析ルールをコード内にハードコーディングしたままにするのではなく、データベースに保存するようにしてください。として ケン・ダウンズ 正しく引用され、 コードを最小限に抑え、データを最大化する. 。こうすることで、小さなルールが変更されるたびに再コンパイルする必要がなくなります。

Python、Ruby、Groovy、または Perl を使用して回避できる場合は、C++ の場合は、これらの高レベル言語のいずれかを使用する方が良いでしょう。生産性が大幅に向上します。さらにパフォーマンスが必要な場合は、Java を使用してください。誰もが少なくとも 1 つの動的型付け言語を理解し、使用する必要があります。

C/C++ への迅速な移行が必要な場合は、言語がネットワーキングですべてを可能にする Python に移行する必要があります。

取り組んでいるプロジェクトの性質上、そのような移行を検討することさえできる場合は、実際に移行してください (何らかの手がかりがあると仮定して)。ただし、多くの C++ プロジェクトでは、移動するしか選択肢がありません。 1 つまたは 2 つの抽象化レベル (C またはアセンブリなど)。

私も他の人に同意します。C++ を使い続けるべきです。非コンパイル言語に切り替えることは、一歩後退することになります。多くのプログラマは言語の厄介な側面 (ポインタなど) を扱うのに苦労するかもしれませんが、少なくともほとんどのプログラマは何らかの C++ に触れたことがあるでしょう。言語を切り替えるのではなく、コードベースとプログラマーの改善に時間とお金を費やすことをお勧めします。

他の言語に関しては、GO lang に注目してください。私の友人はそれをかなり広範囲に使用していました。それは現代のコンパイル言語です。明確、簡潔、そして現代的なものになる傾向があります。GO アプリケーションは通常、C++ で記述されたものと同等の速度で実行され、Web とのインターフェイスが良好です。現時点ではまだあまり成熟していませんが、期待できそうです。

幸運を!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top