Lo que dijo Sean Ferenci.
Tenemos esta extraña evolución en la programación. Por un lado, los idiomas comienzan a forzar ciertas estructuras sobre nosotros ya que “Goto se considera dañino”. Por otro lado, la ciencia de la computación descubrió cada vez más que la solución rápida y eficiente a un problema en su mayoría no está estructurada.
Este problema de patrón de diseño que tendrá en C ++ y cualquier otro lenguaje orientado a objetos. Las cosas no están fuertemente ordenadas por herencia en la realidad. Amalgaman juntos. Y eso sucederá en cada proyecto orientado a objetos que hagas. Y se va el patrón, la estructura.
Los idiomas intentan facilitar la formulación de un cierto tipo de problema. Al igual que Prolog, el conjunto de reglas como lenguaje lógico es uno de los pocos. El lenguaje usualmente no implementa el patrón de diseño, estamos hablando de meta aquí. “C” y con ello muchos idiomas intentaron implementar el patrón de diseño del bucle.
- ¿Cuál es la mejor manera de defenderse contra alguien armado con un cuchillo?
- ¿Cuáles son los mejores sitios web para obtener información sobre películas?
- ¿Cuáles son algunos nombres geniales de asesinos?
- ¿Cuál es mejor: CRH (China Railway High-speed) o Shinkansen (Japanese Super Express)?
- ¿Cuáles son las mejores ciudades para visitar en Europa?
Pero los bucles no ocurren. Y ves que con todas las declaraciones de “ruptura”, “continuar” e incluso “goto” necesitas para que el bucle funcione. Y los tres bucles que necesitas para implementar eso, e incluso entonces, no es suficiente. Tendrá el caso seguro para construir algo que ya nadie entenderá o simplemente empujar una nueva dirección de devolución en la pila y volver.
Sí, eso es sucio.
Pero el mundo no está limpio. Y no se puede simplificar en un patrón simple, si intentas trabajar en ello. Todo eso está bien y bien dentro de una estructura formal cerrada como las matemáticas. Pero cuando las matemáticas llegan a la física, algo se amalgama que a ambos lados realmente no les gusta: la realidad.
Intentamos modelar la realidad y usar patrones para mejorar la comprensión. Pero un patrón siempre se servirá solo y siempre hará lo que ya se conoce.
Pero a tu pregunta. Prólogo implementa la regla lógica. Lisp y muchos idiomas modernos en la lista (no Java, C ++, sino Python, por ejemplo). Muchas lenguas modernas implementan el cálculo lambda. La mayoría de los idiomas el patrón del bucle (incluso algunos ensambladores!). La asociación es también un patrón, como el conjunto.
Luego están los lenguajes anormales, que implementan aspectos completamente diferentes y solo aquellos, como la gramática y la tokenización en bison y flex.
Pero todos ellos no implementan algo para eliminar el patrón, siempre lo implementan, para apoyar el patrón. Ha habido una gran cacería en el goto y con buena razón. Ya casi no encuentras ningún idioma, eso lo apoyará.
Bien…
Tenemos la declaración de cambio, ¿no?
/ sonríe inocentemente /
Como ves, los idiomas siguen la influencia de las ideas principales. Cómo nos gusta ver los problemas y la tontería de un patrón de problema fuerte orientado a objetos nos fue emitida durante 20 años. Y lentamente comenzamos a aprender, que es bueno tener OOP, pero que a la mayoría de los problemas no les importa nuestra visión de cómo debería ser el mundo. Siempre me ha gustado OOP, siempre trato de mantener el patrón.
Pero Python, por ejemplo, ha renunciado a toda la mierda con protección. Y ese es siempre el caso; Hay algo nuevo y todos y su hermana van y comienzan a construir una ideología alrededor de eso. Por eso siempre he odiado las lenguas wirth, son muy ideológicas y poco prácticas.
Ada también está haciendo una mierda muy burocrática. Java es el padre borracho y abusivo de la burocracia. Antes de que se haya forzado a usar ese lenguaje para producir un “hola mundo” simple e inocente, necesita un nuevo teclado y un síndrome RSI completamente desarrollado. Y no está mejorando después del “hola mundo”.
Python, por ejemplo, corta la mierda y se vuelve práctica. Simplemente compara un hola mundo de Ada y Java con uno de Python.
Los patrones no siempre son buenos.
He estado leyendo “Patrones de diseño en Java” y otras cosas a lo largo de los años. Y ahora estoy profundizando en la simple afirmación de que “las soluciones iterativas son siempre más rápidas y más eficientes que las recursivas”, pero aún no tenemos soluciones iterativas para la mayoría de nuestros problemas.
Pero tenemos programas que comienzan a escribir programas por sí mismos. Y si no me crees, simplemente toma una inofensiva ./configura e intenta ser inteligente con el Makefile que esto produce. Y ahí es donde estamos.
Estamos automatizando los procesos en desarrollo que comienzan a utilizar los lenguajes que usábamos hace 20 años. Y cuando una máquina usa estos idiomas, ya no entiendes una palabra. Si desea un sabor temprano para eso, simplemente cree un analizador simple con flex y bison. Y trata de optimizar lo que la máquina ha codificado para ti.
No vamos en la dirección de patrones de diseño limpio. Nos estamos moviendo rápidamente en la dirección de las máquinas de codificación de máquinas y estamos a un paso de las máquinas que realizan el trabajo de los programadores en la actualidad. AI no está lejos de eso. AI lleva 30 años durmiendo, pero ha vuelto.
Y con los algoritmos y principios modernos, tenemos las herramientas para hacer que funcione. Tenemos programación genética y escalada de montañas, la solución que optimiza a Wirth y Dijkstra se ahogan en el dolor. Ya tenemos Makefiles que ya nadie puede leer y código que no está hecho para que lo entiendan los humanos.
Me gustan los patrones de diseño. Realmente me gustan las buenas ideas. Eso es divertido y brillante, comprensible y fácil. Pero no es lo que el mundo va a hacer. Cada cmake, cada ./configure, flex, y bisonte te escupirán en la cara por eso y se reirán de ti.
Basta con echar un vistazo a lo que sucede en Computational Knowledge Engine. Los programas escriben programas. Y una de las últimas entradas en el Concurso Internacional de Códigos C ofuscados le mostrará cómo un programa C está escribiendo programas C, haciendo un JIT y vinculándolo a sí mismo en tiempo de ejecución, y está agregando la funcionalidad a su código.
Echa un vistazo a la IOCCC. Ahí es donde vamos. Seriamente. Malditos sean los patrones. Sería bueno tenerlo, pero ese tren, bueno, ya no puedo ver las luces rojas.
Y esto también es una amenaza para OpenSource. Porque ya no basta con abrir la fuente. Tienes que abrir la forma en que le dijiste a la máquina que produjera esa fuente. La idea de OpenSource ha llegado al siguiente paso. Y si la programación de la máquina no es algo que pueda controlar y ellos automaticen su camino hacia la solución principalmente mediante la modificación y eliminación (mutación y selección) y nada es de interés, pero si la solución es o no eficiente, podemos esperar un largo tiempo. Adiós a todo lo que sabemos sobre programación estructurada.
Estamos en el camino hacia el lugar donde los microbiólogos están con el genoma humano: ven el código pero no lo entienden. Y es curioso que el IOCCC que se fundó para mostrar dónde no debería ir la programación es exactamente el lugar al que nos dirigimos. Estamos programando máquinas para programarse a sí mismos y lo que obtenemos de eso es el peor código de espagueti que uno pueda imaginar.
Y no Djikstra nos salvará esta vez. Porque es eficiente, es lo que hace todo el mundo, es barato y rápido.