Warum werden alte Programmiersprachen weiter überarbeitet?

46

Diese Frage lautet nicht: "Warum verwenden die Leute immer noch alte Programmiersprachen?" Ich verstehe das ganz gut. Die beiden Programmiersprachen, die ich am besten kenne, sind C und Scheme. Beide stammen aus den 70er Jahren.

Kürzlich las ich über die Änderungen in C99 und C11 gegenüber C89 (die in der Praxis immer noch die am häufigsten verwendete Version von C zu sein scheint und die Version, die ich von K & R gelernt habe). Wenn man sich umschaut, sieht es so aus, als würde jede stark genutzte Programmiersprache mindestens einmal pro Jahrzehnt oder so eine neue Spezifikation erhalten. Sogar Fortran wird immer wieder überarbeitet, obwohl die meisten Benutzer FORTRAN 77 verwenden.

Vergleichen Sie dies beispielsweise mit dem Ansatz des Schriftsatzsystems TeX. Im Jahr 1989, mit der Veröffentlichung von TeX 3.0, erklärte Donald Knuth, dass TeX über alle Funktionen verfügt und zukünftige Versionen nur noch Fehlerkorrekturen enthalten würden. Auch darüber hinaus hat er erklärt, dass nach seinem Tod "alle verbleibenden Bugs zu Features werden" und absolut keine weiteren Updates vorgenommen werden. Andere können TeX nach Belieben verteilen und haben dies bereits getan. Die resultierenden Systeme werden jedoch umbenannt, um anzuzeigen, dass sie sich von der offiziellen TeX unterscheiden. Dies liegt nicht daran, dass Knuth TeX für perfekt hält, sondern daran, dass er den Wert eines stabilen, vorhersehbaren Systems versteht, das in fünfzig Jahren dasselbe tun wird wie jetzt.

Warum folgen die meisten Programmiersprachendesigner nicht demselben Prinzip? Wenn eine Sprache relativ neu ist, ist es natürlich sinnvoll, dass sie eine Zeit des raschen Wandels durchläuft, bevor sie sich niederlässt. Und niemand kann gegen geringfügige Änderungen Einwände erheben, die nicht viel mehr bewirken, als bestehende Pseudostandards zu kodifizieren oder unbeabsichtigte Messwerte zu korrigieren. Aber wenn eine Sprache nach zehn oder zwanzig Jahren noch verbesserungswürdig zu sein scheint, warum nicht einfach die Sprache wechseln oder neu anfangen, anstatt zu versuchen, das zu ändern, was bereits verwendet wird? Wenn einige Leute wirklich objektorientiertes Programmieren in Fortran wollen, warum nicht "Objective Fortran" für diesen Zweck erstellen und Fortran selbst in Ruhe lassen?

Ich nehme an, man könnte sagen, dass C89 unabhängig von zukünftigen Revisionen bereits ein Standard ist und nichts die Leute davon abhält, ihn weiter zu verwenden. Das stimmt, aber Konnotationen haben Konsequenzen. GCC warnt im pedantischen Modus vor Syntax, die entweder veraltet ist oder eine etwas andere Bedeutung in C99 hat, was bedeutet, dass C89-Programmierer den neuen Standard nicht einfach vollständig ignorieren können. Es muss also einen Vorteil in C99 geben, der ausreicht, um jedem, der die Sprache verwendet, diesen Mehraufwand aufzuerlegen.

Dies ist eine echte Frage, keine Aufforderung zum Streiten. Natürlich habe ich eine Meinung dazu, aber im Moment versuche ich nur zu verstehen, warum dies nicht nur so ist, wie die Dinge bereits gemacht werden. Ich nehme an, die Frage ist:

Was sind die (realen oder wahrgenommenen) Vorteile der Aktualisierung eines Sprachstandards gegenüber der Schaffung einer neuen Sprache auf der Grundlage der alten?


quelle
2
Viele Compiler können mit Schaltern aufgerufen werden, die ältere Standards erzwingen (z. B. der --std=xSchalter von GCC ). Es ist also nicht so, als würde das Erstellen neuer Standards zu Tools führen, die älteren Code destabilisieren.
Blrfl
2
Wie definieren Sie "eine neue Sprache basierend auf der alten"? Ich würde sagen, Fortran 90 ist eine "neue Sprache", die auf der alten F77 basiert. Es hat die Art und Weise, wie Sie programmieren, komplett verändert - fester vs. freier Quellcode, dynamischer vs. statischer Speicher, etc .. Sie könnten auch argumentieren, dass Fortran 2003 eine "neue Sprache" ist, die auf F90 ​​basiert. Klingt nach der Beziehung zwischen C ++ und C.
tpg2114
1
Ich halte diese Frage für sehr wichtig und verstehe nicht, warum manche sie schließen wollen. Es ist ein sehr interessantes Phänomen, das wahrscheinlich eine Erklärung hat. Vor ein paar (20?) Jahren las ich über neue Funktionen von Fortran und fragte mich: Wenn Fortran-Programmierer diese Funktionen benötigen, warum wechseln sie nicht einfach zu C? Kürzlich hatte ich ähnliche Überlegungen in Bezug auf C ++: Wenn C ++ - Entwickler Lambdas verwenden möchten, warum wird dann nicht beispielsweise auf OCaml ( linux-nantes.org/~fmonnier/ocaml/ocaml-wrapping-c.php ) umgestellt ? Warum erstellen sie lieber eine neue Sprache und nennen sie immer noch C ++?
Giorgio
3
@ tpg2114 Der Unterschied zwischen (FORTRAN 77: Fortran 90) und (C: C ++) besteht darin, dass Fortran 90 FORTRAN 77 bis zu dem Punkt abgelöst hat, an dem den Leuten gesagt wird: "Wenn Sie Fortran lernen möchten, lernen Sie Fortran 2003 oder mindestens 90, denn das ist jetzt der Standard. " Niemand würde so etwas wie "Wenn Sie C lernen möchten, lernen Sie C ++, weil das der neue Standard ist" sagen, weil sie in zwei verschiedenen Sprachen angeboten werden. Wie gesagt, Konnotationen haben Konsequenzen.
6
WEIL C NIEMALS STIRBT
Adel

Antworten:

13

Ich denke, die Motivation für Sprachdesigner, vorhandene Sprachen zu überarbeiten, besteht darin, Innovationen einzuführen und gleichzeitig sicherzustellen, dass ihre Ziel-Entwicklergemeinschaft zusammen bleibt und die neue Sprache übernimmt: Das Verschieben einer vorhandenen Community in eine neue Revision einer vorhandenen Sprache ist effektiver als das Erstellen einer neuen Community um eine neue Sprache. Dies zwingt natürlich einige Entwickler, den neuen Standard zu übernehmen, auch wenn sie mit dem alten in Ordnung waren: In einer Community müssen Sie manchmal bestimmte Entscheidungen einer Minderheit auferlegen, wenn Sie die Community zusammenhalten möchten.

Bedenken Sie auch, dass eine Allzwecksprache versucht, so viele Programmierer wie möglich zu bedienen, und häufig in neuen Bereichen eingesetzt wird, für die sie nicht entwickelt wurde. Anstatt auf Einfachheit und Stabilität des Designs zu setzen, kann die Community neue Ideen (auch aus anderen Sprachen) einbeziehen, wenn die Sprache neue Anwendungsbereiche erschließt. In einem solchen Szenario können Sie nicht erwarten, dass Sie es beim ersten Versuch richtig machen.

Dies bedeutet, dass sich die Sprachen im Laufe der Jahre grundlegend ändern können und die letzte Überarbeitung möglicherweise ganz anders aussieht als die erste. Der Name der Sprache wird nicht aus technischen Gründen beibehalten, sondern weil sich die Entwicklergemeinschaft bereit erklärt, einen alten Namen für eine neue Sprache zu verwenden. Der Name der Programmiersprache kennzeichnet also eher die Community ihrer Benutzer als die Sprache selbst.

Die Motivation, warum viele Entwickler dies für akzeptabel (oder sogar wünschenswert) halten, ist, dass ein schrittweiser Übergang zu einer etwas anderen Sprache einfacher und weniger verwirrend ist als ein Sprung in eine völlig neue Sprache, dessen Beherrschung mehr Zeit und Mühe in Anspruch nehmen würde. Bedenken Sie, dass es eine Reihe von Entwicklern gibt, die eine oder zwei Lieblingssprachen haben und nicht sehr daran interessiert sind, neue (radikal unterschiedliche) Sprachen zu lernen. Und selbst für diejenigen, die gerne neue Dinge lernen, ist das Erlernen einer neuen Programmiersprache immer eine schwierige und zeitraubende Aufgabe.

Es kann auch vorzuziehen sein, Teil einer großen Gemeinschaft und eines reichen Ökosystems zu sein, als Teil einer sehr kleinen Gemeinschaft, die eine weniger bekannte Sprache verwendet. Wenn sich die Community also entscheidet, weiterzumachen, entscheiden sich viele Mitglieder, zu folgen, um Isolation zu vermeiden.

Als Nebenbemerkung denke ich, dass das Argument, Evolution zuzulassen und dabei die Kompatibilität mit altem Code aufrechtzuerhalten, eher schwach ist: Java kann C-Code aufrufen, Scala kann leicht mit Java-Code integriert werden, C # kann mit C ++ integriert werden. Es gibt viele Beispiele, die zeigen, dass Sie problemlos mit Legacy-Code arbeiten können, der in einer anderen Sprache geschrieben wurde, ohne dass Quellcode-Kompatibilität erforderlich ist.

HINWEIS

Aus einigen Antworten und Kommentaren geht hervor, dass einige Leser die Frage als "Warum müssen sich Programmiersprachen weiterentwickeln?" Interpretiert haben.

Ich denke, das ist nicht der Hauptpunkt der Frage, da es offensichtlich ist, dass sich Programmiersprachen weiterentwickeln müssen und warum (neue Anforderungen, neue Ideen). Die Frage ist eher "Warum muss diese Evolution in einer Programmiersprache stattfinden, anstatt viele neue Sprachen hervorzubringen?"

Giorgio
quelle
Diese Antwort ist für mich die sinnvollste von allen, die ich hier gesehen habe: Wenn Sie eine Sprache aktualisieren, können Sie (zumindest einen Teil) der vorhandenen Community, Bibliotheken usw. erben inkompatible Dialekte, die die Aufrechterhaltung einer Gemeinschaft erschweren; Das Aktualisieren einer vorhandenen Sprache könnte ein Weg sein, um zu vermeiden, dass andere Gemeinschaften auf die gleiche Weise fragmentiert werden.
@SunAvatar: Soweit ich weiß, hat Lisp mehrere Dialekte, aber einige sind erfolgreicher als andere (Common Lisp, Scheme, Racket, Clojure). Jedes Mal, wenn Sie eine neue Sprache beginnen, riskieren Sie, dass sich nur eine sehr kleine Community darum versammelt. In der Lisp-Community scheint dies gängige Praxis zu sein: Wenn jemand eine neue Idee hat, verzweigt er sich und sieht, was passiert. Für die Entwickler anderer Sprachen ist es keine Option, die Community zu verlieren.
Giorgio
@SunAvatar: Ich sehe die Vererbung bestehender Bibliotheken nicht als starkes Argument. Sie benötigen dafür keine Quellcode-Kompatibilität. Sehen Sie zB, wie Clojure und Scala Java-Code verwenden können.
Giorgio
1
Sprachen sterben nicht, nur die Programmierer, die sie benutzen.
Evan Plaice
@SunAvatar: Es gibt auch Communities, die versuchen, einer anderen Richtlinie zu folgen: Ein Name kennzeichnet eine Sprache. Wenn ein Teil der Community einen zu stark abweichenden Dialekt erstellt, verwenden sie einen neuen Namen, um Verwirrung zu vermeiden. Siehe z. B. racket-lang.org/new-name.html
Giorgio
21

Abwärtskompatibilität ist Ihre Antwort. Eine bestimmte Sprache, insbesondere eine weit verbreitete Sprache wie C, kann Code enthalten, der jahrzehntelang unverändert in Betrieb ist. Wenn eine Wartung erforderlich ist, ist es hilfreich, Compiler zu haben, die diese Art von Plattform weiterhin unterstützen, während sie auf modernen Systemen für die Entwicklungsarbeit ausgeführt werden. Standardisierungen und Sprachversionsaktualisierungen tragen dazu bei, die Programmierpraktiken auf dem neuesten Stand zu halten, und vermitteln den erfahrenen Programmierern, die möglicherweise nicht in der Lage sind, eine ganz "neue" Sprache zu lernen, ein Gefühl der Vertrautheit.

Denken Sie daran, dass viele der aktualisierten Sprachen weniger aktualisiert sind als "neue glänzende Teile aufgeschraubt haben". Die Bestien von früher lauern oft noch im Inneren.

Denken Sie daran, dass Knuth ein Akademiker ist und dass TeX nur als korrekt und nicht aktualisiert gilt.

Weltingenieur
quelle
14
Die Problemdomäne von Tex = format science paper text hat sich nicht wesentlich geändert. Die Domäne der Programmiersprachen = neue Verwendungszwecke für neue Computer finden, ist eher umfangreich. Aus dem gleichen Grund fügt Latin nicht so viele neue Wörter hinzu wie Englisch
Martin Beckett
Ich glaube nicht, dass die Abwärtskompatibilität ein triftiger Grund ist: Scala kann problemlos in vorhandenen Java-Code integriert werden, ist aber kein Super-Set von Java. Daher denke ich, dass es im Allgemeinen nicht notwendig ist, dass eine neue Sprache mit einer alten Sprache auf der Ebene des Quellcodes kompatibel ist. Es reicht aus, über einen genau definierten Mechanismus zu verfügen, um den alten Code aus dem neuen Code aufzurufen.
Giorgio
@Martin Beckett: "Die Problemdomäne von Tex = formatiertem wissenschaftlichen Aufsatztext hat sich nicht wesentlich geändert.": Ich denke, Sie übersehen den Punkt der Frage. Das OP fragt nicht, ob es Innovationen in Programmiersprachen geben soll (niemand kann dies leugnen), sondern warum alte Sprachen überarbeitet werden, anstatt neue zu schaffen.
Giorgio
Systeme basieren auf Investitionen in Zeit, Geld und Fachwissen (Erfahrung in einer bestimmten Sprache). Neuanstrengungen kosten deutlich mehr als Wartungsarbeiten (in allen drei Kategorien). Ohne Verbesserungen an der Sprache und der Plattform im Allgemeinen steigen die Wartungskosten, und dann sind die Kosten für ein neues System attraktiver und das echte Rehosting, das die COBOL-App zum achten Mal in ihrem Leben auf einer völlig anderen Plattform ausführt, scheint nicht attraktiv wie so viel mehr.
JustinC
Wenn nicht die aktualisierten Standards der COBOL-Sprache und die Implementierer des COBOL-Tools ihre eigenen einzigartigen Funktionen hinzugefügt hätten, hätte dies die Sprache verbessert und die Fähigkeit verbessert, auf breiteren, gängigen und modernen Plattformen zu arbeiten. Die App hätte 60 Jahre nicht überlebt. Zwar stiegen die relativen Kosten aufgrund des zunehmenden Fachwissensmangels später in ihrem Leben sicherlich, doch waren die Anstrengungen insgesamt ein paar Cent höher als bei einer regulären Neufassung, als die Sprache des Augenblicks herauskam.
JustinC
5

Ich denke, die offensichtliche Antwort ist, dass beim Sprachdesign und der Systemarchitektur immer noch Fortschritte erzielt werden und dass sich genügend Menschen für die älteren Sprachen interessieren, um die neueren Techniken (mehrere Kerne, besseres Threading oder Speichermodelle) zu nutzen, die sie verwenden an oder in den Sprachstandard eingebrannt. Es ist auch hilfreich, "eine echte Möglichkeit" zu haben, Dinge zu tun (z. B. XML-Parsing, DB-Zugriff), auf die Sie zählen können, unabhängig davon, auf welchem ​​Compiler oder auf welcher Plattform Sie sich befinden, anstatt von einem Drittanbieter abhängig zu sein Bibliothek, die möglicherweise installiert ist oder nicht (und möglicherweise nicht die von Ihnen benötigte Version usw.).

TMN
quelle
Wenn also "genug Leute sich um die älteren Sprachen kümmern" der Grund ist, würden Sie sagen, dass Ihre Antwort als "sentimentale Bindung an bestehende Sprachen" umformuliert werden kann? Ich sage das nicht abfällig, sondern versuche nur, Ihre Antwort zu verstehen.
Avner Shahar-Kashtan
Nein, ich habe gemeint, dass die Sprachen immer noch aktiv sind und von Leuten verwendet werden, die die neuesten Techniken nutzen möchten. Ich glaube nicht, dass irgendjemand ALGOL um Multithreading-Unterstützung erweitern wird, da es (AFAIK) nicht aktiv genutzt wird. FORTRAN und COBOL werden jedoch immer noch zur Entwicklung neuer Systeme verwendet, sodass ihre Sprachspezifikationen regelmäßig aktualisiert werden, um neue Techniken und Technologien einzubeziehen.
TMN
1

Die grundlegenden Konzepte oder Ziele einer Allzwecksprache verlieren nicht an Relevanz. Kleinere Änderungen in der Arbeitsumgebung oder der Hardware erfordern jedoch, dass einer Sprache Aktualisierungen oder kleine Funktionen hinzugefügt werden.

Die Art und Weise, wie Algorithmen in einer Sprache ausgedrückt werden, ändert sich nicht, obwohl möglicherweise eine bessere Unterstützung für 64-Bit-Typen oder eine bessere Unterstützung für reguläre Ausdrücke oder eine robustere Unterstützung für neue Arten von Dateisystemen erforderlich ist.

Es gibt einige Fälle, in denen 'neue' Funktionen zu vorhandenen Sprachen hinzugefügt werden, aber in vielen Fällen handelt es sich bei diesen Änderungen um Vereinfachungen von Dingen, die die Leute bereits auf die harte Tour gemacht haben. (Siehe C ++ mit Funktionen höherer Ordnung anstelle von Funktionszeigern und Funktoren.)

Ben
quelle
1
Die Änderungen, die Sie im zweiten Absatz beschreiben, sind ziemlich unbedenklich (womit ich nicht nur meine, dass ich nicht widerspreche, sondern dass niemand ernsthaft widersprechen kann). Was Lambdas betrifft, kann ich ihre Nützlichkeit in C ++ nicht kommentieren, aber warum sollten sie hinzugefügt werden, wenn die Art und Weise, wie Algorithmen ausgedrückt werden, nicht geändert werden soll?
Oh, sie sind unglaublich nützlich. Versteh mich nicht falsch. Sie sind die wichtigste Ergänzung in C ++ (IMO). Ich glaube, mir war nicht klar, was ich dort meinte. Man wählt normalerweise C ++, um direkten Zugriff auf Speicher, deterministische Leistung und hohes Optimierungspotential zu haben. Das ändert sich mit den letzten Ergänzungen nicht. Wir vereinfachen viele der anderen Programmieraufgaben, um herauszufinden, warum Sie sich für C ++ entschieden haben, aber C ++ ist aus den gleichen Gründen immer noch gültig und nützlich. Das Schema wird regelmäßig aktualisiert, aber Code-as-Data und Lispy-Ness ändern sich nicht. Daher wählen Sie das Schema aus den gleichen Gründen wie vor 20 Jahren.
Ben
"Was Lambdas betrifft, kann ich ihre Nützlichkeit in C ++ nicht kommentieren, aber warum sollten sie hinzugefügt werden, um die Art und Weise, wie Algorithmen ausgedrückt werden, nicht zu ändern?" hat sie von Anfang an gehabt?
Giorgio
2
@Giorgio Steuerung der Cache- und Abstraktionsfunktionen in der Sprache. Wenn keine vorhandene Sprache beides bietet, können Sie die Sprache nicht wechseln, ohne eine zu opfern. Sie müssen eine Sprache ändern oder eine neue erstellen.
mike30
@mike: Was meinst du mit "Cache-Funktionen"?
Giorgio
-2

Dies ist ein bisschen wie eine Betrachtung der gesprochenen Sprache.

In der Vergangenheit gab es Wörter, die nicht so oft verwendet wurden wie jetzt (oder für eine andere Bedeutung verwendet wurden).

z.B. nett: in (sehr altem) Englisch hat es die fast umgekehrte Bedeutung zu der, die wir heute verwenden, besonders wenn es verwendet wird, um einen Charakter zu beschreiben.

Schlecht: Vor nicht allzu langer Zeit hatte Schlecht nur eine einzige Bedeutung, jetzt kann es etwas bedeuten, das "super erstaunlich" ist (es wird auf eine blöde Art und Weise verwendet (ich habe wahrscheinlich die blöde Rechtschreibung vermisst)!

Eine weitere Neuerung ist das Mobiltelefon 'Text speak' für geschriebene Sprachen.

Ich persönlich verstehe nicht, warum sich eine Programmiersprache nicht auf ähnliche Weise entwickeln wird, Wörter und Funktionen bestimmte Bedeutungen / Handlungen haben und es erforderlich ist, sich zu ändern, um neue Ideen, neue Methoden einzubeziehen.

Ich kenne Leute, die viele verschiedene Sprachen sprechen, und sie schlagen oft vor, dass es nach dem 3. oder 4. einfacher wird, eine neue Sprache zu lernen.

Ich weiß nicht, ob es Programmierer gibt, die eine ähnliche Erfahrung haben, ich wäre nicht überrascht, wenn es solche gibt.

Ich weiß, dass mir das Programmieren in JAVA sehr gut gefällt (so gut wie das Sprechen in Englisch). Dies bedeutet nicht, dass ich nicht in amerikanischem Englisch oder australischem Englisch kommunizieren kann, obwohl es einige „Fallstricke“ gibt, auf die ich achten muss . Ähnlich wie bei der Umstellung von Java auf PHP auf Perl sind die Konstrukte ähnlich, aber es gibt kleine Stolpersteine, die mich ausfindig machen und mich dazu bringen, meinen Kopf gegen die Wand zu schlagen.

Dies unterscheidet sich vom Übergang von Englisch nach Französisch oder von Java nach SAS. Diese sind so unterschiedlich, dass es eine Weile dauert, bis man sie beherrscht.

Wie auch immer, das ist meine Meinung dazu.

DaveM
quelle
Ich denke, Sie denken an "scherzhaft".
uliwitness