Creo que estoy bastante confundido acerca de lo que se llama cálculo y lo que se llama lenguaje de programación.
Tiendo a pensar, y podría haberme dicho, que un cálculo es un sistema formal para razonar sobre la equivalencia de los programas. Los programas tienen una semántica operativa especificada por una máquina, que debería (creo) ser determinista. De esta manera, un cálculo (correcto) para un lenguaje es un método de prueba para la equivalencia del programa.
Esto me parece una división razonable, pero ¿es este el significado comúnmente aceptado? ¿O tal vez incluso está mal?
Relacionado, ¿por qué algunas semánticas operativas no son deterministas (supongamos que son confluentes)? ¿Qué se gana al dejar abierta la opción de estrategia?
Realmente agradecería algunas aclaraciones sobre estos; y referencias concretas aún más! ¡Gracias!
Respuestas:
El significado de las palabras no es fijo, pero puedo darte mi interpretación.
Un cálculo es algo con lo que calculamos en el sentido de hacer malabares con las ecuaciones (piense en la manipulación de series de Taylor o en el cálculo de integrales en el análisis). Un cálculo nos dice cuáles son las reglas de manipulación, pero no cuáles debemos usar en una situación dada.
Un lenguaje de programación es algo que nos dice cómo calcular. Nos dice exactamente cómo usar las reglas. Por lo general, dejamos que la computadora use las reglas, ya que es mucho más rápido. Las reglas pueden ser no deterministas, y puede haber muy buenas razones para que no sean deterministas. La naturaleza del cálculo puede ser que no sea determinista (piense en procesos de comunicación concurrentes), o la fijación de una estrategia particular puede ser perjudicial para las técnicas de implementación y la optimización.
Por el contrario, Standard ML es un lenguaje de programación. Se da en términos de semántica operativa, es decir, reglas de cálculo. Hay nociones derivadas de igualdad (equivalencia contextual, equivalencia observacional, etc.) que podemos poner encima para considerarlo como una especie de cálculo.
Por supuesto, a menudo hay conexiones útiles entre un cálculo y su manifestación como lenguaje de programación. La normalización confluente es solo una forma de pasar del cálculo al lenguaje de programación (aunque lamentablemente algunas personas lo han convertido en una especie de religión). La interacción entre los cálculos y los lenguajes de programación es importante: los lenguajes de programación se pueden usar realmente, pero los cálculos explican de qué se tratan los programas.
Solo para molestar a la gente, permítanme decir también que pretender que no hay diferencia entre un cálculo y su manifestación operativa a veces conduce a visiones sesgadas de la programación y las mini religiones dentro de la comunidad de programación. Puedes intentar adivinar qué idioma tengo en mente. (¡Es un lenguaje genial!)
fuente
El objetivo de los cálculos no es solo estudiar las equivalencias de los programas, es estudiar los programas. Un ejemplo de cálculo elegante es este donde la estrategia (llamada por valor o llamada por nombre) se determina localmente. Podría implementarse algún día en un lenguaje de programación, pero primero se estudia como un cálculo. También utiliza cálculos para estudiar sistemas de tipos (con algunos cálculos como el de la teoría de tipos de Martin-Löf y también los tipos de computación).
Creo que la principal diferencia es que los cálculos deben ser (relativamente) fáciles de estudiar formalmente, mientras que los lenguajes de programación deben ser (relativamente) fáciles de usar. Esto lleva a las siguientes diferencias:
Los cálculos tienden a ser minimalistas, mientras que los PL tienden a tener redundancia (para el ciclo cuando ya tienes el ciclo while, cambia cuando ya tienes si, ...) para facilitar la expresión de lo que quieres.
Los cálculos tienen una semántica completamente especificada, mientras que la semántica de PL a menudo es descrita por un intérprete / compilador predeterminado.
Algunas semánticas operativas no son deterministas porque permiten:
Tenga en cuenta que la llamada por valor no es determinista: puede elegir evaluar primero la función o el argumento.
fuente
"Lenguaje de programación" y "cálculo" son términos polisémicos, es decir, significan cosas diferentes según el contexto.
En algunos contextos, los lenguajes de programación y los cálculos han convergido para referirse al mismo concepto, el de un sistema de reescritura basado en un conjunto de reglas formales que pueden aplicarse "mecánicamente".
La razón por la cual esta convergencia es ocasionalmente enigmática para nosotros (pero no para los desarrolladores de software o matemáticos que trabajan) es que nuestro trabajo es concebir lenguajes de programación concretos como si fueran cálculos, y encarnar físicamente los cálculos en lenguajes de programación concretos.
Para responder a su pregunta directamente, la confusión entre los cálculos y los lenguajes de programación (en la medida en que exista) no es un accidente, sino un proyecto. Nuestro proyecto. Es un testimonio de nuestro relativo éxito como disciplina científica.
fuente