13

Estoy tratando de aprender algunos aspectos de la Jerarquía Chomsky que están relacionados con los lenguajes de programación, y aún tengo que leer el Libro del Dragón.jerarquía chomsky y lenguajes de programación

He leído que la mayoría de los lenguajes de programación se pueden analizar como una gramática libre de contexto (CFG). En términos de poder computacional, es igual a la de un autómata pushdown no determinista. ¿Estoy en lo cierto?

Si es cierto, ¿cómo podría un CFG mantener una gramática no restringida (UG), que está completa? Lo estoy preguntando porque, incluso si los CFG describen los lenguajes de programación, en realidad se usan para describir máquinas de turing, y así a través de un UG.

Creo que se debe a al menos dos niveles diferentes de informática, el primero, que es el análisis de un CFG se centra en la sintaxis relacionada con la estructura (representación?) Del lenguaje, mientras que el otro se centra en la semántica (¿sentido, interpretación de los datos en sí?) relacionados con las capacidades del lenguaje de programación que está completando. Nuevamente, ¿son estas suposiciones correctas?

+2

¡Demasiadas abreviaturas! Si no puede comunicarse sin codificar inútilmente, nunca será realmente eficaz. –

+3

@DonalFellows, hay dos (2) abreviaturas, y si aún no está familiarizado con CFG, no podrá responder la pregunta de todos modos. –

Respuesta

20

He leído que la mayoría de los lenguajes de programación se pueden analizar como una gramática libre de contexto (CFG). En términos de poder computacional, es igual a la de un autómata pushdown no determinista. ¿Estoy en lo cierto?

Técnicamente sí. Útil, no.

Hay al menos dos formas útiles para pensar en estas preguntas:

  • Si usted está pensando en un conjunto de cadenas, que tienen un lenguaje.
  • Si está pensando en un algoritmo para decidir si una cadena está o no en un idioma, tiene un problema de decisión .

La dificultad es que, si bien la mayoría de los lenguajes de programación tienen una estructura subyacente que se describe fácilmente por una gramática libre de contexto (Tcl ser una excepción interesante), muchas frases que se describen por la gramática libre de contexto no son en realidad "en el idioma" donde por "en el idioma" me refiero a "un programa válido en el idioma en cuestión". Estas oraciones adicionales generalmente se descartan mediante alguna forma de semántica estática . Por ejemplo, la siguiente expresión es una frase en la gramática independiente del contexto de los programas en C, pero ella misma no está en el conjunto de los programas de C válidas:

int f(void) { return n + 1; } 

El problema aquí es que no es n en su alcance. C requiere "declaración antes del uso", y esa propiedad no se puede expresar utilizando una gramática libre de contexto.

un procedimiento de decisión típica de un lenguaje de programación real es parte de la parte delantera de un compilador o intérprete, y que tiene al menos dos partes: una, la analizador, es equivalente en poder de decisión a un desplazamiento descendente autómata; pero el segundo hace verificaciones adicionales que descartan muchas expresiones como inválidas. Si estas comprobaciones requieren algún tipo de propiedad de definición antes de usar, no pueden hacerse mediante un autómata pushdown o una gramática libre de contexto.

Si es cierto, entonces, ¿cómo podría un CFG mantener una gramática no restringida (UG), que se está completando?

Un CFG no "contiene" nada — simplemente describe un idioma.

... incluso si los lenguajes de programación se describen con CFG, en realidad se usan para describir máquinas de turing, y así a través de un UG.

Aquí omite algunos niveles importantes de indirección.

Creo que es debido al menos dos niveles diferentes de la computación, el primero, que es el análisis de un CFG se centra en la sintaxis relacionada con la estructura (la representación?) De la lengua, mientras que la otra se centra en la semántica (sentido, interpretación de los datos en sí?) relacionada con las capacidades del lenguaje de programación que está completando. Nuevamente, ¿son estas suposiciones correctas?

Parecen un poco confusos para mí, pero estás en el camino correcto. Una pregunta clave es "¿cuál es la diferencia entre un idioma y un programación idioma?" La respuesta es que un lenguaje de programación tiene una interpretación computacional . Las interpretaciones computacionales vienen en muchas variedades finas, y no todas son Turing-completas. Pero la magia está en la interpretación, no en la sintaxis, por lo que la jerarquía de Chomsky no es muy relevante aquí.

para probar mi punto, un ejemplo extremo: el lenguaje ordinario [1-9][0-9]* es Turing completo bajo la siguiente interpretación:

  • El lenguaje SK-combinador es Turing completo.
  • Existen solo numerosos programas SK.
  • Se pueden enumerar fácilmente de manera única y determinista.
  • Por lo tanto, podemos asociar cada entero positivo con un programa SK.
  • Si interpretamos una secuencia de dígitos como un entero positivo de la manera estándar, también podemos interpretar la misma secuencia de dígitos como un programa SK, y además, cualquier programa SK se puede expresar usando una secuencia finita de dígitos

Por lo tanto, el lenguaje de los literales enteros es Turing-completo.

Si su cabeza no duele ahora, debería.

+0

FYI, usted * puede * hacer un BNF para Tcl. Es menos informativo que en la mayoría de los lenguajes porque los términos recursivos usuales ('if',' while', bloques de programa en general) se definen completamente en el nivel semántico. Es decir, son funciones de biblioteca estándar, nada más. (La otra cara de esto es que es * realmente * fácil insertar sintaxis extranjeras dentro de programas Tcl, siempre que estén en equilibrio entre paréntesis. Prácticamente todo es ...) –

+0

@Donal: Sí, excepto que cualquier programa puede agregar nuevas producciones arbitrarias al "gramática", dinámicamente. Tener un analizador no es muy útil en la práctica --- realmente no se puede analizar un programa Tcl --- y Tcl no tiene mucho de un analizador. Pero la incrustación de rarezas es realmente muy, * muy * fácil. –

+0

¡Muchas gracias! Fue el tipo de respuesta que estaba buscando. No estoy seguro de que todo sobre esto sea claro, pero está más claro. Y creo que entiendo el punto, "la magia está en la interpretación, no en la sintaxis". – dader

1

Esto no es absolutamente cierto. La mayoría de los lenguajes de programación tienen una sintaxis que puede describirse mediante un CFG o BNG, pero cumplir con la sintaxis no garantiza un programa legal. Hay todo tipo de condiciones adicionales como "las variables deben declararse antes del uso" o "los tipos en esta expresión deben combinarse de forma legal" que son no cubiertos por la gramática, y eso es lo que hace que los lenguajes no -contexto libre. (Esto es un poco como XML, que tiene una definición verificable formalmente, pero generalmente también restricciones adicionales que un analizador no puede verificar).

1

Muy buen ejemplo de un lenguaje, que no tiene CFG por su sintaxis es C++. Parece que no entiendes exactamente el UG. La gramática universal es un problema de interpretación descrito como un lenguaje de palabras que contiene un código para turing máquina y palabra que es aceptado por esa máquina de turing. Entonces no codificas el lenguaje en sí (conjunto de palabras), sino la máquina de turing para él. Ahora viene el punto: puedes tener un lenguaje de infinitas palabras, pero no puedes tener una palabra de infinitos símbolos. Esto significa que UG también contiene palabras finitas y, por lo tanto, todas las descripciones de las máquinas de turing son finitas. La descripción de la máquina de turing (programa en un lenguaje de programación) tiene, por lo tanto, un número finito de símbolos (enunciados), por lo que el lenguaje de las descripciones (gramática de sintaxis del lenguaje de programación) puede ser incluso regular. Mire por ejemplo en el Binary Combinatory Logic.

Cuestiones relacionadas