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

12

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

Ejemplo;

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

Estoy desarrollando un nuevo lenguaje de scripting para una aplicación empresarial, y mis usuarios objetivo no tienen un fondo de 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 $ es porque sin ella PHP no puede saber si un nombre es una referencia de función o una referencia de variable. Esto se debe a que el lenguaje permite referencias extrañas a funciones. Por lo tanto, el símbolo $ ayuda al analizador a separar el espacio de nombres.

No tengo este problema en mi analizador. Así que mi pregunta es puramente sobre legibilidad y facilidad de uso. He codificado durante tantos años en PHP que cuando veo $foo es fácil para mí identificar esto como una variable. ¿Estoy dando preferencia de preferencia a este identificador?

    
pregunta cgTag 17.08.2013 - 13:45

6 respuestas

12

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

Esto es lo que $ está haciendo posible en PHP:

  • Variables variables
  • Variables con nombre de palabra clave, por ejemplo, $return o poder usar el mismo nombre para una variable y una función / constante, por ej. %código%

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

  • La implementación no podría distinguir la diferencia entre funciones y variables
  • Interpolación de cadena 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 (asumiendo que $__FILE__ es una palabra clave)

return = "something";

Sin complicaciones graves. Si usaste un prefijo como return , entonces no lo haría Ha habido algún problema.

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

    
respondido por el Esailija 17.08.2013 - 17:43
6

Los sigilos realmente tienen mucho más sentido en perl, donde proporcionan una cierta cantidad de verificación de tipos. En PHP no ayudan mucho fuera de las plantillas. Puede tener una idea de su utilidad y legibilidad al mirar en diferentes idiomas. Casi ninguno los utiliza.

En un idioma específico para el usuario final en el que estoy trabajando, incluso voy más allá, haciendo que los identificadores sean insensibles a mayúsculas y permita espacios y apóstrofes. Eso me permite crear nombres de variables como Karl's height que están mucho más cerca de los lenguajes naturales.

    
respondido por el Karl Bielefeldt 17.08.2013 - 15:26
6

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 idioma. Miraste algo, sabías lo que era. Nunca profundicé demasiado en el intérprete para entender por qué este fue 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 awk y sh ). El sigilo en perl es bastante más que solo $ ya que puede identificar muchos tipos diferentes:

  • $ escalar
  • @ list
  • % hash
  • & codeblock
  • * typeglob

El sigilo identifica qué parte de la estructura de la tabla de símbolos está viendo. Detrás de escena, la entrada de la tabla de símbolos para foo (a la que se accede mediante *foo - el typeglob) tiene todo lo que puede ser un foo. Hay $foo , @foo , %foo , el formato foo , &foo , el manejador de archivos 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, esto es por lo que son los símbolos realmente , no es que debas hacer esto sino que hay algo detrás de escena que ellos hacen.

Los sigilos no son tan fáciles de leer, sino que pueden tener $foo y @foo sin tener una colisión en el espacio de nombres (compare otros idiomas donde no se puede tener ambos int foo; int[] foo; )

Los sigilos para facilitar la lectura son algo que se aprende como parte de cualquier idioma: leer la sintaxis. Usted podría, hipotéticamente, hacer que el tipo en sí (como notación húngara) forme 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 entonces podrías tener un código como

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

No estoy diciendo que esto sea una buena idea, sino que alguien que esté acostumbrado al idioma pueda leerlo de forma nativa y pensar 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 lenguaje.

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

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

Uno podría diseñar un nuevo lenguaje para no programadores que use sigilos y cualquiera que nunca haya programado antes nunca se quejará ni un poco de ellos. Por otro lado, no podría tenerlos como parte del idioma 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 encajarían los sigilos en el lenguaje 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.

    
respondido por el user40980 17.08.2013 - 23:06
2

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

Lea esta 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 escribes:   echo "var = $ var"

Sin $ ese truco será imposible.

    
respondido por el Ruslan Zasukhin 17.08.2013 - 15:00
2

Después de todas estas respuestas, quiero darle algunos puntos más 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 un 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 lenguaje.
  • Todavía no estoy de acuerdo con las "razones" expuestas por otras respuestas. Suponen que el autor de 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 luego tomar el lexer de esa gramática lingüística. Y esto es lo que debes hacer ahora. No es necesario inventar desde cero. Y apuesto lo mismo que hicieron los autores de PHP.
  • Todo lo demás que menciona la gente:
    • distingue variables de no variables
    • palabras de reservidor como nombres de variables
    • capacidad para colocar una variable dentro de la cadena
    • puede ser otra cosa (no soy un gran experto en PHP)

son efectos secundarios de este LEXER , porque puede 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. Había un problema, había una solución especial.

P.S. Muy buen comentario de MichaelT.

    
respondido por el Ruslan Zasukhin 18.08.2013 - 09:46
2

... un sigilo permite:

  • Mejor distingue variables de no variables . Las personas que todavía están aprendiendo conceptos básicos podrían tener problemas para determinar qué palabras son variables y cuáles no. A menudo comienzan por leer ejemplos o el código de otras personas sin los antecedentes adecuados.

  • Utilice palabras clave reservadas o nombres de funciones como nombres de variables . Algunas veces, encontré que algunos de esos nombres son los correctos para una variable (es decir, $count mientras que se definió la función count() ) y agradecí a los sigilos por permitirme usarlos.

  

También sucede que se reutiliza el nombre de la función para mantener el resultado de una función en una variable desechable, por ejemplo:

     

$isdir=isdir($dir);

     

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

    
respondido por el ZJR 18.08.2013 - 00:47

Lea otras preguntas en las etiquetas