Halten Sie eine Programmiersprache abwärtskompatibel, anstatt die Fehler zu beheben


56

Erstens ein Kontext (Dinge, die die meisten von Ihnen sowieso wissen):

Jede populäre Programmiersprache hat eine klare Entwicklung, die die meiste Zeit von ihrer Version abhängt: Sie haben Java 5, 6, 7 usw., PHP 5.1, 5.2, 5.3 usw. Eine neue Version stellt neue APIs zur Verfügung, behebt Fehler und fügt hinzu Neue Funktionen, neue Frameworks usw. Alles in allem ist es also gut.

Aber was ist mit den Problemen der Sprache (oder Plattform)? Wenn in einer Sprache etwas nicht stimmt, vermeiden Entwickler es entweder (wenn sie können) oder lernen, damit zu leben.

Jetzt erhalten die Entwickler dieser Sprachen viel Feedback von den Programmierern, die sie verwenden. Es macht also Sinn, dass mit der Zeit (und den Versionsnummern) die Probleme in diesen Sprachen langsam aber sicher verschwinden. Nicht wirklich. Warum? Abwärtskompatibilität, deshalb. Aber warum ist das so? Lesen Sie unten für eine konkretere Situation.


Am besten kann ich meine Frage am Beispiel von PHP erklären:

PHP wird von Tausenden von Menschen geliebt und gehasst. Alle Sprachen haben Fehler, aber anscheinend ist PHP etwas Besonderes. Schauen Sie sich diesen Blog-Beitrag an . Es gibt eine sehr lange Liste von sogenannten Fehlern in PHP. Jetzt bin ich (noch) kein PHP-Entwickler, aber ich habe alles durchgelesen und bin mir sicher, dass ein großer Teil dieser Liste in der Tat echte Probleme darstellt. (Nicht alles, da es möglicherweise subjektiv ist).

Wenn ich einer der Leute wäre, die PHP aktiv entwickeln, würde ich diese Probleme sicherlich nacheinander beheben wollen. Wenn ich das jedoch mache, bricht der Code, der auf einem bestimmten Verhalten der Sprache beruht, zusammen, wenn er in der neuen Version ausgeführt wird. In 2 Worten zusammengefasst: Abwärtskompatibilität.

Was ich nicht verstehe ist: Warum sollte ich PHP abwärtskompatibel halten? Wenn ich PHP Version 8 mit all den behobenen Problemen veröffentliche, kann ich dann nicht einfach eine große Warnung mit der Aufschrift "Führen Sie in dieser Version keinen alten Code aus!"

Es gibt eine Sache, die man Abwertung nennt. Wir hatten es seit Jahren und es funktioniert. Im Kontext von PHP: Sehen Sie sich an, wie die Leute heutzutage aktiv von der Verwendung der mysql_*Funktionen mysqli_*abraten (und stattdessen empfehlen und gU). Verfall funktioniert. Wir können es benutzen. Wir sollten es benutzen. Wenn es für Funktionen funktioniert, warum sollte es nicht für ganze Sprachen funktionieren?

Nehmen wir an, ich (der Entwickler von PHP) mache Folgendes:

  • Starten Sie eine neue Version von PHP (sagen wir 8) mit all diesen behobenen Fehlern
  • Neue Projekte werden diese Version verwenden, da sie viel besser, klarer, sicherer usw. ist.
  • Um ältere PHP-Versionen nicht zu verlassen, veröffentliche ich weiterhin Updates, um Sicherheitsprobleme, Fehler usw. zu beheben. Dies ist aus Gründen sinnvoll, die ich hier nicht aufführe. Es ist gängige Praxis: Sehen Sie sich beispielsweise an, wie Oracle die Version 5.1.x von MySQL aktualisiert hat, obwohl es sich hauptsächlich auf Version 5.5.x konzentriert hat.
  • Nach ungefähr 3 oder 4 Jahren stoppe ich die Aktualisierung alter PHP-Versionen und überlasse sie dem Tod. Dies ist in Ordnung, da in diesen drei oder vier Jahren die meisten Projekte sowieso auf PHP 8 umgestellt haben.

Meine Frage ist: Sind all diese Schritte sinnvoll? Wäre es so schwer zu tun? Wenn es möglich ist, warum ist es dann nicht möglich?

Ja, der Nachteil ist, dass Sie die Abwärtskompatibilität aufheben. Aber ist das nicht einen Preis wert? Als Vorteil, in 3 oder 4 Jahren haben Sie eine Sprache, mit der 90% der Probleme behoben sind ... eine Sprache, mit der es viel angenehmer ist, zu arbeiten. Sein Name wird seine Popularität sicherstellen.

EDIT : OK, also habe ich mich nicht richtig ausgedrückt, als ich sagte, dass die Leute in 3 oder 4 Jahren auf das hypothetische PHP 8 umsteigen werden. Was ich meinte war: In 3 oder 4 Jahren werden die Leute PHP 8 benutzen, wenn sie ein neues PHP starten neues Projekt.


31
PHP ist ein schlechtes Beispiel für diese spezielle Frage, da Sie häufig nicht die Version auswählen müssen, mit der Sie arbeiten. Die meisten PHP-Sites werden auf gemeinsam genutzten Servern bereitgestellt, und der Eigentümer des Servers wählt die Version aus, nicht Sie. Viele Dinge werden mit jeder neuen Version behoben ( mysql_*wurde zum Beispiel in 5.5 veraltet), aber das ist irrelevant, wenn die Mehrheit der Hosting-Anbieter eine oder sogar zwei Versionen zurück hat (5.3 ist - leider - immer noch die Mehrheit von ihnen) Anbieter bietet).
Yannis

5
... Ich denke auch, Sie unterschätzen die Menge an Code, die portiert werden sollte, die Menge an Dingen, die kaputt gehen würden, die Menge an Abhängigkeiten von Drittanbietern, die
angepasst werden

12
Dieser großartige Blog-Beitrag joelonsoftware.com/items/2008/03/17.html von Joel Spolsky über "Mars-Headsets" sollte für jeden Entwickler, der die Bedeutung der Abwärtskompatibilität unterschätzt, obligatorisch sein.
Doc Brown

3
Außerdem hat PHP die Funktionalität mit jeder einzelnen Version langsam verworfen - und infolgedessen bricht eine Menge Zeug zusammen. Leider steckt PHP an einem schwierigen Punkt fest, an dem es schwierig ist, auch nur Verwerfungswarnungen zu erstellen, damit die Entwickler feststellen, dass die Websites dadurch sowieso nicht gestört werden.
Flauschige

20
python 2.x => python 3.x ist ein bahnbrechender Wechsel von einer gut gestalteten Sprache zu einer anderen, etwas besser gestalteten Sprache, die First-Party-Unterstützung für das automatische Ändern vieler inkompatibler Konstrukte bietet. Das Portieren von Code zwischen ihnen ist ungefähr so ​​einfach, wie Sie einen Wechsel zwischen zwei Sprachen vornehmen könnten. Py3k gewinnt immer noch sehr langsam an Boden.
Phoshi

Antworten:


25

Das hört sich gut an, funktioniert aber in der Praxis nur selten. Die Leute zögern sehr, laufenden Code zu ändern, und selbst bei neuen Projekten auf der grünen Wiese zögern sie sehr, von einer Sprache / Version zu wechseln, die sie bereits kennen.

Das Ändern von vorhandenem, laufendem Code, der "gut funktioniert", hat in keinem Projekt einen hohen Stellenwert in der Prioritätenliste. Anstatt sich um Dinge zu bemühen, für die die Manager gedacht hatten, dass sie bereits bezahlt wurden, um ein Upgrade auf eine neuere Version einer Sprache oder Plattform durchführen zu können, werden sie beschließen, dass die Entwickler "vorerst" auf der alten Version bleiben sollen. Sie können versuchen, Ihre Benutzer mit großartigen Funktionen zu verführen, die nur in der neuen Version verfügbar sind. Es ist jedoch ein Glücksspiel, bei dem Sie das Risiko eingehen, Ihre Benutzerbasis zu verkleinern, da für die Sprache kein klarer Gewinn erzielt wird. coole, moderne Funktionen können nach allgemeiner Meinung nicht einfach gegen den Preis einer fragmentierten Installationsbasis abgewogen werden, und Sie laufen Gefahr, den Ruf eines "Upgrade-Laufbands" zu erlangen.

(Offensichtlich trifft das meiste nicht auf Projekte zu, die von Hobbyisten nur zu ihrem eigenen Vergnügen geschrieben wurden. Aber (hier sei Flammenmeer ...) PHP wird von Hackern unverhältnismäßig selten gewählt, weil es von Anfang an eine solche Freude ist, damit zu schreiben. )


65

Sie unterschätzen den Einfluss der Abwärtskompatibilität. Ihre Einschätzung, dass alle aktiven Projekte in 3 oder 4 Jahren migrieren würden, ist viel zu optimistisch.

Angenommen, ich bin ein PHP-Entwickler. PHP hat Fehler, aber ich weiß, wie ich diese Fehler umgehen kann - das ist einer der Gründe, warum ich als PHP-Entwickler bezahlt werde. Nehmen wir nun an, dass PHP 8 herauskommt und diese Fehler behebt, aber es ist nicht abwärtskompatibel. Als Ergebnis:

  • Ich muss viel Zeit aufwenden, um meinen Code für PHP 8 zu aktualisieren. In dieser Zeit kann ich auf Kundenanfragen reagieren, neue Funktionen implementieren und mit der Konkurrenz mithalten.
  • Selbst nachdem ich das getan habe , besteht die gute Chance, dass ich einen Eckfall oder ein unvorhergesehenes Kompatibilitätsproblem übersehen habe, wodurch Fehler in meinen Code eingefügt wurden.

In Anbetracht dessen gibt es einen starken Anreiz, niemals auf PHP 8 zu migrieren, auch wenn es "besser, klarer, sicherer usw." ist. Schätzungen zufolge gibt es immer noch Milliarden von COBOL-Zeilen (!) - obwohl es offensichtlich viel bessere Technologien gibt, lohnen sich die Kosten für ein Update in Verbindung mit dem Risiko von Fehlern einfach nicht.

Zweitens, auch wenn ich mich entscheide, meinen eigenen Code zu migrieren, hängt jede nicht-triviale App von Bibliotheken von Drittanbietern ab, und es gibt keine Garantie dafür, dass die Bibliotheken von Drittanbietern migrieren. Zum Beispiel wurde Python 3 im Dezember 2008 veröffentlicht, aber Django (wahrscheinlich das führende Python-Webframework) hatte fast fünf Jahre lang keinen stabilen, produktionsbereiten Python 3-Support (siehe hier und hier ).


8
Es gibt eine überraschend große Anzahl offener COBOL-Positionen, insbesondere bei älteren Versicherungsunternehmen Oo
Chad Harrison,

1
@Josh Kelley: Ich stimme Ihnen zu, aber ich denke, dass diese Probleme nur Sprachen betreffen, in denen Sie alten Code nicht klar von neuem Code trennen können, z. B. Python, PHP, weil Sie Bibliotheken und C ++ (Vorlagen) einbinden müssen. Sprachen mit einem anderen Kompilierungsmodell (z. B. Java, Scala, Clojure) zeigen, dass es möglich ist, älteren Codes (z. B. Java) neuen Code (z. B. in Clojure) hinzuzufügen, obwohl die beiden Sprachen auf Quellcodeebene nicht kompatibel sind.
Giorgio

2
Ich weiß nicht, ob ich das als separate Frage oder als Kommentar posten soll. Aber warum konnten sie keine Programmiersprache entwickeln, die die Codemigration zu einem erstklassigen Konzept macht? In Java gibt es eine @Deprecated-Anmerkung, die Ihnen nur eine Warnung gibt. Vielleicht könnte eine andere Sprache tatsächlich ein Makro bereitstellen, das den alten Code durch den richtigen neuen Code ersetzt. Wenn Sie die neueste Version verwenden, ist es ein Fehler, den veralteten Code aufzurufen, aber der alte Code wird konvertiert, um nicht veralteten neuen Code zu verwenden. Just spitballin '
Daniel Kaplan

7
@tieTYT - Einige Programmiersprachen tun dies - siehe Pythons 2to3 oder Go's Gofix ( talks.golang.org/2012/splash.slide#68 ). Es hilft sicherlich dabei, alte Funktionen zu verwerfen, aber es gibt Grenzen, wie gut Software andere Software verstehen und aktualisieren kann, wenn sich die Sprachsemantik ändert.
Josh Kelley

3
@hydroparadise Meine Tante arbeitet als Entwickler mit Banken und Versicherungen, und in diesen Tagen der Krise beschlossen , einige Kunden ihres Unternehmens zu gehen zurück auf COBOL , weil Software billiger ist! So kann auch die Wirtschaftlichkeit die Geschwindigkeit beeinflussen, mit der Unternehmen auf neuere Sprachen / Versionen umsteigen.
Bakuriu

17

Sie machen viele Annahmen über menschliches Verhalten. Wenn Sie es zu sehr ändern, werden die Leute Ihre Konkurrenten bewerten, da sie ohnehin einen erheblichen Aufwand für den Wechsel aufwenden müssen. Für Open-Source-Sprachen wird die alte Version nur gegabelt.

Schauen Sie sich Python als Beispiel an. 3.x ist seit vier Jahren verfügbar und noch nicht weit verbreitet. Die Leute versuchen, es für brandneue Projekte zu verwenden, aber ich denke, Sie unterschätzen, wie viel Code-Arbeit Wartung bedeutet.

Natürlich hielten die meisten Leute Python 2.x nicht für "fehlerhaft". Sie hatten keine Beschwerden wie PHP-Benutzer. PHP ist in einer viel prekäreren Position, weil viele Leute nur wegen seiner großen vorhandenen Codebasis daran festhalten. Wenn Sie die Abwärtskompatibilität verlieren, nutzen viele Leute die Gelegenheit, auf die sie gewartet haben, um zu Python zu wechseln.


Ich denke, Sie haben hier einen guten Punkt (+1). Ich denke, Abwärtskompatibilität ist ein falsches Problem, insbesondere für kompilierte Sprachen, in denen Sie separate Kompilierungen verwenden können (siehe, wie Sie Scala und Clojure mit Java oder C # mit C ++ integrieren können). Es ist jedoch sehr wichtig, das Gefühl zu bewahren, dass die neue Sprache nur eine aktualisierte Version der alten Sprache ist, um Gabelungen zu vermeiden oder dass die Leute einfach in eine andere Sprache migrieren. Ich denke, diese Gründe sind viel schlimmer als der Umgang mit altem Code.
Giorgio

1
@Giorgio Falsches Problem? Sagen Sie dies allen Bibliotheksautoren, die gleichzeitig mehrere Sprachversionen unterstützen müssen.
Svick

@svick: Bei separater Kompilierung müssen Sie keine unterschiedlichen Sprachversionen unterstützen. Sehen Sie zB, wie Scala Java-Bibliotheken verwenden kann, die nicht für Scala kompiliert wurden.
Giorgio

9

Für jede andere Sprache als PHP würde ich sagen, ja, das macht absolut Sinn! Genau das macht Python mit dem Umstieg auf Python 3.

Das Problem mit PHP ist jedoch, dass es zu viele Fehler im Sprachdesign selbst gibt. Daher wäre das, was Sie "PHP 8" nennen, eine völlig andere Sprache. Und wenn Sie zu einer anderen Sprache wechseln müssten, warum würden Sie dann lieber bei neuem PHP bleiben als bei einer der derzeit existierenden und stabilen Alternativen?

Auch PHP-Community ist extrem langsam, um etwas Neues anzupassen. Schauen Sie nur, wie lange es gedauert hat, um loszuwerden register_globals. Es ist seit dem Jahr 2000 als Sicherheitsrisiko bekannt. Es wurde erst 12 Jahre später endgültig entfernt. Ein weiteres Beispiel, als PHP5 eingeführt wurde, war es eine enorme Verbesserung gegenüber PHP4, aber die Community hat es nicht angepasst. Ich brauchte 4 Jahre und massive Aktionen wie GoPHP5 , um die Annahme zu beschleunigen. Und das hatte nicht einmal eine signifikante Anzahl rückwärts inkompatibler Änderungen.


5

Haftungsausschluss: Ich verwalte eine ColdFusion-Benutzergruppe.

ColdFusion leidet unter denselben Problemen: von vielen geliebt, von vielen verachtet. Darüber hinaus Tonnen und Tonnen von FUD basierend auf Pre-Java-Versionen. ColdFusion 10 kam im letzten Jahr heraus, ist ein riesiger Verkäufer und letzte Woche habe ich mich angemeldet, um die Vorabversion von Version 11 zu testen. Außerdem gibt es zwei wichtige Open-Source-Alternativen, von denen eine von JBoss unterstützt wird.

Es gibt VIELE neue Funktionen in CF10, die ich gerne implementieren würde, aber die Migration von CF 7 oder 8 kann schwierig sein, abhängig von der Größe Ihrer Codebasis, der Anzahl der anstehenden Projekte und den Ressourcen, die Sie benötigen, um alles nach dem Ausführen eines Regressionstests zu testen bist auf der neusten version. Ich bin auf eine Reihe kleiner syntaktischer Unterschiede zwischen 8 und 9 gestoßen sowie auf Randfälle, in denen der Code nicht auf die gleiche Weise kompiliert wird. Einmal gefunden, habe ich sie in unseren Coding Standards dokumentiert, damit sie nicht in zukünftigen Projekten oder von neuen Entwicklern verwendet werden.

Wenn ColdFusion 11 (oder eine andere Programmiersprache) jedoch bestimmte Funktionen und die Syntax vollständig missbilligt, kann der Aufwand für das Suchen und Ersetzen von Funktionen enorm sein. Der Testaufwand könnte gigantisch sein. Werden Unternehmen ihre Entwickler, QS- und Projektmanager dafür bezahlen, all diese veralteten Dinge zu finden, zu ersetzen und zu testen? Zweifelhaft.

Wenn die neueste Version einer Sprache abwärtskompatibel ist, aber eine Leistungssteigerung ohne Codeänderungen einführt (CF9 ist etwa 30% schneller als CF8 und CF10 ist viel schneller als CF9), wen interessiert es, Funktionsaufrufe zu ändern, wenn sie noch funktionieren?

Als Unternehmen müssen wir uns darum kümmern, unsere Kunden zufrieden zu stellen und ihre Bedürfnisse zu erfüllen, um Dienstleistungen in Rechnung zu stellen, das Geschäft aufzubauen und mehr Kunden zu gewinnen.

FWIW, ich würde uns gerne irgendwann auf die neueste Version von jQuery bringen, aber da einige Funktionen einige Versionen nach dem, was wir verwenden, veraltet sind und das Volumen von JavaScript im System gegeben ist, weiß ich nicht, wie wir werden das durchziehen.


4

Hier gibt es einen Kompromiss. Einige Fehler müssen WIRKLICH behoben werden, aber einige Dinge können nicht geändert werden, ohne irgendwo den Code eines anderen zu beschädigen. Ich scheine mich an jemanden zu erinnern, der als "Regel" angibt, dass jede Fehlerbehebung das Projekt eines anderen zum Erliegen bringt, egal wie dunkel oder offensichtlich der Fehler ist, jemand wird ihn für etwas verwenden. Das ist die Natur der Programmierer.

Dies ist (meiner Meinung nach) der Unterschied zwischen Hauptversionen, Nebenversionen und Revisionen. Grundsätzlich gilt:

  • Es wird davon ausgegangen, dass Hauptversionen aktuelle Änderungen enthalten.
  • Kleinere Releases können das Verhalten geringfügig ändern.
  • Revisionen sollten so gut wie kompatibel sein.

Wenn ich zum Beispiel etwas in Version 2.3 einer Sprache schreibe, würde ich keinen Unterschied erwarten, wenn ich auf Version 2.3.2 aktualisiere. Wenn ich auf v2.4 aktualisiere, können sich einige Dinge ändern - kleine Syntaxänderungen, einige Funktionen verhalten sich etwas anders, so dass ich die Logik anpassen muss usw. Wenn ich auf v3.0 aktualisiere, wäre ich nicht überrascht, wenn es kaputt geht Vollständig - Funktionen sind veraltet oder fehlen, Vorgänge werden nicht unterstützt oder wurden so stark geändert, dass ich sie nicht einfach wieder in Einklang bringen kann. Einige Funktionen müssen neu geschrieben werden, um die neuen Änderungen zu berücksichtigen.

Bearbeiten:

In Steve Vances Artikel Advanced SCM Branching Strategies heißt es:

Typischerweise gibt es zwei bis drei Release-Stufen, die durch mit Punkten verbundene Nummern benannt sind (z. B. 1.2.3). [...] In dieser Struktur ist die erste Nummer einer Hauptversion zugeordnet, was darauf hinweist, dass sie gegenüber der vorherigen Version erhebliche Verbesserungen in Bezug auf Funktionen und Merkmale aufweist. Es kann auch zu erheblichen Inkompatibilitäten kommen, die eine Migration erfordern. Die zweite Zahl stellt eine Nebenversion dar, die weniger Funktions- und Funktionsverbesserungen, eine erhebliche Anzahl von Fehlerkorrekturen und keine Inkompatibilitäten enthält. Die dritte Zahl bezieht sich auf eine Patch-Ebene, die fast ausschließlich eine Sammlung von Fehlerkorrekturen angibt. Es sind keine Funktions- oder Funktionsverbesserungen und keine Inkompatibilitäten zwischen den Patch-Levels zulässig.

Die einzige Änderung, die ich daran vornehmen würde, ist das oben erwähnte Prinzip, dass Programmierer häufig Wege finden, um Fehler zu "verwenden". Eine kleinere Version mit "einer erheblichen Anzahl von Fehlerkorrekturen und keinen Inkompatibilitäten" könnte daher schwierig sein, da dies wahrscheinlich ist Fehler brechen entweder etwas auf, das sie verwendet hat, oder führen dazu, dass eine Problemumgehung unnötig wird und Probleme verursacht.


Ich würde erwarten, dass 2.3-> 2.4 Funktionen hinzufügen, aber nicht entfernen.
Donal Fellows

1
Zufällig bin ich kürzlich auf ein relevantes Zitat gestoßen. Es ist etwas lang für einen Kommentar, deshalb bearbeite ich meine Antwort.
Anaximander

2

Es kommt wirklich darauf an, was das Ziel der Sprache ist - welche Arten von Anwendungen sollen mit der Sprache erstellt werden.

Wenn Sie beispielsweise Android ignorieren, wird Java hauptsächlich in großen Unternehmenssystemen und Middleware verwendet. Diese Arten von Anwendungen neigen dazu, sowohl in der Größe als auch in der Zeit sehr groß zu werden. Dies hat einige Implikationen; Stellen Sie sich ein System mit 500K + LoC vor, auf dem über 50 Ingenieure in der Entwicklungsphase arbeiten. In der Regel wird diese Art von System anschließend mit etwa 10 Entwicklern gewartet. Wenn sich die Sprache ändert und die Änderungen nicht abwärtskompatibel sind, kann das Projekt nicht einfach auf eine neue Version migriert werden, da die Programmierer, die einige Teile geschrieben haben, verschwunden sind und niemand mehr daran arbeiten möchte. Dies ist das kleinere Problem, das größere Problem besteht in der Tatsache, dass die Anpassung einer 500 LoC-Anwendung an neue Spracheinschränkungen etwas teuer ist. Zum Beispiel, wenn Generics nicht mit Typ Erasure und implementiert wurdenList list = new List(); würde nicht kompilieren Millionen von Codezeilen müssten umgeschrieben werden - was mit hohen Kosten verbunden ist.

Auf der anderen Seite wird PHP im Web eher für einfachere Anwendungen verwendet. Normalerweise wird es von einem einzelnen Programmierer oder einem kleinen Team entwickelt. Die Idee ist, dass die Entwickler das gesamte Projekt ziemlich gut kennen und Sprachänderungen einfacher integrieren können. Außerdem ist es das Ziel, eine Website sehr schnell zu erstellen. Je schneller, desto besser. Wenn eine neue Sprachfunktion dies besser kann, wird sie sogar zu gewissen Abwärtskompatibilitätskosten implementiert.


1

Man kann behaupten, dass Microsoft eine ähnliche Änderung mit ASP.NET (als Nachfolger von klassischem ASP) oder mit VB.NET vorgenommen hat (obwohl bei letzterem so viele Zugeständnisse gemacht wurden, dass die meisten Vorteile des "Neustarts" der Sprache verloren gingen).

Wie auch immer, wenn sich jemand an den Albtraum der Migration von VB6-Code nach VB.NET erinnert, auch mit Hilfe eines Migrationstools, ist er sich sofort einig, dass die Tools für die Sprachmigration bei größeren Sprachupdates nicht sehr gut funktionieren.

Es ist möglicherweise möglich, die Plattform nach vorne zu bringen, Sie sollten jedoch weiterhin "veraltete" APIs durch mindestens einige Überarbeitungen unterstützen.


1

Viele der "Fehler", über die die Leute in populären Programmiersprachen schreien, sind keine, sie sind Dinge, die das Lieblingsspielzeug des Screamers von heute ist, dass diese Sprache fehlt, DAHER ist diese Sprache grundlegend fehlerhaft, weil sie fehlt.
Der nächste Hype kommt, die Sprache ist plötzlich fehlerhaft, weil sie diesem Hype nicht mehr folgt.

Das Fehlen von Closures in Java ist ein klassisches Beispiel. Das ist überhaupt kein Fehler in der Sprache, und die Änderung der Sprache (wie es leider auf der Tagesordnung steht), um sie einzubeziehen, wird die IMO grundlegend lähmen oder es zumindest viel schwieriger machen, sie zu lesen und zu verstehen.

Was allzu viele Menschen aus den Augen verlieren, ist, dass jede Sprache ihre Stärken und Schwächen hat und dass der Versuch, etwas zu erschaffen, das die Stärken von allem kombiniert und gleichzeitig jede Schwäche vermeidet, nur ein völlig unbrauchbares Monster schafft, das nichts kann, unglaublich unerschwinglich und unmöglich ist effektiv nutzen.

Fügen Sie hinzu, wie andere betont haben, dass die Abwärtskompatibilität für die Beibehaltung bestehender Benutzer von entscheidender Bedeutung ist. Viele von ihnen werden NICHT Tausende von Stunden und Millionen von Dollar / Euro für die Nachrüstung ihrer millionenfachen Leitungscodebasen auf das aus Ihrer Sicht "Bessere" verwenden. als die Version der Sprache, die sie seit Jahren verwenden, und Sie haben eine Vielzahl von sehr guten Argumenten, um gut genug in Ruhe zu lassen, und wenn Sie mit einer neuen, überschriebenen Idee spielen möchten, die angeblich der nächste "Java-Killer" ist, den Sie "sind. Spielen Sie am besten mit diesem Spielzeug, anstatt zu schreien, dass "Java iz ded" ist, es sei denn, es wird "repariert", um ein Klon dieses Spielzeugs zu sein.


1

Ich würde vorschlagen, dass sich neuere Versionen einer Sprache darum bemühen sollten, dass 99,99999% des Codes, der sowohl in der alten als auch in der neuen Version der Sprache kompiliert wird, in beiden Sprachen identisch funktionieren, es sei denn, es wurde absichtlich so konzipiert, und dies meistens Wenn die neue Version Code ablehnt, der unter der alten Version kompiliert wurde, liegt dies daran, dass der Code - bestenfalls - zweifelhaft war und auf eine andere Art und Weise geschrieben werden sollte, die sowohl unter dem alten als auch unter dem neuen Compiler kompiliert werden würde.

Wenn ich zum Beispiel eine neue Sprache entwerfe, die Java oder C # ähnelt, verbiete ich implizite Typkonvertierungen in einigen Kontexten, in denen diese Sprachen dies zulassen. Als einfaches Beispiel in C # angegeben

int someInt;
double someDouble;

Es someInt.Equals(someDouble)ist garantiert, dass der Ausdruck unabhängig vom Inhalt der Variablen false zurückgibt. Es wird kompiliert, weil doublees konvertiert werden Objectkann und inteine EqualsÜberladung für diesen Typ aufweist, sodass der Compiler die Konvertierung durchführt und den Aufruf ausführt. Würde ich eine neue Version von C # und .NET Framework entwerfen, würde ich die Boxkonvertierung verbieten, da dies möglicherweise nichts Sinnvolles bewirken kann. Es ist möglich, dass es ein Programm gibt, das einen solchen Vergleich in einer Weise durchführt, die nutzlos, aber harmlos ist, und dass der Compiler einen solchen Code ablehnt, könnte das Programm beschädigen, aber das Korrigieren oder Entfernen eines solchen nutzlosen Codes wäre eine Verbesserung.

Nehmen wir als etwas weniger klares Beispiel an

float f=16777216f;
int i=16777217;

und betrachten Sie den Ausdruck f==i. Es ist möglich , dass einige Code float tut / integer Vergleiche und funktioniert einwandfrei , aber der Code sollte entweder neu geschrieben werden f==(float)i, (double)f==i;oder (double)f==(double)i;[ intzur doubleFörderung ist verlustfrei, so dass die beiden letzteren entsprechen würde]. Einiger Code, der direkt vergleicht floatund integerWerte können immer mit Zahlen umgehen , die so klein sind , dass floatund doubleVergleiche identisch verhalten würden, aber ein Compiler kann in der Regel nicht wissen , dass; Der Code sollte klarstellen, welche Art von Vergleich erforderlich ist, anstatt zu hoffen, dass die Regeln der Sprache der Absicht des Programmierers entsprechen.


1

Es ist am besten, niemals die Abwärtskompatibilität zu unterbrechen.

Microsoft hat die VB6-Programmiersprache durch eine neue Sprache ersetzt, die die Kompatibilität völlig verletzt hat. So ist der 16-jährige VB6 auch heute noch beliebter als die dotNet-Version (Tiobe-Index August 2014). Und Gartner schätzt, dass noch 14 Milliarden Zeilen VB6-Code verwendet werden.

2014 musste Microsoft erneut bekannt geben, dass sie VB6 trotz der Anforderungen der Visual Basic-Programmierer-Community nicht aktualisieren oder öffnen werden. Aber sie haben die Unterstützung von VB6 bis 'mindestens' 2024 verlängert, und es funktioniert gut unter Windows 7 und 8. Das wird über 26 Jahre Unterstützung für dieselbe Version von VB6 sein.

Warum sollte vorhandene Arbeitssoftware neu geschrieben werden müssen, auch wenn Microsoft Office nie "aktualisiert" hat, um dotNet zu verwenden?


dies scheint nicht alles wesentliche über vor 14 Antworten zu bieten
gnat

1

Es gibt einige verschiedene Probleme bei der Aufhebung der Abwärtskompatibilität. Einige der Probleme ergeben sich aus der Tatsache, dass die meisten Programmiersprachen auch Plattformen (Interpreter / Laufzeiten) sind, andere Probleme ergeben sich aus der Annahme der menschlichen Natur.

A. Code, der in älteren Versionen geschrieben wurde, würde nicht den Vorteil neuer Versionen haben, die die Leistung, Sicherheit oder Funktionen verbessern. Sie könnten dieses Problem abmildern, indem Sie mehrere Hauptversionen des Compilers / Interpreters unterstützen. Dies ist jedoch ein enormer Ressourcenverlust (dh es ist teuer oder dauert lange und nervt.).

B. Code, der für die neueren Versionen geschrieben wurde, ist möglicherweise nicht mit Code kompatibel, der in älteren Versionen geschrieben wurde. Sie könnten dies umgehen, indem Sie einen Interpreter / Compiler haben, der mit mehreren Hauptversionen der Sprache umgehen kann, aber dies ist mehr ein Ärgernis als die Unterstützung separater Interpreter / Compiler (die Problemumgehung für A).

C. Größere Änderungen, wenn sie zu oft / schnell auftreten, erschweren auch einfach die Verwendung der Sprache, da Sie mehr lernen und verlernen müssen. Änderungen an einer Sprache können dazu führen, dass die Benutzer zu einer neuen Sprache wechseln, oder dass sie weiterhin veraltete Sprachversionen verwenden und nur nie zur neuen Version wechseln (wie es bei Python der Fall ist). Andererseits können die Änderungen auch neue Benutzer anziehen und alte aufregen.

D. Neue Unterlagen müssen aufbewahrt und gepflegt werden. Es ist immer eine ziemlich verwirrende Erfahrung, bei Google nachzuschlagen und festzustellen, dass Sie die Dokumente für eine andere Version lesen, als Sie derzeit verwenden.

Wenn Sie eine Programmiersprache erstellen, in der sich externe Module nicht darum kümmern müssen, welche Version Sie verwenden, ist es im Großen und Ganzen fast definitiv richtig, die Abwärtskompatibilität aus den richtigen Gründen zu unterbrechen (um größere Fehler in der Sprache zu beheben) . Es ist wahrscheinlich, dass der Hauptgrund dafür, dass dies nicht getan wird, darin besteht, dass Programmiersprachendesigner die Kosten für das Unterbrechen der Kompatibilität überschätzen ( um der Antwort eines anderen zu widersprechen ), insbesondere zu einem frühen Zeitpunkt. Tatsache ist, dass die Probleme der Unterbrechung der Kompatibilität von Benutzern dieser Sprache umgangen oder durchgearbeitet werden können. Dies gilt nicht nur für Programmiersprachen. Dies gilt für APIs, Benutzeroberflächen - wirklich jede Schnittstelle in jeder Situation.

Facebook ärgert die Leute, wenn es seine Benutzeroberfläche oder seine Entwickler-APIs ändert. In der Vergangenheit war es schwierig, mit der Plattform zu arbeiten. In einigen Fällen funktionierten APIs einfach nicht mehr aus heiterem Himmel. Aber die Leute haben es weiter benutzt, und jetzt sind die APIs und Benutzeroberflächen sprunghaft besser als vor 5 Jahren. Die Leute werden sich über Veränderungen beschweren, ob sie gut oder schlecht für sie sind, aber das (sich beschweren) ist kein guter Grund, auf diese Veränderung zu verzichten. Leider nutzen Programmiersprachenentwickler dies als Grund, um die Probleme ihrer Sprache intakt zu halten.

Weitere Gründe für Sprachen, die keine wesentlichen Änderungen vornehmen, um sich selbst zu verbessern, sind:

E. Sprachentwickler glauben, dass die Angst ihrer Benutzer vor Veränderungen ein guter Grund ist, ihre Sprache zu stagnieren

F. Sprachentwickler mochten ihre Sprache, als sie es machten, und sie denken wahrscheinlich, dass es mit seinen Fehlern in Ordnung ist.

G. Sprachen, die älter werden, haben in der Regel keinen kleinen Kernbestand an Entwicklern mehr und werden zu mehr von Komitees gebauten Bestien. Dies bedeutet, dass Entscheidungen über diese Sprachen langsam und oft konservativ und unkreativ sind.

H. Der letzte Grund ist, dass einige wichtige Änderungen eine erhebliche Neubewertung der für den Interpreter / die Laufzeit getroffenen Entwurfsentscheidungen erfordern. Manchmal erfordern Verbesserungen der Sprache einfach zu viel Arbeit, um machbar zu sein. Ich würde vermuten, dass dies ein selteneres Problem ist als die meisten anderen.

Oft sind Sprachdesigner nicht unbedingt Werkzeugdesigner, und deshalb denken sie nicht an gute Lösungen für dieses Problem, oder sie führen sie nicht gut aus. Hier sind einige Lösungen, die ich zur Lösung des Problems der Umbrüche finden kann:

  1. Veraltet Dinge, bevor sie entfernt werden.

  2. Stellen Sie ein gutes Standard-Konverter-Tool bereit. Python lieferte das 2to3-Tool, aber es war nicht gut beworben, kam nicht standardmäßig mit Python 3, wie ich mich erinnere, und funktionierte nicht einmal sehr gut (ich erinnere mich, dass ich die von 2to3 generierten Programme manuell durchgehen musste, um Probleme zu beheben) nicht behoben). Dieses Konvertierungstool kann sogar automatisch ausgeführt werden, wenn Ihr Compiler / Interpreter eine ältere Version erkennt. Was könnte einfacher sein?


Das Problem mit der Facebook-Analogie ist, dass kein Facebook-Legacy verwendet wird. Es gibt keine andere Wahl. Entweder verwenden Sie die aktuelle Version von Facebook oder Sie verwenden Facebook überhaupt nicht. In der Zwischenzeit nutzen immer noch Tonnen von Menschen Python 2sieben Jahre nach der Veröffentlichung von, Python 3weil es immer noch existiert - wenn es nicht so wäre, würden sie murren, aber sie würden nach portieren Python 3.
Kevin

Ich denke nicht, dass das ein Problem mit der Analogie ist, das war eigentlich mein Punkt. Facebook hat die Route "Fehler beheben" gewählt und die Route "Abwärtskompatibilität" weitgehend vermieden. Aus diesem Grund haben sie keine ältere Version ihrer API. Es ist ein perfektes Beispiel für ein Extrem.
BT

Die Aufhebung der Rückwärtskompatibilität in Programmiersprachen wird nur dazu führen, dass die alte Version weiterhin verwendet und / oder gefälscht wird. Die alte Version von Facebook existiert nicht mehr; Ich nehme an, Sie könnten einen Klon erstellen, der die alte API unterstützt, aber niemand würde ihn verwenden, da Facebook eine Marke mit einer riesigen Nutzerbasis ist.
Kevin

Facebook hat den Vorteil, dass beim Update die Vorgängerversionen im Wesentlichen nicht mehr existieren. Programmiersprachen sind nicht so, und das ist ein relevanter Unterschied - Sie können eine veraltete Version einer Programmiersprache verwenden, z. B. Python 2weil sie noch vorhanden ist.
Kevin

Ich verstehe dein Argument. Ich denke immer noch, es ist das eine Ende zweier Extreme. Wenn in einer nicht unterstützten Version einer Sprache schwerwiegende Fehler auftreten, kann dies daran liegen, dass diese Version nicht mehr vorhanden ist, da niemand sie verwenden möchte.
BT

0

Ich weiß nicht, ob das ein Problem für PHP-Code ist, aber in vielen alten Sprachen wird der Legacy-Code nach Jahren oder manchmal sogar Jahrzehnten nie aktualisiert, da er funktioniert, für das Unternehmen von entscheidender Bedeutung ist und zu groß ist (sagen wir mal Millionen von SLOC), so wäre es nicht sinnvoll, es umzuschreiben. Dies ist ein Grund, warum Java die Abwärtskompatibilität trotz bekannter alter Probleme, insbesondere in Bibliotheken, zu einem fast religiösen Problem gemacht hat (auch wenn sie leichter zu aktualisieren sind). Ich denke, viele Codes aus dem Linux-Kernel wurden auch jahrzehntelang nicht aktualisiert, obwohl Standards wie C99 und C11 übernommen wurden.

Selbst in Sprachen, die weniger "unternehmerisch" sind, kann das Brechen von altem, funktionalem Code ein Problem sein. Das ist mit Python 2 -> 3 passiert. Eine ganze Reihe von Bibliotheken und Systemskripten waren stabil und wurden nicht mehr gepflegt, nicht weil sie aufgegeben wurden, sondern weil sie stabil waren und ihre Arbeit erledigten. Ihre Anpassung dauert einige Jahre. Als Entwickler können Sie also nicht unbedingt zu Python 3 wechseln, wenn Ihre Lieblingsbibliothek noch nicht umgezogen ist. Daher funktioniert Ihr eigener Code auch unter Python 3 nicht, was zu einer Fragmentierung der Community führt.


-1

Das Problem liegt in der Abwärtskompatibilität. Die meisten PHP-Skripte, die ich ausführe, laufen auf einem älteren RedHat-Server. Wenn ich die neuere Version der Sprache für zukünftige Skripte verwenden würde, müsste ich PHP auf diesem Server aktualisieren - und riskieren, dass meine älteren Skripte kaputt gehen / Stunden brauchen, um den gesamten alten Code mit dem zu schreiben neuer Standard. Außerdem sind alle meine Entwickler daran gewöhnt, dass PHP auf eine bestimmte Art und Weise reagiert (ob diese Art und Weise nun "kaputt" ist oder nicht). Wenn es nicht mehr so ​​reagiert, könnte es eine große Hürde für die Produktivität sein, da sich Entwickler möglicherweise selbst PHP neu beibringen müssen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.