¿Hay alguna razón para creer que los lenguajes de programación van a converger?

En la Tierra hoy, aunque la mayoría de la gente habla algo de inglés, aparentemente no hay razón para creer que el idioma principal de la generación futura será el mismo en las próximas décadas o siglos (es decir, seguiremos teniendo diferentes idiomas nativos y aprenderemos un idioma común). más adelante en la vida).

Del mismo modo, hay un montón de diferentes lenguajes de programación. Pero el proceso de iteración es mucho más rápido aquí. Los nuevos lenguajes de programación se crean regularmente, los viejos se vuelven obsoletos...

¿Hay alguna razón para creer que los lenguajes de programación van a converger en un solo lenguaje en las próximas décadas o siglos?

Creo que para que los lenguajes converjan, primero necesitaríamos que el hardware converja. La computación paralela está obligando a algunos a cambiar los lenguajes actuales como Java por otros más adecuados. Aunque si tenemos computadoras personales exaflop, ¿quién necesita esos molestos buenos algoritmos? Los lenguajes de alto nivel no verán mucha diferencia con los de bajo nivel.
Hace poco sueño con un buen idioma que pueda hacer todo, pero no es tan fácil. A estas alturas, uno puede pensar en todos los métodos de control informático como un gran lenguaje complicado. Un buen lenguaje unificado podría usar todos los paradigmas evitando convenciones contradictorias innecesarias como el tamaño frente a la longitud, pero por ejemplo a) a las personas les gustan cosas diferentes y es posible que no estén de acuerdo fácilmente b) la unificación necesitaría mucho trabajo de todos modos.
Por supuesto que no hay razón. ¿Cómo exactamente vas a "convergir" cosas como Brainfuck y Haskell?
En realidad, hay dos tipos de programadores: los que persiguen el último lenguaje del momento, creyendo que resolverá todos sus problemas, y el resto de nosotros, que hacemos un trabajo útil. Apuesto a que dentro de siglos, la gente seguirá usando C & FORTRAN, mientras que los lenguajes de moda seguirán el camino de SNOBOL, Forth y muchos otros cuyos nombres ni siquiera puedo recordar.
Esta es una pregunta que se hace ocasionalmente en Programmers.SE: ¿Por qué no creamos un lenguaje universal? Porque la semántica de alto nivel puede ser incompatible y el diseño de PL es un juego de compensaciones .
@ Mints97 Para ser justos, Brainfuck pretende ser una especie de parodia de un lenguaje de programación. Prefiero pensar en LISP, C y Perl. Todos fueron diseñados para propósitos del mundo real, al menos.
@BartekChom Sí. Microsoft también se subió al tren de OpenGL: se fueron para hacer su propio DirectX porque tenían que hacer software . El comité estaba tardando demasiado en resolver los problemas más simples. La unificación es una perspectiva tentadora, pero también es lenta, dolorosa e inflexible. Si One Way duele, alguien va a hacer Otro Way que no duele, y sus esfuerzos de unificación son en vano.
No entiendo la premisa... Si C++ converge en Java, lo que realmente sucede es que estás usando Java. Si aparece un nuevo lenguaje que es una mezcla de Java y C++ (y, supuestamente, mejor que ambos), no sería una convergencia de Java y C++ sino un nuevo lenguaje diferente (entonces, no son "dos convergentes en uno" como "aparece uno nuevo y se abandonan los otros dos")...
Las comunidades de Perl y Python una vez intentaron converger ;-)
Los lenguajes se vuelven obsoletos pero muy lentamente, C puro todavía se usa mucho en ciertas áreas, pero para proyectos más grandes no es una opción óptima en absoluto. Por lo tanto, parece que siempre habrá diferentes idiomas para diferentes situaciones (controladores frente a aplicaciones comerciales basadas en la web, por ejemplo)
¿Por qué convergerían los lenguajes de programación? Son herramientas, después de todo. ¿Convergen las herramientas de los herreros? ¿Convergen las herramientas de los carpinteros?
@el.pescado Bueno, tenemos fábricas que pueden hacer casi cualquier cosa con metal o madera...
@Sheraff Aún así, si la fábrica quiere hacer algo de metal, puede fundirlo, puede CNC, enrollarlo, soldarlo a partir de piezas más pequeñas... Muchas técnicas.
Xkcd obligatorio sobre el tema xkcd.com/927 Parte del problema es que no todos estarán de acuerdo en cuál debería ser ese lenguaje de programación.
Tal vez si la IA del futuro, que se programa a sí misma, es capaz de llegar a un acuerdo. Pero dudo que sean capaces también.
Este lenguaje de programación ya existe, se llama lenguaje ensamblador. Es el GCD de todos los idiomas.
Con los lenguajes de programación es aún menos probable: algunas personas encuentran más placer en inventar nuevos lenguajes de programación que en la programación real. Los nuevos lenguajes naturales surgen en su mayoría sin darse cuenta; los nuevos lenguajes de programación, por el contrario, surgen porque hay un impulso por innovar innato en las personas inteligentes. Tenga en cuenta que no es un impulso para consolidar; es un impulso para ir audazmente a donde ningún hombre ha ido antes.
Dado que todos los demás han presentado buenos argumentos, presento un argumento por analogía: es mejor tener una herramienta para cada trabajo en lugar de una navaja suiza para todos.

Respuestas (20)

No es técnicamente posible, al menos sin renunciar a la funcionalidad.

Por ejemplo, los idiomas tienen diferentes niveles de rigurosidad que son proporcionales a su nivel alto o bajo. Los lenguajes de secuencias de comandos se escriben suavemente porque pueden realizar fácilmente conversiones y comprobaciones de tipos en tiempo de ejecución. Compare esto con C/C++, que tiene muchas más dificultades con la flexibilidad de tipos debido a que está más cerca de la memoria. Si bien se agregan más características agnósticas de tipo, al final del día, la mayoría de estas todavía están basadas en compiladores: sirven más como ayudas de programación que como funcionalidad real del lenguaje.

Otro ejemplo importante es cómo se maneja la memoria. En los lenguajes de secuencias de comandos (e incluso en algunos lenguajes compilados), la memoria está en gran medida fuera del alcance del programador, administrada por el intérprete o algún otro sistema. Por el contrario, los lenguajes de nivel inferior brindan la capacidad de manipular y acceder directamente a la memoria, como los punteros de C/C++.

Si bien es posible pensar que tal vez con el aumento del rendimiento algún día dejaremos de preocuparnos por la programación de bajo nivel y comenzaremos a usar algún extraño análogo de PHP para todo, creo que eso es no entender cómo funciona realmente el mundo. Considero que C/C++ es un lenguaje de bajo nivel, al igual que la mayoría de la gente; pero alguna vez, y todavía entre algunos, es un lenguaje de alto nivel, y el bajo nivel sería como el ensamblaje. Esto no es meramente terminología: a medida que cambia el marco de desempeño de la cuestión de la eficiencia, también lo hacen las medidas de la misma. Las simplificaciones que ahora podríamos considerar demasiado costosas de implementar incluso en lenguajes interpretados podrían algún día ser comunes entre los lenguajes de "alto nivel", Java podría considerarse "de bajo nivel"

Creo que es mucho menos probable que los lenguajes de programación converjan que los lenguajes hablados por ese motivo. El lenguaje humano cumple una sola tarea fija, transmitir información. Si bien puede argumentar que diferentes idiomas son mejores o peores en alguna parte de ese objetivo que otros, todos pueden lograr esos objetivos. Sin embargo, hay cosas que simplemente no puede hacer en PHP. También hay cosas que ninguna persona en su sano juicio querría hacer (en estos días) en asamblea.

Una forma de pensarlo podría ser esta. Si mañana todos en el mundo hablaran galés con fluidez, ¿qué pasaría? Bueno, todo el mundo podría conversar en galés, los servicios de traducción dejarían de funcionar y tal vez los puerros se volverían más populares. Si mañana el único lenguaje de programación disponible fuera JavaScript, todos estaríamos completamente jodidos.

Eso ni siquiera cuenta la inercia. En el lenguaje humano, la inercia es principalmente una cuestión de poder leer obras literarias antiguas, algo que rara vez es una decisión cuando se decide aprender un nuevo idioma, y ​​nunca una decisión cuando se aprende un idioma nativo. Si bien perder la comprensión de las obras clásicas sería una pérdida cultural, no es probable que motive acciones a gran escala. Por otro lado, tener que reprogramar el kernel de Linux, Windows, casi todos los controladores de dispositivos y los servidores web definitivamente influiría en las decisiones más amplias de los lenguajes de programación. Que COBOL siga vivo es un argumento bastante fuerte en contra de la convergencia del lenguaje de programación, en mi opinión.

Sin embargo, hay un punto en el que podría esperar cierta convergencia en los lenguajes de programación: la sintaxis. Eso ya está sucediendo, y la familia tipo C ha ganado en gran medida. C, C++, Java, JavaScript y PHP comparten una sintaxis en su mayoría idéntica, con algunos cambios en los operadores, que en su mayoría reflejan su diferencia inherente. Sin operación de puntero *y &en PHP, no hay concatenación de cadenas fácil y divertida .en C. Sin embargo, aparte de eso, estos lenguajes son casi completamente inteligibles entre sí, al menos en estructura. Una familia alternativa sería la línea BASIC, que incluye VB y diría que Python.

Estoy de acuerdo, si se dedica principalmente a la manipulación de texto, no desea pasar por toda la funcionalidad de un lenguaje con todas las funciones como C++, por lo que se queda con COBOL. Por el contrario, si solo realiza cálculos matemáticos, puede quedarse con FORTRAN en lugar de C ++. Básicamente, podemos crear un lenguaje que "lo haga todo", pero a expensas de hacerlo más difícil de usar si solo necesita un subconjunto de la funcionalidad. En mi opinión, siempre querremos y usaremos idiomas especiales, incluso cuando no los necesitemos .
En realidad, C en particular es muy indulgente con los tipos: puede convertir cualquier cosa en cualquier cosa, y "simplemente funcionará". Obviamente, no obtendrás el resultado que buscas si intentas usar a char*como a short(a menos que eso sea lo que pretendías hacer, obviamente), pero el compilador te lo permitirá; podría emitir una advertencia, y muchos compiladores tienen una configuración para tratar las advertencias como errores, pero eso es todo. Recuerdo jugar con punteros de memoria en C allá por los años 90, bajo DOS; un short*puntero a la RAM de video, tratándolo como chars para escribir en la pantalla.
Acordado. La empresa para la que trabajo admite/desarrolla programas en CFML, COBOL, VB, Ruby, etc. y tiene varias formas diferentes de bases de datos, además de usar javascript. Cada uno de estos idiomas tiene diferentes fortalezas y debilidades y realmente no veo que sea posible fusionarlos todos en 1 idioma que no sería un completo desastre.
¿Qué detiene una forma de idioma que incluye la gestión de memoria tanto manual como automática? ¿O de incluir tipeo estático y dinámico? C# (un lenguaje de programación moderno muy popular) tiene escritura estática y un tipo llamado dinámico que imita la escritura dinámica que se encuentra en los lenguajes de secuencias de comandos.
@JohnColanduoni La combinación de escritura dinámica y estática, por ejemplo, a través de varias formas de escritura gradual e inferencia de tipo parcial, es un tema actual en el diseño y la investigación de PL. La combinación de administración de memoria automática y manual es imposible a menos que solo se acceda a la memoria administrada manualmente a través de puntos débiles que explícitamente podrían volverse inválidos en cualquier momento; se debe garantizar que la memoria administrada automáticamente nunca se liberará mientras aún esté accesible. Entonces, en un sistema combinado, la memoria administrada manualmente tendría un tipo diferente de la memoria automática.
@amon No necesitarían tener tipos separados por completo. Por ejemplo, podría tener una especie de tipo de puntero confluente que no permita almacenar el puntero; en cambio, solo permite acceder al objeto o pasar el puntero a las subrutinas con la misma restricción. Siempre que se trate de subrutinas (es decir, solo se ejecutan durante el tiempo de ejecución de la persona que llama), no importará si el valor se gestiona de forma manual o automática, ya que la persona que llama mantiene una referencia a él (aunque con la gestión manual de la memoria, por supuesto, se podría eliminar el puntero en cualquier momento).
@JohnColanduoni C ++ va de esa manera con cosas como "punteros inteligentes", pero aún debe invocarlo, y no seleccionar uno u otro universalmente en el sistema presenta limitaciones y complejidades propias. No estoy seguro de que sea una buena idea mezclar ambos, pero esa es principalmente mi opinión, y mucha gente claramente no está de acuerdo a medida que avanza. Ahora, si tuviera un idioma del que pudiera cambiar el modo, eso también podría entrar en un subconjunto más filosófico de esta pregunta: si hubiera un idioma que pudiera hacer todo, pero no todo a la vez, ¿sería realmente un idioma?
La administración de memoria y la verificación de tipos son en realidad dos de las características del lenguaje que espero converjan en un estándar dentro de cien años. Ambos son problemas que, para el 99% de los programas realistas, tienen una solución en tiempo de compilación, pero encontrarla es intratable; a medida que las computadoras se vuelvan ridículamente más poderosas, será posible realizar muchos más análisis fuera de línea de programas de tamaño completo.
"Si mañana el único lenguaje de programación disponible fuera JavaScript, todos estaríamos completamente jodidos". Tenga cuidado, es posible que veamos un día en el que C se compile en Javascript, por lo que puede ejecutarse mediante el motor de JavaScript, que lo compilará JIT en el ensamblaje real;)
@hyde ¡Creo que tienes un gran concepto para un escenario de ciencia ficción distópico!
@hyde ¿Quieres decir como asm.js ?
Estrictamente hablando, casi todos los lenguajes de programación actuales son Turing-completo, y todos los lenguajes Turing-completo pueden hacer cualquier cosa que cualquier otro lenguaje Turing-completo puede hacer, con tiempo y memoria infinitos. Por lo tanto, la afirmación de que "Sin embargo, hay cosas que simplemente no puede hacer en PHP", simplemente no es cierta : hay muchas cosas que sería horrible intentar hacer en PHP (en realidad, como alguien con mucho de experiencia profesional con él, diría que tratar de hacer cualquier cosa en PHP es bastante horrible), pero podrías .
@KRyan Turing-completeness se descompone cuando tiene que lidiar con el hardware real (Turing-completeness se trata solo de implementar algoritmos , no de hacer las cosas apropiadas con señales eléctricas). PHP no puede manejar el direccionamiento directo de memoria, punto final. C/C++ puede. Algo que necesita direccionamiento directo de memoria no se puede escribir en PHP.
@cpast Creo que una buena prueba es "¿podría implementar este idioma en este idioma?" Dado que PHP necesita un intérprete, la respuesta es no. Por otro lado, los compiladores y bibliotecas de C/C++ están en su mayoría en C/C++.
@ John Colanduoni: What stops a language form including both manual and automatic memory management?Eche un vistazo al lenguaje de programación D, que ha intentado hacer que esto funcione y básicamente ha fallado, por razones que no sorprenderán en absoluto a nadie que esté familiarizado con la ley de Gresham .
Estoy de acuerdo con casi todo esto y, sin embargo, debo señalar que todos los idiomas están completos, puedes hacer cualquier cosa en cualquier idioma... si eres lo suficientemente masoquista para intentarlo. Sin embargo, estoy de acuerdo en que algunos lenguajes son MUCHO mejores para lograr ciertos objetivos y tratar de programar una pequeña CPU en un dispositivo usando Python probablemente sea una mala idea. En su mayor parte, los lenguajes humanos son igualmente buenos para comunicar conceptos; Los lenguajes de programación están diseñados intencionalmente para cumplir mejor con ciertos objetivos.
No solo no todos los idiomas están completos en Turing, sino que el número de los que no lo están está aumentando. Para la programación del mundo real, TC causa más problemas de los que resuelve: otra predicción de cien años sería que la integridad de Turing probablemente dejará la corriente principal en algún momento. Resulta que poder probar cosas sobre la ejecución de su programa es realmente útil, quién lo hubiera pensado.
La suposición implícita para el uso continuo de la arquitectura de Von Neumann en 100 años es casi risible y hace que muchos de los argumentos de puntero, acceso a memoria, etc. sean discutibles. No se olvide de las computadoras cuánticas... Otro punto que destacaría es que en los próximos 10 o 20 años tendremos programación en lenguaje natural donde simplemente le hablaremos a la computadora y esta traducirá nuestras intenciones en lo que ahora llamamos un Lenguaje de "alto nivel". Tan pronto como eso suceda, los que escriben el intérprete de lenguaje natural probablemente elegirán uno o quizás dos idiomas que harán todo lo que necesitamos.

¿Hay alguna razón para creer que los lenguajes de programación van a converger en un solo lenguaje en las próximas décadas o siglos?

Como programador, ciertamente espero que no. Probablemente sería un gran inconveniente para prácticamente todos y no beneficiaría prácticamente a nadie.

Diferentes idiomas son buenos para diferentes tipos de tareas. Si está escribiendo un script corto para ocultar un campo en una página web cuando un usuario hace una elección particular en un formulario, no necesita la capacidad de C para manipular directamente cualquier dirección de memoria direccionable, pero realmente no puede tener C sin el concepto de punteros. (Puede evitar usarlos, pero eso es bastante limitante en términos de lo que puede hacer; por ejemplo, ahora no tiene una construcción nativa del idioma que pueda usar para cadenas de longitud variable, por lo que necesita reinventar esorueda.) Si está escribiendo un sistema operativo para que se ejecute en bare metal, la falta de control de convenciones de llamadas, gestión de memoria y controladores de interrupciones de Javascript hará que la tarea sea casi imposible, si no completamente imposible. Si le está enseñando a alguien los conceptos básicos de la programación como concepto, el ensamblador no va a ser suficiente (se adentra demasiado en los detalles ásperos de sumar dos números o acceder a la memoria); por otro lado, si está escribiendo la sección crítica de un controlador de interrupciones de alta frecuencia, PHP probablemente no sea el lenguaje que está buscando. Un lenguaje recolectado como basura como Java es una mala elección para un sistema en tiempo realdonde la previsibilidad de la ejecución es un requisito, porque en la mayoría de los lenguajes de GC, el recolector de basura técnicamente puede activarse en cualquier momento y comenzar a barajar sus datos, ocupando tiempo de CPU y provocando vaciados de caché. Escribir consultas de datos basadas en conjuntos en C es una molestia, pero SQL hace que sea al menos relativamente fácil expresar lo que desea hacer con sus datos, en lugar de la mecánica de cómo hacerlo .

Y sigue así. Si bien ciertamente existe cierto grado de superposición, por ejemplo, entre lenguajes como C# y Java, o BASIC y Pascal, en muchos de los lenguajes de uso común, cada lenguaje de programación llena un nicho específico . La elección entre, digamos, Java y C# es bastante arbitraria (ninguno es obviamente mejor que el otro en el caso general , aunque uno puede ser mejor que el otro en cualquier caso específico ); la elección entre Ada y C ++ no es arbitraria (hay cosas que puede hacer en uno que no puede hacer en el otro, o no puede hacer sin una flexión significativa del lenguaje).

Incluso si ignoramos los lenguajes específicos de la arquitectura como el ensamblador, que ya es una onda manual bastante importante (¿en qué escribirá la inicialización del "BIOS" del programa previo y el código de inicio del sistema operativo; lenguaje de máquina binario?), al menos con Con la tecnología de las computadoras tal como las conocemos y reconocemos hoy en día, hay una multitud de tareas que deben realizarse y los requisitos son diferentes para cada una. Rendimiento, previsibilidad, facilidad para el programador, accesibilidad de la API, alcance de las funciones (tanto lo que se necesita como lo que explícitamente no se necesita o no se desea), etc. En algunos casos, ciertas características son un requisito absoluto para el propósito previsto del idioma; en otros faltade ciertas características es una característica. Como se señaló en los comentarios y también en otros lugares, algunas características específicas son, por su propia definición, incompatibles entre sí, independientemente de cómo se implementen o expresen, y por lo tanto no es posible que coexistan en el mismo lenguaje de programación, por lo que cualquier lenguaje de este tipo necesitaría para cambiar uno por el otro. Ahora considere a las personas que, por una razón u otra, realmente necesitan la función que se cortó; ¿Qué lenguaje de programación usarán?

Todo esto parecería hacer muy poco probable que todo converja en un solo lenguaje de programación que sea igualmente adecuado para escribir un kernel de sistema operativo y un script de ocultación de campo para una página web (o lo que sea que reemplace las páginas web en su escenario). Incluso iría tan lejos como para decir que, de manera realista, no sucederá.

Si desea que la programación de computadoras parezca realista en su mundo, debe tener en cuenta el hecho de que diferentes tareas requieren diferentes herramientas y que estas diferentes herramientas serán utilizadas por diferentes personas. Un lenguaje de programación es una de esas herramientas, y como tal, así como hoy en día tenemos tanto herramientas eléctricas como herramientas manuales que logran lo mismo, por ejemplo, hacer un agujero en una pared, es casi seguro que existirán diferentes lenguajes de programación que sean adecuados para diferentes tareas.

Y eso sin siquiera tocar el tema de reescribir cada pieza de software, o su equivalente, en EZ++2108. Lo cual, sin importar cuán productivo pueda ser alguien en este nuevo idioma, sería una empresa gigantesca .

También compare ¿Por qué hay tantos lenguajes de programación? en Computer Science Stack Exchange, y ¿Por qué la gente usa C si es tan peligroso? en el intercambio de pila de programadores.

Creo que esta respuesta argumenta con éxito que de los lenguajes de programación que tenemos actualmente, algunos lenguajes pueden ser completamente inadecuados para una tarea determinada. Pero eso no implica que no pueda existir un lenguaje universal que sea adecuado para cada propósito. Para refutar la posibilidad, simplemente necesitamos encontrar un ejemplo de dos características deseables que no pueden coexistir en el mismo lenguaje, por ejemplo, la seguridad de la memoria y la aritmética de punteros sin restricciones.
@amon Quizás, pero ¿por qué un lenguaje de secuencias de comandos de páginas web debería tener (y cargar al programador con) aritmética de punteros sin restricciones, solo porque eso es necesario para escribir un sistema operativo ? En esencia, los lenguajes de programación se tratan de expresar lo que quieres que haga la computadora. Si un lenguaje de programación de páginas web (piense en Javascript) es lo mismo que un lenguaje de programación de sistema operativo (piense en C o ensamblador) con características eliminadas, se puede argumentar que los dos no son el mismo lenguaje; tienen diferentes conjuntos de funciones y se adaptan a diferentes necesidades, incluso si la sintaxis central es quizás la misma.
Si tienen la misma sintaxis y el mismo conjunto de características, entonces sí, son el mismo lenguaje, pero también permiten construcciones muy peligrosas que podrían, sin un sandboxing muy cuidadoso (algo que no siempre logramos hacer bien incluso con Javascript) , al menos corrompe el proceso del navegador web. Veré si puedo incorporar esto en mi respuesta para que quede más claro.
@amon hay características que probablemente no son compatibles. Por ejemplo, con tipos como pruebas, puede probar varias propiedades sobre el programa, incluso en algunas variantes (TLC, Agda, ...) que termina. Es fácil pensar que todavía son lo suficientemente fuertes como para expresar muchos de los problemas interesantes. Sin embargo, debido al problema de detención, se ha demostrado que no puede implementar una máquina de Turing universal en ellos, por lo que tiene una compensación. De manera similar, si agrega una cantidad suficiente de funciones al sistema de tipos, obtiene un sistema de tipos indecidible (no hay un algoritmo posible para verificar si un programa verifica el tipo).

TL; DR No es imposible, pero lo dudo bastante.


Ya hay buenas respuestas, pero quería agregar un punto de vista ligeramente diferente.

Primero, los lenguajes hablados NO son una buena analogía para los lenguajes de programación . De hecho, en su naturaleza difieren considerablemente. Exceptuando el conlang , las lenguas habladas son el resultado de siglos de evolución. La separación aumentó la diferencia, pero la comunicación tiende a hacerlas más homogéneas. La idea principal es comunicarse entre sí, entenderse e intercambiar (o hacer negocios). Sin embargo, esos idiomas son hablados por muchos hablantes, y nadie o nadie controla realmente la evolución del idioma. Incluso organismos como la Académie Française francesa se limitan a reflejar la evolución de la lengua, a posteriori . No hay ninguna reflexión sobre "mejor" o "más eficiente".

En mi opinión, habrá un uso cada vez más convergente del "inglés" como idioma de comunicación, pero incluso esto divergirá del inglés real. Y también dudo que los otros idiomas desaparezcan por completo debido a la inercia, mencionada por Wiliam Kappler.

Por otro lado, los lenguajes de programación son discutidos por colaboraciones, lo que establece estándares. El más conocido es el ANSI para C. Pero la mayoría de los lenguajes tienen un grupo de personas involucradas en decidir sobre la evolución del lenguaje. Cambia por completo la naturaleza de la evolución de los lenguajes de programación en comparación con los lenguajes hablados.

Ahora, ¿podrían fusionarse? Diría que no es imposible . Si miras hacia atrás hace 10 o 15 años, pocos habrían imaginado cuánto se extendería un lenguaje como Java. De hecho, su tamaño, rendimiento y tiempo de compilación fueron considerablemente peores que, por ejemplo, C++. Pero desde entonces, el lenguaje, la JVM y los compiladores han mejorado considerablemente. Y además, el progreso en las computadoras significa que algunos MB más aquí o allá, y la diferencia de ejecución apenas se notan en la mayor parte de la experiencia del usuario.

En el microcontrolador, existe una tendencia a adaptar cada vez más la arquitectura ARM. Lo que parece indicar una fusión del hardware. Y si vemos la guerra del sistema operativo para las aplicaciones móviles: por ejemplo, Microsoft regresa a ARM, o tabletas, teléfonos inteligentes, etc. Si logran tener un solo sistema operativo ejecutándose en todos los sistemas, eso facilitaría la uniformización de los lenguajes de programación. A medida que se reduzca el precio de la memoria, habrá menos incentivos para usar soluciones de memoria baja, lo que permitirá aplicaciones de sistemas operativos más grandes (vea qué tan "bajo" se pone Linux a través de Embedded-Linux).

Sin embargo, veo cuatro argumentos en contra .

Como señalan las otras respuestas, los lenguajes de programación tienden a especializarse en un nicho. Pude ver algunos ejes para diferenciar idiomas.

  • accesibilidad: ¿qué tan fácil es aprender el idioma/leer un programa?
  • eficiencia: eso ya es triple: tamaño del contenedor, cantidad de RAM y velocidad
  • funcionalidad: ¿qué podemos hacer con el lenguaje?
  • portabilidad: ¿cuál es el alcance donde se puede implementar? ¿Qué tan fácil es llegar a nuestros clientes?

Y probablemente haya algunos más. Ahora, la única forma de unificar los idiomas es lograr que un idioma sea el mejor en todos esos ejes. Sólo para dar alguna ilustración,

  • ruby es fácil de leer y aprender, pero no particularmente eficiente,
  • Java está ampliamente implementado, pero es demasiado grande/complejo para los sistemas integrados.
  • C puede ser muy eficiente, pero difícil de aprender (comparativamente).

Debido a estos diferentes ejes y la especialización que observamos hoy, es dudoso que uno de los lenguajes evolucione para dominar a los demás.

También tenemos que considerar la inercia .de cambio. Los lenguajes de programación han nacido en un mundo totalmente conectado (entre sus usuarios). Por lo tanto, más comunicación no modificará su curso (en cuanto a los idiomas hablados). La mayoría de los usuarios son reacios a aprender nuevos y, a menudo, esperan hasta el último momento para recurrir a aprender algo nuevo. Pero la "selección natural" podría jugar aquí, favoreciendo a quienes lo hacen. Pero junto con los programadores, la inercia de los lenguajes de programación está escrita en su código. En muchos dominios de investigación, Fortran es el lenguaje de elección (incluso he visto el código en F77), aunque 1) la investigación a menudo conoce las nuevas herramientas, y 2) algunos argumentarían que Fortran es un lenguaje difunto. ¿Pero por qué? ¡Porque se implementó una gran cantidad de código en esos Fortran! Y sería un gran esfuerzo, y probablemente resultaría imposible traducirlo todo a otro idioma (los escritores originales no están disponibles, es difícil verificar la ciencia detrás). Lo mismo ocurre con otro código grande: es probable que nadie reescriba el kernel de Linux. Necesita implementar lenguajes compatibles. Pero incluso entonces, eso significa que el idioma "antiguo" aún debe mantenerse actualizado.

El efecto del anarcoliberalismo de la programación e Internet. Se puede ver bien con las numerosas bifurcaciones en FOSS: si alguien no está de acuerdo con una decisión sobre el nuevo estándar, es probable que se adhiera al anterior o cree una alternativa. Al igual que, como señaló Wiliam, muchos lenguajes actuales derivan de C. Y si pudiéramos confiar en los últimos 30 años más o menos, vemos que la cantidad de aplicaciones de los lenguajes de programación se dispara, la mayoría de los lenguajes evoluciona, algunos aparecen como derivación de aquellos, otros como nuevos conceptos (raramente). Pero los estándares más antiguos todavía se utilizan en la actualidad. Así que hay una multiplicación y diversificación de lenguas. Es difícil imaginar que esta tendencia se revierta.

Último de cuatro puntos, la irracionalidad de los actores del sector, alias programadores. Se implementan nuevos lenguajes en aras de factores irracionales: los espacios en blanco son un ejemplo perfecto. Algunas personas defenderán la elegancia, la poesía, etc. de sus idiomas. Esto crea algunas de las famosas guerras de llamas de Internet. Le sugiero que busque "C++ vs Java". Llévate un poco de vendaje. Los nuevos usuarios a menudo se colocan a lo largo de uno de los lados. Como hemos visto en la famosa e infame guerra entre emacs y vim.

Para concluir , diría que puedo ver un escenario en el que la memoria HW se vuelve barata, la arquitectura HW se limita a unos pocos (X86, ARM) y ese sistema operativo predomina en todos ellos. Aparece un nuevo lenguaje que es el mejor o casi el mejor en todos los ejes anteriores. Luego, con el tiempo suficiente, los otros idiomas podrían desaparecer.

Pero en realidad, lo más fácil probablemente sería lograr que un dictador malvado tome el control del mundo y prohíba cualquier lenguaje que no sea ensamblador. Porque ¿quién necesita algo más?

¿Ensamblador? No. En mis días , cuando teníamos ganas de ser novedosos y elegantes, usábamos una aguja imantada .
No dije que fuera un dictador divertido y malvado. Pero nunca he visto más allá del cartón punteado.

TL; DR: No. Los lenguajes de programación son demasiado diversos.

Razón 1: Propósito

Hay, según la lista de lenguajes de programación de Wikipedia , 806 lenguajes de programación distintos, excluyendo los dialectos BASIC y los lenguajes de programación esotéricos.

Hay algunas características de cada lenguaje que no serían demasiado difíciles de fusionar: la mayoría de los lenguajes de programación tienen alguna forma de procesamiento condicional, declaración de variables, operaciones aritméticas y matemáticas, salida y entrada, entre otras similitudes. Estas son las partes que serían relativamente fáciles de fusionar (siempre que podamos decidir un estilo, lo que puede llevar bastante tiempo...).

Hay otras partes de otros idiomas que no se pueden fusionar fácilmente, muchas de las cuales dependen del propósito del idioma. JavaScript, por ejemplo, es un lenguaje de secuencias de comandos web dinámico que se utiliza para dar interactividad a las páginas web. Mucho de esto se usa aquí en StackExchange para cargar contenido dinámicamente sin tener que volver a cargar la página. Este proceso se llama AJAX .

AJAX está diseñado para la web. No está diseñado para aplicaciones de escritorio, como las que podrían estar escritas en Java o C# o C o C++ (etc.), que pueden ser multiproceso y cargar contenido dinámicamente sin mencionar AJAX: así es como funcionan estos lenguajes.

Tomando JavaScript y Java como ejemplo, también podemos ver que el propósito del lenguaje de programación es importante. JavaScript está diseñado para la web; Java para la instalación en un sistema. JavaScript, por lo tanto, no tiene acceso a archivos , por razones de seguridad, para garantizar que los sitios web maliciosos no puedan acceder a sus archivos fácilmente. Suponiendo que este lenguaje de programación general teórico (que voy a llamar Σ∞ o Sigma Infinity) también tiene que adaptarse a todos los propósitos, tiene que ser adecuado tanto para la web como para las versiones instaladas. Para satisfacer este requisito, los diseñadores del lenguaje se verían obligados a publicar dos versiones diferentes del lenguaje, una sin acceso a archivos y otra con acceso, para mantener la seguridad.

Como le dirán los mantenedores de lenguajes modulares o lenguajes con múltiples versiones, esta es una gran tarea: garantizar que ambas versiones sean...

  • Compatibles entre sí
  • A hoy
  • Tan cerca de idéntico como sea posible
  • Soportado
  • Probado
  • documentado
  • Usó

... es una gran pregunta. Necesitarías crear una gran empresa para apoyar a Σ∞.

No, es cierto, esto no excluye la posibilidad de que Σ∞ exista. Sin embargo, dado que aquí estamos hablando de practicidad, es más práctico para varias empresas mantener varios idiomas que para una gran empresa mantener Σ∞.


Razón 2: Características

Los lenguajes de programación 806 contienen muchas características. Ignorando los problemas de compatibilidad de propósito que acabamos de discutir, crear Σ∞ llevará mucho tiempo simplemente por la gran cantidad de cosas que los creadores tienen que incluir. Para cada idioma, el proceso de creación podría verse así:

ingrese la descripción de la imagen aquí

Mirando una publicación anterior en StackOverflow , parece que muchos desarrolladores dedican mucho más tiempo a corregir errores que a escribir nuevas funciones. Por lo tanto, llevará mucho tiempo implementar una función, y mucho menos un idioma, y ​​mucho menos 806 idiomas.

Sí, puedo estar exagerando un poco, y puedes contratar a muchos desarrolladores, pero el tiempo y el dinero que se invertirán en el proyecto Σ∞ serán significativos.


Razón 3: tamaño de archivo

Uno simple y más fácil de superar que los dos anteriores, pero aún así vale la pena mencionarlo. El C redistribuible y el tiempo de ejecución ocupan 37 MB, comprimidos, en mi computadora. Eso es alrededor de 45 MB sin comprimir. Asumiendo que C es un lenguaje representativo en términos de tamaño de archivo, eso nos da 38700 MB o 38.7 GB como el tamaño total de Σ∞.

Eso es un poco menos de lo que esperaba, y ciertamente no mucho en términos de requisitos de almacenamiento. Sin embargo, las conexiones a Internet deben desarrollarse significativamente antes de descargar dicho archivo: los usuarios no quieren esperar demasiado para que los instaladores descarguen un solo archivo, especialmente si hay más archivos para descargar para el programa.

Como dije, este problema es mucho más fácil de manejar: estamos hablando del futuro, por lo que probablemente pueda asumir mejores conexiones a Internet. Sólo un punto que vale la pena mencionar.


Razón 4: tipeo y compiladores

Esto se ha cubierto en otras respuestas, por lo que lo repasaré rápidamente: según el propósito del lenguaje y el nivel dentro de la informática, los procesos de compilación y tiempo de ejecución difieren significativamente.

JavaScript, por ejemplo, se interpreta en tiempo de ejecución . El código del navegador traduce JS en código ejecutable justo antes de que se ejecute. Además, JavaScript tiene un tipo débil: no tiene que declarar que esta variable es un número entero y esta es una cadena, solo dice var.

C#, en comparación, es un lenguaje precompilado fuertemente tipado . Tienes que decir que esto es un número entero y esto es una cadena, y tu código no se compilará si no lo haces. (Está bien, también está en C#, pero aún se escribe en tiempo de compilación). Además, debe ejecutar su código a través de un compilador, que lo convierte en un ejecutable que puede ejecutar.var

Fusionar los dos tipos de lenguajes sería bastante difícil, si no imposible.


Finalmente...

Concluyo, por lo tanto, que hay demasiados lenguajes de programación y demasiados tipos diferentes de lenguajes de programación para que el proyecto Σ∞ sea factible, y mucho menos práctico.

"también hay var en C#" ; hoy en día, también lo tenemos dynamic, además, siempre está el objecttipo de confianza (que deberá emitir antes de que le permita hacer mucho más que pasar el valor...). :)
@MichaelKjörling: de hecho, pero aún se escriben en el momento de la compilación (con la posible excepción de dynamicque no lo he verificado).
Correcto, object(o más bien, System.Object; objectes simplemente la palabra clave de conveniencia en C#) permanece System.Objecthasta que lo convierte en otra cosa. Sin embargo, creo que dynamices un pato extraño, que se escribe en tiempo de ejecución. No he tenido ninguna oportunidad de usarlo yo mismo.
@MichaelKjörling ¡Ni siquiera había oído hablar de eso hasta hace 4 minutos! System.Objectes un poco extraño porque no puede hacer mucho más que pasar, pero sigue siendo un tipo.
"Visual C# 2010 presenta un nuevo tipo, dinámico. El tipo es un tipo estático, pero un objeto de tipo dinámico omite la verificación de tipo estático". "En tiempo de compilación, se supone que un elemento que se escribe como dinámico admite cualquier operación". "[una llamada a un método en una variable de tipo dinámico] no es verificada por el compilador porque el tipo [...] es dinámico. Por lo tanto, no se informa ningún error del compilador. Sin embargo, el error no pasa desapercibido indefinidamente. Se detecta en tiempo de ejecución y provoca una excepción en tiempo de ejecución " . MSDN
@MichaelKjörling: apuesto a que es divertido jugar con él...
@TracyCramer un navegador web , sí. Tal como está, JS no tiene métodos o API experimentales o de otro tipo que pueda usar para acceder a los archivos; requeriría un cambio en el lenguaje para apoyarlo. No estoy incluyendo idiomas cambiados.
@TracyCramer, la pregunta es sobre la convergencia de los lenguajes de programación actuales, con cambios realistas . JavaScript obteniendo acceso a archivos no es realista.
Razón 3: el tamaño del archivo tiene implicaciones mucho peores de lo que piensas. 38,7 GB no es mucho espacio en disco, pero ese espacio en disco representa muchos más aros por los que pasar con cada paso de su compilador. Este lenguaje puede caber perfectamente en su disco duro, pero luego se compila tan lentamente que nunca funcionaría como un lenguaje de secuencias de comandos.

Ojalá no.

Los lenguajes de programación nunca deben regirse por las leyes que permiten la convergencia de los lenguajes naturales.

Ahora tenemos C ++, que es el inglés de los lenguajes de programación, tomando prestadas indiscriminadamente cosas de otros lenguajes diferentes en varios puntos de su historia (probablemente la peor idea en su historia haya sido el volcado sintáctico de los genéricos de Ada en la sintaxis de la plantilla). C++ ya no se puede describir con sensatez mediante diagramas de sintaxis y ya no puede ser analizado con sensatez por analizadores de una clase razonablemente regular. Sus estándares oscilan de un lado a otro en la semántica cada pocos años, y ahora las matrices de dimensiones variables, que serían necesarias para implementar bibliotecas numéricas generalmente útiles que compitan con las bibliotecas FORTRAN de 50 años, han sido expulsadas nuevamente.

Algo así como deshacerse del plural "ye" en inglés.

Ahora compare con un lenguaje como "Lua": ajuste de sintaxis en una sola página en el manual de referencia (que es papel de tamaño A5, aproximadamente la mitad Legal), una estructura de datos única, pocos tipos de datos escalares, las técnicas de programación OOP se implementan por protocolo en lugar de que por la sintaxis y así sucesivamente.

Fusionarlo con C++ de cualquier manera no tendría sentido.

Ahora, de manera un tanto interesante, hay una convergencia de lenguajes informáticos en el nivel de destino: ya no hay máquinas Lisp dedicadas como Symbolics, y las arquitecturas actuales favorecen el direccionamiento de pilas con una pila de retorno y datos compartida, un programa común y espacio de direcciones de datos, con un paradigma de llamada/retorno de función (en lugar de cambio de pila/corrutinas) para organizar el flujo de control y un montón que solo trabaja con datos en lugar de llamada/retorno de función (como lo necesita para las continuaciones completas del esquema).

Esto conduce a varios lenguajes de programación que tienen diferentes características de rendimiento y, en consecuencia, diferentes opciones de lenguaje de programación dependiendo del nivel requerido de coincidencia con el pensamiento de los programadores o de las computadoras.

Entonces llega a la situación en la que los "lenguajes de alto nivel" a menudo se implementan en un lenguaje de bajo nivel (Lua en C, por ejemplo) en lugar de ellos mismos para obtener un sistema con el que tanto la computadora como el programador puedan funcionar sin demasiado mucho dolor.

Esta división fundamental no muestra signos de desaparecer. Las máquinas virtuales cambian un poco los compromisos y colocan otro nivel de capas, pero en realidad no cambian eso.

Esa fue una publicación muy informativa @ usuario9847. Disfruté mucho leyéndolo.

Aquí se dan muchas buenas respuestas, generalmente sin opinión.

Voy a decir que , porque eventualmente crearemos software que sea lo suficientemente inteligente para escribir código mucho mejor de lo que los humanos son capaces de escribir código. Algún tiempo después de este evento, los programadores humanos quedarán obsoletos.

Por un argumento bien conocido, esta máquina reescribirá repetidamente su propio código, aumentando su inteligencia con cada iteración. Suponiendo que haya un límite para la inteligencia de las máquinas, convergerá rápidamente a este nivel de inteligencia y el lenguaje que utiliza convergerá de manera similar a un ideal.

Cierto, a menos que el ideal sea inalcanzable usando la lógica. Por ejemplo, el idioma ideal puede ser de naturaleza caótica.
@CortAmmon No te preocupes. ¡Mi supercomputadora podría manejarlo! ;) Hablando en serio, ¿no se puede suponer que una computadora solo es capaz de realizar funciones computables, por lo que su estado ideal sería puramente lógico?
En realidad, es muy difícil hacer esa suposición. Casi en todos los lugares a los que vamos en informática, los problemas no computables como los sistemas caóticos o el problema de la detención nos persiguen. Es sorprendente lo difícil, en realidad. (Para un estudio de caso, el estudio moderno de DARPA sobre la IA militar intencionalmente establece límites similares a los que está mencionando. Los doctores en IA odian estas reglas, porque es prácticamente imposible hacer algo que valga la pena llamar inteligente bajo ellas)
@CortAmmon Eso es muy cierto. No estoy sugiriendo que los problemas no computables no existan, solo que no son una característica del mundo computable. El resultado de Turing es un teorema de la lógica, por lo que nuestra supercomputadora conocería estas limitaciones y, con suerte, podría navegar hacia un estado ideal sin referencia a programas arbitrarios o sistemas caóticos no computables. Probablemente estoy hablando desde mi trasero aquí.
Incluso en este caso, los programadores humanos seguirían existiendo, incluso si estuvieran programando solo por diversión. Y aprenderán, usarán y crearán diferentes lenguajes de programación porque, nuevamente, los diferentes lenguajes son interesantes.
@Roux Ese es un buen punto. Los lenguajes de programación humanos serán como arte popular "ingenuo" para las máquinas. i.ebayimg.com/00/s/NTk4WDgwMw==/z/ITwAAOSwxH1T1ilb/…

¿Podría haber un único lenguaje de programación en el futuro? Ciertamente, pero echemos un vistazo a por qué tenemos tantos hoy.

Actualmente hay una gran cantidad de idiomas que se usan o se han usado, pero esa lista no demuestra realmente por qué tenemos diferentes idiomas hoy en día, así que usemos esta lista de idiomas por tipo en su lugar.

Los lenguajes de secuencias de comandos como bash y ksh son buenos para tareas de procedimiento simples que deben realizarse una y otra vez, pero no brindan toda la funcionalidad necesaria para las aplicaciones grandes. Son más estructuras de apoyo.

Los lenguajes compilados como C++ y Python tienen grandes fortalezas. El primero tiene soporte para el control fino de la memoria y la gestión de recursos. Python está destinado a ser fácil de leer y el código fuente es corto, ciertamente mucho más corto que C++. Estos dos lenguajes también operan en diferentes niveles: C++ es un lenguaje de bajo nivel (el código fuente se parece a las instrucciones del sistema) y Python es un lenguaje de alto nivel (el código fuente se parece al lenguaje hablado).

También está Prolog , un lenguaje divertido que funciona como un lenguaje de base de datos con reglas y consultas. Prolog se basa en la lógica más que en los procedimientos, como lo son bash y C++. Como resultado, es bueno para imitar la inteligencia (sistemas de IA) y no tan bueno para manipular registros en la memoria.

Cada uno de estos lenguajes tiene su propia sintaxis y reglas de análisis. Alguien que entiende C ++ generalmente puede tener una idea bastante buena del código de Python al mirarlo, pero bash y Prolog son tan diferentes que no se pueden leer de uno a otro.

Pero la sintaxis realmente no afecta lo que se admite en un idioma. El borrador de trabajo de los estándares C++ de 2014 tiene más de 1300 páginas. Definitivamente no es un lenguaje simple.

A menos que haya un gran avance en la construcción y aplicación de lenguajes, espero que los lenguajes de programación permanezcan como estructuras separadas para enfocarse en actividades específicas. Es posible que veamos un grupo más pequeño de idiomas utilizados, pero no espero que ese número llegue nunca a uno.

No estoy seguro de que todos estén de acuerdo en que Python sea un lenguaje compilado.
@PaŭloEbermann Está incluido en la sección compilada en ese segundo enlace. Se compila parcialmente, pero también se interpreta, por lo que es discutible.

Podría converger en un solo idioma, pero sería muy diverso.

La metaprogramación es donde su código interactúa con el código mismo. Podría tener un lenguaje de programación, pero las diferentes áreas de uso lo usarían de manera muy diferente, tal vez incluso de manera incompatible. Al final, el lenguaje sería muy avanzado.

Curiosamente, LISP, uno de los lenguajes más antiguos, es probablemente el que tiene más posibilidades de hacer esto. En LISP, el código fuente en sí también es la estructura de datos más común, una lista. Un LISP podría tener potencialmente diferentes "sub-idiomas", que tendrían diferentes partes de LISP. Esto es algo así como las Mónadas de Haskell.

Haskell es otro caso interesante a considerar. Es de naturaleza muy matemática, por lo que los compiladores pueden manipularlo matemáticamente para hacer que los programas sean más rápidos. Además, tiene Monads y DSLs, que son básicamente sublenguajes programables. Puede programar su GPU en haskell (es decir, el programa haskell hace que el programa ejecute programas en su GPU).

Cabe señalar que, aunque existen, tanto Lisp como Haskell en algunos lo oscurecen. Sin embargo, están en aumento, por lo que en el futuro, podríamos imaginar que tenemos algún tipo de súper lenguaje, en ti, que básicamente hace que el programa se programe en sí mismo. Esto permitiría muchos casos de uso diferentes.

Cabe señalar que este idioma se vería como muchos idiomas separados mezclados desde un lugar distante, aunque su núcleo podría ser un idioma base simple. Una biblioteca sería básicamente un idioma.

Tanta razón como creer que los lenguajes humanos convergerán.

Hace mucho tiempo, la gente pronosticó una rápida convergencia de los lenguajes humanos. Sin embargo, esto aún no ha ocurrido. Los lenguajes de programación tienen una característica adicional que no está presente en los lenguajes humanos, son lenguajes inventados.por naturaleza (en contraste con el esperanto y otros idiomas humanos inventados que son una excepción, no la regla). Esto significa que si bien los lenguajes humanos podrían converger debido a la evolución natural y al aumento de la comunicación proporcionada por la tecnología, algo que podría causar la creación de un lenguaje universal en el futuro, hablado por la mayoría absoluta de la población mundial, e incluso si los lenguajes informáticos están sujetos a los mismos principios de convergencia, tenemos el factor adicional de que todos los días se crean nuevos lenguajes de programación. Algunos lenguajes nuevos pueden lograr la hegemonía en un nicho determinado y luego expandirse para convertirse en un lenguaje de propósito general. No podemos descartar esto.

Entonces, creo que los lenguajes de programación siempre serán un campo heterogéneo. Incluso los lenguajes informáticos más antiguos que se consideran obsoletos (yo mismo soy un programador de Pascal), pueden recibir un nuevo tratamiento y volverse modernos. Pascal se enfrenta a muchos prejuicios de personas que lo conocen solo por textos como Kerrighan "Por qué Pascal no es mi lenguaje favorito", sin embargo, el pascal moderno es mucho más avanzado que el lenguaje C, con un conjunto completo de adiciones orientadas a objetos, y ninguno de las cosas que Kerrighan criticó en ese popular ensayo. Entonces, creo que los idiomas no se agruparán en un solo idioma universal, sino que seguirán modernizándose y aceptando cosas nuevas de otros idiomas, al igual que nuestros propios idiomas humanos.

Por un lado, cuando las computadoras llegaron a Brasil (soy brasileño), "creamos" nuevas palabras a partir de sus contrapartes en inglés, como "borrar", que tienen una cierta raíz común en latín, pero no se usaban en el portugués moderno. Pero esto no hará que usemos palabras en inglés para cosas ordinarias como comida tradicional u otros artículos comunes, porque no tenemos razón para hacerlo, eso sería un uso inútil del esfuerzo con poca ganancia. Se podría decir que la gente debería aprender inglés para tener mejores perspectivas de trabajo (como solemos pensar aquí) o para aumentar la audiencia o algo similar. Pero, en ese caso, la gente no usará palabras en inglés en una conversación normal.

Entonces, esto provoca que las personas tengan dos idiomas, para no olvidar su lengua materna o adaptarla innecesariamente. Esto me hace creer que los lenguajes humanos nunca (al igual que los lenguajes informáticos) convergerán en una sola entidad.

Lo que los lenguajes de programación (¡u otros!) no pueden hacer es tan importante como lo que pueden hacer.

Esto ya muestra que siempre habrá algo que impida absolutamente un lenguaje común para todos. Por ejemplo, los programadores del lenguaje de memoria administrada están muy contentos de evitar tener que lidiar con la asignación y desasignación de memoria explícita; significa que puede concentrarse más en cosas que aún no podemos automatizar (incluso en parte). El lenguaje de los abogados es muy bueno cuando se trata de ser lo más específico posible y con pocas posibilidades de interpretación alternativa.

Los lenguajes (nuevamente, de programación o de otro tipo) son solo herramientas. Usted elige la mejor herramienta para el trabajo: a veces es una llave inglesa, a veces es un martillo neumático.

Ahora, obviamente puede crear un lenguaje que permita y prohíba todo, por ejemplo, en función de algunas construcciones predeterminadas o incluso directivas del compilador. Por ejemplo, cuando he estado trabajando en mi sistema operativo C#, en realidad tenía un código C# que se compilaba en equivalentes de ensamblado, algo así como:

registers.AX = memory.Indirect(variable1.Address); // Translated into mov ax, [EBP-20h]

(solo pseudocódigo, el código real era un poco diferente, pero debería ilustrar la idea)

De hecho, esto me permitió escribir todo el código en C#, incluido el cargador de arranque y los controladores de dispositivos.

La pregunta es, ¿el hecho de que esté escrito en C# significa que sigue siendo un único lenguaje llamado C#?

Yo diría que no . De hecho, una parte importante del trabajo habitual de un programador es crear sus propios lenguajes. No lenguajes como C# o LISP, eso sí, sino lenguajes específicos de dominio para manejar bien problemas particulares, y nada más. Si bien siempre se implementan en otro idioma en particular, son un idioma propio, un subconjunto, al igual que el lenguaje de los abogados en inglés es un subconjunto del inglés común.

Algunos lenguajes se prestan extremadamente bien a tales sublenguajes: LISP/ML (y sus derivados, como F# o Scala) son el mejor ejemplo, por supuesto. Lo interesante es que son los lenguajes estrictos los más útiles para crear tales sublenguajes, ya sea que se suponga que los sublenguajes son estrictos o no.

Entonces, ¿alguna vez habrá un súper lenguaje? Seguro Por qué no. Ya hay muchos candidatos que se acercaron bastante: x86 fue durante un tiempo casi universal, el C original tenía el objetivo de ser compilable en cualquier lugar (muchos compiladores todavía producen código para compilar para algún compilador de C). O código de bytes JVM moderno o IL. Pero ese es el nivel en el que esperaría que apareciera: intermedio. El nivel de usuario final (desarrollador) será un pequeño y agradable ecosistema de varios lenguajes muy adecuados para su trabajo, nada menos, nada más. A menos, por supuesto, que esté planeando una distopía en la que Apple-the-world-haegemon obligue a todos a usar Objective-C o algo así. Recuerde, se necesita trabajo para mantener las cosas simples: el desorden surge de forma bastante natural. Siempre habrá desorden y desacuerdo, y ambos alimentarán la pluralidad.Reducir la complejidad es la parte difícil.

Me temo que tengo que estar en desacuerdo con esto: la escritura dinámica/estática y fuerte/débil es increíblemente difícil de fusionar en un solo idioma.
@ArtOfCode No digo que sea fácil, pero obviamente es posible. Además del hecho de que todos los lenguajes de programación del planeta finalmente se ejecutan en algún hardware físico, también hay lenguajes de investigación como Systems C# (administrado + no administrado) y, de hecho, incluso el propio C# (estático + dinámico). No es fácil, pero hacer la máquina de vapor tampoco fue fácil. De hecho, C# también tiene modelos de memoria tanto dinámicos como estáticos, aunque la parte estática es muy limitada (sigue siendo mayormente segura; por otro lado, Systems C# es en muchos sentidos el nuevo C++).
Todavía voy a estar en desacuerdo, me temo: la respuesta de William Kappler en la parte superior demuestra que es básicamente imposible fusionar idiomas de diferentes niveles (que a menudo también son idiomas de diferentes tipos).
@ArtOfCode Siento que te perdiste por completo el punto de mi respuesta. ¿Acabas de leer la parte "Claro, por qué no" o estoy siendo tan incomprensible? :D Estoy argumentando que incluso si hubiera un superlenguaje para todo, no codificarías en eso de todos modos: tendrías lenguajes más pequeños y más adecuados para todo lo que estás haciendo. Al igual que IL une (hasta cierto punto) todo el mundo .NET, pero todos todavía codifican en C#, F#, LINQ, IronPython, C++/CLI, EntityFramework,...
No, mi punto no es que no haya un conjunto más pequeño de lenguajes para tareas particulares, ya lo hay y estoy de acuerdo con usted en eso. Lo que quiero decir es que crear un superlenguaje está cerca, si no es que es absolutamente imposible.

No no hay. Puede que sea más fácil mezclar idiomas, pero dichos idiomas son muy formales y no se combinarán en el nivel del marco conceptual.

Perl se acerca a ser un idioma criollo natural, pero solo entre "tipos" similares de idiomas. No puede simplemente mezclar algo que se basa en una manipulación de memoria más primitiva, o agregar algo que es puramente funcional. El estilo de sintaxis general también puede tener variaciones, pero no puede incluir una construcción con un tipo de sintaxis totalmente diferente.

Probablemente no.

Como ha dicho (correctamente), hay muchos lenguajes de programación. Al igual que hablar lenguajes (naturales), a menudo se toman prestados unos de otros. Sin embargo, a diferencia de los lenguajes naturales, los lenguajes de programación están guiados por diseñadores inteligentes, también conocidos como programadores, que tienen sus propias ideas (contradictorias) sobre "lo que es mejor".

Como señala JDługosz, los lenguajes de programación son siempre muy formales. En un lenguaje natural, los cambios en los patrones del habla y la pronunciación en un grupo aislado de personas pueden dar lugar a diferentes variantes (el inglés estadounidense frente al británico es un ejemplo leve). No es así en los lenguajes de programación, un programa está dentro de las especificaciones o no. Cambiar la especificación no sucede simplemente, los escritores del compilador/intérprete deben aceptar un cambio que podría romper cientos de programas que dependen de un comportamiento particular. En todo caso, los lenguajes de programación en realidad divergen porque los escritores de compiladores/intérpretes no se molestan en apegarse a las especificaciones del lenguaje (ver expresiones regulares , hay: Perl, POSIX, emacs, vim, etc.).

También me parece poco probable que los programadores, generalmente humanos, puedan ponerse de acuerdo sobre un solo lenguaje que lo abarque todo. Las nuevas ideas siempre se integrarán para mantener los lenguajes modernos, las ideas se comparten, pero me parece poco probable que todos los lenguajes de programación converjan.

A medida que los compiladores aumentan la memoria y la potencia de procesamiento de la CPU, pueden hacer frente a la posibilidad de obtener más y más lenguajes de código fuente. Por ejemplo, gcc generalmente puede compilar como ansi-c o c## según sea necesario, y también puede compilar como fortran F77 o una variante menos antigua. Lo que esperaría es que el código fuente legible por humanos continúe agregando preferencias arbitrarias de usuarios y preferencias de la compañía a estándares conocidos, y en ocasiones esos pueden ser ilegibles para cualquier otra persona, pero el código de máquina ejecutable verdaderamente óptimo en un procesador RISC verdaderamente arbitrario probablemente convergerá cuanto más se pueda.

Algún día, el código fuente podría haberse abstraído tanto detrás de instrucciones de alto nivel que sería posible pararse frente a su MakeAnythingBot y decir "Computadora, diseñe y haga un programa espacial, un sistema monetario, un sistema de producción agrícola, todos los materiales necesarios". suministros y un MakeAnyThingBot mejorado", y lo hará. Si eso sucede, creo que estamos en un gran problema.

Tenga en cuenta que la parte difícil de la programación no es escribir las construcciones reales del lenguaje de programación. La parte difícil es tomar un documento vago, amplio y poco especificado y convertirlo en instrucciones muy específicas para que la computadora las siga. La programación de alto nivel frente a la de bajo nivel (BASIC frente a ensamblador) se trata del nivel de detalle en el que especifica lo que debe hacer la computadora, pero no cambia la precisión requerida para especificar lo que debe hacer la computadora. Si el programador no proporciona esa precisión, entonces el lenguaje de programación debe hacerlo.

tldr Creo que los lenguajes de programación van a converger simplemente porque hay demasiadas formas de que suceda.

Veamos algunos de los aspectos más destacados de la (algo) breve historia de la programación.

  • Interruptores
  • Tarjetas perforadas
  • lenguaje ensamblador
  • Lenguajes interpretados/scripting
  • Idiomas de alto nivel
  • lenguajes orientados a objetos
  • Idiomas "administrados"

En solo 70 años, hemos pasado de cambios y manivelas a compiladores increíblemente eficientes con verificación de sintaxis y semántica. Dentro de 100 o 200 años, ni siquiera puedo imaginar cómo programaremos (si es que lo hacemos), pero aventuraré algunas conjeturas.

La mayoría de las respuestas aquí hacen una suposición implícita para el uso continuo de la arquitectura Von Neumann que es, para todos los propósitos prácticos, la única arquitectura que existe actualmente. Pero descartar una arquitectura diferente, especialmente cuando surgen computadoras ópticas o cuánticas, es miope.

Todas las "razones" por las que un solo idioma es insostenible simplemente resaltan las desventajas de nuestra arquitectura informática actual. No abordan ningún progreso futuro en esta área. Decir que dentro de 100 años seguiremos utilizando una arquitectura de Von Neumann es altamente especulativo.

Entonces, ¿cómo podemos llegar a un idioma?

De hecho, íbamos por buen camino para que Java se convirtiera en nuestro lenguaje 'único' cuando se estaba desarrollando el 'chip Java'. Entendía el código de bytes de Java de forma nativa: no habría necesidad de tener ningún idioma excepto uno si cada computadora usara el 'chip de Java'. Y para la programación web, podríamos haber usado un subconjunto del lenguaje para trabajar dentro de los navegadores. No hay nada que (técnicamente) nos impida usar un solo idioma ahora. Podríamos haber escrito navegadores para usar C o C++ y simplemente redactar algunos de los comandos del lenguaje, como el acceso a archivos, por ejemplo.

Si cambiamos las arquitecturas, entonces un idioma puede ser la elección inevitable y obvia.

Podemos llegar al punto de simplemente decir lo que queremos que haga la computadora y entender lo que queremos decir: programación en lenguaje natural. El nuevo 'lenguaje' de la computadora será cualquier cosa que programemos para que use el programador de computadoras. Y no hay razón para tener 10 idiomas de 'alto nivel' para elegir.

¿Y qué hay de los implantes neurales? Tal vez solo 'pensaremos' lo que queremos hacer.

Y quizás en el futuro ni siquiera programemos nada. Una inteligencia artificial simplemente construirá máquinas, cultivará alimentos y satisfará todas nuestras necesidades como en la película animada WALL-E. Ojalá no nos volvamos sedentarios así y seamos artistas, músicos, etc.

Los aviones se inventaron hace 112 años, los cohetes llegaron a la órbita 30 años después, a la luna 20 años después, un hombre a la luna 17 años después (más o menos cuando se inventó C), que fue hace solo 46 años. A Venus el próximo año y luego a Marte el próximo año. Decir que la programación será como lo es ahora dentro de 200 años o más desafía la historia.

¿Está demasiado lejos? Para algunas personas, sí. Pero la tecnología avanza tan rápido que negar cualquiera de estos escenarios es ignorar nuestro potencial como especie.

Estoy de acuerdo en que afirmar que la arquitectura von Neumann no será la única arquitectura dentro de 200 años es pura especulación. Pero también lo es afirmar que One Chip/One Architecture, independientemente de cuál, va a ser. La historia muestra que tiende a divergir. Por lo tanto, no prueba realmente la probabilidad de un idioma único que indica su "tl: dr".
@bilbo_pingouin, estoy de acuerdo, pero dudo que alguien pueda "probar" una predicción de 200 años. Incluso la órbita de la Tierra está sujeta a incógnitas desconocidas.

Como muchos otros señalaron, diferentes lenguajes de programación tienen diferentes campos de uso, por lo que probablemente no. Y estoy de acuerdo con eso.

Pero quiero añadir alguna otra perspectiva. La informática es joven. El primer lenguaje de programación fue Plankalkül de Konrad Zuse desarrollado entre 1942 y 1945. Eso fue hace 70 años. La gente de esa época todavía está viva. Pero esos fueron los primeros pasos de bebé, la computación no alcanzó masas en ese entonces.

Realmente comenzó más tarde, por lo que asumiría que el primer lenguaje de programación con amplio alcance fue ALGOL , de 1958. Eso fue hace poco más de 55 años. Este lenguaje está fuera de uso , no hay preguntas sobre Stack Overflow este año, solo tres el año pasado; Creo que podemos asumir con seguridad que ya está muerto.

Así que miremos un poco más. COBOL se lanzó en 1959. 88 preguntas este año ya en Stack Overflow muestran que este lenguaje todavía está en uso. Hablamos de un lenguaje que un Dilbert-comic de hace casi 20 años ya mostraba como fósil:ingrese la descripción de la imagen aquí

Incluso C ya es bastante antiguo, y es uno de los lenguajes más populares que existen.

Entonces, ¿qué está pasando aquí? Como dije, la informática es bastante joven. Si un nuevo idioma necesita 5 años para volverse popular y se mantiene popular durante 5 años, y los jóvenes lo aprenden cuando es popular en un promedio de 25 años y luego trabajan hasta los 65, entonces puede ver que les brinda al menos 50 años de vida. a un lenguaje que se vuelve popular. Los únicos que murieron antes son los idiomas que, para empezar, nunca se vuelven populares. Y este tiempo se extiende, si hay una gran base de código para mantener en ese idioma, que se creó en el momento en que el idioma era popular. Esta es una de las razones por las que C todavía se usa mucho y una de las razones por las que creo que Java se programará incluso en eones a partir de ahora.

Entonces, como la informática es bastante joven, todavía estamos en una fase en la que se crean más lenguajes que los que quedan fuera de uso. Eso probablemente se resolverá en algún momento, pero no veo razones por las que el desarrollo de nuevos lenguajes se detenga alguna vez. Entonces no, mirando desde un punto de vista histórico sobre la longevidad de los idiomas, probablemente nunca habrá uno solo.

Esta pregunta debe abordarse en términos de límites, de lo contrario, es solo un tema de conversación de programadores. Dado que se mencionó la escala de tiempo de siglos, mirar el caso límite es válido.

En el límite, toda la materia del sistema solar ha sido convertida en computronio por medio de nanomáquinas y todo ese computronio está dispuesto alrededor del sol para recolectar la máxima energía posible.

En esta etapa tan lejana, la arquitectura de hardware subyacente es probablemente bastante homogénea, incluso hoy en día vemos signos de convergencia de la arquitectura de hardware, más específicamente en términos de comunicaciones seriales de alta velocidad (PCI 4.0, 100 GBE, USB3.0; bajo el capó, son todos muy parecidos en términos de propiedades eléctricas y protocolos de capa de enlace, mientras que antes eran bastante diversos). Las personas se obsesionan con la informática en términos de conjuntos de instrucciones e idiomas en lugar de lo que realmente importa, tanto hoy como en mi escenario límite lejano, que son los costos termodinámicos de mover datos de A a B. Una vez que los datos se han movido, el costo y los detalles de procesarlo es secundario.

A medida que mejora la potencia de procesamiento y aumentan las distancias que deben recorrer los datos para ser procesados, el procesamiento de la información se convierte principalmente en una contabilidad termodinámica circunscrita por las leyes de Shannon y la física fundamental.

A medida que esa realidad progrese y se haga más evidente, las ventajas que se pueden obtener al usar esta abstracción o que disminuirán y las guerras de lenguajes terminarán y serán suplantadas por las matemáticas y los protocolos de control de versiones de máxima eficiencia que permiten que ocurra un procesamiento semántico significativo incluso cuando el El tiempo que tardan los datos en llegar de A a B es muy grande en comparación con la rapidez con la que podría evolucionar la entidad receptora, si así lo decidiera.

Si toda la arquitectura de hardware termina igual, entonces el lenguaje universal es el lenguaje en el que ese hardware está programado en el nivel más bajo de programabilidad. Las abstracciones del lenguaje construidas sobre eso probablemente no califiquen como lenguajes de la misma manera que no pensaríamos en la terminología científica relatada en el idioma inglés como un idioma distinto del inglés mismo.

Finalmente, si el hardware (computronio) es en sí mismo reconfigurable (sin duda por un costo termodinámico no trivial), entonces los conceptos de software y hardware no tienen mucho significado. De hecho, ambos se reducirían a los mismos principios termodinámicos, aunque el control de versiones (que en este nivel solo puede tratar de mantener los procesos genuinamente irreversibles separados de los reversibles) puede desempeñar un papel independiente.

Obviamente, este escenario está un poco lejos, pero colocar una historia en algún punto de esta trayectoria es, en mi opinión, un enfoque válido de ciencia ficción dura.

Me gusta mucho tu enfoque. Pero debo decir que el lenguaje universal que mencionas suena como la versión compilada de las instrucciones. Todavía debe haber una manera para que la persona que da estas instrucciones lo haga de una manera simple. Que es para lo que son los lenguajes de programación en este momento. ¿Qué te hace pensar que en tu historia no habrá varios lenguajes de programación que se compilen en el mismo lenguaje universal de máxima eficiencia?
Los lenguajes de programación abstractos son útiles para ayudar a los humanos que piensan en términos de abstracciones específicas. Cuando la mayor parte de la reprogramación se realiza de máquina a máquina, y gran parte o la mayoría de las máquinas están programadas para aprender (p. ej., aprendizaje profundo tal como lo implementan hoy Google, Microsoft, etc.), los requisitos para la programación son diferentes. Las abstracciones seguirán siendo útiles y necesarias para comprimir las transferencias de datos, pero es probable que sean específicas del dominio según la naturaleza de la información enviada. Lo que digo es que los protocolos de comunicaciones se vuelven mucho más importantes que los programas.
También debo decir que en mi caso límite no hay programadores humanos, excepto en zoológicos y museos.

En general, no, por todas las razones especificadas, sin embargo, es probable que desarrollemos un lenguaje descriptor universal para programas/características que sea comprensible tanto para los humanos como para los sistemas expertos dedicados que los utilizan para escribir aplicaciones básicas. Consulte Procesamiento del lenguaje natural .

Por ejemplo, podríamos decir "Me gustaría una aplicación que recopile, archive y muestre datos meteorológicos para mi región". El sistema experto interpretaría esto y escribiría un módulo desechable que realiza esa función (con cierta información sobre sus preferencias personales de GUI a través del análisis de su perfil o generado dinámicamente en función de las preferencias de estilo de la terminal en la que está viendo la aplicación). ).

Naturalmente, la descripción de un juego sería muy larga y gráficamente desafiante, pero al dividir la descripción en funciones y niveles, esto podría lograrse. El lenguaje del descriptor, sea lo que sea, estaría estructurado para hacer frente a esas tareas.

Hay muchas razones enumeradas anteriormente por las que nunca habrá un único lenguaje verdadero. Sin embargo, está completamente dentro del ámbito de la posibilidad que uno cree un megalenguaje que, en esencia, es un montón de DSL.

Todos los lenguajes tendrían que usar el mismo tiempo de ejecución o máquina virtual, y tendría que haber algún tipo de estandarización del espacio de nombres. Una vez que tenga eso, puede tener:

  • Un lenguaje de programación imperativo simple para cuando quieres decir: "Haz esto , luego esto y luego esto ".

  • Un verdadero lenguaje orientado a objetos, para encapsulación y cosas similares.

  • Un lenguaje de programación funcional sin "fugas" no funcionales (no tanto como una declaración de impresión) para que pueda garantizar el aislamiento de una pieza de código

  • Un lenguaje relacional, tal vez incluso una versión de SQL, de modo que podría ser un lenguaje de primera clase en lugar de una lista de cadenas que no se pueden verificar en tiempo de compilación.

  • Un lenguaje declarativo similar a Make o Prolog

  • Un lenguaje de expresión regular de primera clase, para que no tenga que escribir código que parezca ruido de línea

  • Analizadores adecuados: algo como Lex y YACC que no se compilan en C, pero se convierten en construcciones de lenguaje de primera clase por derecho propio.

  • Un lenguaje de sistema de creación de software, algo así como Maven o Ant o algo así.

Todavía no sería el único lenguaje verdadero: algo tan grande probablemente tendría que implementarse en algo más simple (¡C ataca de nuevo!). Sin embargo, uno podría llegar lejos con eso. Aprenderlo no tendría que ser mucho más difícil (si lo hubiera) que aprender un idioma hoy en día, porque cada idioma podría darse el lujo de estar incompleto. Por ejemplo, ningún idioma excepto el lenguaje de expresiones regulares tendría que tener la funcionalidad de expresiones regulares. El lenguaje declarativo no necesitaría poder ejecutar código imperativo solo para ser útil. El lenguaje imperativo puede ser simple, ya que no tiene que soportar todos los paradigmas de programación bajo el sol.

Como respuesta corta, los lenguajes de programación se escriben con sintaxis y semántica para resolver problemas. Estoy seguro de que, si el alcance de los problemas que se le pide a la programación de computadoras se mantuviera constante, encontraríamos lenguajes convergiendo con bastante rapidez.

Sin embargo, encontrar a alguien que piense que el alcance de la programación de computadoras se mantiene constante o, para el caso, alguien que piense que el alcance de la programación de computadoras está haciendo algo más que una carrera desenfrenada hacia el futuro, eso podría ser difícil.

Siguiendo el camino de Microsoft, el teorema "Use su propio idioma en .NET Framework", comenzó con alrededor de 26 idiomas y ahora tiene alrededor de 146 idiomas y sigue creciendo. Y cada uno de ellos evolucionando con las nuevas tendencias de hardware. Los lenguajes de programación solo maduraron, no se abandonaron.

Yendo por el camino de Java "Olvídate de todo, aprende solo Java". No estoy muy seguro del estado actual, mientras que Java se ha movido de Sun a Oracle/IBM,... y así sucesivamente, perdiendo lentamente el objetivo principal de la portabilidad.

A diferencia de los lenguajes humanos, los lenguajes de PC deben evolucionar y deben agregarse otros nuevos. Teníamos base 'C/Fortran' y base 'Basic'. Luego basado en el esquema. Así que se trata del programador qué sabor le gusta.

Mi lenguaje personal de apelación es VB y siempre ha resuelto lo que necesitaba. Lo más importante en un largo período posterior es que el código es tan bueno como el inglés normal para leer y comprender y, sin embargo, compilado en binarios de alta eficiencia.

Deje que los nuevos lenguajes de programación evolucionen para que puedan surgir nuevas metodologías. No restrinjamos en nombre de la convergencia, por favor.