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?
Respuestas:
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:
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.fuente
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).
fuente
Aquí está mi categorización básica. Estoy tratando de dibujar un paralel con LISP.
Expresiones primitivas
Paralelo en LISP : átomos, números y listas.
Medios de combinación (formas de construir estructuras de datos compuestas)
Paralelo en LISP : celdas Cons, listas
Medios de abstracción
+
,-
,*
,/
, ...)Paralelo en LISP : funciones, como el azúcar sintáctico
let
,define
fuente
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
for
bucle 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.
fuente
x = ++x;
no es válido incluso si un compilador típico lo aceptaría.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í.
fuente
means of combination
: que es difícil descubrir qué es exactamente lo que pertenece allí. Buena respuesta, sin embargo.