He estado buscando un lenguaje de programación práctico que no tenga palabras clave reservadas, pero no he tenido suerte de encontrarlo.
Estoy trabajando en un lenguaje de programación para mi propia edificación y entretenimiento y aún no he necesitado incluir ninguna palabra clave, eso es lo que me llevó a mi búsqueda y la pregunta:
No creo que la conveniencia para el escritor del compilador sea importante para el usuario final del lenguaje. Las computadoras son lo suficientemente potentes hoy en día como para poder inferir significados del contexto. No más de lo que un escritor necesita etiquetar sustantivos, verbos y demás al escribir una novela, ¿por qué un programador debe etiquetar funciones y variables con function x() {}
o set x = 1
o var x = 1
etc; ¿Cuándo puedo inferir del contexto de las declaraciones que es una declaración de función o una invocación o que una etiqueta es una asignación a un valor o una referencia a ese valor de etiquetas?
Aquí hay un ejemplo concreto de lo que está haciendo mi analizador actual, sin necesidad de palabras clave reservadas para admitir cosas comunes que normalmente tendrían un montón de ruido como func
o function
o dec
o no.
Declaración de funciones
sum3(a,b,c) -> a + b + c.
Invocación de funciones
x = sum3(1,2,3).
Función anónima llamada x
x = (a,b,c) -> a + b + c.
y = x(1,2,3).
Me gustaría saber por qué las palabras clave son tan importantes para un lenguaje de programación exitoso.
Respuestas:
MUMPS tiene mucho éxito, se usa ampliamente en seguros y atención médica y no tiene palabras reservadas. Diría que ayudan en términos de escribir código más claro, pero no son estrictamente necesarios. APL es otro ejemplo. APL ve uso para guiones únicos en la industria nuclear, entre otros. J , un miembro de la familia APL también carece de palabras clave.
Las palabras clave ayudan a los escritores de compiladores a implementar el análisis más fácilmente. APL es famoso por su asociación correcta. También ayudan a reforzar las convenciones y mejorar la legibilidad. APL no es conocido por ser enormemente legible para la mayoría.
fuente
Un lenguaje bien conocido sin palabras clave es Lisp. Lo más parecido a las palabras clave son las llamadas formas especiales (su número puede variar entre dialectos) que reciben un trato especial del intérprete. Aparte de eso, no se pueden distinguir de las funciones regulares en términos de cómo se usan, con la excepción de que no se pueden redefinir (al menos en Lisps estoy familiarizado).
Esto da como resultado una sintaxis simple (pero muy pesada), y es una de las cosas que permitió a Lisp tener un sistema macro tan poderoso. Por otro lado, a menudo se dice que Lisp es difícil de leer. APL y MUMPS, aún más, he visto a ambos descritos como a medio camino de Brainf * ck. Las palabras clave ayudan en este departamento y también hacen que la lectura del código sea más fácil para nosotros los humanos.
Por lo tanto, no diría que se requieren palabras clave para un idioma exitoso, pero seguramente ayudan a que un idioma tenga éxito.
fuente
if
en C sería un identificador válido si no se definiera como especial (una palabra clave). Esto significa queif
no es un identificador yif = 10
da un error de sintaxis. Si no me equivoco, la sintaxis mínima de Lisp no distinguedefun
entref
,x
,y
y+
en(defun f (x y) (+ x y))
.if
es un nombre de variable válido en Common Lisp (y otros Lisp-2)(defparameter if nil)
no romperá nada y se puede usar en formas como(unless if (setf if t))
(defun if ...)
fallará. Tomó notas de los comentarios en cuenta y editó la respuesta. Estoy de acuerdo en que los formularios especiales no son palabras clave en el mismo nivel que en C, por ejemplo, todavía son lo más parecido que tiene Lisp.TCL no tiene palabras clave, y de hecho solo 12 reglas de sintaxis. Si bien no es tan popular como lo era antes, tiene su nicho con el esperado y está integrado en ECAD y enrutadores, por lo que sin duda es algo práctico para mí.
También creo que puede mostrar por qué muchos idiomas no siguen esta ruta. Sí, es perfectamente posible escribir un analizador TCL (posiblemente más fácil que muchos otros idiomas), sin embargo, no puede escribir una gramática BNF muy útil para el idioma y muchas personas parecen tener problemas para aprender el idioma. Sospecho que esto se debe al menos en parte a la falta de palabras clave.
fuente
¿Esto significa que quieres una gramática que no esté libre de contexto? Buena suerte.
No se trata de ser poderoso o no. Existen reglas eternas e inmutables sobre los idiomas: las matemáticas. Esto, y el hecho de que un lenguaje de programación debería ser sintácticamente fácil hará que los CFG gobiernen en las próximas décadas.
Por cierto, en Haskell como sintaxis, solo escribes algo como
para definir una función Pero observe que la "palabra clave" en este caso es el '='. Si te lo pierdes, cosas terribles sucederán en el analizador.
Pero este es un punto en el que estoy de acuerdo con usted, lo encuentro mucho más intuitivo que todas las palabras clave def, dcl, fun, fn, function o what-not que introducen funciones en otros idiomas.
Sin embargo, esta gramática se puede escribir en LALR antiguo (1), aquí no se infiere ningún significado del contexto.
fuente
{ int x = 0; x = "HELLO"; }
debería producir un árbol de análisis, pero cuando el compilador busca x en la segunda asignación, ve que se ha declarado como int y emite un error de tipo. Por lo tanto, el programa se rechaza incluso si su estructura CF es correcta.Hasta donde sé, Smalltalk es el idioma que tiene menos palabras clave (si no cuento idiomas como Brainfuck). Palabras clave son Smalltalk
true
,false
,nil
,self
,super
ythisContext
.He diseñado un idioma, inspirado en smalltalk, que no tenía palabras clave. Pero después de un tiempo de usarlo, terminé agregando algunas palabras clave, principalmente para el azúcar sintáctico.
Entonces, mi opinión es que el lenguaje sin palabras clave es posible, pero no es muy práctico y esa es la razón por la cual todos los idiomas populares tienen palabras clave.
fuente
true
,false
ynil
se podría definir como métodos en ese receptor implícito, y, dadas las capacidades de reflexión, los otros tres, probablemente, también.true
,false
ynil
son valores bien conocidos suministrados por el entorno yself
,super
ythisContext
son variables que no puede establecer pero cuyos valores cambian como resultado de la ejecución.Parece que está trabajando bajo una suposición falsa, que las palabras clave están ahí para facilitar las cosas al compilador. Si bien facilitan las cosas para el compilador, tienen un beneficio mucho más importante: facilitan las cosas para la persona que lee el código .
Sí, podría mirar un montón de contexto y descubrir que está viendo una declaración de función o una declaración de variable, pero dependiendo del contexto y de la complejidad del código involucrado, eso podría tomar mucho tiempo para descubrir . O bien, podría tener una palabra clave útil como función o var , y sabrá de inmediato lo que está viendo.
Sí, hacen que el código sea más complicado de escribir , pero teniendo en cuenta que los programas pasan mucho más tiempo en mantenimiento que en producción, y que su código se lee, depura y mantiene mucho más de lo que se crea, tratando de diseñar su lenguaje para hacer que sea fácil de escribir en lugar de fácil de leer es un caso clásico de optimización prematura dañina.
Además, no desdeñe los conceptos que facilitan el trabajo del compilador. Cuanto más fácil sea analizar, más rápido se compilará su código, lo que significa que los ciclos de edición-construcción-depuración se vuelven más rápidos, lo que significa que su productividad aumenta.
Cuando tiene una base de código grande y compleja, eso puede suponer una diferencia no trivial en la productividad. Por ejemplo, donde trabajo tenemos un programa en el trabajo que tiene alrededor de 4 millones de líneas de Delphi. Tenemos otro módulo que tiene aproximadamente 300,000 líneas de C ++. Ambos toman aproximadamente el mismo tiempo para compilar. (Aproximadamente 3 minutos.) ¡Si tuviéramos 4 millones de líneas de C ++, podría tomar una hora construirlo!
fuente
Hay algunos ejemplos raros.
APL usa solo símbolos, ¡pero muchos de ellos! Necesita un teclado especial para usar el idioma.
Ver este artículo de Wikipedia
CORAL 66: tenía palabras clave, pero solo las reconocía si se citaban con comillas simples.
PL / 1 también tenía palabras clave, pero también podría usarlas como nombres de variables o procedimientos.
En general, su pregunta es un poco como preguntar "¿por qué los idiomas hablados tienen palabras?".
fuente
La razón principal es que es más fácil de analizar tanto para humanos como para computadoras. La desambiguación de un lenguaje complejo sin palabras clave requeriría muchos símbolos como sintaxis, y sería enorme e innecesariamente confuso. Es mucho más fácil de leer
function
que$!{}
. Y el contexto no resuelve todas las ambigüedades.fuente