¿Es imaginable enseñarle a una máquina cómo programarse a una especificación definida? [cerrado]


12

Un amigo mío sin conocimientos de programación me hizo esta pregunta y me pareció interesante.

Creo que no es posible porque requeriría una inteligencia artificial realmente avanzada capaz de analizar el texto de un problema, pensar en una solución y programarlo. Solo pensar en una máquina capaz de programar una calculadora simple me parece bastante avanzado.

Pero tal vez me equivoque y me gustaría saber qué piensa al respecto y si conoce algún artículo / investigación sobre el tema, o si ya existe o si existe la posibilidad de seleccionar una especificación y obtener el máquina para autoprogramarse a esta "especificación"


44
Definir programación. Podría construir un programa que haga otros programas. ¿Pero realmente aprendería?
Pieter B

Sí, la pregunta no es sobre la generación de código sino sobre la programación real como lo hacemos los desarrolladores.
florian

Depende de lo que sea el programa. Un programa con mucha lógica empresarial de procedimiento sería mucho más difícil (y mucho menos factible) que algo funcional y puramente matemático. (Eso es una intuición, de todos modos, pero no tengo ninguna forma de respaldar eso, desafortunadamente.)
lunchmeat317

@florian: Nosotros mismos somos máquinas que hemos aprendido a programar (suponiendo que los extraterrestres / dios nos hayan creado :-)). Por supuesto, aún no hemos adquirido la capacidad de programar secuencias de ADN, etc., por lo que si crea una máquina que tiene que aprender a programar eventualmente, debe programarla para "evolucionar" y eventualmente aprender cómo se programó.
Nav

2
@maple_shaft: hice la pregunta más objetiva al alinearla con las respuestas existentes, y me preguntaba si se puede volver a abrir en su forma actual.
Tom Au

Respuestas:


15

Joel realmente respondió a esto hace unos años . El significado real de "enseñarle a una máquina a programar por sí mismo" es "enseñarle a una máquina cómo tomar una especificación y crear un programa que corresponda a esa especificación". Y con eso en mente:

El problema, aquí, es muy fundamental. Para probar mecánicamente que un programa corresponde a alguna especificación, la especificación misma debe ser extremadamente detallada. De hecho, la especificación tiene que definir todo sobre el programa, de lo contrario, nada se puede probar de forma automática y mecánica. Ahora, si la especificación define todo sobre cómo se va a comportar el programa, entonces, he aquí, ¡contiene toda la información necesaria para generar el programa! Y ahora ciertos geeks se van a un lugar muy oscuro donde comienzan a pensar en compilar automáticamente especificaciones en programas, y comienzan a pensar que acaban de inventar una forma de programar computadoras sin programar.

Ahora, este es el equivalente en ingeniería de software de una máquina de movimiento perpetuo. Es una de esas cosas que los crackpots intentan hacer, no importa cuánto les digas que nunca podría funcionar. Si la especificación define con precisión lo que hará un programa, con suficientes detalles para que pueda usarse para generar el programa en sí, esto solo plantea la pregunta: ¿cómo se escribe la especificación? Tal especificación completa es tan difícil de escribir como el programa informático subyacente, porque el escritor de especificaciones debe responder a tantos detalles como el programador. Para usar la terminología de la teoría de la información: la especificación necesita tantos bits de entropía de Shannon como el programa de computadora en sí. Cada bit de entropía es una decisión tomada por el escritor de especificaciones o el programador.

Entonces, la conclusión es que si realmente hubiera una forma mecánica de probar cosas sobre la exactitud de un programa, todo lo que podría probar es si ese programa es idéntico a otro programa que debe contener la misma cantidad de entropía como el primer programa, de lo contrario, algunos de los comportamientos serán indefinidos y, por lo tanto, no demostrados. Así que ahora la escritura de especificaciones es tan difícil como escribir un programa, y ​​todo lo que ha hecho es mover un problema de aquí para allá, y no logró nada en absoluto.

La única forma de evitar esto sería producir una computadora inteligente real con suficiente intuición para hacer todo el relleno de espacios en blanco que usted y yo hacemos automáticamente, todo el tiempo, al producir software ... en cuyo caso usted Terminaría con una computadora que se programa tan bien como un desarrollador humano. ;)


77
Puedo escribir una especificación completa para un algoritmo de clasificación mucho más fácilmente de lo que puedo llegar con la clasificación por inserción, clasificación rápida o clasificación por cubeta. Sin embargo, afirmas que es fácil transformar el primero en el segundo.
raptortech97

Joel ... ¡Ya dijo suficiente! ;-) Entiendo que para hacer eso, necesitaríamos una especificación en un idioma dado. Pero no estoy totalmente convencido sobre el argumento de que la especificación debe ser muy detallada. Nosotros, como desarrolladores, somos capaces de desarrollar un programa sin tener una especificación muy detallada. ¿No podemos desarrollar una inteligencia artificial que sea capaz de tomar una decisión "aleatoria" sobre el diseño de un programa?
Florian

66
@florian ¿Entonces quiere que el programa haga la tarea de interpretación de especificaciones que realizan los programadores humanos? Luego se convierte en el antiguo problema de la "IA fuerte", que numerosas personas inteligentes han investigado durante décadas sin ningún progreso que demostrar. Existe un acalorado debate filosófico sobre si la IA es incluso metafísicamente posible, y mucho menos prácticamente posible en el futuro lejano, y en mi experiencia, solo los vendedores de serpientes predicen una IA fuerte en el futuro cercano.

Realmente no lo quiero, me preguntaba (como me preguntó mi amigo) si era posible. Entiendo perfectamente que la IA no existe realmente y que solo se reduce a algunas opciones programadas "al azar".
Florian

2
@ raptortech97: No, no puedes. No 'completo' en el sentido de esta pregunta. Para que su especificación sea tan completa que sea capaz de transformarse mecánicamente en un programa ejecutable, esencialmente tiene que estar escrita en un lenguaje de programación. De lo contrario, su especificación tendrá un comportamiento indefinido, o simplemente está escribiendo código en un documento de MSWord.
cuál es el

4

Claro, hacemos esto todo el tiempo (para subconjuntos de problemas extremadamente limitados). Es bastante trivial imaginar dar otro paso o dos y vincular algo como Siri en la entrada de estos generadores de código (o algo así como Wolfram Alpha) que a su vez escribe código y resuelve su problema. Esperaría que algo ya exista en algún lugar para hacer las cosas más básicas.

El problema con escribir software complejo para negocios no es hacer un programa para escribir el código, es escribir un programa para cumplir con los requisitos.


Gracias por los enlaces. Aunque Yacc y Xamarin son generadores de código puramente deterministas. No crean cosas desde cero.
Florian

@florian: nada crea cosas desde cero. Siempre hay algo de entrada, son más exigentes que la mayoría.
Telastyn

1
@Telastyn: comparar la entrada / salida para un generador de analizador sintáctico con la entrada / salida para una mente humana como "más exigente" es falso en el mejor de los casos.
cuál es el

2

Creo que la respuesta de @Mason Wheeler tiene la idea clave. Dice así:

La entropía de Shannon de Tic-tac-toe es realmente pequeña. Por eso llamamos al tic-tac-toe un juego "resuelto" o "determinista". No es realmente interesante una vez que pasas la escuela primaria. Las damas tienen una entropía más alta, si consideras la entropía de todos los juegos posibles que puedes jugar. Pero las damas también son un juego "resuelto" o "determinista". Si te mueves primero, solo debes ganar o empatar. El ajedrez tiene una entropía mucho más alta, pero ningún humano ha vencido a los mejores jugadores de computadoras desde 2006. Entonces, en cierto modo, las computadoras han dominado el ajedrez de una manera que los humanos no pueden. Big Blue analizó Wikipedia, y luego jugó Jeopardy contra jugadores humanos, y los derrotó profundamente.

¿Que sigue? ¿Cuál es la entropía de una novela, o los sonetos de Shakepeare?

Del mismo modo, en el espacio de programación, lo que probablemente surgirá es un conjunto creciente de competencias. Prolog abordó un conjunto de problemas de la computadora donde configuró el problema y la computadora resolvió la respuesta. Alguien probablemente encontrará clases de problemas de programación simples que una computadora podrá satisfacer, etc. Luego, alguien se basará en eso para producir "personalización a pedido" dentro de algún espacio problemático. Y así continúa.

Creo que la pregunta se convierte en cuánto tiempo le lleva a una IA dominar una cantidad determinada de entropía ... y cuántos recursos informáticos se requieren. Creo que es inimaginable que una computadora no pueda dominar la entropía dominada por el mejor cerebro humano (no hay nada mágico en los cerebros), pero la pregunta es, ¿cuántos núcleos necesitas y cuántos siglos tomará llegar allí?

Pero ... ¿alguna vez una computadora podrá hacer mi trabajo? ¡Inconcebible!


Sin embargo, creo que es justo decir que Jeopardy es un caso un poco especial: se reduce a recordar y asociar hechos. Tome incluso a los mejores especialistas, y habrá pepitas de incluso conocimiento público que desconocen o no pueden recordar bajo presión. Por otro lado, para una computadora que es capaz de analizar una enciclopedia (como Wikipedia, Enciclopedia Británica o cualquier otra), ningún hecho declarado en esa enciclopedia es más (o menos) exótico que cualquier otro.
un CVn

1

Esto es difícil de responder porque, al igual que con la inteligencia artificial, una vez que hayamos logrado esto, será porque habremos escrito un programa que lo haga. Y los críticos dirán: "¡bueno, esta máquina no se está programando realmente! ¡Simplemente sigue exactamente el programa que le diste!"

Bueno, sí. Lo que sea que podamos lograr con las computadoras, lo haremos dándole algún programa y lo ejecutará. Si ese es un argumento en contra, entonces no podemos lograr nada. Y, sin embargo, en algún momento, la gente pensó que una computadora de ajedrez sería obviamente inteligente. Ahora pueden, y sabemos exactamente cómo, y no creemos que sea inteligente. Los submarinos aún no pueden nadar.

Entonces, considere algunos ejemplos.

Desde hace décadas, hemos tenido generadores de analizadores sintácticos . Usted les da una descripción de un idioma, se procesa y el resultado es el código de un analizador para ese idioma. Sabemos exactamente cómo se hace, pero ¿no es eso una programación de computadora en sí misma?

Segundo: editores que le dicen que ha cometido un error (error de sintaxis, variable no existente, etc.). No programa nada en sí mismo, pero puede decirte que hiciste algo mal. Es mucho en la superficie solamente.

Idiomas en los que puede hacer clic y arrastrar los controles de la IU, y el código que realmente los hará funcionar se genera automáticamente.

Compiladores JIT. Software que puede reconocer zonas activas en el software actualmente en ejecución y reemplazar parte de eso por código compilado altamente optimizado, optimizándose efectivamente mientras se ejecuta. Creo que este es un ejemplo de lo que puede parecer una programación de máquina en sí misma, hasta que sepa exactamente cómo sucede, y luego resulta que solo está haciendo lo que el programador le dijo, como siempre.

Juego general jugando. Este es un campo de investigación interesante, en el que los investigadores escriben programas que pueden leer descripciones de las reglas de los juegos, que luego los programas juegan uno contra el otro. Entonces, en lugar de un programa de tic-tac-toe o un programa de ajedrez, estos son programas que leen las reglas de tic-tac-toe o ajedrez o algún juego nuevo inventado en el lugar, y luego pueden jugarlos. El programa no se está programando en sí, pero sí juega ajedrez sin que las reglas del ajedrez hayan sido codificadas. Hubo un momento en que esto se consideraría claramente que la computadora se enseña a sí misma algo.

Hemos dado muchos pasos pequeños en la dirección general.

Pero no puedo pensar en ningún programa que se reescriba basándose en los resultados de ejecuciones anteriores, o que pueda reconocer rutinas obsoletas o ineficientes en su propio código. Creo que algún día tendremos eso, y no lo consideraremos nada especial, ya que será solo una característica del último compilador ...


0

Actualmente no y no en el futuro previsible porque necesita toda la increíble complejidad del cerebro humano para crear un programa. Y aun así, esos cerebros necesitan estar altamente entrenados para hacerlo correctamente, y aun así no todos son capaces de hacer la tarea, aunque se podría argumentar que con el tiempo suficiente se puede entrenar a cualquiera para programar.

Tomé de la forma en que formuló su pregunta que no está hablando de tareas simples emuladas.

Solicitó artículos y este artículo de Science Blogs sobre Developing Intelligence responde a esa pregunta de muchas maneras.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.