Analizando un lenguaje de programación

10

En SICP , los autores declaran ( Sección 1.1 ) que existen tres "mecanismos" básicos de lenguajes de programación:

  • expresiones primitivas , que representan las entidades más simples que conciernen al lenguaje

  • medios de combinación , por los cuales los elementos compuestos se construyen a partir de elementos más simples

  • medios de abstracción , por los cuales los elementos compuestos pueden ser nombrados y manipulados como unidades

¿Cómo puedo analizar un lenguaje de programación convencional (Java, por ejemplo) en términos de estos elementos o mecanismos?


fuente
¿Ha buscado anteriormente en el formulario extendido Backus-Naur, EBNF o Backus-Naur Form, BNF ? Puede descomponer una gramática similar a estos tres conceptos, aunque no estoy realmente seguro de cuáles son sus intenciones, así que no sé si ayudará o no.
Jetti
@Jetti: sí, sí, y no, no es lo que me interesa. Realmente estoy buscando analizar la semántica (pregunta: ¿esa es realmente la palabra que estoy buscando?) De los lenguajes de programación, no sus formas escritas (es decir, sintaxis).

Respuestas:

1

La distinción entre expresiones primitivas, medios de combinación y medios de abstracción es útil al modelar lenguajes de programación. Tenga en cuenta que esta no es una propiedad intrínseca del lenguaje: no puede apuntar a ninguna definición de lenguaje y decir "esta característica es inequívocamente una expresión primitiva, esa característica es inequívocamente un medio de combinación". La distinción es una propiedad del modelo, y los modelos complejos pueden resistir la clasificación.

Un ejemplo de libro de texto de estos tres conceptos es el cálculo lambda , que tiene exactamente uno de cada uno:

  • Las variables x , y , ... son las únicas expresiones primitivas.
  • La aplicación de funciones MN es el único medio de combinación.
  • La abstracción lambda λx.M es el único medio de abstracción.

Cuando accedes a idiomas con más funciones, el modelado puede volverse más ambiguo. En términos generales, una expresión primitiva es aquella que no se puede o no se descompone en componentes primitivos. Pero es como el átomo : es primitivo hasta que la ciencia avanza. Por ejemplo, hay una variante del cálculo lambda en la que las variables usan números en lugar de nombres ( índices de Bruijn ), lo cual es particularmente conveniente al modelar términos lambda para pruebas de computadora; y en pruebas de computadora, los enteros se dividen en partes constituyentes . Entonces, en estos modelos, las variables no son expresiones primitivas después de todo.

En (un modelo típico de) Java, las expresiones primitivas son principalmente constantes y variables. Los medios de combinación incluyen los numerosos operadores; más precisamente, "expresión aditiva" es un medio de combinación con dos ranuras (el lado izquierdo y el lado derecho), o con tres ranuras (los dos lados más el operador) si incluye A + B y A - B bajo ese nombre (en cuyo caso los operadores +y -serían construcciones primitivas por derecho propio). Otros medios de combinación incluyen secuencias de instrucción I ; J , construcciones de buclewhile (…) {…}, y así. Luego, tiene construcciones como declaraciones de variables, definiciones de funciones, definiciones de clase, etc., que son medios de combinación (combinan nombres y tipos de parámetros, cuerpos, inicializadores, ...) y medios de abstracción (porque definen nombres para reutilizar). De hecho, es bastante común que los medios de abstracción también sean medios de combinación: combinan un nombre con su definición.

Gilles 'SO- deja de ser malvado'
fuente
Buena respuesta; tienes a los problemas que he tenido problemas con - la distinción ambigua entre los primitivos, combinaciones, etc.
¿Qué quieres decir con "variable" exactamente? ¿No pueden describirse como medios de abstracción porque tienen un nombre?
morbidCode
@morbidCode El concepto de variable es complicado, y la palabra tiene un significado diferente pero relacionado en el cálculo lambda y en Java. Una variable puede considerarse una "abstracción" ya que se refiere a un valor no especificado. Sin embargo, no es un medio de abstracción: no crea la referencia, es simplemente una forma de utilizar la abstracción existente. Una abstracción lambda crea una forma de usar un bloque de código como un objeto que puede ser manipulado.
Gilles 'SO- deja de ser malvado'
4

Puñalada áspera:

Las expresiones son solo eso; lo que constituye una expresión en Java. No sé si eso se expandiría para incluir declaraciones o no.

Las combinaciones incluirían expresiones compuestas, (¿variables ?,) declaraciones, métodos, el mecanismo de clase y paquetes. Módulos, también, una vez que están en el idioma.

En Java, el medio más simple de abstracción es una clase: nada puede existir fuera de una clase. Hay, quizás, "capas" de abstracción: un método estático es posiblemente más simple que un método de instancia, porque no requiere una instancia.

Los genéricos ofrecen una capa adicional de abstracción (y frustración).

Dave Newton
fuente
@MattFenwick Una expresión puede consistir en una única primitiva, combinaciones de primitivas y otras entidades hacen una expresión compuesta (sigue siendo una expresión, pero no una declaración).
Dave Newton el
@MattFenwick No, no digo que una expresión sea primitiva, digo que una expresión puede consistir en una sola primitiva. No hay forma de que una cadena sea primitiva solo porque el lenguaje le proporciona azúcar sintáctico, a menos que desee diferenciar entre una cadena inmediata y la referencia que crea. Yo diría que + es, porque no se puede actuar de ninguna manera.
Dave Newton el
Con respecto a su lado: ¿Hay algún problema con la implementación de genéricos de Java?
Steven Evers
2

Aquí está mi categorización básica. Estoy tratando de dibujar un paralel con LISP.

Expresiones primitivas

  • Todos los valores primitivos, cosas que puedes representar usando literales (números, booleanos, ...)

Paralelo en LISP : átomos, números y listas.

Medios de combinación (formas de construir estructuras de datos compuestas)

  • Matrices
  • Objetos / estructuras.

Paralelo en LISP : celdas Cons, listas

Medios de abstracción

  • Toda la sintaxis de flujo de control (if, while for)
  • Todos los operadores incorporados ( +, -, *, /, ...)
  • Todas las funciones (en esta categoría incluimos clases y métodos)

Paralelo en LISP : funciones, como el azúcar sintáctico let,define

hugomg
fuente
¡Buena respuesta! Sin embargo, estaba pensando que quizás algunas de las construcciones de flujo de control encajarían bajo medios de combinación. Bonitos paralelos con LISP, que ayudan mucho.
No exactamente. Las matrices y los objetos se juegan en un nivel diferente, son parte de la representación de datos, no del lenguaje en sí. Los inicializadores de matriz son parte del lenguaje y son un medio de combinación. Los operadores y las construcciones de flujo de control no son medios de abstracción, porque no "almacenan" nada para su reutilización. Los medios de abstracción generalmente dan un nombre a una entidad para su futura reutilización con ese nombre.
Gilles 'SO- deja de ser malvado'
0

Un lenguaje de programación generalmente se define por su sintaxis y su semántica . Ambos se definirán en los estándares del idioma.

La sintaxis describe cómo escribir un programa válido y la semántica define lo que significa ese programa válido.

En sus casos, la sintaxis le dirá cuáles son sus primitivas, cómo las combina y cómo las abstrae. La semántica le dirá qué significan las combinaciones y abstracciones.

Por ejemplo, la sintaxis le dirá cómo escribir un forbucle válido . La semántica le dirá qué hace el bucle for.

Si realmente desea comenzar a analizar un lenguaje de programación, tome una copia del estándar y vea qué hay allí. Realmente comenzaría con un lenguaje simple, como C, antes de profundizar en Java. También leería el resto del libro. Aprender por qué los idiomas de programación funcionan de la manera en que lo hacen me ha convertido en un mejor programador, aunque no implemente compiladores.

mpdonadio
fuente
1
¿Esperar lo? "Simple como C antes de profundizar en Java". Me perdiste en "Simple like C".
corsiKa
Matt, supongo que realmente no entiendo lo que estás haciendo entonces. El libro que citó habla de ambas cosas, ya sea que los autores las llamen explícitamente sintaxis y semántica o no.
mpdonadio
De hecho, la "sintaxis" describe precisamente las cosas "más simples" en los idiomas, de los cuales se compone los átomos.
Ira Baxter
La sintaxis no captura completamente lo que es un programa válido, ni mucho menos. Por ejemplo, un programa sintácticamente correcto puede fallar la verificación de tipos. El programa de CA que ejecuta la declaración x = ++x;no es válido incluso si un compilador típico lo aceptaría.
Gilles 'SO- deja de ser malvado'
0

No sé si es correcto, pero la forma en que entiendo la división es la siguiente:

expresiones primitivas , estas serían, cosas como >>, +, *, /, int, boolean, variables, métodos, etc.

medios de combinación, esto puede ser discutible, ya sea sus cosas como + y concact, o está hablando de ideas más avanzadas como herencia vs composición y los métodos para hacerlo. Inyección, el nuevo operador, extensión, etc.

medios de abstracción, esta sería la sintaxis utilizada para nombrar variables y métodos, así como medios para crear interfaces, clases, clases estáticas, métodos de sobrecarga, etc.

Sin embargo, es posible que necesite darnos más información del libro para que sepamos exactamente lo que significa allí.

Beto
fuente
El libro es gratis en línea; se da un enlace en el OP. De alguna manera me sentí de la misma manera means of combination: que es difícil descubrir qué es exactamente lo que pertenece allí. Buena respuesta, sin embargo.
¿Sabes de qué otros capítulos habla sobre combinaciones y abstracciones?
Bob