1つの製品またはソフトウェアの開発に複数のプログラミング言語が使用されるのはなぜですか?


114

私は最近、コンピューターサイエンスの修士号を取得することを目指している大学院生です。私は本当に興味をそそられ、それらに貢献することを勧める複数のオープンソースプロジェクトに出会いました(CloudStack、OpenStack、moby、Kubernetesなど)。それらの大部分に共通していることの1つは、複数のプログラミング言語(Java + Python + GoまたはPython + C ++ + Rubyなど)を使用していることです。複数のプログラミング言語が互いに通信するためにどのように作られているかを扱っているこの他の質問をすでに見てきました:2つの異なる言語を持つ2つの異なるプログラミングを相互作用させる方法は?

企業に複数のプログラミング言語の使用を促す要件を理解したいと思います。ソフトウェアアーキテクトまたはプロジェクトリーダーが「タスク1に言語Xを使用し、タスク2に言語Yを使用することを提案しています」と言う要件または要件のタイプは何ですか?同じ製品またはソフトウェアで複数のプログラミング言語が使用されている理由を理解できないようです。


14
コンピュータエンジニアリングの大学院生として、特に研究コードについては、「著者(学生)が始めたときに最もよく知っていた言語」の問題であることが多いと付け加えます。研究プロジェクト、特に大きな研究プロジェクトにつながらない一回限りのプロジェクトは、「私の正確さ」よりも結果を重視する傾向があります。
-tonysdg

16
@tonysdg:「正しさ」は学問においてより重要である傾向があります。一般に関係ないのは、保守性、ユーザーエクスペリエンス、およびドキュメントです。特に言語の混在は保守性に影響します。資格のあるメンテナーの数を制限します。
–MSalters

2
@MSalters:保守性は、私がその時に探していたと思う言葉です---あなたが書いたすべてに同意します!
-tonysdg

19
さまざまなタスクのためのさまざまなツール。建築家とエンジニアは、異なるツールを使用して1つの家を建てることに気付くでしょう。
ポールD.ウェイト

17
休日に家から空港、外国の空港、ホテル、ビーチの順に移動する場合、旅行の各区間で同じ交通手段を使用していますか?
軌道の明度レース

回答:


17

この回答には、さまざまな言語がプロジェクトに明確なメリットをもたらすことができる理由に関する優れたカバレッジとリンクがあります。ただし、プロジェクトが最終的に複数の言語を使用するようになる理由には、言語の適合性だけでなく、それ以上のものがあります。

プロジェクトは、主に次の6つの理由で複数の言語を使用します。

  1. 他の言語で書かれたコードを再利用することの費用便益。
  2. レガシーコードを含めて対応する必要性。
  3. 特定の言語のコーダーの可用性;
  4. 特殊なニーズのための特別な言語の必要性;
  5. レガシー言語のバイアス; そして
  6. 不十分なプロジェクト管理(計画外の多言語使用)。

理由1〜4は、直接対処することで、プロジェクトをより速く、より効率的に、より高品質の製品で、より簡単に長期的にサポートできるという意味で、肯定的な理由です。理由5および6は否定的であり、必要な変更に対する抵抗の症状、計画の不備、効果のない管理、またはこれらすべての要因の何らかの組み合わせです。残念ながら、これらのマイナス要因は、「偶発的な」多言語使用の一般的な原因です。

再利用のコストメリットである理由1は、オープンソースソフトウェアのより大きな役割と、Webで適切なコードコンポーネントを見つける機能の向上の両方により、プロジェクトで複数の言語の使用を許可するますます強力な理由になっています。過去数十年の「すべてを社内でコーディングしましょう」という哲学は、経済的現実に直面して衰退し続けており、基本的に新しいプロジェクトにとって最も費用対効果の高いアプローチではありません。これにより、プロジェクト内で単一言語の使用を厳密に実施する機会が少なくなります。

特に、適切に管理されたオープンソースコンポーネントを再利用するプロジェクトの場合、複数の言語を使用すると、再利用されたコンポーネントが適切に設計されたインターフェイスの背後に隠れ、ゼロコストの外部グループによって個別に維持されるため、全体的なコスト面で大きなメリットが得られます。ベストケースのシナリオでは、この種の再利用による言語の混合は、オペレーティングシステムコンポーネントを使用するよりもプロジェクトにとってコストがかかりません。このアプローチの価値の良い例は、Microsoftのブラウザでのオープンソースソフトウェアの大規模な採用ほど良くありません。

理由2(レガシーコードに対応する必要性)は、大規模なプロジェクトの危険性では無視されます。しかし、レガシーコードが多くの問題を引き起こす可能性があり、新しい言語の新しいコードで簡単に置き換えることができると単純に仮定すると、非常に危険です。レガシーコードは、たとえ悪いレガシーコードであっても、レガシー製品を使用するコミュニティが期待する機能の暗黙的な「契約」に相当するものを含むことがよくあります。そのコミュニティは、企業の主要な収入源であるか、政府のソフトウェアのサポートの主なターゲットであることがよくあります。その暗示された契約を単に破棄することで、気づいている顧客を大勢追いかけ、他のオプションがすぐに利用可能な場合、一晩で会社を破産させることができます。

同時に、ない古い言語で古いコードを交換することは卸売交換と同じくらい危険なことができます。最悪の例は米国退役軍人局であり、コンピューター科学者ではなく医師によって設計されたMUMPS(冗談なし)と呼ばれる言語でコーディングされた多数の重要なシステムがあります。ムンプスを学びたい人は誰もいませんし、それを知っている人は文字通り死にかけています。したがって、プログラマは、他のより一般的で、より強力で、より保守された言語の使用に前進しようとしても、MUMPSに対応する必要があります。

このタイプの多言語使用には、慎重な計画が必要です。その計画は、一方で何十年もの顧客の知識を失い、他方でソフトウェアをサポートする能力を失うことの間でナイフエッジをナビゲートしなければなりません。明確に定義されたインターフェースの背後にある古いコードを分離し、その動作が十分に文書化された後に新しいより強力なコードが古いコードを置き換えることを可能にする技術が役立ちます。しかし、このレガシーシナリオは決して簡単なものではなく、幅広い規模の多くの企業や組織が消滅する原因となっています(今後もそうであり続けます)。

理由3、さまざまな言語のコーダーの可用性は、プロジェクトが危険にさらすことを無視する実用的な要因です。ただし、プロジェクトの主催者は、特定の言語が彼らの目標に最適であると(正しくまたは誤って)感じる場合があります。新しい言語を学ぼうとするプログラマの曲線。

より合理的なアプローチは、機能分野に基づいてプロジェクトの言語ニーズを分析することです。たとえば、プロジェクトを注意深く見てみると、あまり使用されていない言語でのコーディングの専門知識を必要とする、独自のアルゴリズムを実装するための高価値コードの小さな「頂点」しかないことがわかります。大規模なプロジェクトの他の部分は、より一般的な言語で、または(さらに良い)適切に管理されたオープンソース製品で簡単に対応できます。したがって、言語のニーズによってプロジェクトを分析すると、特別な言語で特別な専門知識を雇用またはレンタルするためのはるかに現実的で費用対効果の高いアプローチを提供でき、単一プロジェクト内の言語間のインターフェースを強化するのにも役立ちます。

さまざまなニーズに応じてさまざまな言語を使用する理由4は、そのような種類のプロジェクトニーズの分析を実行することから直ちにスムーズに進みます。1つのプロジェクト内でサポートする言語が多すぎると、サポートとコンポーネント間のインターフェースの両方が複雑になり、組み合わせが複雑になる可能性があるため、これにも注意が必要です。コスト面で最も安全なルートは、特にカスタマイズ以外のほとんどでプロジェクトのニーズを満たすことができる優れたパッケージが存在する場合は特に、再利用の最大機会を最初に見つけることです。次に、特定されたニーズの大部分に対処できる少数の言語について、何らかの決定を行う必要があります。再利用集約型の開発では、これは多くの場合グルーコードの一種になります。

一般に、プロジェクトの一部のメンバーが他のメンバーと同じであるという理由だけで、非常に類似した機能を持つ複数の言語を選択することはお勧めできません。ただし、特殊な言語スキルの恩恵を受ける、明確に定義された機能サブセットがある場合、新しいコード開発に複数の言語を使用する十分な理由になります。

使用される言語の必要な変更に対する抵抗5が、プロジェクトの深刻な混乱と内戦の原因になります。ユーザーとしてDaveoこの回答に関するコメントで指摘されているように、一部のプロジェクト担当者にとっては変更は非常に難しい場合があります。同時に、変化に対する抵抗は決して単純な問題ではありません。それがまさにそれが多くの争いを引き起こし得る理由です。レガシー言語が十分に強力である場合、レガシー言語スキルの使用はプロジェクトの生産性を強力に後押しすることができ、スムーズに動作し、品質を尊重するチームで優れた品質の製品につながる可能性があります。ただし、多くの古い言語は、高度な機能、コンポーネントの可用性、オープンソースオプション、インテリジェントツールキットのサポートの観点から、最近の言語では完了できないという事実と、レガシー言語のスキルのバランスを取る必要があります。

当時も現在も、より弱く、読みにくく、生産性の低いレガシー言語を使い続けるための最も一般的な(そして皮肉なことに、ほとんどの場合正しい)単一の議論は、古い言語がより効率的なコードの生成を可能にするというものでした。これは古い議論であり、1950年代にさかのぼります。アセンブリ言語のユーザーは、FORTRANとLISPでのプログラミングの出現をしばしばひどくresりました。現在でもコード効率の引数に有効性がある例は、オペレーティングシステムカーネルなどの処理集約型コードで見ることができます。ここでは、CはC ++よりも優れた言語のままです(ただし、単純な効率を超える理由があります)。

しかし、新しい千年紀のグローバルにネットワーク化され強力にマシンでサポートされたプロジェクト環境では、プロジェクト言語を選択するための主な議論としてのコード効率はさらに弱まりました。人工知能アプリケーションのマスマーケティングを可能にしたコンピューティングおよびネットワークハードウェアの爆発は、人間のプログラミングのコストが、非常に安価なハードウェアおよびクラウドウェアでの相対性の非効率なコード実行のコストを容易に上回ることを意味します。それが、コンポーネントライブラリ、オープンソースオプション、および高度なインテリジェントツールキットのより新しい言語でのより高い可用性と組み合わされると、効率上の理由だけで言語を保持するケースの数は非常に少なくなります。適用される場合でも、

プロジェクトがレガシー言語にとどまるより説得力のある理由は、何らかの理由でプロジェクトにスタッフを変更するオプションがほとんどないかまったくない場合です。これは、たとえば、主要なレガシー製品ラインが、既存のスタッフのみが流な言語で完全にコーディングされている場合に発生する可能性があります。そのような場合、プロジェクトは古い言語でプログラムしようとする道を進むか、新しい言語の使用方法について既存のスタッフを訓練しようとする必要があります。

レガシー言語のスタッフを新しい言語でトレーニングすることは、それ自体が危険な場合があります。私は、CからC ++に訓練されたばかりのプロジェクトのメンバーが、オブジェクト指向メソッドの利点を理解していないと誠意をもって私に不平を言ったケースを今でも思い出します。彼のコードを見たとき、彼は以前の103個のC関数を単一のC ++オブジェクトクラス用の103個のメソッドに変換していました...

より深いメッセージは、人々が数年または数十年にわたって単一の言語と言語スタイルでプログラミングを行った場合、新しい方法で「考える」ことの難しさは、優れたトレーニングプログラムでもほとんど克服できないことです。場合によっては、他の選択肢はないかもしれませんが、現在のトレンドや手法にもっと合っている若いデザイナーやプログラマーを連れてくることです。

プロジェクト管理が貧弱な理由6は、それ自体を物語っています。プロジェクトでの言語の選択と使用は、常に明示的に検討および評価されるべきであり、偶然に起こることは許されません。少なくとも、言語の選択はプロジェクトの長期的な運命とサポートコストに大きな違いをもたらす可能性があるため、常に考慮して計画する必要があります。ムンプスにならないでください!


すべてに同意します。Basileの答えは主にパフォーマンスと表現性の問題に焦点を当てていますが、答えは誰でもポリグロットプログラミングの選択の背後にある管理の観点を理解するのに役立ちます。
パルスパテル

@ParthPatelこの答えを受け入れるべきだと思います。これは最高の自己完結型のまとめです。

2
+1:しかし、あなたは自我を忘れました。多くの人々は新しい言語を学ぶことを拒否し、彼らが知っていることを固守します。複数のチームによるこの異なるレベルの成熟度は、1つのプロジェクトで多くの異なるテクノロジーにつながる可能性があります
-Daveo

1
理由7、IT部門を採用目的でセクシーに見せようとする。冗談ではなく、.Netプロジェクトでは、Goでまったく新しいサービスを使用するために、既存のサービスから単一のエンドポイントを置き換えて、「ポリグロット」をジョブ追加に入れる必要がありました!
クリス・リー

1
へえ!複数の言語を使用していることは、行き止まりのCOBOL専用の仕事に就くのではないかと心配している人々にとって魅力的であることに異議を唱えられません。言語がその目的のためだけに追加されていることを聞いたのはこれが初めてですが、確かに、より多くの種類のツールと言語を持っていることが最新技術で動作していることの指標として見られる多くの環境があります、したがって、より進歩的な職場です。良い例、ありがとう!
テリーボリンジャー

158

同じ製品またはソフトウェアで複数のプログラミング言語が使用されている理由を理解できないようです。

非常に簡単です。すべてのニーズと目標に適した単一のプログラミング言語はありません。

Michael L. Scottの著書Programming Language Pragmaticsを読んでください。

一部のプログラミング言語は、表現力と宣言性を好みます(多くのスクリプト言語だけでなく、AgdaPrologLisp、Haskell、Ocaml などの高レベルプログラミング言語も...)。開発のコストが重要な場合(人間の時間と開発者のコ​​スト)、それらを使用するのが適切です(実行時のパフォーマンスが最適でなくても)。

他のプログラミング言語は、実行時のパフォーマンスを優先します(C ++、Rust、Go、C、アセンブラー、OpenCLなどの特殊言語など、通常コンパイルされた実装を備えた多くの低レベル言語)。しばしばそれらの仕様はいくつかの未定義の振舞いを許します。コードのパフォーマンスが重要な場合、これらの言語を使用することをお勧めします。

一部の外部ライブラリは、特定の言語とABIおよび呼び出し規約を念頭に置いて作成されています。他の言語を使用し、おそらくいくつかのグルーコードを記述することにより、外部関数インターフェイスの規則に従う必要があります

実際には、非常に表現力のあるプログラミング言語(開発者の生産性が向上し、十分なスキルを持つ開発者チームを想定している)があり、実行時に非常に高いパフォーマンスを発揮することはほとんどありません。実際には、表現力とパフォーマンスの間にはトレードオフがあります。

注:ただし、いくつかあったが遅いのプログラミング言語での進展:錆は、CまたはおそらくCよりも表現力で++が、その実装は、ほぼ同じパフォーマンスで、おそらく同じように高速に実行可能ファイルを生成するために改善されます。そのため、職業生活の間に新しいプログラミング言語を学ぶ必要があります。しかし、銀の弾丸ありません

開発のコストは今日ますます重要になっていることに注意してください(1970年代-当時は非常にコストがかかっていたコンピューターや、一部の組み込みアプリケーションでは、大量の製品を使用していました)。経験則(非常に近似)は、熟練した開発者が毎年約25,000行の(デバッグおよび文書化された)ソースコードを記述でき、使用するプログラミング言語にあまり依存しないことです。

一般的なアプローチは、大規模なアプリケーションにスクリプト言語(またはドメイン固有の言語)を埋め込むことです。この設計思想(ドメイン固有の言語に関連する)は何十年も使用されています(1980年代からスクリプト作成にElispを使用しているEmacsソースコードエディターが良い例です)。次に、簡単に埋め込み可能なインタープリター(GuileLuaPythonなど)を使用します。、...)より大きなアプリケーション内。大規模なアプリケーションにインタープリターを組み込むという決定は、非常に早い段階で行わなければならず、アーキテクチャーに大きな影響を及ぼします。その後、2つの言語を使用します。迅速に実行する必要のある低レベルのものには、CやC ++などの低レベル言語を使用します。高レベルのスクリプトの場合、他のDSLまたはスクリプト言語。

また、特定のソフトウェアは、現在のほとんどのオペレーティングシステム(Linux、Windows、Android、MacOSX、Hurdなど)内で、何らかのプロセス間通信技術を使用していくつかの協調プロセスで実行できることに注意してください。分散コンピューティング技術(クラウドコンピューティング、HPC、クライアントサーバー、Webアプリケーションなど)を使用して、複数のコンピューター(またはそれらの多く)で実行することもできます。どちらの場合も、複数のプログラミング言語を使用するのは簡単です(たとえば、1つのプロセスまたはコンピューターで実行される各プログラムを独自のプログラミング言語でコーディングする)。詳細については、オペレーティングシステム:3つの簡単なピースを参照してください。また、外部関数インターフェース(例:JNI)、ABI呼び出し規約など...同じプログラム(または実行可能ファイル)で複数の言語の混合を促進します-SWIGのようなコードジェネレーターが役立ちます。

場合によっては、いくつかのプログラミング言語混在させる必要があります:Webアプリケーションには、ブラウザーで実行される部分にJavaScriptまたはWebassembly(ほとんどのWebブラウザー内で実行される唯一の言語)が必要です(これらを生成するフレームワーク、たとえばocsigen)。CまたはC ++はそこで必要なものを表現できないため、RDBMSクエリはSQLを使用する必要があり、GPGPUOpenCLでコード化されたコンピューターカーネルを必要としますまたはCまたはC ++ホストコードなどによって管理されるCUDAなど。一部の言語は、このような混在を容易にするように設計されています(Cのステートメントasm後半のGCC MELTなどのコードチャンクなど)。

場合によっては、メタプログラミングテクニックを使用します。大規模なソフトウェアプロジェクトの一部には、アドホックな形式化から他のツール(おそらくプロジェクト固有のツール)によって生成されたコード(CまたはC ++など)があります:コンパイラ)bisonANTLRなどが思い浮かびますが、SWIGやRPCGENも同様です。また、GCCには、10を超える特殊なC ++コードジェネレーター(GCCの内部DSLごとに1つ)が内部にあることに注意してください。この例を参照してください。メタバグを見つけるのは難しいことに注意してくださいブートストラップコンパイラ、およびホモイコニシティリフレクションについてもお読みください。(学ぶために価値があるのLispを、と遊ぶSBCL、および読み取りにSICPを、にも見えるJITコンパイルのようなライブラリGCCJIT、あなたがそれらを使用して、実行時にいくつかのコードを生成するかもしれないいくつかの大規模なプログラムで、を意識するグリーンスパンの第十則)。見サーキットあまり旅行し FOSDEM2018で話を。

時には、特殊な注釈言語(DSLと見なされる可能性があります)を使用して、コードの正式な注釈(証明者、静的アナライザー、コンパイラーなど)を提供したい場合があります。Frama-Cを使用してACSL調べ、Cプログラム(安全性が重要なプログラム)、またはHPCのOpenMPプラグマに注釈を付けます。警告:このような注釈を書くには、多くのスキルと開発時間が必要になる場合があります。

ところで、これは、コンパイラーとインタープリターに関するいくつかのスキルがすべての開発者に役立つことを示唆しています(コンパイラー内部で作業しなくても)。そのため、コンパイラを使用していなくてもDragon Bookを読んでください。独自のインタプリタをコーディングする場合(またはDSLを設計する場合)、Lisp In Small Piecesも読んでください。

参照してください。このそのそれその質問に関連する私の答え。

インスピレーションと啓発のために、いくつかの大規模なフリーソフトウェアプロジェクト(github上またはLinuxディストリビューションから)のソースコードも調べてください。

また、一部のプログラミング言語は、既存の言語に(プラグマまたはコメントとして)注釈を追加することで進化しました。例については、を考えるACSL(によってその証明を可能にするためにCプログラムに注釈を付けるコメント-延長FRAMA-Cまたはの)OpenCLのか(Cの方言がGPGPUsプログラムする)のOpenMPまたはOpenACC #pragmaか、Common Lispの型注釈を

PS:プログラミング言語を混合する社会的または組織的または歴史的な理由もあります。ここではそれらを無視していますが、実際にはそのような理由が支配的であることを知っています。また、読む神話マン月間


6
私にとって、これは正しい答えです。たとえば、Cプログラムのアセンブリルーチンを使用できます。UNIXシェルには複数のプログラミング言語が散らばっていますがawk、タスクに適しているという理由だけで、bashスクリプト内で使用される(別のプログラミング言語である)ことがよくあります。ただし、@ amonのポイントは依然として有効です。
MayeulC

8
ところで、優秀なプログラマーは時々コードの行を削除することができます...(多くのくだらないコード行をごく少数の良い行に置き換えることによって)
バジル・スタリンケビッチ

12
素晴らしい答えですが、一つの要求です。「サイド」をあまり目立たないように表示して欲しがりますが、HTML SUPタグは小さなフォントでレンダリングする副作用があるからといって乱用しないでください。アクセシビリティの悪夢である必要があり、HTML5標準では、「これらの要素は、表記上の表記を特定の意味でマークアップするためにのみ使用する必要があります。これらの要素がないと、コンテンツの意味が変わります。」
FeRD

4
@FeRD:削除され<sup>たが後悔がある
バジル・スタリンケビッチ

6
@BasileStarynkevitch感謝します。私が言ったように、私はその意図に感謝し、過度に冗長で傾向のある作家自身として、StackExchangeがテキストをより小さく、またはおそらくクリックして表示するコンテナ内で折りたたむサポートされた方法を提供したいと思います。しかし、段落長の上付き文字は、その欠陥に対する答えではありません。
FeRD

29

多くのプロジェクトは、複数のプログラミング言語で構築されていません。ただし、ソフトウェアを支援するために他の言語のスクリプトを使用するのが一般的です。

  • 別個のプログラムである管理ツールは、異なる言語で記述される場合があります。
  • ライブラリとAPIは複数の言語のバインディングを頻繁に提供するため、開発者は好みの言語を使用できます。
  • ビルドスクリプトおよび関連する開発スクリプトは、多くの場合、専用の言語を使用します。
  • アプリケーションのエンドツーエンドのテストでは、同じ言語を使用する必要はありません。

一部のプロジェクトでは、アプリケーション内で複数の言語を使用しています。たとえば、スクリプト言語のプラグインを統合できる低レベル言語のコアなどです。一部のエコシステム(JVMや.NETなど)では、同じ言語ランタイム上の複数の言語の相互運用性が優れているため、使用される正確な言語はそれほど重要ではありません。たとえば、既存のJavaライブラリを使用し、スクリプト機能をGroovyに統合するプロジェクトをScalaで作成できます。

プロジェクトが複数のツールで構成されている場合、それらは異なる言語で開発することもできます。一貫性は良好ですが、特にオープンソースプロジェクトの場合、利用可能な開発作業がボトルネックになる可能性があります。誰かが便利なツールを開発する意思があるが、メイン言語に精通していない場合、そのツールは一貫性よりも価値があるかもしれません。


3
これは、@ Basileの答えを補完するものです。Linuxカーネルからのperlスクリプトは、カーネルの一部でも、Makefileでもありません。これらにCを使用しても何も得られません。さらに、これらのperlスクリプトは、Linuxカーネルとは無関係に使用できます。かなり頻繁に、それらは密接に関連したプロジェクトであると考えられますが、それでもはっきりとしたプロジェクトです。通常、1つのタスクに1つの言語を使用します。
MayeulC

20

これには2つの形式があり、その2つの中間に位置する多くの組織があります。

悪い形 -組織は混乱であり、努力のための単一の技術的ビジョンがあることを確認する人はいません。開発者は、最も快適な言語を使用するか、最近新しいフレームワークまたは言語で実験し、単純な楽観主義のために単純にそれを使用することにしました。

良い形 -組織には、ポリグロットプログラミングに適した、本当にきれいなアーキテクチャがあります。明確に定義されたバウンディングコンテキストを使用してアプリケーションを独立したコンポーネントに分離します。この組み合わせにより、特定のコンポーネントを最も簡単に記述できるプログラミング言語を選択できます。

現実 -通常は前者の方が後者よりも多くなります。いくつかの企業がビジネスドメイン用とWebサーバー用に1つの言語を選択し、多くの場合、データベース管理のために3番目の言語を選択していることを確認しました。つまり、3つのすべてが大きな混乱で一緒にぼやけてしまい、混乱の特定の部分を解決するのに適切なさらに多くの言語を導入することがよくあります。


20

32年間実行されているプログラミングプロジェクトの例を提供できますが、まだ十分な人生が残っているようです。オープンソースというよりも商用です。

コアは、プロジェクト専用に作成されたドメイン固有の言語で記述されています。これは、特にロールバックを基本アーキテクチャに統合するため、非常に有用であることが判明しましたが、Cコードにコンパイルし、プラットフォームのコンパイラーでコンパイルします。その間、約20のプラットフォームをサポートしており、32ビットと64ビットのバリエーションはカウントしていませんが、現在6つのプラットフォームで出荷しています。

C ++で書かれたアドオンがあります。これは、プロジェクトの過去の責任者が、C ++ / MFC / Windows / x86が他のすべてのアーキテクチャとプラットフォームを置き換えると確信したときに開始されたため、C ++の作業を提供する必要がありましたスタッフを雇うことができる。彼が期待したように物事は判明しませんでした。

ドメイン言語とC ++に加えて、開発者はLISPで作業します。LISPは、テストハーネスに埋め込まれたインタープリターを使用して、テストケースの作成に使用されます。ある時点でLISPをJavaに置き換えることを検討しましたが、幸いなことに、そうしなかったことがわかりました。

また、C#で書かれたメインAPIのラッパーもあります。これは、顧客が要求したときに行われたため、C#でアプリケーションを書き直すことができました。APIのCヘッダーファイルと重要な構成ファイルを読み取り、ラッパーのC#コードを書き込むPerlスクリプトによって作成されます。Perlですべてのテキスト処理を行うことは、C ++で行うより簡単です。

ドメイン言語はmakeベースのビルドシステムに対応していないため、独自のビルドシステムがあり、それらを必要とします。UNIXライクなプラットフォーム用のものは、シェルスクリプト、Perl、およびドメイン言語の小さなプログラムで記述されています。Windowsプラットフォーム用のものは、バッチ言語、Perl、およびドメイン言語の同じ小さなプログラムで記述されています。古いVMSビルドシステムはDCLで作成されましたが、10年以上使用されていません。

ドメイン言語用のコンパイラには、YACC / Bisonプログラミングがいくつかあります。Objective-C ++で記述されたAppleプラットフォーム用のテストコードがいくつかあります。チームの内部Webサイト(プロジェクト管理に使用され、成果物の一部ではない)の一部はASPで記述され、その他はPerlのCGIスクリプトとして記述されています。

基本的に、これは難しい問題に対処するプロジェクトとして始まったので、特別なツールを作成する価値がありました。チームはプログラミングを、使用する言語とはある程度独立したスキルであると考えているため、タスクを簡単にするために新しい言語を使用してもかまいません。ただし、ファッションは優先順位のリストの上位にはないため、新しい言語を無償で導入することでタスクを断片化することはありません。

このコードの機能は、ワークステーションおよびサーバーで使用される数学的モデリングです(製品を特定できなければ、もう少し自由に話すことができます)。現在、約2,500万のLoCであり、チーム全体の規模は約50です。


このソフトウェア製品についてもう少し詳しく教えてください。どの産業分野(脳神経外科ロボットは、例えば高頻度取引と同じではありませんか)?おおよそのサイズ(何百万行のコード)?チームの規模は?
バジルStarynkevitch

@BasileStarynkevitch:詳細を追加しました。
ジョンダルマン

この。これがまさに、プロジェクトが良い言語から悪い言語、い言語まで複数の言語を持っている理由です。
ジャレッドスミス

15

特定の言語から最も簡単にアクセスできるツール(OSのUIツールキットなど)が必要な場合があります。たとえば、iOSとmacOSで、UIKitとAppKitを使用してGUIアプリケーションを作成する場合、SwiftまたはObjective-Cで作成するのが最も速く簡単な方法です。(他の言語のバインディングが存在する場合がありますが、ビルド対象の最新のOSリリースの背後にあるため、すべての機能が提供されない場合があります。)

頻繁に起こるのは、アプリケーションがクロスプラットフォームであり、アプリのコアロジックが両方にアクセス可能ないくつかの言語で記述され、UI / OS固有の部分がネイティブに動作する言語で記述されている場合です。

したがって、WindowsおよびmacOSアプリケーションを記述している場合、コアロジックをC ++で記述し、WindowsのUIにはC#を、macOSのUIにはSwiftを使用できます。これにより、コアロジックを2回作成し、両方のアプリのさまざまなバグに対処する必要がなくなるため、時間を節約できます。ただし、クロスプラットフォームUIライブラリはそうなります。


MVC FTW!各OS /環境用のラッパーアプリを備えたクロスプラットフォームコアを1つ持つことになります...または接続の現代の世界でそれをクライアント/サーバーアーキテクチャに移行することもあります
-ivanivan

1
これは私自身の経験と一致します。私が取り組んできたかなりの規模のプロジェクトはすべて、複数の言語を使用してきました。その理由は、特定のツールとインターフェイスするために、特定のパーツを特定の言語で記述する必要があるためです。
オーウェン

元iOS開発者として、これを行ったことを確認できます。JSONで通信するPHPで書かれたAPI、JavaScriptで書かれたWebフロントエンド、JavaScriptで書かれたWebフロントエンド、Javaで書かれたAndroidフロントエンド、Objective-Cで書かれたiOSフロントエンドがありました。その後、新しいプロジェクトはSwiftで作成されましたが、内部フレームワークは引き続きObjective-Cで作成されました。そのため、ある時点で、アプリケーションの1つがPHP、Java、Objective-C、Swift、JavaScript、HTML5で記述され、3つのプラットフォームで利用可能になりました。
ベルソフィー

10

一部のプログラミング言語は特定のタスクにより適しているという事実に加えて、実際的な現実があります。

実際には、特に考慮すべき2つの重要なポイントがあります。

  1. 人々は、さまざまなプログラミング言語でさまざまな経験と関心レベルを持っています。-状況によっては、好きな言語で作業できるようにすることで、共通の言語を強制するよりも良い結果を得ることができます。
  2. 大規模なコードベースは、さまざまな人々によって長期間にわたって構築されます。-より適切な言語が出てきたら、プロジェクト全体を書き直すのに必要な資金やボランティアの数を得る方法はありません。

そしてもちろん、次のようなまったく異なるニーズを持つアプリケーションの特定の部分がしばしばあります。

  • コンパイル言語で開発されたパフォーマンスに敏感な領域。サンプル言語:C ++
  • スクリプト言語で開発された、安価で、変更が容易で、潜在的にカスタマイズ可能な領域が必要です。サンプル言語:Lua。
  • GUIレイアウト。サンプル言語:HTML
  • インストーラ。サンプル言語/ツール:WiX。
  • ビルド。言語/ツールの例:リストするには多すぎますが、通常は一度に数個です。

さらに、洗練されたコードベースで使用されるツールがかなりあり、その多くは、さらに別の言語で必要なカスタマイズとプラグインを可能にします。


8
HTMLはプログラミング言語ではありません
Bergi

1
@Bergi正しい。ピーターはそうではないと主張している。これはマークアップ言語です。
ベルソフィー

1
HTML、XAML、QMLなどは、ソフトウェアプロジェクトのプログラマーがコンピューターに何をすべきかを伝えるために使用する言語です-プログラマーは理論的にはUIを含むプロジェクト全体を単一の言語で書くことができるため、通常は厳密には必要ありません。それが、この質問の文脈に関連するものです。
ピーター

5

すでに作られた正しい他のポイントに加えて:
経験から、多くの言語や環境の決定を意味し、「あなたはハンマーを持っている場合、すべてが爪のように見える」によって作られ、人々は、彼らが精通しているツールを使用する傾向があります。

また、新しい環境を導入したり、言語では、ライセンス、トレーニング、多分ハードウェアに大きな投資をして、生産時間の大きな損失が付属しています-それぞれが取る訓練、設定、インストール、調達週間の大企業では、あなたは基本的に終了たくさんの初心者デベロッパーがいます。
基本的に、より現代的またはより適切な環境または言語に「投資」する時間はないので、彼らはもはや機能することができなくなるまで、彼らが持っているものに固執します。

具体的には、複数の人/チームがソリューションの開発に参加している場合、各グループは最もよく知っているものに固執する傾向があるため、ソリューション全体には潜在的に複数の言語が含まれており、複数の環境で開発されています。


5

この質問(およびいくつかの答え)は、アプリケーションがコードのモノリシックブロックであると仮定しているようです-これは必ずしもそうではありません。

Stack Exchangeのような典型的なWebサイトは、実際には、相互に何らかのメッセージングを使用して、すべて互いに独立して実行されているさまざまなサービスの束です。これらのサービスは、それぞれ独自の長所を持つさまざまな言語で実装できます(通常は実装されます)。

私は小さなコミュニティ銀行や信用組合をターゲットにしたオンラインバンキングプラットフォームのごく一部に取り組んでいます。このプラットフォームには複数のコンポーネントがあります-Webフロントエンド、データベース層、サードパーティの通信層など。これらはすべて、異なるオペレーティングシステムの異なるサーバーで実行される独立したアプリケーションです。ブラウザのクライアント側でJavascriptを実行し、サーバー側にPerlビルドページを持ち、C ++で記述された複数のサービスを使用して、Perlコードと銀行のコアプロセッサ、C ++アプリケーションの別のセットの間の抽象化レイヤーとして機能しますさまざまなレイヤー間でメッセージをルーティングし、C ++アプリケーションとPerlスクリプトのごく一部でさまざまなプロセスの状態を監視し、そのステータスを内部モニターなどに報告します。

モノリシックアプリケーションはまだ存在しますが、それでもさまざまな理由でさまざまな言語を利用できます。アプリケーションの90%をJavaで記述できますが、JNIを使​​用してCまたはC ++を活用し、パフォーマンスが重視されるセクションを増やします。


SQL(またはお好みのクエリ言語)について誰も言及していないことに驚いています。現在、ほとんどのアプリケーションには少なくとも何らかの「スタック」アーキテクチャが備わっています。
user3067860

3

「異なる言語には異なる長所がある」というモチーフの非常に具体的な例であるFORTRANを指摘したいと思います。

Fortranは元々、エンジニアが数値解析作業をしやすくするために開発されたものであり、Fortranコンパイラが非常に効率的な数値コードを出力するようにするために多くの努力が払われてきました。他方、初期の頃からコンピューターの使用は数千の方向に爆発しており、そのいずれも数値分析を伴わず、プログラミング言語の開発は「現実」の世界を無視することに大体従いました。

SO:今日であり、かなり広大な製品を使用している会社で働いていることがわかります。そのほとんどは(たとえば)Javaで書かれています(私はここで個人的な経験から話しています)。しかし、製品のコア機能の1つが何らかの形式の数値解析を必要とすることがわかり、その特定の解析に最適なコードはすべて、Fortranのネット上ですでに利用可能です。それで、あなたは何をしますか?これらのFortranコードの1つをダウンロードし、そのインターフェイス(最上位のサブルーチンの引数)を把握し、CでJNIラッパーを作成し、Javaクラスとしてパッケージ化します。バム!一度に3つの言語で開発する必要がありました。[特に、FortranコードがCOMMONブロック(つまり静的ストレージ)を使用しており、スレッドセーフのために変更する必要があることがわかった場合]


4
または、十分にテストされたFORTRAN計算コアは、ポインターでヒープソートを実行することに依存する新しいアルゴリズムを一度に呼び出すことで改善されます。これは、Cで既に記述されています。フレックスのスキャナー。ああ、多分あなたはC ++から呼び出さなければならないGUIが一番上に欲しいでしょう。または、クライアントは、Matlabサブルーチンとしてすべてを実際に呼び出したいと思っています
...-jamesqf

3

プログラミングは1つのタスクではないからです。製品を作成することさえ、1つのタスクではありません。さまざまな言語で最もよく表現されるタスクには複数のタイプがあります。

より具体的にするために、スタンドアロンアプリのような単純なものを想定しましょう(分散アプリに対して実行するタスクがさらにあります)。

製品は

  • 書かれた
  • まとめます(これには、展開のための画像、フォントなどのリソースのコンパイルと収集の両方が含まれます)
  • 配備された
  • 設定済み
  • 監視された

製品のランタイムを作成するのに適した言語が、製品をまとめるのと同じくらい良いとは考えられません。等々。

ただし、製品を作成するプロセスでさえ、1つの言語で最適に行われない場合があります。

製品で処理される構造化データがたくさんあるとしましょう。書き込み時にデータの構造はわかっていますか?存在する場合、展開時にデータベースを構成する必要があります。これは、ランタイムにコンパイルされる言語を生成できる言語で最適に行われます。

では、データの構造が時々変化する場合はどうでしょうか?新しいデータ構造をコードおよびデータベース構成に変換する構造化された方法が必要な場合よりも。これは、さらに別の言語で行うのが最適です。

すべて同じ言語でできますか?承知しました。しかし、あなたの有効性は、プロジェクトをどれだけ早く終了できるか、そして変更に対する回復力によって決まります。既存のツールを使用して多くの作業を自動化できる場合、3か月かかる作業を他の誰かが2日間で行うことができます。しかし、その誰かが他の言語を使用して、繰り返しを行うことを自動化します。


「製品のランタイムを作成するのに適している言語は、同じくらい良いとは思えません」...プログラミング言語はランダムなプロセスから出てくるわけではないので、このように可能性について話すのは少し奇妙です。プログラミング言語は、いくつかのタスクを解決するように設計されています。あなたのポイントは、言語が偶然も、解決するように設計されていない別の問題も解決する可能性は低いということです。しかし、プログラミングの本質は、解決したいすべての問題を抽象化することであり、したがって、本当にうまく設計された言語は、どんなタスクにも同じように良いはずだと主張します。
左辺約

@leftaroundaboutそれは、言語ができることとそれがうまく表現することを混同することはよくある間違いです。高水準言語の目的は、問題を解決することではありません。何らかのツールがこの表現をコンピューターが実行するタスクに変換できるように、問題の解決策を表現するための構文として機能することです。これを考えると、表現の実際の作業は人々によって行われることを覚えておくことが重要です。そして、人々は異なる抽象化を使用して、異なるドメインからの問題の解決策を説明します。
グロブキン

確かに人々は異なる抽象化を使用します。私のポイントは、優れた言語はこれらすべての抽象化を表現できるはずだということです。
18年

@leftaroundabout、まったくありません。何かをうまく表現するには、その事柄に注意を向けることができる必要があります。すべてのタイプの抽象化をうまく表現しようとすると、それらすべてに注意を向けることになります。そして、それは注意を分散させ、アイデアの表現が不十分になります。何を強調するかを選び、それに集中することには何の問題もありません。
グロブキン

できることはどこかに注意を指示することは、実際にそれをやってと同じものではありません。
18年

1

ソフトウェア開発は、あなたがポイントに進行していることができ、同じプロジェクト内の異なるプログラミング言語を使用して、あなたはそれを動作させることができます。

次に、なぜ複数の言語を使用するのという疑問があります。

理由の1つは、言語が古くなり、新しい言語に徐々に置き換わることです。運がよければ、少しずつ行うことができます。したがって、プロジェクトには古い言語と新しい言語が混在します。

もう1つの理由は、言語XがプラットフォームAで使用されているもの、言語YがプラットフォームBで使用されているもの、言語Zが両方のプラットフォームでサポートされている状況です。そのため、共通コードは言語Zで記述され、プラットフォームに応じてXまたはYと組み合わされます。

そして、人々は、他の人が書いたコード(言い換えれば、自分で書くために時間を費やす必要のないコード)を使用することを好みます。他の人が作成したコードを任意の言語で自由に使用し、好みの言語でコードを追加できます。


8
最初の文について:混合言語プログラムは、50年以上にわたってものでした。
Blrfl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.