Diese Antwort bietet eine hervorragende Übersicht und enthält Links dazu, warum verschiedene Sprachen für ein Projekt unterschiedliche Vorteile bieten können. Es ist jedoch nicht nur eine Frage der sprachlichen Eignung, warum Projekte mehrere Sprachen verwenden.
Projekte verwenden aus sechs Hauptgründen mehrere Sprachen:
- Kostenvorteile bei der Wiederverwendung von in anderen Sprachen geschriebenem Code;
- Die Notwendigkeit, Legacy-Code einzubeziehen und aufzunehmen;
- Verfügbarkeit von Codierern für bestimmte Sprachen;
- Das Bedürfnis nach speziellen Sprachen für spezielle Bedürfnisse;
- Legacy-Sprachverzerrungen; und
- Schlechtes Projektmanagement (ungeplante mehrsprachige Verwendung).
Die Gründe 1 bis 4 sind insofern positiv, als eine direkte Ansprache dazu beitragen kann, dass ein Projekt schneller, effizienter, mit einem qualitativ hochwertigeren Produkt und mit einer einfacheren langfristigen Unterstützung abgeschlossen werden kann. Die Gründe 5 und 6 sind negativ, Symptome des Widerstands gegen notwendige Veränderungen, schlechte Planung, ineffektives Management oder eine Kombination all dieser Faktoren. Diese negativen Faktoren sind leider häufige Ursachen für "versehentlichen" mehrsprachigen Gebrauch.
Grund 1 , der Kostenvorteil der Wiederverwendung, ist zu einem immer wichtigeren Grund geworden, die Verwendung mehrerer Sprachen in einem Projekt zuzulassen, da Open Source-Software eine größere Rolle spielt und die Funktionen zum Auffinden der richtigen Codekomponenten im Web verbessert wurden. Die Philosophie "Lassen Sie uns alles intern programmieren" der vergangenen Jahrzehnte ist angesichts der wirtschaftlichen Gegebenheiten nach wie vor verblasst und im Grunde nie der kostengünstigste Ansatz für ein neues Projekt. Dies wiederum macht die Möglichkeit einer strikten Durchsetzung der Verwendung einer einzigen Sprache innerhalb eines Projekts seltener.
Insbesondere im Fall eines Projekts, bei dem gut verwaltete Open-Source-Komponenten wiederverwendet werden, kann die Verwendung mehrerer Sprachen enorme Kostenvorteile bringen, da die wiederverwendeten Komponenten sich hinter gut gestalteten Schnittstellen verstecken und von externen Gruppen ohne Kostenaufwand unabhängig gewartet werden. Im besten Fall ist das Mischen von Sprachen über diese Art der Wiederverwendung für das Projekt nicht teurer als die Verwendung von Betriebssystemkomponenten. Ich kenne kein besseres Beispiel für den Wert dieses Ansatzes als die groß angelegte Übernahme von Open-Source-Software durch Microsoft in ihren Browsern.
Grund 2 , die Notwendigkeit, Legacy-Code zu berücksichtigen, wird bei großen Projekten ignoriert. So viel Ärger Legacy-Code auch verursachen mag, die naive Annahme, dass er leicht durch neuen Code in einer neuen Sprache ersetzt werden kann, kann ein unglaubliches Risiko darstellen. Legacy-Code, auch schlechter Legacy-Code, enthält häufig einen impliziten "Vertrag" von Funktionen, die von der Community, die das Legacy-Produkt verwendet, erwartet werden. Diese Community ist häufig eine wichtige Einnahmequelle für ein Unternehmen oder das Hauptziel der Unterstützung für Regierungssoftware. Wenn Sie diesen impliziten Vertrag einfach verwerfen, können Sie bewusste Kunden in Scharen verfolgen und ein Unternehmen über Nacht bankrott machen, wenn andere Optionen verfügbar sind.
Zur gleichen Zeit, nicht alten Code in einer alten Sprache ersetzen kann genauso gefährlich sein , wie es Großhandel ersetzen. Ein Beispiel für den schlimmsten Fall ist die US-Veteranenverwaltung, die über eine große Anzahl lebenswichtiger Systeme verfügt, die in einer Sprache namens MUMPS (kein Scherz) codiert sind, die von Ärzten und nicht von Informatikern entwickelt wurde. Niemand will MUMPS lernen, und diejenigen, die es wissen, sterben buchstäblich ab. Programmierer müssen sich daher auf MUMPS einstellen, auch wenn sie versuchen, andere gebräuchlichere, leistungsfähigere und besser gewartete Sprachen zu verwenden.
Diese Art der mehrsprachigen Verwendung erfordert sorgfältige Planung. Diese Planung muss den Spagat zwischen dem Verlust jahrzehntelangen Kundenwissens und dem Verlust der Fähigkeit zur Unterstützung der Software auf der anderen Seite bewältigen. Techniken, die den alten Code hinter gut definierten Schnittstellen isolieren und neuen, leistungsfähigeren Code ermöglichen, den alten Code zu ersetzen, nachdem sein Verhalten gut dokumentiert wurde, können Abhilfe schaffen. Dieses alte Szenario ist jedoch niemals einfach und war (und ist auch weiterhin) die Ursache für den Niedergang vieler Unternehmen und Organisationen in einem breiten Spektrum von Größen.
Grund 3 , die Verfügbarkeit von Programmierern für verschiedene Sprachen, ist ein pragmatischer Faktor, den Projekte auf eigene Gefahr ignorieren. Unabhängig davon, wie sehr die Projektorganisatoren das Gefühl haben (richtig oder falsch), dass eine bestimmte Sprache für ihre Ziele am besten geeignet ist, wenn diese Sprache in Konflikt mit dem ihnen zur Verfügung stehenden Sprachkompetenzpool steht, leiden sowohl der Zeitplan als auch die Qualität des Produkts unter dem Lernen gebogen von Programmierern, die versuchen, eine neue Sprache zu lernen.
Ein rationalerer Ansatz besteht darin, die Sprachbedürfnisse des Projekts anhand der Funktionsbereiche zu analysieren. Ein genauer Blick auf das Projekt kann beispielsweise zeigen, dass es nur einen kleinen "Scheitelpunkt" an hochwertigem Code gibt, z. B. für die Implementierung eines proprietären Algorithmus, für den Codierungskenntnisse in einer weniger häufig verwendeten Sprache erforderlich sind. Andere Teile eines großen Projekts lassen sich häufig problemlos mit gängigeren Sprachen oder (noch besser) mit gut verwalteten Open-Source-Produkten bearbeiten. Die Analyse eines Projekts nach Sprachbedürfnissen kann somit einen wesentlich realistischeren und kostengünstigeren Ansatz für die Einstellung oder Anmietung von Spezialkenntnissen in bestimmten Sprachen bieten und auch dazu beitragen, die Schnittstellen zwischen Sprachen innerhalb eines einzelnen Projekts zu schärfen.
Grund 4 , bei dem unterschiedliche Sprachen für unterschiedliche Anforderungen verwendet werden, ergibt sich unmittelbar und reibungslos aus einer solchen Analyse der Projektanforderungen. Vorsicht ist auch hier geboten, da die Auswahl zu vieler Sprachen für die Unterstützung innerhalb eines einzelnen Projekts zu einer kombinatorischen Explosion der Komplexität sowohl bei der Unterstützung als auch bei den Schnittstellen zwischen Komponenten führen kann. Am sichersten ist es in Bezug auf die Kosten, zuerst die maximalen Möglichkeiten für die Wiederverwendung zu finden, insbesondere, wenn es gute Pakete gibt, die die Projektanforderungen nur durch Anpassung erfüllen können. Als nächstes sollte eine Entscheidung über eine kleine Anzahl von Sprachen getroffen werden, die die Mehrheit der ermittelten Bedürfnisse abdecken können. Bei wiederverwendungsintensiven Entwicklungen handelt es sich häufig um eine Art Klebercode.
Es ist im Allgemeinen keine gute Idee, mehrere Sprachen mit sehr ähnlichen Fähigkeiten auszuwählen, nur weil einige Mitglieder des Projekts die eine oder die andere mögen. Wenn es jedoch eine genau festgelegte Teilmenge von Fähigkeiten gibt, die von besonderen Sprachkenntnissen profitieren würde, kann dies ein guter Grund sein, mehrere Sprachen für die Entwicklung von neuem Code zu verwenden.
Grund 5 , der Widerstand gegen notwendige Änderungen in den verwendeten Sprachen, kann zu schwerwiegenden Projektstörungen und internen Konflikten führen. Als Benutzer DaveoIn einem Kommentar zu dieser Antwort wurde darauf hingewiesen, dass Änderungen für einige Projektmitarbeiter sehr schwierig sein können. Gleichzeitig ist der Widerstand gegen Veränderungen niemals ein einfaches Thema, weshalb er viel Streit verursachen kann. Die Verwendung von vorhandenen Sprachkenntnissen kann die Produktivität eines Projekts erheblich steigern, wenn die vorhandene Sprache ausreichend leistungsfähig ist, und zu einem Produkt mit hervorragender Qualität in einem Team führen, das reibungslos funktioniert und die Qualität achtet. Ältere Sprachkenntnisse müssen jedoch mit der Tatsache in Einklang gebracht werden, dass viele ältere Sprachen in Bezug auf erweiterte Funktionen, Verfügbarkeit von Komponenten, Open Source-Optionen und Unterstützung intelligenter Toolkits nicht mehr mit neueren Sprachen ergänzt werden können.
Damals und heute war das häufigste (und ironischerweise häufigste) Argument für die weitere Verwendung einer schwächeren, weniger lesbaren oder weniger produktiven Legacy-Sprache, dass die ältere Sprache die Produktion von effizienterem Code ermöglicht. Dies ist ein altes Argument, das bis in die 1950er Jahre zurückreicht, als die Benutzer der Assemblersprache das Aufkommen der Programmierung in FORTRAN und LISP oftmals erbittert kritisierten. Ein Beispiel, bei dem das Argument der Codeeffizienz bereits jetzt Gültigkeit haben kann, ist der verarbeitungsintensive Code, z. B. ein Betriebssystemkern, bei dem C die bevorzugte Sprache gegenüber C ++ bleibt (allerdings aus Gründen, die über die einfache Effizienz hinausgehen).
In den global vernetzten und leistungsfähigen maschinengestützten Projektumgebungen des neuen Jahrtausends ist die Codeeffizienz als Hauptargument für die Wahl einer Projektsprache jedoch noch schwächer geworden. Die gleiche Explosion von Computer- und Netzwerkhardware, die die Massenvermarktung von Anwendungen mit künstlicher Intelligenz ermöglicht hat, bedeutet auch, dass die Kosten für die menschliche Programmierung die Kosten für die ineffiziente Ausführung von Code auf spektakulär billiger Hardware und Cloudware leicht in den Schatten stellen können. In Kombination mit der höheren Verfügbarkeit von Komponentenbibliotheken, Open Source-Optionen und fortschrittlichen intelligenten Toolkits in neueren Sprachen wird die Anzahl der Fälle, in denen eine Sprache nur aus Effizienzgründen beibehalten wird, sehr gering. Auch in Fällen, in denen dies zutrifft,
Ein zwingenderer Grund für ein Projekt, bei alten Sprachen zu bleiben, liegt vor, wenn ein Projekt aus welchen Gründen auch immer nur wenige oder keine Möglichkeiten hat, sein Personal zu ändern. Dies kann beispielsweise der Fall sein, wenn eine wichtige ältere Produktlinie vollständig in einer Sprache codiert ist, in der nur das vorhandene Personal fließend ist. In solchen Fällen muss das Projekt entweder versuchen, in der alten Sprache zu programmieren, oder vorhandene Mitarbeiter in der Verwendung einer neuen Sprache schulen.
Die Schulung älterer Mitarbeiter in einer neuen Sprache kann für sich genommen eine Gefahr darstellen. Ich erinnere mich noch an einen Fall, in dem sich ein Mitglied eines Projekts, das gerade geschult und von C auf C ++ umgestellt worden war, aufrichtig darüber beschwerte, dass er die Vorteile objektorientierter Methoden einfach nicht verstand. Als ich mir seinen Code ansah, hatte er seine früheren 103 C-Funktionen in 103 Methoden für eine einzelne C ++ - Objektklasse konvertiert ... und zu Recht nicht gesehen, wie das irgendetwas half.
Die tiefere Botschaft ist, dass, wenn Menschen jahrelang oder jahrzehntelang in einer einzigen Sprache und einem Sprachstil programmiert haben, die Schwierigkeit, sie dazu zu bringen, auf neue Weise zu "denken", selbst mit guten Trainingsprogrammen fast unüberwindbar werden kann. In einigen Fällen bleibt möglicherweise keine andere Wahl, als jüngere Designer und Programmierer zu gewinnen, die besser mit den aktuellen Trends und Methoden vertraut sind.
Grund 6 , schlechtes Projektmanagement, spricht für sich. Die Auswahl und Verwendung von Sprachen in einem Projekt sollte immer explizit berücksichtigt und bewertet werden und darf nicht zufällig geschehen. Zumindest kann die Sprachauswahl einen großen Einfluss auf das langfristige Schicksal und die Supportkosten eines Projekts haben und sollte daher immer berücksichtigt und geplant werden. Werde kein MUMPS!