Me gustaría abordar la idea que muchos carteles han dado, que tal lenguaje sería "inútil". Quizás sería inútil que los humanos escriban, manualmente, con la intención de resolver alguna tarea en particular. Sin embargo, a pesar de ser un caso de uso mayoritario para lenguajes de programación, ciertamente no es el único caso de uso. Varios casos de uso vienen a la mente donde dicho lenguaje es útil, y podemos buscar en esos campos ejemplos de dichos lenguajes.
En primer lugar, la alusión de Cort Ammon a la genética es acertada: la transformación del programa en la pregunta (en sustitución )
de 5
) puede verse como una mutación . Este tipo de manipulación es común en el campo de la computación evolutiva ; en particular, los algoritmos genéticos realizan tales transformaciones en cadenas , mientras que la programación genética transforma los programas . En cualquier caso, generalmente queremos asignar significado a cada posibilidad, ya que eso producirá el espacio de búsqueda más compacto.
Los algoritmos genéticos dependen de algún tipo de función de evaluación para cadenas; Si utilizamos un intérprete de lenguaje de programación como nuestra función de evaluación, entonces tenemos un escenario en el que es útil un lenguaje de programación que asigne significado a todas las cadenas posibles. En la programación genética, se supone que nuestra función de evaluación es un intérprete de lenguaje de programación, pero podemos elegir varias representaciones para nuestros programas; por ejemplo, muchos sistemas operan en árboles de sintaxis abstracta. Si elegimos cadenas como nuestra representación, recuperamos el mismo escenario que con los algoritmos genéticos.
Otra situación en la que podemos querer que cada cadena sea un programa válido es cuando enumeramos programas. Esto está relacionado con la biyección mencionada por CodesInChaos, pero podemos preferir operar con cadenas en lugar de números naturales por varias razones:
- Si hay alguna estructura en el lenguaje, por ejemplo. podemos asignar significado a subcadenas, esto puede perderse al traducir a números naturales. En este caso, podemos preferir usar cadenas para razonar y transformar subcadenas localmente, en lugar de representar el programa completo como un número. Esto es análogo a cómo podríamos preferir usar operaciones bit a bit en una expresión int en lugar de expresiones aritméticas, cuando cada bit tiene un significado individual. Esto es básicamente una generalización del escenario evolutivo.
- Es posible que queramos generar los programas a pedido; por ejemplo, podríamos comenzar a ejecutar un programa completamente indeterminado y solo generar (por ejemplo, aleatoriamente) las instrucciones individuales (por ejemplo, caracteres) cuando / si el puntero de instrucción llega a ellas. Esto es común en la teoría de la información algorítmica, donde el programa es una cinta de máquina de Turing, y el objetivo es caracterizar el comportamiento de los programas generados aleatoriamente. Por ejemplo, podemos formular el Solomonoff antes de cadenas arbitrarias como la probabilidad de que una máquina Turing universal con una cinta aleatoria produzca esa cadena.
En términos de lenguajes de ejemplo, muchos sistemas de cálculo evolutivo se basan en lenguajes de pila como la familia Push . Estos tienden a permitir flujos arbitrarios de tokens (que podríamos representar como caracteres individuales). A veces (como en el ejemplo Brainfuck de BrainSlugs83) existen restricciones para equilibrar los paréntesis; sin embargo, podemos relacionar esto con los programas de auto delimitación , ya que una cadena como [
no puede ser un programa válido , pero es un prefijo de programa válido . Si imaginamos un compilador / intérprete leyendo el código fuente de stdin, entonces no rechazará una cadena como [
, simplemente esperará más entrada antes de continuar.
Lenguajes como Binary Combinatory Logic y Binary Lambda Calculus surgieron directamente del trabajo en la teoría de información algorítmica, por ejemplo. de http://tromp.github.io/cl/cl.html
Este diseño de una computadora universal minimalista fue motivado por mi deseo de llegar a una definición concreta de la complejidad de Kolmogorov, que estudia la aleatoriedad de los objetos individuales.
You are a bimbo.