Sollten Programmiersprachen streng oder locker sein? [geschlossen]


14

In Python und JavaScript sind Semikolons optional.

In PHP sind Anführungszeichen um Array-Schlüssel optional ( $_GET[key]vs $_GET['key']). Wenn Sie sie jedoch weglassen, wird zunächst nach einer Konstanten mit diesem Namen gesucht. Es erlaubt auch 2 verschiedene Stile für Blöcke (durch Doppelpunkte oder geschweifte Klammern getrennt).

Ich erstelle gerade eine Programmiersprache und versuche zu entscheiden, wie streng ich es machen soll. Es gibt viele Fälle, in denen zusätzliche Zeichen nicht wirklich erforderlich sind und aufgrund von Prioritäten eindeutig interpretiert werden können, aber ich frage mich, ob ich sie dennoch durchsetzen oder nicht, um die Konsistenz zu fördern.

Was denkst du?


Okay, meine Sprache ist weniger eine Programmiersprache als eine schicke Templatsprache. Eine Art Kreuzung zwischen Haml- und Django-Vorlagen . Bedeutet, mit meinem C # -Webframework verwendet zu werden und soll sehr erweiterbar sein.


22
Dies ist ein Thema für einen heiligen Krieg.

1
Pythonisten raten von der Verwendung von Semikolons ab. Ehrlich gesagt bin ich mir nicht sicher, ob sie überhaupt benötigt werden - nur, um mehrere Anweisungen pro Zeile zuzulassen, was völlig vermieden werden kann, ohne zu leiden. Also ... ich bin für strengere Sprachen. Manchmal können Sie jedoch Dinge außerhalb einer Sprache mit Code-Analyse-Tools wie StyleCop erzwingen.
Job

1
Die Anführungszeichen für PHP-Array-Schlüssel sind nicht optional. Sie waren in PHP2, aber in späteren Versionen automatisch definierte Konstanten. Sie sind nicht erlaubt in Basisband - Interpolation "..$_GET[raw].."jedoch.
Mario

1
@Ralph: Die Regeln sind etwas komplizierter. Es ist richtig zu schreiben "xx$_GET[raw]xx"- Wenn Sie beginnen, geschweifte Klammern zu verwenden, muss der Schlüssel "xx{$_GET['raw']}xx"in Anführungszeichen gesetzt werden. Wenn geschweifte Klammern verwendet werden, überprüft der gewöhnliche PHP-Parser dies und die strenge Syntax wird angewendet. Es ist nur so, "$_GET[x]"dass der Schlüssel als roher String behandelt wird, und das ist auch eine strenge Regel, auf die PHP Fehler parsen würde "$_GET['x']".
Mario

2
@mario: Die Tatsache, dass wir dieses Gespräch führen, bedeutet, dass die Art und Weise, wie Array-Schlüssel behandelt werden, mehrdeutig und verwirrend ist. Es scheint in Zeichenfolgen zu sein, es ist eindeutig, aber inkonsistent (Sie können keine Anführungszeichen verwenden, wenn Sie bereits in einer Zeichenfolge sind, es sei denn, Sie verwenden geschweifte Klammern, dann müssen Sie, aber außerhalb sollten Sie). Und außerhalb von Strings, in "normalem" PHP ... nun, es macht so komischen Mist.
20.

Antworten:


19

Verschiedene Arten von Sprachen haben unterschiedliche Verwendungszwecke, daher hängt die Antwort auf diese Frage wirklich davon ab, wofür Sie sie verwenden werden.

Zum Beispiel ist Perl eine sehr lockere Sprache, und ich finde sie sehr nützlich, um schnelle Korrekturen oder Skripte für das Knacken von Zahlen zu schreiben. Für solide robuste Projekte verwende ich C #.

Sie müssen das richtige Gleichgewicht für die Zielnutzung finden. Je strenger es ist, desto länger müssen Sie den Code schreiben, aber Sie erhalten mehr Robustheit, Wiederverwendbarkeit und sind einfacher zu warten.


26

Was ich in einer Programmiersprache (im Gegensatz zu einer Skriptsprache) suche, ist Konsistenz und starke Typisierung.

In aktuellen Programmiersprachen ist es möglich, das Semikolon beispielsweise an bestimmten Stellen wegzulassen, ohne mehrdeutig zu werden (der letzte Ausdruck in einem {}Block ist einer). Wenn Sie in einer Programmiersprache in diesen Fällen Zeichen weglassen können, hat ein Programmierer jetzt ein zusätzliches Problem. neben der allgemeinen sprachsyntax muss sie nun wissen, in welchen fällen auch teile der syntax weggelassen werden dürfen.

Dieses zusätzliche Wissen ist kein Problem für den Programmierer, der den Code schreibt, aber es wird eine Belastung für jeden, der den vorhandenen Code zu einem späteren Zeitpunkt interpretieren muss (einschließlich des ursprünglichen Autors nach einer Weile).

Ihr PHP-Beispiel eröffnet die Möglichkeit subtiler Fehler in einem Programm, wenn die Konstante keyim selben Kontext hinzugefügt wird. Der Compiler hat keine Möglichkeit zu wissen, dass dies nicht gemeint ist, sodass das Problem nur zur Laufzeit und nicht zur Kompilierungszeit auftritt.


1
Stimmen Sie zu, Sie sollten die Möglichkeiten für Entwickler einschränken: mehr Möglichkeiten => müssen mehr nachdenken (sollte ich so oder so vorgehen) => weniger Zeit für die eigentliche Arbeit
Kemoda

Ich verstehe nicht, was der Mangel an implizitem Typ-Casting mit der Syntax einer Sprache zu tun hat.
Dan_waterworth

5
Auch wenn Sie lesen $_GET[key], wissen Sie nichts. Am Ende greift man das gesamte Projekt ab, um zu wissen, ob keyes sich um eine Konstante handelt oder nicht. So etwas spart 0,5 Sekunden beim Schreiben und 20 Sekunden beim Lesen.
Moshe Revah

Wenn Ihre Sprache Ihnen Optionen ohne Unterscheidung bietet, tendiert der Codierungsstil - ob codiert oder nicht - dazu, einen von ihnen zu standardisieren ...
Deduplicator

11

Überall dort, wo es Unklarheiten gibt, muss der Compiler eine Möglichkeit haben, zu erraten, was der Programmierer wirklich gemeint hat. Jedes Mal, wenn dies passiert, besteht die Möglichkeit, dass der Programmierer etwas anderes meint, aber die Mehrdeutigkeitsregel nicht festgelegt ist.

Es ist schon schwer genug, logisch korrekten Code zu schreiben. Das Hinzufügen syntaktischer Mehrdeutigkeiten mag auf den ersten Blick "freundlich" erscheinen, aber es ist eine offene Einladung, neue, unerwartete, schwer zu debuggende Fehler in die Codebasis aufzunehmen. Unterm Strich so streng wie möglich sein.

In Ihrem Beispiel haben Sie erwähnt, dass Semikolons in Python und JavaScript optional sind. Zumindest für Javascript ist dies nicht ganz richtig. Semikolons sind in JS genauso erforderlich wie in jeder anderen Sprache der C-Familie. Der JavaScript-Parser wird jedoch von der Sprachspezifikation benötigt, um unter bestimmten Umständen fehlende Semikolons einzufügen. Dies wird allgemein als eine sehr schlechte Sache angesehen, da es dazu neigt, Ihre Absichten falsch zu machen und Ihren Code zu vermasseln.


6

Die Antwort darauf, wie locker du deine Sprache machen sollst, entspricht der Antwort auf die Frage, die in einem Akzent in Texas steht: "Wie glücklich fühlst du dich, Punk?".


Ich verstehe es nicht.
19.

4
Mein schlechter Scherzversuch war, dass dynamisches Tippen Sie bei immer größeren Systemen stören könnte, besonders wenn Sie unerfahrene Entwickler in den Mix aufnehmen. Meiner Erfahrung nach wachsen Systeme von beliebigem Wert immer weiter und werden von immer mehr Entwicklern entwickelt. "Alle Verwendungen des Symbols suchen" oder "Alle umbenennen" oder "Sicheres Löschen" oder "Fehler in Lösung suchen" ist dann von unschätzbarem Wert. Dynamisches Tippen in dem eingeschränkten Sinne, dass VB spät gebunden ist und umfangreichen Typenzwang ausübt, hat beim aktuellen Gig viele Fehler verursacht .
Henrik

Ergo, wenn Sie Glück mit Ihrem Projekt haben, zum Beispiel wenn Sie gute und erfahrene Entwickler haben oder wenn Sie Glück haben, richtigen Code zu schreiben. Sie können die dynamische Eingabe verwenden.
Henrik

2
Ah ... aber bei dieser Frage ging es nie wirklich um dynamisches Tippen :)
20.

1
Ah, sehr wahr, Raplh. Ich neige dazu, dynamische Sprachen so locker zu sehen, wie sie normalerweise locker sind. Du hast aber recht.
Henrik

4

Wenn die Sprachen nicht so unterschiedlich wären, müssten sich nicht alle so viel Mühe geben, um die Konsistenz der Codierung zu gewährleisten. Wir mögen es nicht, wenn Benutzer Anfragen stellen, die die Komplexität unnötig erhöhen. Warum sollten wir das also von unseren Entwicklungssprachen verlangen?


+1: Ich stimme vollkommen zu. Ich verstehe nicht, warum Prinzipien wie KISS und YAGNI nicht für Sprachdesign gelten sollten.
Giorgio

2

Ich persönlich bevorzuge die Fähigkeit, gerade so streng zu sein, dass ich meine Tippfehler erfassen kann, aber mit so wenig extra Kochplatte wie möglich. Ich spreche über dieses Problem unter http://www.perlmonks.org/?node_id=755790 .

Das heißt, Sie gestalten Ihre Sprache für sich. Sie sollten es so machen, wie Sie es wollen.


+1: ... Die Fähigkeit, gerade genug Strenge zu haben, um meine Tippfehler zu fangen, aber mit so wenig Extra-Boilerplate wie möglich. - Ja. Kennen Sie Anders Hejlsbergs Plan für C #? Er trifft eine bewusste Entscheidung, um "Essenz über Zeremonie" zu betonen. channel9.msdn.com/Blogs/matthijs/…
Jim G.

@ jim-g: Danke für den Gedanken. Ich kenne nicht viel von C #. Ich habe viele, viele Jahre nicht in der Microsoft-Welt gearbeitet.
btilly

1

Ich mag es, wenn meine Sprachen das tun, was ich meine. Im Allgemeinen neigt das ziemlich stark zu locker. Ich möchte auch in der Lage sein, ein Element oder einen Block mit "strict" zu markieren, um diesen begrenzten Bereich zu debuggen / analysieren.


1

Im Allgemeinen neige ich dazu, mich auf die Seite von "Was würde es mir als Programmierer leichter machen" zu stellen. Das kann natürlich mehr als eine Sache bedeuten. In Javascript gibt es fast keine Typprüfung, was großartig funktioniert, bis Sie auf einen seltsamen Fehler stoßen. Auf der anderen Seite gibt es in Haskell eine Menge Typprüfungen, die mehr Arbeit in den Vordergrund stellen, aber einige Klassen von Fehlern blockieren.

Um ehrlich zu sein, würde ich mir ein paar Sprachen ansehen, um zu sehen, was sie tun, und versuchen, eine Nische zu finden, die keiner von ihnen trifft!

Ich glaube nicht, dass es einen offensichtlichen richtigen Weg gibt, oder zumindest, wenn es etwas gibt, über das die Leute noch keinen Konsens gefunden haben. Indem wir also Sprachen mit unterschiedlichen Typsystemen erstellen, lernen wir.

Viel Glück.


1

Ich würde vorschlagen, dass eine gute Programmiersprache strenge Regeln enthält, deren Durchsetzung konsistent sein sollte, aber die Regeln sollten so geschrieben sein, dass sie hilfreich sind. Ich würde weiter vorschlagen, dass man überlegen sollte, eine Sprache zu entwerfen, um Fälle zu vermeiden, in denen die "Hamming-Distanz" zwischen zwei wesentlich unterschiedlichen Programmen nur eine ist. Offensichtlich kann man so etwas nicht mit numerischen oder String-Literalen erreichen (wenn ein Programmierer, der 123 meinte, stattdessen 1223 oder 13 eintippt, kann der Compiler nicht genau wissen, was das Programm bedeutete). Auf der anderen Seite, wenn die Sprache :=für die Zuordnung und ==für den Vergleich der Gleichheit verwendet werden soll und nicht eine einzige= für jeden rechtlichen Zweck würde dies die Möglichkeiten sowohl für zufällige Zuordnungen, die Vergleiche sein sollten, als auch für zufällige Nichtstun-Vergleiche, die Vergleiche sein sollten, erheblich verringern.

Ich würde vorschlagen, dass es zwar Orte gibt, an denen es für Compiler nützlich ist, auf Dinge zu schließen, diese Schlussfolgerung jedoch in den einfachsten Fällen oft am wertvollsten und in den komplizierteren Fällen am weniger wertvollsten ist. Zum Beispiel das Ersetzen von:

  Wörterbuch <complicatedType1, complicatedType2> item =
    neues Wörterbuch <complicatedType1, complicatedType2 ()>;

mit

  var item = new Dictionary <komplizierterTyp1, komplizierterTyp2 ()>;

erfordert keine komplizierten Typinferenzen, macht den Code jedoch deutlich lesbarer (unter anderem durch Verwendung der ausführlicheren Syntax nur in Szenarien, in denen dies erforderlich ist, z. B. weil der Typ des Speicherorts nicht genau mit dem Typ des Ausdrucks übereinstimmt Wenn Sie es erstellen, wird dies dazu beitragen, die Aufmerksamkeit auf Orte zu lenken, die es möglicherweise erfordern.

Eine Hauptschwierigkeit beim Versuch einer differenzierteren Typinferenz besteht darin, dass mehrdeutige Situationen auftreten können. Ich würde vorschlagen, dass eine gute Sprache es einem Programmierer ermöglichen sollte, Informationen in den Compiler aufzunehmen, um entweder solche Unklarheiten aufzulösen (z. B. indem einige Typecasts als anderen vorzuziehen betrachtet werden) oder festzustellen, dass sie keine Rolle spielen (z. B. weil obwohl zwei möglich sind) Überladungen können unterschiedlichen Code ausführen. Der Programmierer hat angegeben, dass sie sich in den Fällen, in denen entweder verwendet werden könnte, identisch verhalten sollten, oder sie kennzeichnen diejenigen (und nur diejenigen), die auf keine der oben genannten Arten behandelt werden können.


1

Für mich ist die Lesbarkeit am wichtigsten.

Für jemanden, der mit der Sprache vertraut ist, sollte die Bedeutung eines Codefragments klar sein, ohne den Kontext gründlich analysieren zu müssen.

Die Sprache sollte Fehler so oft wie möglich anzeigen können. Wenn jede zufällige Folge von Zeichen ein syntaktisch korrektes Programm ergibt, ist das nicht hilfreich. Und wenn Variablen automatisch erstellt werden, wenn sie zum ersten Mal verwendet werden, führt die falsche Schreibweise von clientas cleintnicht zu einem Kompilierungsfehler.

Neben der Syntax sollte die Sprache eine klar definierte Semantik haben, und vielleicht ist das sogar noch schwieriger, als sich für eine anständige Syntax zu entscheiden ...

Gute Beispiele:

  • In Java "1"ist ein String, 1ein Int, 1.0ein Double und 1Lein Long. Ein Blick und du weißt was es ist.

  • In Java =ist die Zuordnung. Es weist den Wert für primitive Typen und die Referenz für Referenztypen zu. Es werden niemals komplexe Daten kopiert oder verglichen.

  • In Java benötigt der Aufruf einer Methode Klammern und unterscheidet sich auf diese Weise deutlich von Variablen. Wenn also keine Klammern vorhanden sind, müssen Sie nicht nach einer Methodendefinition suchen, sondern nur Daten lesen.

Schlechte Beispiele:

  • In Java kann ein Symbol wie clientfast alles sein: ein Paketpfadelement, ein Klassen- oder Schnittstellenname, ein innerer Klassenname, ein Feldname, ein Methodenname, eine lokale Variable und vieles mehr. Es ist Sache des Benutzers, Namenskonventionen einzuführen oder zu befolgen oder nicht.

  • In Java wird der Punkt .überstrapaziert. Dies kann ein Trennzeichen innerhalb des Paketnamens, ein Trennzeichen zwischen Paket und Klasse, ein Trennzeichen zwischen äußerer und innerer Klasse, ein Konnektor zwischen Instanzausdruck und auf der Instanz aufzurufender Methode und vieles mehr sein.

  • In vielen Sprachen sind die geschweiften Klammern der ifBlöcke optional, was zu bösen Fehlern führt, wenn jemand dem (nicht wirklich vorhandenen) Block eine weitere Anweisung hinzufügt.

  • Infix-Operatoren: Manchmal muss ich bei einem numerischen Ausdruck innehalten und mir Schritt für Schritt überlegen, was er bedeutet. Wir alle sind es gewohnt, mathematische Ausdrücke in Infix-Notation zu schreiben a * b / c * d + e. Die meiste Zeit erinnern wir uns daran, dass Multiplikation und Division Vorrang vor Addition und Subtraktion haben (aber ist Ihnen klar geworden, dass wir nicht durch dividieren c*d, sondern nur durch cund dann durch multiplizieren d?). Es gibt jedoch so viele zusätzliche Infix-Operatoren mit eigenen Prioritätsregeln und in einigen Sprachen Überladung, dass es schwierig ist, den Überblick zu behalten. Vielleicht war es besser gewesen, die Verwendung von Klammern durchzusetzen ...


Sie haben meistens über Mehrdeutigkeit gesprochen, aber es gibt mehrere Möglichkeiten, dasselbe zu tun, ohne Mehrdeutigkeit zu erzeugen. Vielleicht können wir zwei Multiplikationsoperatoren haben, *und ×. Beide 5*3und 5 × 3` bedeuten dasselbe, und ein erfahrener Programmierer weiß genau, was sie bedeuten, ohne sich im umgebenden Kontext umschauen zu müssen. Das Problem ist jedoch, dass es jetzt zwei Möglichkeiten gibt, dasselbe zu tun, und dass jemand während des Programms zwischen ihnen wechseln kann. Ich glaube, das ist es, worüber ich mir mehr Sorgen gemacht habe, als ich die Frage gestellt habe.
Mpen

-2

Sie könnten eine Analogie zur natürlichen Sprache in Betracht ziehen. Sind Sie ein Grammatik-Nazi? Oder sind Sie mit einigen Grammatikfehlern einverstanden, wie z. B. aufgeteilten Infinitiven, fehlenden Konjunktionen oder falsch platzierten Modifikatoren. Die Antwort läuft auf persönliche Vorlieben hinaus.

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.