Wie konnten einige Sprachgemeinschaften (z. B. Ruby und Python) eine Fragmentierung verhindern, andere (z. B. Lisp oder ML) nicht?


67

Der Begriff "Lisp" (oder "Lisp-like") ist ein Überbegriff für viele verschiedene Sprachen, z. B. "Common Lisp", "Scheme" und "Arc". In anderen Sprachgemeinschaften gibt es eine ähnliche Fragmentierung wie in ML.

Ruby und Python haben es jedoch beide geschafft, dieses Schicksal zu umgehen, indem mehr Innovationen bei der Implementierung (wie PyPy oder YARV) statt Änderungen an der Sprache selbst vorgenommen wurden.

Haben die Ruby- und Python-Communitys etwas Besonderes getan, um eine Fragmentierung der Sprache zu verhindern?


10
Sie sagen, Fragmentierung ist eine schlechte Sache.
Sonia

21
@Sonia Aus Sicht des Marktanteils ist Fragmentierung oft eine Katastrophe.
Chrisaycock

5
Stehen Sprachen im Wettbewerb?
Barry Brown

32
@ Sonia Es kann eine schlechte Sache sein. Beispielsweise hängt eine für Python geschriebene Bibliothek mit ziemlicher Sicherheit nicht von der Implementierung ab, wohingegen eine für Lisp geschriebene Bibliothek in Scheme möglicherweise nicht funktioniert.
Kris Harper

2
@ Barry Brown: Großartiger Punkt! Sprachen sollten nicht miteinander im Wettbewerb stehen. Aber Sprachanbieter sind es und dies beeinflusst oft das Sprachdesign (ich glaube nicht, dass dies bei Ruby, Python, Lisp, ML der Fall ist).
Giorgio

Antworten:


77

Ruby und Python haben beide wohlwollende Diktatoren am Ruder. Sie sind Sprachen, die tief in pragmatischen Belangen verwurzelt sind. Dies sind wahrscheinlich die wichtigsten Faktoren, die die Fragmentierung hemmen. Lisp und ML sind dagegen eher "design by committee" -Sprachen, die in der Wissenschaft für theoretische Zwecke konzipiert wurden.

Lisp wurde ursprünglich von John McCarthy als praktische mathematische Notation für Computerprogramme entwickelt. Er hat es nie als eigentliche Programmiersprache implementiert; Die erste Implementierung wurde von Steve Russell entwickelt , aber er war kein gütiger Diktator. Im Laufe der Zeit erschienen viele verschiedene Implementierungen von Lisp; Common Lisp war ein Versuch, sie zu standardisieren.

Lisp ist eher eine "Familie" von Sprachen. Genau wie ML, das einen ähnlichen Entwicklungsweg wie Lisp eingeschlagen hat.


4
Hmm, ich sehe definitiv den Diktatorstatus unter homogenen Sprachgemeinschaften wie Objective-C (für iOS-Apps) und Ada (für Verträge des Verteidigungsministeriums). In diesen Fällen erforderte eine höhere Leistung die Einhaltung, die die Entwickler befolgten, um ihre Ware verkaufen zu können. Aber ich musste noch nie in Python (Hobby-Projekt) so programmieren wie in C # (.Net-Komponente). Dh, ich könnte leichter aus Python fliehen als etwa C. Wie kann ein Diktator die Herde festhalten , ohne diese Drohung, sie zu benutzen, oder wenn Sie keine Verkäufe tätigen ? Das könnte jedoch eine andere Frage sein.
Chrisaycock

1
Mit "gütiger Diktator" meine ich, dass alle Sprachänderungen durch eine Person gehen müssen, die die Vision hat, die Sprache rein zu halten. Die Leute bleiben aus pragmatischen Gründen bei Python. Sie mögen die Sprache und sind darin produktiv. Aber nicht jeder und sein Bruder dürfen es gabeln und nennen es immer noch Python.
Robert Harvey

4
@HenrikHansen Haskell ist ein Standard, wie Robert erwähnt. Der HUGS-Compiler muss also mit GHC kompatibel sein, da beide sich "Haskell" nennen. Der gleiche standardbasierte Schutz gilt auch für C und C ++, weshalb GCC und Visual Studio kompatibel sein müssen (sofern keine proprietären Erweiterungen verwendet werden). Die Neugier ist das, was mit Lisp passiert ist, wo es bereits einen Standard (Common Lisp) gibt und es dennoch viele andere Lisps gibt. ML hat das gleiche Problem, wo es Standard-ML und noch andere MLs gibt.
Chrisaycock

4
"Common Lisp wurde entwickelt, um die divergierenden Varianten von Lisp zu standardisieren, die vor Lisp existierten" - en.wikipedia.org/wiki/Common_Lisp . Mit anderen Worten, es gab bereits eine Fragmentierung, bevor der Standard entwickelt wurde.
Robert Harvey

3
Ich würde sogar sagen, ML und Lisp sind keine Sprachen wie Python und Ruby. Lisp und ML sind eher "Konzepte", die von verschiedenen Sprachen umgesetzt werden.
BenjaminB

29

Ein wahrscheinlicher Faktor ist einfach das Alter. Lisp und ML sind viel älter als Python und Ruby:

  • Lisp: 1958

  • ML: 1973

  • Python: 1991

  • Ruby: 1995

Lisp und ML haben offensichtlich viel größere Veränderungen bei den Hardware-Fähigkeiten, mehr Trends in der Informatik und sehr viel mehr Doktoranden festgestellt, die nach etwas suchen, an dem sie arbeiten können.


7
Möglicherweise, aber ich kann mich nicht erinnern, dass Fortran diesen Grad an Gabeln hatte. (Es gab Dinge wie Fortran D, aber die meisten Fortrans haben die Standardisierung durchlaufen.) Ich nehme an, dass das Alter der Verschmelzung ein Faktor sein könnte.
Chrisaycock

2
AFAIK, Fortran hatte eine Menge Inkompatibilitäten und nicht standardisierte Erweiterungen und verschiedene Implementierungen, bis die Standardkomitees es allmählich herausarbeiteten, wahrscheinlich weil es weiter verbreitet war als Lisp und ML.
Erjiang

@erjian: FORTRANs Inkompatibilitäten wurden beseitigt, da ein schwerwiegender Anreiz für die geschäftliche Nutzung bestand. LISP, meistens in der akademischen Welt, hatte diesen Luxus nie. Das heißt, es ist nicht, wie weit verbreitet seine Verwendung war, sondern wie wohlhabend seine Benutzer waren.
MSalters

2
Alternativ wurden Varianten nicht FORTRAN genannt. Als BASIC herauskam, sah es sicher wie ein vereinfachtes FORTRAN aus.
David Thornley

1
@MSalters Common Lisp war eigentlich eine (recht erfolgreiche IMO) Anstrengung, um die Inkompatibilitäten in den verschiedenen Maclisp-Dialekten herauszufinden, die unter anderem von der geschäftlichen Nutzung vorgegeben wurden (und DARPA wollte, dass alle von ihm finanzierten Forschungslabors Code leichter teilen können). . Abgesehen von Schema, Clojure und Common Lisp gibt es heute keine praktischen Allzweck-Lisps mehr, und diese drei sind unterschiedlich genug, haben sehr getrennte Gemeinschaften mit unterschiedlichen Kulturen und Geschichten, um sie nicht mehr als Dialekte der gleichen Sprache wie Java und C ++ zu zählen .
Pavel Penev

24

Sie sind im Wesentlichen alle implementierungsdefinierten Sprachen

Wenn es einfach ist, eine neue Implementierung einer Sprache zu erstellen, die weitgehend mit vorhandenem Code kompatibel ist, dann sind Hacker Hacker. Jeder schreibt irgendwann eine Lisp-Implementierung. ML-Compiler sind für Absolventen des Sprachdesigns fast schon Pflicht - die Sprache ist ja bekanntermaßen gut dokumentiert .

Auf der anderen Seite haben wir die Ad-hoc- und Implementierungs-definierten Sprachen. Oder Sprachen, die nur so komplex sind, dass sie ein wesentliches Hindernis für eine jemals realisierbare alternative Implementierung darstellen:

  • Rubin; perl; Python - allzu implementierungsspezifisch, um tragfähige Alternativen zu erstellen
  • ghc haskell und erlang - gut definiert, aber so schwer zu tun, was mit ghc (oder erlang) konkurriert, dass die Leute sich normalerweise nicht darum kümmern

Dieser scheinbare Nachteil - Sprachen , die zu hart sind brauchbare Alternativen zu produzieren, haben den massiven Kopf: knappe Ressourcen für Entwickler sind auf die einer wahren Umsetzung konzentriert.


In der Vergangenheit haben einige Mitglieder der Haskell-Community aktiv Fusionen und eine Konzentration der Entwicklungsbemühungen betrieben. Sie haben erkannt, dass ein Auseinanderbrechen der Entwickler-Community bedeuten würde, dass wir keinen Erfolg haben würden. GHC wurde ausgewählt und verfochten.


2
Ich würde gerne mehr über die "aktiv verfolgten Fusionen und die Konzentration" erfahren.
Sam Tobin-Hochstadt

Fragmentierung ist natürlich. Sprachen wie Python und Ruby sind Anomolien, die in der Hauptsache nicht fragmentiert wurden, wenn Sie nicht verwendete Varianten, z. B. ChinesePython, und Varianten, die in einer früheren Version stagnieren, z. B. Jython, nicht zählen. Es gibt auch eine Vorurteile für Überlebende, da die meisten Sprachen mit einem Diktator nicht sehr populär werden, z. B. Nermerle, Groovy, Beanshell, Boo. Tatsächlich gibt es wahrscheinlich Tausende von ihnen.
Vorg van Geir

1
Selbst dann könnte Haskell noch praktischer sein, um den Reifegrad von Python / Ruby zu erreichen. Haskell's cabalist kein unterhaltsames Werkzeug und eher einfach zu brechen. Sogar Yesod erkennt es an: yesodweb.com/blog/2012/04/cabal-meta Python und Ruby sind in Bezug auf die Paketverwaltung viel besser.
Ehtesh Choudhury

1
@ Shurane Python und Ruby überprüfen nicht Ihre Pakete vor der Integration ...
Don Stewart

2
-1: für "ruby; perl; python - allzu implementierungsspezifisch, um brauchbare Alternativen zu erzeugen" Jython, IronPython, JRuby, IronRuby, PyPy und Stackless beweisen, dass Sie sich bei Implementierungen irren (und dies sind nur die wichtigsten). Auch CPython ist Referenzimplementierung, aber nicht die Sprachdefinition, das ist
vartec

12

Ich würde sagen, ein Faktor ist eine definierende Plattform . Für Haskell ist die Plattform der Haskell-Standard und der GHC (ich würde mir vorstellen). Für Ruby war es Ruby on Rails, das die Ruby-Entwicklungsplattform "definierte". Für C war es Unix.

Vergleichen Sie das mit Lisp, wo es keine originelle Kick-Ass-Plattform gab, die definierte, wie die Sprache war. Wenn ich mich richtig erinnere, hatte jede Lisp-Maschine leichte Unterschiede, je nach Modell und Hersteller. Common Lisp war aus irgendeinem Grund nicht definierend. Möglicherweise aufgrund zu großer Konkurrenz und mangelnder Bereitschaft, auf eine andere Plattform zu wechseln.

Dies ist natürlich eine reine Spekulation von meiner Seite. Der Gedanke kam aus den Kommentaren zu Harveys Antwort. Es scheint jedoch, dass die definierende Plattform in vielen Formen vorliegt, aber die gemeinsame Eigenschaft scheint zu sein, dass es das ist, was an Beliebtheit gewinnt.


Ich mag diese Idee wirklich. Ich kann viele Formen von Lisp verwenden, weil keine von ihnen ein "Killer-Framework" hat, aber wenn ich Rails verwenden möchte, muss ich mich an den kanonischen Ruby halten. Sicher ist es nicht die einzige Antwort, aber ich mag Ihre Hypothese.
Chrisaycock

Ich würde auf Plattformteil zustimmen . Wenn Sie einen einzelnen Übersetzer haben, der in der Lage ist, die Sprache auszuführen, ist die Fragmentierung gering.
c69

Common lisp hat sich frühzeitig nicht auf eine einzige Definition festgelegt, da die Leute eine starke Meinung zu bestimmten Dingen hatten, z. B. zu Hygienemakros.
Robert Harvey

Ich bin damit einverstanden und nicht einverstanden. Ich stimme dem zu, weil ein "Killer-Framework" die Kernsprache mit wertvollen Funktionen ausstattet, das Wachstum fördert und schnelle Innovationen außerhalb der Standardspezifikation ermöglicht. Ich stimme dem nicht zu, denn wenn die Framework-Betreuer nicht sehr vorsichtig sind, kann diese rasche Zunahme der Innovation zu einer Menge aufgedunsener und / oder undichter Abstraktionen führen, die sie instabil machen könnten.
Evan Plaice

1
(Forts.) Frameworks wie jQuery, die die Kernfunktionalität einer Sprache idealerweise erweitern, werden in Zukunft aussterben, da die wertvollsten Beiträge dieser Frameworks standardisiert und in den Kern integriert werden. Frameworks sterben in der Regel am schnellsten ab, da Entwickler es im Allgemeinen vorziehen, Abhängigkeiten zu reduzieren / zu beseitigen, wenn sich eine Codebasis stabilisiert. Wenn die Sprachentwickler relevant bleiben möchten, vereinfachen sie diesen Prozess, indem sie die Framework-Funktionalität anpassen und übernehmen und ihre Benutzer dazu ermutigen, die Abhängigkeiten von Frameworks von Drittanbietern zu verringern.
Evan Plaice

7

Vergessen Sie nicht, die Kultur abzuwägen, die die Entwicklung einer Sprache antreibt

Ich würde auch die Tatsache betonen, dass die Entwicklung auf Python / PHP aktiv in der Öffentlichkeit stattfindet. Sie haben eine Gruppe von Personen, die eine Standardspezifikation festnagelt, die jedem / jeder frei zur Verfügung steht.

Ähnlich wie das W3C mit dem HTML / CSS-Standard. Sie haben eine kleine Gruppe von motivierten Personen, die die feineren Details dessen kontrollieren, was die Sprache erreichen soll. Alles geht in eine klar definierte Spezifikation, bevor es für die Öffentlichkeit freigegeben wird.

OTOH, Sprachen wie LISP werden von Professoren oder anderen Personen hinter verschlossenen Türen gegabelt, die aufrichtig glauben, dass ihre Sicht auf den „besten Gebrauch“ der Sprache richtig ist. Sie können gleichzeitig richtig und falsch sein, da einige Implementierungen in bestimmten Dingen großartig sind. während keiner der Beste in allem ist.

Das ist nicht unbedingt schlecht, denn Vielfalt schafft Innovation. Sprachen wie LISP sind und bleiben großartige Sprachen zum Lernen und Forschen, weil sie die Grenzen des Verstehens erweitern.

Die Eigenschaften, die ein Umfeld für Innovationen ausmachen, tragen jedoch nicht unbedingt zur Stabilität bei. Umgekehrt sind die Eigenschaften, die eine Umgebung für Stabilität gut machen, nicht unbedingt gut für Kreativität.

Wenn die Entwicklung auf aktiver Zusammenarbeit beruht, sind manchmal Einzelpersonen gezwungen, sich zum Wohle des Ganzen zu ergeben. Schlecht für die Forschung / gut für die Konsistenz.


Fakt ist, wir leben immer noch im wilden Westen der Entwicklung von Programmiersprachen. Das Problem bei der Gestaltung der „idealen Sprache“ ist so groß, dass trotz enormer Anstrengungen niemand der Lösung nahe gekommen ist.

Im Bereich Forschung / Wissenschaft gibt es noch viel Raum für Verbesserungen und Innovationen. Im kommerziellen Bereich, wo der Einsatz von Software in praktischen Anwendungen exponentiell zunimmt und die treibende Kraft Einfachheit und Konsistenz ist.

Einige Sprachen spezialisieren sich auf die ersteren, andere auf die letzteren. Diejenigen, die versuchen, sich auf beides zu spezialisieren, machen es normalerweise auch nicht besonders gut und sterben ab.

Mit beiden meine ich monolithische Sprachen wie VB / C # / Java. Es ist zu früh zu sagen, aber ich möchte sehen, wie C # und Python in 10 Jahren aussehen. Im aktuellen Tempo wächst die Funktionalität und Inkonsistenz von C # mit einer Geschwindigkeit, die es ziemlich düster aussehen lässt. Selbst mit einer großartigen Dokumentation ist es zu schmerzhaft, sich an all die subtilen Details und Macken zu erinnern, die in der Sprache enthalten sind. Es ist großartig für einen einzelnen Entwickler, aber sobald Sie mehr Entwickler mit einzigartigen Stilen hinzufügen, wächst die Inkonsistenz in der Codebasis, die Qualität leidet und niemand gewinnt. Ich denke, es gibt viel zu lernen aus den Schwierigkeiten, die Perl in einer Produktionsumgebung mit sich bringt.


Leiter? Meinen Sie letzteres?
Giorgio

@ Giorgio Ja, ich hasse es, wenn ich das falsch schreibe.
Evan Plaice

2

Ich denke nicht, dass es richtig ist zu sagen, dass Sprachen wie Python und Ruby nicht fragmentiert sind. Schon sehen wir einige Fragmentierungseffekte. Beispielsweise ist Python 3 nicht vollständig abwärtskompatibel mit Python 2, sodass beide Versionen beibehalten werden müssen und viele vorhandene Codes nur mit Python 2 funktionieren. Es gibt auch einige Python-Ausgründungen, einschließlich PyPy.

Ein weiterer Faktor ist das Alter der Sprachen. Die am stärksten fragmentierten Sprachen sind die älteren Sprachen und unterliegen daher dem Druck der Evolution und Revision. Lisp wurde vor einigen Jahrzehnten erfunden. Es blieb also genügend Zeit, einige seiner Ideen in neue Sprachen umzusetzen. C ist ein weiteres Beispiel für eine fragmentierte Sprache. Während C nur eine wirklich wichtige Revision der Sprache selbst hatte (K & R zu ANSI), gab es zahlreiche Ausgründungen, darunter C ++, Not Quite C und alle anderen, die eine C-ähnliche Syntax aufweisen.

Ruby selbst ist (wenn Sie so wollen) eine "Fragmentierung" früherer Sprachen. Da es Ideen von C, Smalltalk und Perl (unter anderem) enthält, ist es derzeit die Sprache , die die Fragmentierung vornimmt. Ich verstehe nicht, warum wir in Zukunft möglicherweise keine weitere Verflechtung von Ruby mit anderen Sprachen sehen werden.


6
-1 weil: (1) Python 3.x ist keine Fragmentierung. Es ist nur der nächste Schritt in der Sprachentwicklung; Python 2.x wird in einigen Jahren vollständig eingestellt . (2) Andere Sprachimplementierungen, die zu 99% kompatibel sind (wobei die 1% Implementierungsdetails und meistens eher undurchsichtig sind) und sich aktiv weigern, an der Definition der Sprache teilzunehmen, sind keine Fragmentierung. (3) Eine völlig andere Sprache, die einige Gemeinsamkeiten hat und in gewisser Weise kompatibel ist (C ++ zu C), ist kaum Fragmentierung. (4) Das Akzeptieren von Ideen aus vorhandenen Sprachen ist keine Fragmentierung, sondern die einzige Möglichkeit, eine Sprache zu entwerfen.

2
@delnan: Python 2.x wird in ein paar Jahren komplett fallen gelassen? Das ist ein bisschen albern zu sagen, wenn COBOL und Fortran noch da sind!
Mason Wheeler

3
@ MasonWheeler Ich spreche von Entwicklung. Auf dem VCS wird immer noch alter Code archiviert, inoffizielle Binärdownloads bleiben möglicherweise jahrzehntelang bestehen und einige Shops vermeiden möglicherweise die Portierung. Aber ich gehe davon aus, dass ein nicht allzu ferner Tag, die überwiegende Mehrheit der Python-Programmierung, in Python 3 stattfindet. Schließlich wurde die Entwicklung von 2.x-Funktionen vor einiger Zeit eingestellt (und wird erst fortgesetzt, wenn Sie Python-dev einer Gehirnwäsche unterziehen). , Bugfixes / Sicherheitsupdates sollten nicht für immer fortbestehen, und ein erheblicher Teil der Bibliotheken ist auf Python 3 portiert, wobei sich die meisten anderen darauf freuen (z. B. Djano) oder nicht gewartet werden.

1
@ MasonWheeler Oh, und was Fortran und COBOL betrifft: Fortran hat 2008 eine neue Standardrevision erhalten, und COBOL hat 2002 eine mit einer Handvoll technischer Berichte seitdem erhalten.

@MasonWheeler Wussten Sie, dass modernes COBOL eine objektorientierte Programmierung ermöglicht?

2

Lisp ist fragmentiert, weil es ein so mächtiges Modell ist, die erstaunlichste Sprache, die jemals erfunden wurde. Die meisten Sprachen leihen heute Dinge aus, die zuerst in Lisp implementiert wurden. Man kann also sagen, dass jede Sprache Teil dieser bestimmten Fragmentierung ist. Smalltalk war zum Beispiel stark von Lisp inspiriert und Ruby ist stark von Smalltalk inspiriert. JavaScript ist Lisp in einer Java-Verkleidung und so weiter. Es ist alles miteinander verbunden, und jeder Spracherfinder wählt seine Lieblingsstücke aus anderen Sprachen aus.

Ein weiterer Faktor ist, dass Lisp wahrscheinlich das am einfachsten zu implementierende Programmierkonzept ist - weshalb es immer wieder und immer wieder gemacht wird.


1

Lisp-ähnliche Sprachen sind zu grundlegend und zu theoretisch, um dramatisch verändert zu werden. Grammatische Änderungen (ich möchte nicht nur die Namen von Befehlen ändern) passen einfach nicht zur dahinter stehenden Theorie der funktionalen Programmierung.

Aber die Tatsache, dass es Sprachen wie lisp gibt, zeigt, dass "Änderungen" ohnehin schon an lisp vorgenommen wurden. Mit anderen Worten, es gibt Sprachen, die von Menschen gemacht wurden, die von lisp oder seiner Theorie dahinter inspiriert waren und eine in gewisser Weise ähnliche neue Sprache entwickelt haben.

Es gibt auch viele Sprachen, die von Python inspiriert sind. ZB Julia, CoffeeScript usw., die ihre eigene Familie von whitespace-sensitiven objektorientierten Sprachen bilden würden.

Ich denke, grundlegende Grundlagen einer Sprache wie Python werden sich nie wirklich ändern. Python ist objektorientiert und weist daher Ähnlichkeiten mit C ++ und Java auf, ist jedoch dynamisch und daher auch vielen Skriptsprachen ähnlich.

Na wer interessiert sich eigentlich für Sprachen? Was zählt, ist der Zweck: Französisch ist ähnlich wie Latein, aber Mädchen, die Französisch verstehen, sind viel heißer;)

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.