¿Qué conceptos de la investigación en lenguaje de programación probablemente se generalizarán en los próximos 5 a 10 años (2014–2023)?

Lo que puede venir en 5-10 años:

  • Un guiño al estilo monádico y al seguimiento de los efectos (pero probablemente con otros nombres ya que la gente parece estar tan asustada de las palabras). Esto se remonta a la clara exposición de Wadler en 1992 *, por lo que la corriente principal está en el mejor de los 20 años detrás de la curva aquí.
  • Java podría obtener cierres algún día
  • Verificadores de tipo autónomo ( tal vez, pero Erlang ya tiene uno). Contaría compiladores como Roy y Fay aquí, que ya tenemos, por lo que no es un gran tramo. Mejorarán y habrá otros.
  • Tipos de datos algebraicos (suma, producto), quizás con otros nombres
  • Inferencia de tipos (esto ya está empezando a llegar en algunos de los nuevos idiomas de vanidad)
  • Formas de coincidencia de patrones (pero esto funciona mejor cuando tienes bases adecuadas como ADT)
  • Comprensiones
  • Implementaciones de actores.

Scala es un buen ejemplo de difusión de FP; podría usarlo como una lista de verificación para que otros idiomas se pongan al día. No tenía a Scala en mente cuando escribí la lista anterior, pero encaja bien.

Lo que espero que se entienda y se adopte, pero no espere:

  • Comprobación de tipo general y corrección,
  • expresividad y
  • Rendimiento obtenido a través del borrado y la certeza del tiempo de ejecución.

No me queda claro por qué no usarías los sistemas maduros que tienen el 100% de los anteriores, hoy.

Bueno, podemos soñar que la corriente principal tomará nota. Es típicamente 20-30 años detrás de buenas ideas. Y dentro de 10 años, la comunidad de PF todavía estará muy por delante: ya están empezando a elaborar aplicaciones prácticas para los tipos dependientes y verificadores de pruebas, por no mencionar que encuentran nuevos métodos monádicos casi a diario.

* —Wadler: Mónadas

Creo que la “Programación reactiva” (o FRP en su versión funcional) se convertirá en la “recolección de basura” de esta década. (Es decir, estándar en todos los idiomas que no tienen una razón particularmente buena para no tenerlo).

Básicamente, es una forma de conectar los valores y actualizarlos automáticamente cuando se producen algunos eventos. Sin tener que escribir explícitamente el manejo de eventos como controladores de devoluciones de llamadas / eventos anidados. Hemos tenido esta idea durante años en varias formas, como “señales” en bases de datos y marcos web, en marcos del lado del navegador como angular.js. Pero creo que se convertirá en un ciudadano de primera clase de los lenguajes de programación de uso común.

Los marcos muestran que muchos idiomas pueden implementar RP en una biblioteca / marco. Para generalizar, necesitaremos algún tipo de soporte sintáctico (por ejemplo, para distinguir entre llamadas de función de un solo disparo con parámetros particulares y flujos de datos permanentes) Y un buen soporte de compilador / depurador porque la depuración de acciones espeluznantes a distancia en idiomas que no son No te prepares para eso, apesta.

Muchos idiomas de FP ya tienen algo similar. Supongo que veremos el primer intento de injertarlo en los estándares de javascript o java en esta década.

Voy a decir algo aquí que muchos de ustedes pueden burlarse, pero muchas de las cosas que ocurren en los lenguajes de programación son un reciclaje de conceptos antiguos, aunque de una manera más eficiente.

Si observa paradigmas completamente nuevos que no se han visto en lenguajes populares del pasado:

1) LINQ: muchos idiomas pueden tratar trozos de datos en N dimensiones como unidades, pero LINQ lo lleva más lejos, lo que permite que el conocido estilo de operaciones RDBMS se aplique a cualquier tipo de datos. No es difícil de emular en los idiomas más avanzados, pero nadie hizo este tipo de cosas antes. Las operaciones de estilo SQL proporcionan una buena herramienta para visualizar consultas complicadas que serían bastante incómodas de expresar en código normal (estoy seguro de que los programadores de Haskell y R no tienen ese problema).

2) Conceptos de C ++: sí, se rompió en algunas formas complicadas y en una tarea extremadamente compleja, pero la idea de poder definir los requisitos de tipo o “interfaces” por así decirlo de una manera completamente desacoplada es algo que nunca se ha hecho. Hasta donde sé, para aquellos que no están familiarizados, en su forma más simple, nos permitiría definir un algoritmo genérico que funcionara en cualquier tipo que admitiera cierto conjunto de operaciones, incluso si esos tipos no estaban relacionados o eran desconocidos para el escritor. del algoritmo. Esto lleva la generosidad al siguiente nivel (una vez más, creo que se pueden hacer tales cosas en Haskell como están)

3) DSL compatibles con lenguaje incorporado: generación de código y mixins en D, constexpr y literales de cadena sin formato en C ++ 13: esto nos permite expresar algo de lógica en un lenguaje que no es necesariamente similar al idioma principal cuando tiene sentido. Por supuesto, C ++ ha estado (ab) usando las plantillas y el preprocesador para hacer esto desde siempre, pero las adiciones recientes al lenguaje te permiten algunas locuras (un genio húngaro en Boostcon 2012 demostró una biblioteca de plantillas en C ++ que te permite escribir código de forma rudimentaria Haskell dialecta dentro de los literales de cadena y haz que se “ejecute” en tiempo de compilación!)

El procesamiento secuencial se detuvo en la ampliación hace 10 años, la ampliación paralela se mueve más rápido de lo que la mayoría de los programas aprenden a aplicarla, y mientras más partes pequeñas se ponen en el aire, más pronto uno de ellos hace algo mal. Agregue que la corriente principal tiene dificultades para gastar dinero = tiempo + esfuerzo en adaptarse hasta que tenga que hacerlo, y creo que tenemos un caso de que algún tipo de truco para facilitar la tolerancia a fallas en los sistemas distribuidos puede entrar en la tubería antes que cosas de gran belleza teórica.
Pero no estoy seguro de los 5-10 años.

Esta respuesta no sustituye el consejo de un psíquico real.

Un lenguaje de programación es el lenguaje de alguna plataforma que implementa algoritmos que usan paradigmas para resolver problemas específicos. Es una función que depende de cuatro objetos de valor: plataformas, algoritmos, paradigmas y problemas. Ver Clasificación de los principales paradigmas de programación.

Normalmente miras el pasado con la esperanza de vislumbrar el futuro. Una breve, incompleta y en su mayoría incorrecta historia de los lenguajes de programación es una de mis fuentes favoritas para ver dónde hemos estado hasta 2003 y para ver hacia dónde nos dirigimos. Current Treads, tal como se encuentra en la historia de los lenguajes de programación, ofrece un vistazo. Lo que resolvamos hoy determinará lo que resolveremos en el futuro.

Consulte los artículos de Computación y algoritmo que muestran cómo evolucionaron las plataformas y los algoritmos para resolver nuevos problemas.

OCaml ya tiene usos en el mundo real. Además, F # es un primo cercano de OCaml.

El nuevo lenguaje de propósito general más prometedor es probablemente Scala. Sin embargo, es muy complejo y todavía faltan herramientas. (Es difícil aprovechar el poder de un lenguaje de tipo inferido sin un IDE poderoso).

Expresiones Lambda y funcionalidad incorporada para la concurrencia y la resolución de probabilidades. Estas características serán esenciales para construir los sistemas de próxima generación y las aplicaciones de aprendizaje automático.