Ich habe oft Leute gesehen, die sich darum stritten, dass ihre Lieblingssprache "mächtiger" ist als andere. Wenn es um die Beschreibung einer Programmiersprache geht, kann ich verstehen, was eine objektorientierte Sprache ist oder was eine dynamische Sprache ist, aber ich kann immer noch nicht herausfinden, was genau eine "mächtige" Sprache ist. Was sind deine Gedanken?
programming-languages
Handwerker
quelle
quelle
Antworten:
Wir können nicht definieren, was eine "mächtige" Sprache ist, ohne zuerst das Wort "mächtig" zu definieren.
Die wörtliche Definition von Macht wäre "Potenz", und ich denke, wir sind uns alle einig, dass die große Mehrheit der Compiler - und sogar viele Interpreten, die nicht Turing-vollständig sind - ebenso gut dafür sorgen, dass der Prozessor ihre Anweisungen ausführt . Was die wörtliche Definition betrifft, wäre die Antwort auf die Frage "fast jede Sprache überhaupt".
Praktisch sollten wir hier wirklich aufhören. Das Definieren einer "mächtigen Sprache" ist ein bisschen wie das Definieren einer "guten Person" oder eines "Qualitätsprodukts". Es gibt absolut keine objektive Definition dieser Wörter, auf die sich jeder oder sogar die Mehrheit der Experten einigen könnte, und die meisten Definitionen werfen einfach die Frage auf . Je nachdem, mit wem Sie sprechen, kann die Macht eine der folgenden sein:
Seht jeder, was hier los ist? Praktisch jedes Aufzählungszeichen kann als Zeichen von "Macht" interpretiert werden, und genau das Gegenteil!
Irgendjemand dachte offensichtlich, dass variable Variablen eine großartige Idee seien, die die Sprache sehr mächtig machen würde . Ich werde nicht beurteilen; Ich bin kein PHP-Typ.
Ich schlage vor, dass wir alle anstelle dieses ganzen Unsinns aus dem Heiligen Krieg diese wirklich einfache Definition verwenden:
Die mächtigste Sprache ist diejenige, mit der Sie in kürzester Zeit das qualitativ hochwertigste Produkt zu den niedrigsten Kosten versenden können.
Vage? Darauf kannst du wetten. Deshalb muss jeder, der sich als Profi bezeichnen will, sowohl die Programmierkonzepte als auch die Projektdomäne verstehen . Nur so können Sie entscheiden, was für Sie "mächtig" ist.
Andernfalls bringen Sie möglicherweise nur ein wirklich großes Messer in einen Schusswechsel.
quelle
Ich bin vielleicht voreingenommen, weil ich ein Systemprogrammierer bin. Ich denke, eine Programmiersprache, die für die gesamte Kernel-, System-, Server- und Anwendungsprogrammierung verwendet wird, oder die mehrere Programmierparadigmen unterstützt, oder beide, kann als "leistungsfähig" bezeichnet werden.
C, C ++, D sind mächtig, aber das ist natürlich nur meine bescheidene Meinung.
quelle
Es gibt einige Definitionen von Macht, die über die Vollständigkeit von Turing hinausgehen. Mark zitierte, was ich tendenziell als "die Paul Graham-Definition" betrachte. Es ist eine ziemlich gute Definition mit einem schwerwiegenden Fehler: Es ist falsch. Es ist theoretisch eine sehr gute Definition der Sprachkraft, aber Sie wissen, was sie über den Unterschied zwischen Theorie und Praxis sagen ...
Wenn jeder in der Lage wäre, perfekten Code zu schreiben, der nicht nur fehlerfrei, sondern auch absolut zukunftssicher ist, dann wäre die Definition von Paul Graham korrekt. Das ist aber offensichtlich nicht der Fall. In der Praxis wird der größte Teil der Zeit und des Aufwands für das Software-Engineering nicht durch die erstmalige Erstellung des Produkts, sondern durch die anschließende Wartung in Anspruch genommen. Abhängig davon, welche Statistiken Sie anhören (und dies ist wahrscheinlich von Projekt zu Projekt sehr unterschiedlich), kann die Wartung zwischen 60% und 90% des Gesamtaufwands eines Programms ausmachen.
Die Wartung wird häufig von anderen Personen als der Person durchgeführt, die den Code ursprünglich geschrieben hat, und häufig Monate oder sogar Jahre nach dem ersten Schreiben des Codes. Dies bedeutet, dass es sich auch für den ursprünglichen Codierer möglicherweise um den Code anderer Personen handelt Punkt. Wenn Sie während der Wartung produktiv sein möchten, müssen Sie in der Lage sein, die ursprüngliche Absicht des Codes durch Lesen schnell festzustellen.
Daher ist eine leistungsfähigere Sprache eine Sprache, die das schnelle Lesen von Code erleichtert, und keine, die das schnelle Schreiben von Code erleichtert . Es besteht tendenziell eine gewisse Überschneidung zwischen den beiden Konzepten, aber die Konzepte sind häufig auch widersprüchlich, da in der knappen Syntax häufig Details ausgelassen werden, auf die ein Compiler / Interpreter viel einfacher schließen kann als ein Wartungsprogrammierer.
BEARBEITEN: Es gibt einen weiteren wichtigen Punkt bei der Beschreibung der Kraft einer Sprache: die Bandbreite der Konzepte, die Sie ausdrücken können, und wie leicht Sie beide Enden erreichen können. Paul Graham bewertet diesen gerne danach, wie hoch das Abstraktionsniveau sein kann, aber das ist nur die Hälfte davon. Jede Sprache, die eine niedrigere Abstraktionsgrenze auferlegt, unter die Sie bei Bedarf nicht gehen können, ist verkrüppelt, weil die Details, die weg abstrahiert werden, aus einem bestimmten Grund vorhanden sind. Dies ist der Unterschied zwischen einer leicht lesbaren Spielzeugsprache wie COBOL und einer leicht lesbaren, leistungsstarken Sprache: COBOL verfügt über keine Zeiger und keinen Zugriff auf Inline-Assemblys, in denen Sie Berechnungen ausdrücken können, auch wenn diese für COBOL nicht gut geeignet sind.
COBOL ist auch nicht besonders gut darin, das obere Ende des Abstraktionsspektrums zu erreichen. Laut Wikipedia gibt es "keine benutzerdefinierten Typen und keine benutzerdefinierten Funktionen", was es sehr schwierig macht, Algorithmen und Datenstrukturen zu erstellen.
quelle
Dies wurde wiederholt ausführlich diskutiert (z. B. auf comp.lang.lisp, mehrmals). Ich glaube, niemand hat jemals eine "richtige" Antwort gefunden, aber viele Leute haben Antworten gefunden, die mir offensichtlich falsch erscheinen.
Lassen Sie mich in den Antworten, die ich hier sehe, die Antwort von Mason Wheeler auswählen. Auf der einen Seite die Themen er Abdeckungen sind wichtig - aber auf der anderen Seite kann ich nicht ganz vorstellen , dass sie überhaupt im Zusammenhang Aufruf „Macht“ . Es ist ein bisschen so, als würde er sagen, sein Honda Mini-Van sei leistungsstärker als ein Top-Kraftstoff-Dragster, weil er sicherer, leiser, handlicher, geräumiger und komfortabler ist. All dies ist absolut wahr und es ist alles wichtig. Diese Faktoren (unter anderem) machen den Minivan für die meisten Menschen praktischer und vernünftiger - aber sie ändern nichts an der Tatsache, dass der Motor des Minivans nur etwa 250 PS leistet, während der Dragster etwa 8000 PS leistet.
Das Problem ist natürlich, dass es bei Fahrzeugen eine klare Definition gibt, was "Kraft" ausmacht und was nicht. Bei den Programmiersprachen scheint es mir, als würde die Diskussion bedeuten, Handling, Komfort, Geschwindigkeit, Ladekapazität und Reichweite als Teil der "Kraft" zu behandeln. Das Ergebnis sind Fäden, die endlos weiterlaufen und viel mehr Wärme als Licht erzeugen. Die meisten der auftretenden Fragen hängen im Wesentlichen davon ab, wie wichtig Sie völlig unabhängigen und orthogonalen Merkmalen beimessen. Beispielsweise ist die Fähigkeit, die MMU in Assemblersprache zu programmieren, mehr oder weniger "leistungsfähig" als die Fähigkeit, Funktionen auf höherer Ebene zu erstellen in Haskell? Zumindest IMO, es gibt keine sinnvolle Möglichkeit, die beiden zu vergleichen, und es gibt keine sinnvolle Antwort auf die Frage "
So sehr ich es auch hasse, muss ich sagen, dass in diesem Fall die einzig sinnvolle Antwort im Grunde genommen eine relativistische ist - eine mächtige Sprache, die Ihnen dabei hilft, das zu erreichen, was Sie wollen. Unterschiede in den Zielen der Menschen machen die meisten "absoluten" Machtmessungen bestenfalls bedeutungslos.
quelle
Das richtige Gleichgewicht zwischen Kürze und Flexibilität.
Gute Frage. Angesichts der Tatsache, dass viele Sprachen "Turing complete" sind, können wir sie alle in Bezug auf ihre theoretischen Fähigkeiten auf die gleiche Grundlage stellen. Das machen wir aber nicht, weil sich Sprachen offensichtlich voneinander unterscheiden. Und was ist der Unterschied?
Der Unterschied ist die Fähigkeit, mit sehr wenig viel zu sagen . Wenn wir bis zum Äußersten springen könnten, könnte ich eine Sprache erstellen, die die beste Sprache für die automatische Initialisierung eines Content-Management-Systems mit nur einem Zeichen, "c", ist. Aber worum würde es dabei gehen? Sicher, es ist kraftvoll in dem Sinne, dass es sehr kurz ist, aber es ist nicht flexibel. Was Sie wollen, ist eine Sprache, mit der Sie viele verschiedene komplexe Dinge sagen können, ohne zu wortreich zu sein. Ohne wie eine Versammlung zu sein, fähig zu allem unter der Sonne, unendlich flexibel, aber extrem wortreich.
Eine mächtige Sprache ist eine Sprache, mit der Sie viele verschiedene Dinge mit der geringstmöglichen Länge sagen können.
quelle
Sobald Sie Turing vollständig getroffen haben (und es ist für eine Sprache einfach, dies zu tun), bedeutet "Macht" nicht viel, in dem Sinne, dass alles, was Sie in einer Turing-vollständigen Sprache sagen können, auch in einer anderen Sprache gesagt werden kann. Die Antwort von Mark Canlas spricht für sich : Kürze und Flexibilität machen den Unterschied.
Matthias Felleisens Aufsatz " Über die Ausdruckskraft von Programmiersprachen" ist dennoch eine interessante Lektüre. Darin versucht er, den Begriff der Ausdruckskraft in Sprachen zu formalisieren.
quelle
Es scheint viel Uneinigkeit darüber zu geben, was sprachliche Macht ausmacht. Ist es Kürze, Lesbarkeit, Anpassungsfähigkeit oder einfach nur Vollständigkeit? Ich denke, dass all diese Faktoren eine Rolle spielen. Daher ist es vielleicht am besten, wenn man sie in Bezug auf statistische Punkte betrachtet. Ja, ich spreche hier von einem Pen-and-Paper-Rollenspiel.
Die Idee ist, dass jede Sprache (ungefähr) die gleiche Anzahl von "Punkten" hat, die beliebig auf mehrere Kategorien verteilt werden können. Zu Diskussionszwecken werden lediglich die Faktoren Kürze, Lesbarkeit und Flexibilität genannt. Eine Sprache kann dann äußerst knapp und flexibel sein, ist aber folglich sehr schwer zu lesen. oder sehr gut lesbar und flexibel, aber sehr ausführlich.
(Die Anzahl der Punkte, die eine Sprache zu verteilen hat, hängt von den Fähigkeiten des Designers und Implementierers ab. Nehmen wir jedoch an, dass alle Sprachdesigner gleich gut darin sind, was sie tun.)
Wenn ein Sprachdesigner beschließt, die Stärke einer Sprache in einer Kategorie zu erhöhen, entzieht er logischerweise jeder anderen Kategorie einen Bruchteil dieser potenziellen Stärke. Aus diesem Grund wird so oft gesagt, dass es beim Design von Programmiersprachen nur um Kompromisse geht. Aus dieser Sicht ist die Gesamtstärke einer Sprache immer noch nicht definierbar, und wir müssen auf die bewährte Methode zur Kategorisierung von Sprachen anhand ihrer relativen Stärken zurückgreifen. Nicht befriedigend? Schade.
Sie können auf zwei Arten argumentieren: Eine mächtige Sprache ist eine Sprache mit einer relativ gleichmäßigen Punkteverteilung (Alleskönner, Meister ohne Punkte) oder mit so vielen Punkten wie möglich in einem Bereich, ohne andere unbeaufsichtigt zu lassen (Spezialist). Es gibt keine "Renaissance-Menschensprache" mit perfekter Beherrschung in zahlreichen Bereichen. Und wenn das Ihre Definition der mächtigsten Sprache ist, dann haben Sie einfach kein Glück.
Zur weiteren Lektüre wird in diesem Artikel (zufällig auch von Paul Graham, der gemischte Meinungen zu haben scheint) die Idee angesprochen , dass Programmiersprachen in der Tat unterschiedlich leistungsfähig sind , auch wenn es schwierig zu bestimmen sein mag . Er argumentiert ziemlich überzeugend, dass es sehr leicht zu erkennen ist, wie eine Sprache weniger mächtig ist als die von Ihnen bevorzugte - es fehlt Feature X -, aber es ist sehr schwer zu erkennen, wie eine wirklich mächtigere Sprache tatsächlich so ist - es ist im Grunde gleichbedeutend mit Sprache X, aber mit ein paar anderen Sachen. Ich hinterlasse Ihnen ein Zitat aus dieser Zeitung:
quelle
Programmiersprachen sind Werkzeuge - nicht mehr und nicht weniger. Einige Werkzeuge sind äußerst spezialisiert und für bestimmte Zwecke gut geeignet. andere werden verallgemeinert und bis zur Nutzlosigkeit vereinfacht.
Ich würde behaupten, dass die "mächtigste" Sprache diejenige ist, mit der Sie Ihre Ziele mit einem Minimum an Zeit, Energie und anderen Ressourcen erreichen können. Das ist die Sprache, die den größten ROI bietet. In einigen Situationen könnte es C sein; in anderen Java; in noch anderen, Haskell.
Das Beste, was Sie tun können, ist, sich mit einer Vielzahl von Sprachen und deren Verwendungszweck vertraut zu machen. Dann, wenn der Zeitpunkt gekommen ist, ein neues Projekt zu beginnen, können Sie eine fundierte Entscheidung treffen, welche am besten geeignet wäre.
quelle
Diskussionen über Programmiersprachen sind - IMHO - Diskussionen über Mail-Clients in einigen Linux-Newsgroups ähnlich: Sie neigen dazu, ein Flammenkrieg zu sein. Ich kann mich an Zeiten erinnern, als VB6 beliebt war. Es wurde sogar argumentiert, dass es überhaupt keine Programmiersprache ist, während andere beeindruckende Anwendungen damit erstellten.
Ich denke, Programmiersprachen unterscheiden sich bereits im Konzept, da die Entwickler bei der Erstellung / Gestaltung der Sprache unterschiedliche Dinge im Auge hatten. Eine Sprache, die zu einem Zweck passt - und unter diesen Umständen mächtig ist -, passt möglicherweise nicht zu einem anderen. Die Sprache mächtig zu nennen oder nicht, ist dann rein subjektiv. Trotzdem glaube ich nicht, dass es eine Metrik gibt, die angewendet werden kann.
quelle
Sie sind alle Werkzeuge in Ihrer Werkzeugkiste. Ein Hammer kann mächtig sein, aber nicht, wenn Sie einen Schraubenschlüssel benötigen. C / C ++ ist großartig, wenn Sie ein Systemprogrammierer sind, aber Adobe Flash passt wahrscheinlich besser zu der Gaming-Website, die Sie erstellen möchten.
quelle
Die leistungsstärkste Programmiersprache ist diejenige, die das folgende lineare Programmierproblem löst :
Maximieren
Geschwindigkeit der Entwicklung
+ Einfache Codelesung
+ Einfache Fehlersuche
+ Prägnanz / Kürze des Ausdrucks
+ Lehren / Lernen
- CPU-Auslastung
- Speicheranforderungen
Vorbehaltlich
(Und ja, ich weiß, ich habe bereits eine völlig widersprüchliche Antwort gepostet. Das liegt daran, dass ich ein Dialektiker bin.)
quelle
Dies wurde in Bezug auf natürliche Sprachen geschrieben, aber ich denke, dass es auch für Programmiersprachen angemessen ist:
"Macht" ist einfach nicht einer Sprache über einer anderen zuzuschreiben. Es wäre albern zu sagen, "Chinesisch ist eine mächtigere Sprache als Koreanisch." Ebenso ist es albern zu sagen, "APL ist eine mächtigere Sprache als COBOL."
Es gab mehrere Versuche, die sprachliche Kraft mit einer objektiven Maßnahme gleichzusetzen. Ich glaube, diese Versuche schlagen fehl:
Meiner Meinung nach sind Diskussionen über "die Macht einer Sprache über eine andere" Ausdruck des Überlegenheitsgefühls des Sprechers gegenüber einer anderen Gruppe. Kurz gesagt, seine Vorurteile und Stereotypen. Natürlich glauben Menschen, die wirklich Vorurteile haben, wirklich sehr stark an ihre Stereotype, und es ist unwahrscheinlich, dass Sie sie überreden könnten, ihre Meinung zu ändern.
quelle