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.
"..$_GET[raw].."
jedoch."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']"
.Antworten:
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.
quelle
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
key
im 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.quelle
$_GET[key]
, wissen Sie nichts. Am Ende greift man das gesamte Projekt ab, um zu wissen, obkey
es sich um eine Konstante handelt oder nicht. So etwas spart 0,5 Sekunden beim Schreiben und 20 Sekunden beim Lesen.Ü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.
quelle
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?".
quelle
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?
quelle
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.
quelle
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.
quelle
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.
quelle
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:
mit
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.
quelle
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
client
ascleint
nicht 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,1
ein Int,1.0
ein Double und1L
ein 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
client
fast 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
if
Blö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 dividierenc*d
, sondern nur durchc
und dann durch multiplizierend
?). 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 ...quelle
*
und×
. Beide5*3
und 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.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.
quelle