Erleichtern Sigillen das Lesen des Quellcodes?


13

In den meisten Programmiersprachen haben Variablen keine identifizierenden Zeichen wie in PHP. In PHP müssen Sie einer Variablen das $Zeichen voranstellen .

Beispiel;

 var $foo = "something";
 echo $foo;

Ich entwickle eine neue Skriptsprache für eine Geschäftsanwendung und meine Zielbenutzer haben keinen Programmierhintergrund. Erleichtern diese Zeichen das Lesen und Verwenden des Codes?

Ein Grund, warum PHP das verwendet, $ist, dass PHP ohne es nicht erkennen kann, ob ein Name eine Funktionsreferenz oder eine Variablenreferenz ist. Dies liegt daran, dass die Sprache seltsame Verweise auf Funktionen zulässt. Das $Symbol hilft dem Parser also, den Namespace zu trennen.

Ich habe dieses Problem nicht in meinem Parser. Meine Frage ist also nur die Lesbarkeit und Benutzerfreundlichkeit. Ich habe so viele Jahre in PHP programmiert, dass $fooes mir leicht fällt, diese Variable zu identifizieren , wenn ich sie sehe . Gebe ich diesem Bezeichner nur eine Vorliebe?


19
IMO, Code ist ohne Siegel besser lesbar
John Dvorak

6
@JanDvorak +1 für ein neues Wort des Tages. Ich werde versuchen, sigilsheute dreimal in Gesprächen zu verwenden.
Reactgular

6
IMO Es hängt davon ab, ob Ihr Editor über Syntaxhervorhebungen verfügt.
CodeBeard

5
Wenn Sie var $x = ...oder type $x = ...dann verwenden, denke ich, ist $ Overkill. Wenn Sie es nur $x = ...getan hätten , könnte es sich lohnen, es zu tun. Insbesondere, wenn Sie die Syntaxhervorhebung in gängigen Editoren nicht unterstützen möchten. Allerdings mag ich nichtsigils
CodeBeard

5
Siegel sind wie eine erzwungene ungarische Notation
Ratschenfreak

Antworten:


13

Die tatsächlichen technischen Möglichkeiten und Einschränkungen sind nicht von der Art, wie sie in diesem Thread vorgeschlagen werden. Lassen Sie uns diese zuerst ausräumen.

Folgendes macht $ in PHP möglich:

  • Variable Variablen
  • Variablen mit Schlüsselwortname zB $returnoder der gleichen Bezeichnung für eine Variable und eine Funktion / Konstante zB$__FILE__

Einschränkungen oder Funktionen, die nichts mit dem Präfix $ zu tun haben:

  • Die Implementierung kann ansonsten keinen Unterschied zwischen Funktionen und Variablen feststellen
  • PHP-String-Interpolation oder Template-Syntax
  • Erforderliche Variablendeklaration

Das heißt, es gibt keinen technischen Grund, den Sie nicht haben könnten

foo = "something";
echo foo;

oder

foo = "something";
echo "foo = $foo";
//would print
//foo = something 

Dies ist jedoch nicht möglich (vorausgesetzt, es returnhandelt sich um ein Schlüsselwort).

return = "something";

Ohne ernsthafte Komplikationen. Wenn Sie ein Präfix wie verwendet hätten $, wäre es kein Problem gewesen.

Es ist eine Meinung, aber ich glaube, ein Siegel wäre es wert für Nicht-Programmierer, da es ihnen ermöglicht, Schlüsselwörter als Variablennamen zu verwenden, für sie würde es ansonsten wie eine willkürliche Einschränkung aussehen: P


Über return = "something";, C # hat "kontextbezogene Schlüsselwörter", die auch eine Option ist, die es wert ist, beim Entwerfen von Sprachen überprüft zu werden.
Luiscubal

1
@ Luiscubal Schreiben, das in C # nicht überraschend ein Siegel erfordert. Wenn Sie also möchten, dass dieser Code kompiliert wird, müssen Sie schreiben @return = "something;". Es gibt eine gewisse Anzahl von kontextbezogenen Schlüsselwörtern, aber alle kontextbezogen zu machen, würde eine viel kompliziertere Implementierung bedeuten.
Esailija

7

Sigils sind in Perl viel sinnvoller, da sie eine gewisse Art der Typprüfung ermöglichen. In PHP helfen sie nicht viel außerhalb des Templatings. Sie können sich ein Bild von deren Nützlichkeit und Lesbarkeit machen, indem Sie sich in verschiedenen Sprachen umsehen. Kaum jemand benutzt sie.

In einer Endbenutzersprache, an der ich arbeite, gehe ich sogar noch weiter, indem ich die Groß- und Kleinschreibung von Bezeichnern nicht beachte und Leerzeichen und Apostrophe zulasse. Auf diese Weise kann ich Variablennamen erstellen Karl's height, die den natürlichen Sprachen viel näher kommen.


1
+1 für Leerzeichen in Variablen, aber ich habe keine Ahnung, wie man das implementiert. Ich bin mir nicht sicher, ob ich das besser lesen kann. Ich bin es einfach nicht gewohnt.
Reactgular

1
Ich mag die Idee. Aber ich würde es hassen, den Parser für eine Sprache mit Leerzeichen im Bezeichner zu schreiben. :-)At Karl's for the night = true;
Martin York

Es wäre jedoch interessant, all diese Standards zu sehen, die wir einer Sprache oben hinzufügen, damit wir sie besser lesen können. Anstatt manuell von einem externen Tool überprüft zu werden, werden Sie Teil der Sprachdefinition. Auf diese Weise können wir keine sinnlosen Argumente zu Bezeichnernamen in den Codierungsstandards haben (wie sie in der Sprache sind).
Martin York

2
Die Unempfindlichkeit gegenüber Groß- und Kleinschreibung hat jedoch das Problem der Internationalisierung. Wenn Sie Zeichen aus vielen Sprachen zulassen, werden Sie möglicherweise auf Namen stoßen, die in einigen Gebietsschemata "gleich" sind, in anderen jedoch nicht.
Luiscubal

1
Das Zulassen von Leerzeichen in Variablen ist im Prinzip keine große Sache - es bedeutet lediglich eine Grammatikregel für Bezeichner, die mehrere Wörter zulässt. Dies bedeutet jedoch, dass andere Dinge in der Grammatik möglicherweise nicht möglich sind, ohne Mehrdeutigkeiten zu erzeugen. In Haskell map sumhandelt es sich beispielsweise um einen teilweise angewendeten Funktionsaufruf, an den die Funktion sumals Parameter übergeben wird map. Da beide nur Bibliotheksnamen sind, konnte der Compiler bei Mehrwort-IDs nicht wissen, ob map sumes sich um eine Mehrwort-ID oder eine Funktionsanwendung handelt, die auf zwei Einwort-IDs basiert.
Steve314

7

Vor Jahren habe ich Applesoft Basic gelernt. Zeichenfolgen wurden immer mit $einem Suffix versehen und Arrays mit einem Suffix von %. So hat die Sprache funktioniert. Sie haben etwas angeschaut, Sie wussten, was es war. Ich habe mich nie zu sehr mit dem Dolmetscher befasst, um zu verstehen, warum dies der Fall war oder welche Designentscheidungen es dazu geführt haben.


Das Siegel in PHP kommt von seinem Perl-Einfluss (der von awkund beeinflusst wurde sh). Das Sigil in Perl ist weit mehr als nur $das Identifizieren vieler verschiedener Typen:

  • $ Skalar
  • @ aufführen
  • % hash
  • & Codeblock
  • * Typeglob

Das Siegel kennzeichnet, welchen Teil der Symboltabellenstruktur Sie betrachten. Hinter den Kulissen enthält der Symboltabelleneintrag für foo (auf den über *foo- den Typeglob zugegriffen wird ) alles, was ein foo sein kann. Es gibt $foo, @foo, %foo, das Format foo , &foodie Dateikennung foo, etc ...

Dies ermöglicht auch das Erstellen eines Alias ​​von einer Variablen zu einer anderen:

#!/usr/bin/perl

$foo = "foo";
@qux = (1,2);
*bar = \$foo;
*bar = \@qux;

print "$bar @bar\n";

Dies druckt foo 1 2- in Perl, das ist, wofür die Siegel wirklich sind , nicht, dass Sie dies tun sollten, sondern dass es diese Sache hinter den Kulissen gibt, die sie tun.

Die sigils gibt es nicht so viel für die Lesbarkeit, sondern so , dass man haben kann $foound @fooohne eine Kollision im Namensraum (vergleiche anderen Sprachen , wo man kann nicht beides haben int foo; int[] foo;)


Zeichen für die Lesbarkeit werden in jeder Sprache gelernt - beim Lesen der Syntax. Sie könnten hypothetisch erzwingen, dass der Typ selbst (als ungarische Notation) Teil des Bezeichners ist.

Etwas in Lex im Sinne von:

typeChar  [is]
capLetter [A-Z]
letter    [a-z]
digit     [0-9]
%%
{typeChar}{capLetter}(letter}|{digit})* { prientif("iddentifier");}
%%

Und dann könnten Sie Code wie haben

iFoo = 42;
sFoo = "a string";
iBar = iFoo * 2;

Ich sage nicht, dass dies eine gute Idee ist, sondern dass jemand, der an die Sprache gewöhnt ist, dies von Haus aus lesen kann und denkt, dass es die Lesbarkeit verbessert, während jemand, der mit der Sprache nicht vertraut ist, der Meinung ist, dass es nur etwas hinzufügt ein Haufen Lärm für die Sprache.

Nachdem ich mit einer so definierten Sprache gearbeitet hatte, konnte ich sie wahrscheinlich problemlos lesen.

Manche mögen sie, manche nicht. Es gibt große heilige Kriege in verschiedenen Foren, die dies diskutieren, und es läuft wirklich darauf hinaus, wie oft Sie sie benutzt haben.

Man könnte eine neue Sprache für Nicht-Programmierer entwerfen, die Sigillen verwendet, und jeder, der noch nie zuvor programmiert hat, wird sich nie ein bisschen über sie beschweren. Auf der anderen Seite könnten Sie sie nicht als Teil der Sprache haben und Ruby- oder Perl-Programmierer könnten sich darüber beschweren, dass ihnen einige wichtige Informationen fehlen.

Es ist wirklich egal. Es kommt darauf an, wie Siegel in die Sprache passen, wenn Sie sie verwenden oder nicht. Wollen Sie können "123 $foo 456"oder müssen Sie "123 " + foo + " 456"? Hier sollte die Entscheidung getroffen werden.


1
Zeichenfolgeninterpolation wie "123 $foo 456"wird durch das Präfix sigil nicht aktiviert und ist vollständig orthogonal dazu.
Esailija

1
Es ist Teil der Interpolation von Variablen und hängt davon ab, wie eine Zeichenfolge analysiert wird. Sigils kann man erkennen, leichter machen (es andere Möglichkeiten getan werden kann , wie durch gezeigt beste Art und Weise variable Interpolation in Javascript zu tun? Aber das ist nicht Teil der Kernsprache Sigils, wohl, es viel einfacher zu schreiben machen und diese verstehen..

1
@MichaelT Nein, die Tatsache, dass Variablen Präfixe haben, macht die Implementierung der Zeichenfolgeninterpolation weder einfacher noch schwieriger. Sie sind nur zwei völlig unabhängige Dinge. Für einen menschlichen Leser mag es eine gute Wahl gewesen sein, $asddie Zeichenfolgeninterpolationssyntax zu verwenden, wenn sie $bereits für Variablenpräfixe verwendet wurde, aber es hatte nichts mit der tatsächlichen Möglichkeit zu tun, die Zeichenfolgeninterpolation überhaupt zu implementieren.
Esailija

2
@Esailija könntest du beschreiben, inwiefern sie nichts miteinander zu tun haben? Abgesehen davon, von en.wikipedia.org/wiki/Variable_interpolation - "Zu den Sprachen, die die Variableninterpolation unterstützen, gehören Perl, PHP, Ruby, Tcl, Groovy und die meisten Unix-Shells. In diesen Sprachen tritt die Variableninterpolation nur auf, wenn das Zeichenfolgenliteral lautet Doppelte Anführungszeichen, jedoch keine einfachen Anführungszeichen. Die Variablen werden erkannt, da sie in diesen Sprachen mit einem Siegel (normalerweise "$") beginnen. "

@MichaelT Das in Variablenpräfixen und der Zeichenfolgeninterpolation verwendete Dollarsymbol ist eine völlig oberflächliche Wahl (die nur Lesbarkeitsargumente enthält und nichts mit der Implementierung zu tun hat, kann auch das sein, #das beispielsweise in Coffeescript verwendet wird. Und Coffeescript hat kein Präfix Variablen mit #- in der Tat Präfix Variablen überhaupt nicht)
Esailija

3

Ich bin nicht einverstanden, dass PHP $ verwendet, um sich von funcs zu unterscheiden. Zumindest, weil PHP eine C-ähnliche Syntax hat und funcs () nach dem Namen Parens hat.

Lesen Sie diesen Beitrag über den Stapelüberlauf darüber, warum $ in PHP ist.

Viele gängige Sprachen, wie C, C ++, C #, Java, verwenden kein $ und wir können einfach var von der Funktion unterscheiden.

In PHP hilft $ zum Beispiel, wenn Sie schreiben: echo "var = $ var"

Ohne $ wird ein solcher Trick unmöglich sein.


+1 ah das macht mehr Sinn. Vielen Dank.
Reactgular

3
Eine Sprache mit Siegeln hat nichts damit zu tun, dass sie eine Zeichenfolgeninterpolation aufweist, wie in Ihrem Beispiel vonecho "var = $var"

4
-1. PHP-Syntax-Macken beruhen nicht auf einer tatsächlichen Einschränkung, sondern darauf, dass die Grammatikregeln, wenn überhaupt, äußerst schlecht gestaltet sind. Dies ist der Grund, warum sie Hacks benötigen, um zu ermöglichen, fn()[]wo dies mit vernünftiger Grammatik möglich gewesen wäre, ohne darüber nachzudenken.
Esailija

@svidgen Ja. Sie können die Zeichenfolgeninterpolation nicht sicher durchführen, ohne anzugeben, welcher Teil der Zeichenfolge einer Variablen zugeordnet werden soll. Andere Sprachen enden mit etwas, was ich für ärgerlich / unnötig halte, wie Pythons String-Formatierung. Es gibt jedoch auch andere Vorteile in PHP: RuslanZasukhin sagt fälschlicherweise, dass Funktionen immer mit parens angegeben werden, da sie auch als Referenzen weitergegeben werden können.
Izkata

@Izkata Die Art und Weise, wie Sie Variablen in einer Sprache verwenden, hat nichts mit der Syntax der Zeichenfolgeninterpolation zu tun. Aber das war in dieser Antwort impliziert, daher -1 ...
Esailija

3

Nach all diesen Antworten möchte ich Mathew Foscarini noch einige Punkte geben.

  • Sie betrachten das Problem jetzt als "Sprachkonstruktor". Sie versuchen zu verstehen, warum eine andere Sprache über diese oder jene Funktion verfügt, um zu entscheiden, ob Sie etwas in Ihrer eigenen Sprache verwenden möchten. Ich bin viele Jahre in derselben Position, weil ich SQL-Parser für unsere Valentina-Datenbank entwickle.
  • Ich rate Ihnen, sich antlr.org anzuschauen und sogar ein Buch von Terence zu lesen. Es hat viele schöne Dinge für Sprachentwickler.
  • Ich bin immer noch nicht einverstanden mit "Gründen", die durch andere Antworten aufgedeckt wurden. Sie gehen davon aus, dass der PHP-Autor im Kopf entschieden hat, $ zu verwenden, um reservierte Schlüsselwörter zu verwenden und Variablen besser von Nicht-Variablen zu unterscheiden. Ich denke nicht ... obwohl beweisen kann nur seine / ihre eigene Geschichte sein.
  • Höchstwahrscheinlich folgen sie nur Perl und älteren Sprachen. Wie Terrence betont, sind die meisten Sprachen ähnlich, insbesondere im LEXER-Teil. Und normalerweise kann der Konstrukteur einer neuen Sprache einfach auswählen, welche Art von Sprache er entwickeln will, und dann Lexer dieser Sprachgrammatik nehmen. Und das solltest du jetzt tun. Keine Notwendigkeit, von Grund auf neu zu erfinden. Und ich wette, dasselbe haben PHP-Autoren getan.
  • Alles andere, was die Leute erwähnen:
    • Variablen von Nicht-Variablen unterscheiden
    • Reserver-Wörter als Variablennamen
    • Möglichkeit, eine Variable innerhalb eines Strings zu platzieren
    • kann sonst sein (ich bin kein großer Experte in PHP)

sind Nebenwirkungen dieses LEXER , weil es einen Token erkennen kann.

Nehmen wir als Beispiel: In SQL verwenden wir "", um Bezeichner mit reservierten Wörtern und sogar Bezeichner mit Leerzeichen "Vorname", "Gruppenname" verwenden zu können. GROUP ist ein Schlüsselwort. Es gab ein Problem - es gab eine spezielle Lösung.

PS Sehr guter Kommentar von MichaelT.


+1 Danke für den tollen Link. Ich habe dieses letztendlich benutzt, aber dein Link sieht viel besser aus. goldparser.org
Reactgular

Danke auch für deinen Link. Ich habe diesen Goldparser noch nie gesehen. Sieht auch interessant aus.
Ruslan Zasukhin

@ RuslanZasukhin Wenn Sie auf meine Antwort verweisen, habe ich nie gesagt, dass es die Absicht des Entwicklers war, Keywords zu aktivieren. Ich habe nur gesagt, dass die Verwendung von Schlüsselwörtern als Variablennamen technisch möglich wird, wenn den Variablen ein Symbol wie vorangestellt wird $. Auch die "Fähigkeit, Variablen in Zeichenfolgen zu platzieren" beruht nicht darauf, dass Variablen ein Symbol wie "" vorangestellt wird $. Das heißt, "123 $foo 456"funktioniert auch dann, wenn die Variablensyntax wie foo = 3oder ist @foo = 3. Sie sind nicht miteinander verwandt.
Esailija

3

... ein Siegel erlaubt:

  • Unterscheide Variablen besser von Nicht-Variablen . Menschen, die noch Grundbegriffe lernen, haben möglicherweise Schwierigkeiten herauszufinden, welche Wörter Variablen sind und welche nicht. Sie beginnen oft damit, Beispiele oder den Code anderer zu lesen, die keinen angemessenen Hintergrund haben.

  • Verwenden Sie reservierte Schlüsselwörter oder Funktionsnamen als Variablennamen . Manchmal stellte ich fest, dass einige dieser Namen die richtigen für eine Variable waren (dh $countwährend eine count()Funktion definiert war) und dankte Sigils, dass ich sie verwenden durfte.

Ich verwende diesen Funktionsnamen auch häufig wieder, um das Ergebnis einer Funktion in einer Wegwerfvariablen zu speichern, z.

$isdir=isdir($dir);

if(/* complex condition implying $isdir */) {
/* etc */
}


1
ZHR, was heißt besser? In C ++ schreiben wir alle unsere Variablen ohne $ und unterscheiden sie perfekt und einfach. Beispiel: {int z = 0; z = 55; z (z); } Und in C ++ können wir auch den Funktionsnamen verwenden, wenn eine Zuweisung erforderlich ist, z. B. Zeiger auf Funktion.
Ruslan Zasukhin

@ RuslanZasukhin, Computer Analphabeten, kennen Sie einige? Versuchen Sie ihnen C ++ beizubringen, Sie werden begeistert sein.
ZJR

Außerdem: Ich denke nicht, dass ein Siegel immer ein $Zeichen sein muss. Ich erinnere mich an das Dollarzeichen, das mich verwirrte, als ich ein Kind war, wegen seiner angeborenen Geldassoziation. %könnte eine praktikable Alternative sein.
ZJR
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.