¿Los sigilos hacen que el código fuente sea más fácil de leer?

13

En la mayoría de los lenguajes de programación, las variables no tienen caracteres de identificación como en PHP. En PHP debe anteponer una variable con el $carácter.

Ejemplo;

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

Estoy desarrollando un nuevo lenguaje de secuencias de comandos para una aplicación comercial, y mis usuarios objetivo no tienen experiencia en programación. ¿Estos caracteres hacen que el código sea más fácil de leer y usar?

Una razón por la que PHP usa el $es porque sin él PHP no puede decir si un nombre es una referencia de función o referencia de variable. Esto se debe a que el lenguaje permite referencias extrañas a las funciones. Entonces, el $símbolo ayuda al analizador a separar el espacio de nombres.

No tengo este problema en mi analizador. Entonces mi pregunta es puramente legible y fácil de usar. He codificado durante tantos años en PHP que cuando veo $fooes fácil para mí identificar esto como una variable. ¿Solo estoy dando preferencia a este identificador?

Reactgular
fuente
19
OMI, el código es más legible sin sigilos
John Dvorak
66
@ JanDvorak +1 por darme una nueva palabra del día. Intentaré usar sigilstres veces hoy en conversaciones.
Reactgular
66
IMO Depende si su editor tiene resaltado de sintaxis.
CodeBeard
55
Si usa var $x = ...o type $x = ...entonces creo que $ es exagerado. Si lo hubiera hecho, $x = ...entonces valdría la pena hacerlo. Especialmente si no desea admitir el resaltado de sintaxis en editores comunes. Sin embargo, como preferencia, no me gustasigils
CodeBeard
55
los sigilos son como una notación húngara forzada
monstruo de trinquete

Respuestas:

13

Las posibilidades y limitaciones técnicas reales no son nada de lo que se sugiere a lo largo de este hilo. Vamos a aclarar esos primero.

Esto es lo que $ hace posible en PHP:

  • Variables variables
  • Variables con nombre de palabra clave, por ejemplo, $returno poder usar el mismo nombre para una variable y una función / constante, por ejemplo$__FILE__

Limitaciones o características que no están relacionadas con el prefijo $:

  • De lo contrario, la implementación no puede diferenciar entre funciones y variables
  • Interpolación de cadenas PHP o sintaxis de plantilla
  • Declaración de variable requerida

Eso significa que no hay ninguna razón técnica que no puedas tener

foo = "something";
echo foo;

o

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

Sin embargo, no puede tener (suponiendo que returnes una palabra clave)

return = "something";

Sin complicaciones serias. Si utilizó un prefijo como $, entonces no habría sido ningún problema.

Es una opinión, pero creo que un sigilo valdría la pena para los no programadores, ya que les permite usar palabras clave como nombres de variables, para ellos de otra manera parecería una limitación arbitraria: P

Esailija
fuente
Acerca de return = "something";, C # tiene "palabras clave contextuales", que también es una opción que vale la pena consultar al diseñar lenguajes.
luiscubal
1
La escritura de @luiscubal que en C # no sorprendentemente requiere un sigilo, por lo que si desea que se compile ese código, debe escribir @return = "something;". Hay cierta cantidad de palabras clave contextuales, sí, pero hacer que todas ellas sean contextuales significaría una implementación mucho más complicada.
Esailija
7

Los sellos realmente tienen mucho más sentido en Perl, donde proporcionan una cierta cantidad de verificación de tipo. En php no ayudan mucho fuera de la plantilla. Puede tener una idea de su utilidad y legibilidad mirando diferentes idiomas. Casi nadie los usa.

En un lenguaje dirigido al usuario final en el que estoy trabajando, incluso voy más allá, haciendo que los identificadores no distingan entre mayúsculas y minúsculas y permitiendo espacios y apóstrofes. Eso me permite hacer que nombres de variables como Karl's heightese estén mucho más cerca de los lenguajes naturales.

Karl Bielefeldt
fuente
1
+1 para espacios en variables, pero no tengo idea de cómo implementar eso. Tampoco estoy seguro de que sea más fácil de leer. Simplemente no estoy acostumbrado.
Reactgular
1
Me gusta la idea. Pero odiaría escribir el analizador para un idioma con espacios en el identificador. :-)At Karl's for the night = true;
Martin York
Pero sería interesante ver todos estos estándares que agregamos a la parte superior de un idioma para ayudarnos a leerlo. En lugar de ser verificado manualmente por una herramienta externa, se convierte en parte de la definición del lenguaje. De esa manera, no podemos tener argumentos sin sentido sobre los nombres de los identificadores en los estándares de codificación (como están en el lenguaje).
Martin York
2
Sin embargo, la insensibilidad a los casos tiene el problema de la internacionalización. Si permite caracteres de muchos idiomas, puede encontrarse con nombres que son "iguales" en algunas configuraciones regionales, pero no en otras.
luiscubal
1
Permitir espacios en blanco en las variables no es un gran problema en principio, solo significa una regla gramatical para los identificadores que permite múltiples palabras. Sin embargo, significa que otras cosas pueden no ser posibles en la gramática sin crear ambigüedad. Por ejemplo, en Haskell, map sumes una llamada de función parcialmente aplicada: la función sumse pasa como un parámetro a map. Pero ambos son solo nombres de biblioteca, por lo que con los identificadores de varias palabras, el compilador no podría saber si se map sumtrata de un identificador de varias palabras o una aplicación de función basada en dos identificadores de una sola palabra.
Steve314
7

Hace años, aprendí Applesoft Basic. Las cadenas siempre tenían el sufijo $y las matrices tenían un sufijo de %. Así es como funcionaba el lenguaje. Miraste algo, sabías lo que era. Nunca profundicé demasiado en el intérprete para entender por qué este era el caso o las decisiones de diseño que lo hicieron así.


El sigilo en php proviene de su influencia perl (que fue influenciada por awky sh). El sigilo en perl es bastante más que solo $ya que puede identificar muchos tipos diferentes:

  • $ escalar
  • @ lista
  • % picadillo
  • & bloque de código
  • * typeglob

El sigilo identifica qué parte de la estructura de la tabla de símbolos está mirando. Detrás de escena, la entrada de la tabla de símbolos para foo (a la que se accede mediante *foo- the typeglob) tiene todo lo que puede ser un foo. Hay $foo, @foo, %foo, el formato foo , &fooel gestor de archivo foo, etc ...

Esto también permite hacer un alias de una variable a otra:

#!/usr/bin/perl

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

print "$bar @bar\n";

Esto imprime foo 1 2: en perl, para eso están realmente los sigilos , no para que debas hacer esto, sino para que haya algo detrás de escena que hacen.

Los sigilos no existen tanto para la legibilidad, sino para que uno pueda tener $fooy @foosin tener una colisión en el espacio de nombres (compare otros idiomas donde no se pueden tener ambos int foo; int[] foo;)


Los signos de legibilidad son algo que se aprende como parte de cualquier lenguaje: leer la sintaxis. Hipotéticamente, podría forzar el tipo en sí (como notación húngara) como parte del identificador.

Algo en Lex a lo largo de las líneas de:

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

Y luego podrías tener un código como

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

No digo que sea una buena idea, sino que alguien que esté acostumbrado al idioma pueda leerlo de forma nativa y piense que mejora la legibilidad, mientras que alguien que no está familiarizado con el idioma puede pensar que simplemente agrega Un montón de ruido al idioma.

Sin embargo, después de trabajar con un lenguaje definido de esta manera, probablemente podría leerlo sin problemas.

A algunas personas les gustan, a otras no. Hay grandes guerras santas en varios foros que debaten esto y realmente se reduce a cuánto las has usado.

Se podría diseñar un nuevo lenguaje para los no programadores que usa sigilos y cualquiera que nunca haya programado antes nunca se quejará un poco de ellos. Por otro lado, no podría tenerlos como parte del lenguaje y luego hacer que los programadores de ruby ​​o perl se quejen de que se están perdiendo alguna información clave.

Realmente no importa. Lo que importa es cómo los sigilos encajarían en el idioma si los usas o no. ¿Quieres poder hacer "123 $foo 456"o debes hacer "123 " + foo + " 456"? Aquí es donde se debe tomar la decisión.


fuente
1
La interpolación de cadenas como "123 $foo 456"no está habilitada por el prefijo sigil y es completamente ortogonal a ella.
Esailija
1
Es parte de la interpolación de variables y depende de cómo se analiza una cadena. Sigilos pueden hacer que más fácil (se puede hacer de otras maneras, como se muestra por la mejor manera de hacer la interpolación de variables en javascript? Pero que no forma parte del núcleo del lenguaje sigilos, sin duda, hacen que sea mucho más fácil de escribir y entender esto..
1
@MichaelT No, el hecho de que las variables tengan prefijos no facilita ni dificulta la implementación de la interpolación de cadenas. Son solo 2 cosas completamente ajenas. Para un lector humano, podría haber sido una buena opción usar $asden la sintaxis de interpolación de cadenas si $ya se usaba para prefijos variables, pero no tenía nada que ver con la posibilidad real de implementar la interpolación de cadenas en primer lugar.
Esailija
2
@Esailija, ¿podría describir cómo no están relacionados? Como comentario aparte, en en.wikipedia.org/wiki/Variable_interpolation - "Los lenguajes que admiten la interpolación variable incluyen Perl, PHP, Ruby, Tcl, Groovy y la mayoría de los shells de Unix. En estos idiomas, la interpolación variable solo ocurre cuando el literal de cadena es entre comillas dobles, pero no cuando está entre comillas simples. Las variables se reconocen porque las variables comienzan con un sigilo (generalmente "$") en estos idiomas ".
@MichaelT El símbolo de dólar que se usa en prefijos variables y la interpolación de cadenas es una elección completamente superficial (que solo tiene argumentos de legibilidad, no tiene nada que ver con la implementación, también podría ser el #que se usa en coffeescript, por ejemplo. Y coffeescript no tiene prefijo variables con #- de hecho no tiene prefijos variables)
Esailija
3

No estoy de acuerdo con que PHP use $ para diferenciar los vars de los funcs. Al menos porque PHP tiene una sintaxis tipo C y los funcs () tienen parens después del nombre.

Lea esta publicación en el desbordamiento de pila sobre por qué $ está en PHP.

Muchos lenguajes populares, como C, C ++, C #, Java no usan $ y podemos diferir fácilmente de la función var.

En PHP $ ayuda, por ejemplo, cuando escribe: echo "var = $ var"

Sin $ tal truco será imposible.

Ruslan Zasukhin
fuente
+1 ah eso tiene más sentido. Gracias.
Reactgular
3
Un lenguaje que tiene sigilos no tiene nada que ver con que tenga interpolación de cadenas como en su ejemplo deecho "var = $var"
44
-1. Las peculiaridades de la sintaxis de PHP no se deben a alguna limitación real, sino a que las reglas gramaticales están extremadamente mal diseñadas, si es que están diseñadas. Esta es la razón por la que necesitan hacks para habilitar fn()[]dónde, como con una gramática sensata, que hubiera funcionado de inmediato sin siquiera pensarlo.
Esailija
@svidgen Sí. No puede hacer la interpolación de cadenas de forma segura sin alguna forma de indicar qué parte de la cadena se supone que se debe asignar a una variable. Otros idiomas terminan con lo que considero verbosidad molesta / innecesaria, como el formato de cadena de Python. Sin embargo, también hay otras ventajas en PHP: RuslanZasukhin es incorrecto al decir que las funciones siempre se indicarán con parens, ya que también se pueden pasar como referencias.
Izkata
@Izkata La forma en que usa variables en un idioma no tiene nada que ver con la sintaxis de interpolación de cadenas. Pero eso estaba implícito en esta respuesta, por lo tanto -1 ...
Esailija
3

Después de todas estas respuestas, quiero darle más puntos a Mathew Foscarini.

  • Considera el problema ahora como un "constructor de lenguaje". Intenta comprender por qué otro idioma tiene esta o aquella característica para elegir si usar algo en su propio idioma. Estoy en la misma posición muchos años, porque estoy desarrollando el analizador SQL para nuestra base de datos Valentina.
  • Te aconsejo que eches un vistazo a antlr.org e incluso leas un libro de Terence. Tiene muchas cosas buenas para los desarrolladores de idiomas.
  • Todavía no estoy de acuerdo con las "razones" expuestas por otras respuestas. Asumen que el autor PHP en la cabeza ha decidido usar $ para poder usar palabras clave reservadas y distinguir mejor las variables de las no variables. No lo creo ... aunque probar puede ser solo su propia historia.
  • Lo más probable es que solo sigan a perl y más idiomas tempranos. Como subraya Terrence, la mayoría de los idiomas son similares, especialmente en la parte LEXER. Y, por lo general, el constructor de un nuevo idioma puede elegir qué tipo de lenguaje va a desarrollar y, a continuación, interpretar la gramática del lenguaje. Y esto es lo que debes hacer ahora. No es necesario inventar desde cero. Y apuesto a que lo mismo hicieron los autores PHP.
  • Todo lo demás que la gente menciona:
    • distinguir variables de no variables
    • palabras de reserva como nombres de variables
    • capacidad de colocar variables dentro de la cadena
    • puede ser otra cosa (no soy un gran experto en PHP)

son efectos secundarios de este LEXER , porque es capaz de reconocer un token.

Tomemos como ejemplo: en SQL usamos "" para poder usar identificadores con palabras reservadas e incluso identificadores con espacios "Nombre", "Nombre del grupo". GRUPO es una palabra clave. Hubo un problema, hubo una solución especial.

PD: Muy buen comentario de MichaelT.

Ruslan Zasukhin
fuente
+1 gracias por el gran enlace. Terminé usando este, pero su enlace se ve mucho mejor. goldparser.org
Reactgular
Gracias también por tu enlace. No he visto este analizador de oro uno antes. También se ve interesante.
Ruslan Zasukhin
@RuslanZasukhin si estás haciendo referencia a mi respuesta, nunca dije que era la intención del desarrollador habilitar palabras clave. Solo dije que usar palabras clave como nombres de variables se vuelve técnicamente posible cuando las variables tienen como prefijo un símbolo como $. Además, la "capacidad de colocar variables dentro de una cadena" no se debe a que las variables tengan como prefijo un símbolo como $. Es decir, "123 $foo 456"funcionará incluso si la sintaxis variable es como foo = 3o @foo = 3. No están relacionados entre sí.
Esailija
3

... un sigilo permite:

  • Distinguir mejor las variables de las no variables . Las personas que todavía están aprendiendo conceptos básicos pueden tener problemas para descubrir qué palabras son variables y cuáles no. A menudo comienzan leyendo ejemplos o el código de otras personas sin antecedentes adecuados.

  • Use palabras clave reservadas o nombres de funciones como nombres de variables . A veces descubrí que algunos de esos nombres eran los correctos para una variable (es decir, $countaunque había una count()función definida) y agradecí a sigils por permitirme usarlos.

También hago que el nombre de la función se reutilice con frecuencia, para mantener el resultado de una función en una variable desechable, por ejemplo:

$isdir=isdir($dir);

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

ZJR
fuente
1
ZHR, ¿qué significa mejor? En C ++ escribimos todas nuestras variables sin $ y las distinguimos perfecta y fácilmente. Ejemplo: {int z = 0; z = 55; z (z); } Y en C ++ también podemos usar el nombre de la función si es necesario asignar, por ejemplo, puntero para la función.
Ruslan Zasukhin
@RuslanZasukhin, analfabetos informáticos, ¿sabes algo? Intenta enseñarles C ++, te sorprenderá.
ZJR
Además: no creo que un sigilo deba ser siempre un $signo. Recuerdo que el signo del dólar me confundía cuando era niño debido a su asociación monetaria inherente. %podría ser una alternativa factible
ZJR