¿Cuáles serán los lenguajes de programación a principios de 2020?

Como dijo Quora User, nos estamos acercando rápidamente a los límites de la fabricación de chips, y estamos empezando a alcanzar límites cuánticos que nos impedirán un mayor crecimiento de la velocidad y la capacidad, tal como hemos estado utilizando durante los últimos 40 años (la Ley de Moore). Los programadores (y los gerentes) siempre apostaban a la actualización de hardware del próximo año para resolver la falta de rendimiento de su software; y eso ha funcionado durante tanto tiempo que las últimas dos generaciones de programadores rara vez se preocupan por la eficiencia, ya sea la velocidad o la memoria, o ambas cosas. (Excepto los juegos … Luego se esfuerzan por exprimir el último abandono de la plataforma de su elección).

Nosotros, los programadores en el área científica, hemos estado presionando la última caída de rendimiento desde el día 1. Y aprendimos muchas lecciones sobre cómo hacerlo sin comprometer la claridad del código y su capacidad para ejecutarse en arquitecturas y entornos futuros. Algunos códigos científicos tienen un pedigrí muy largo, y cambiarlos o volver a codificarlos no afectará la reproducibilidad de los resultados que es tan importante en la ciencia.

Anticipamos el “enamoramiento cuántico” de la Ley de Moore y comenzamos a hacer nuestros planes de contingencia. Esos planes, en esencia, indican que debemos aprovechar la mayor ventaja posible del procesamiento paralelo, ya sea mediante la distribución del cómputo en múltiples máquinas independientes o en múltiples unidades de cómputo independientes. Incluso aprovechamos las GPU mejoradas (cuya razón de ser fue impulsada en gran medida por la industria del juego) disponible en todas partes donde se encontraba disponible una moderna tarjeta gráfica. Gigantes como Nvidia incluso satisfacían nuestras necesidades con arreglos de GPU sin video aptos para clusters, e incluso bibliotecas desarrolladas capaces de computar nuestros algoritmos centrales en ellos.

El área de programación científica sabe que la única forma de avanzar es aprovechar el paralelismo en forma de múltiples unidades de cómputo homogéneas (o heterogéneas, como en el caso de las GPU y lo que venga a continuación). Actualmente, muchos compiladores de alto nivel de lenguajes como C / C ++ pueden utilizar múltiples unidades centrales en las CPU populares para distribuir los cálculos automáticamente sin tener que lidiar con las complejidades de bajo nivel de la programación de subprocesos.

Aparte de esto, no puedo decir con certeza. El mundo de la electrónica y los chips no cambiará demasiado en 5-10 años: ahora es más un “rastreo por los últimos centímetros” que un “ataque precipitado para la línea de meta”; es “más de lo mismo, solo que más grande y mejor” en lugar de “nueva velocidad sin precedentes”. (A menos que haya avances imprevistos, es decir. Pero “imprevisto” significa exactamente eso: no se puede prever ).

¿Por qué todo este desvío en “tierra electrónica”? Porque los lenguajes de programación no existen en un vacío: atienden necesidades específicas y aprovechan oportunidades específicas. No creas un nuevo idioma solo porque puedes (debería saberlo: he estado haciendo esto durante décadas, siempre porque surgió la necesidad, no porque quería “intentarlo y hacerme famoso”). El atributo más importante de un idioma es qué tan bien se ajusta a las necesidades del campo al que se dirige y qué tan bien se abstrae de los detalles esenciales de la implementación de aquellos que no necesitan preocuparse por sí mismos (y también, qué tan bien se revela Detalles a quienes realmente necesitan conocerlos).

Ningún lenguaje actual o pasado ha golpeado el “punto dulce”. No para todos los casos de uso, es decir. La tendencia siempre ha sido diseñar lenguajes de propósito general que cubran la mayor cantidad posible de patrones de uso. Ellos son “generalistas”. Pero por la misma razón que ahora tenemos que pensar cada vez más en la optimización, los lenguajes generalistas siempre se retrasarán un poco debido a su necesidad de compromiso para generalizar . Yo, personalmente, predigo el aumento de más idiomas “especializados”, sintonizados con precisión en sus áreas objetivo; no existe solo, sino en un próspero ecosistema de otros idiomas, tiempos de ejecución y entornos que permiten a cada uno centrarse en lo que hace mejor y relegar otros aspectos a otros idiomas. Ya lo estamos viendo con “sistemas multiparadigm” que aprovechan muchos idiomas, cada uno haciendo su parte y parcela.

Lo importante a recordar es que “los humanos son caros, las máquinas son baratas”. No fue hace décadas, pero lo es cada vez más hoy y mañana. Necesitamos idiomas que ayuden a los humanos, no a la máquina: ya conocemos muchas formas de ayudar a la máquina sin molestar demasiado a los humanos (si es que lo hacemos); no lo hicimos cuando empezamos a crear los primeros idiomas, y no lo hicimos. durante muchos, muchos años después, pero ahora conseguimos una comprensión decente del “arte” y lo estamos utilizando en tantos compiladores como tenga sentido. Los programadores rara vez, si acaso, necesitan conocer esos detalles de bajo nivel (de hecho, la mayoría de los programadores han sido ajenos a la necesidad de conocerlos desde que comenzó su carrera).

Los programadores pierden enormes cantidades de tiempo pensando o preocupándose por la velocidad de las partes no críticas de sus programas, y estos intentos de eficiencia en realidad tienen un fuerte impacto negativo cuando se consideran la depuración y el mantenimiento. Debemos olvidarnos de las pequeñas eficiencias, digamos que aproximadamente el 97% de las veces: la optimización prematura es la raíz de todo mal. Sin embargo, no debemos dejar pasar nuestras oportunidades en ese 3% crítico.
–En el artículo de Donald Knuth “Programación estructurada con ir a declaraciones”

Eso fue escrito hace 40 años por un gran sabio , durante la “revolución de la programación estructurada”. Todavía es cierto hoy. Y será verdad para el futuro previsible.

Los lenguajes de programación deberían ayudar a los humanos a usarlos, no a la máquina que ejecuta los programas. Si la máquina necesita ayuda para ejecutar de manera eficiente y rápida alguna parte del código, y el sistema de lenguaje no puede determinar por sí mismo qué parte es y qué hacer al respecto, entonces la primera línea de ataque es perfilar al culpable (s) y entonces enfócate en ellos. Ese no es el trabajo de un procesador de lenguaje (compilador, intérprete, JIT, lo que sea) sino de un conjunto de herramientas que se pueden implementar para instrumentar el código en ejecución y que producirá un resultado que ayude a un experto en optimización a identificar las causas y sugerir mejoras ( e incluso interactuar con los diseñadores de sistemas de idiomas para agregar algunas heurísticas para abordar el problema).

Mi punto es que nos estamos acercando rápidamente a una situación de “escasez de recursos”, donde necesitamos optimizar todos los componentes relevantes del problema para convertirlo en una solución. Y la parte humana ha sido esencialmente descuidada durante demasiado tiempo. Los lenguajes deben abordar tanto el lado de la computadora (eficiencia, medida de la manera que sea apropiada) como la parte humana (programador y eficiencia de apoyo, medida de la manera que sea apropiada). Esos lados son complementarios e interactúan, por lo que deben abordarse juntos.

Eso es lo que espero ver adelante. No “compilado versus interpretado”, no “adelantado en el tiempo versus justo en el tiempo”, no “procesal versus funcional”: esas son batallas antiguas . El “enemigo” ha cambiado: el enemigo a vencer somos nosotros , el eslabón débil : los programadores. Es hora de optimizar las capacidades humanas y también de educar a los programadores para que sean mucho más que “programadores”, “programadores competitivos” y “piratas informáticos”.

Descargo de responsabilidad: antigua industria del software curmudgeon hablando. Siéntete libre de ignorarme. 🙂

El desarrollo de cualquier lenguaje se basa en la necesidad y en la complejidad de la necesidad. Consideremos la evolución del lenguaje humano. ¿Por qué se desarrolló? ¿Cómo se desarrolló? ¿Qué mecanismos se utilizaron en su desarrollo? Si se adopta una visión darwiniana, el lenguaje evolucionó en los humanos como un mecanismo para facilitar la adaptación y asegurar la supervivencia de la especie. Pero básicamente se reduce a “lo necesitábamos”. Al principio, unos pocos gruñidos y gestos eran suficientes, pero a medida que la sociedad se hacía más compleja, se necesitaba un lenguaje más complejo. ¿Adivina qué? El lenguaje se hizo más complejo.

¿Qué mecanismos facilitaron su desarrollo, no biológico sino social? La sociedad humana se desarrolló desde Hunter Gatherers hasta Agricultural, lo que a su vez condujo al desarrollo de las ciudades. Por supuesto, este es un análisis muy simple, pero es suficiente para mi punto de vista. A medida que los humanos se agrupaban, y la complejidad de su necesidad de lenguaje aumentaba, también lo hacía la complejidad del lenguaje. ¿Alguien creó uno para ellos? ¿Se acredita a una persona por su desarrollo? No, fue creado y desarrollado por Humanos, para Humanos. Su evolución fue moldeada por la necesidad humana, la interacción humana. Cuanto mayor es la necesidad, mayor es la interacción, más fácil es que evolucione el lenguaje complejo. Aquí está mi punto. La próxima evolución en lenguajes de programación será Lenguajes escritos por Computadoras para Computadoras. ¿Quieres que el lenguaje de programación sea más eficiente? Cree un entorno en el que las Computadoras tengan que interactuar para realizar una tarea, déles la suficiente autonomía, dígales que necesitan crear un lenguaje más eficiente y vea qué sucede.

Entiendo que esta es una respuesta muy simplista, y hay obstáculos tecnológicos que están delante de nosotros. No soy programador, o pretendo ser un experto en informática en cualquier forma o forma, pero los lenguajes se desarrollan según la necesidad y la complejidad de la necesidad. Los mecanismos son la interacción, y las interacciones más complejas. λ

Cualquier lenguaje de programación que facilite la flexibilidad, independientemente de la plataforma, la versatilidad y el desarrollo incremental son lenguajes del futuro. Estos idiomas tienden a hacer las cosas muy fáciles sin que usted haga mucho trabajo, por ejemplo Python and Go, que se dice que son los Idiomas del Futuro. Estos dos lenguajes funcionan en cualquier forma de desarrollo de software, incluso desarrollo de aplicaciones móviles (en la fabricación).

Será un lenguaje de programación muy intuitivo y fácil de aprender. a diferencia de los lenguajes de programación comunes, donde se deben aprender los símbolos crípticos, se adaptará a la forma en que un humano piensa. el tiempo y la sincronicidad no importarán tanto como la relatividad y la conectividad. Los recursos y las bibliotecas estarán disponibles al instante para el programador. El concepto de compilación quedará completamente abandonado. en su lugar, los errores de sintaxis se señalarán durante la programación. Si tenemos una computadora tan increíble y rápida, ¿por qué no usarlas? El software con errores en él ya no será un problema.
en 5 a 10 años habrá tantas personas con habilidades de programación como personas hoy en día que saben leer y escribir.

5-10 años es un tiempo muy corto en lenguajes de programación.

El paisaje lingüístico no se verá muy diferente para entonces. Un cambio sutil en las frecuencias, pero no mucho más notable.

Lo que parece cambiar mucho más rápido son los marcos y las bibliotecas. Espero que tal vez el 50% de los marcos populares de hoy estén en desuso y se reduzcan a un legado que se encuentra al borde del estado extinto.

Python, Ruby y Javascript seguirán siendo masivos. Pero jQuery y Sinatra y Django podrían estar en declive.

Parece que React y React Native van a ser grandes ganadores para definir las interfaces de usuario. Pero posiblemente envuelto en nuevas bibliotecas simplificadas o incluso DSL. Quizás veamos algo como un “ReactScript” que aparece. Un DSL / front-end dedicado para definir interacciones de tipo React. (Habiendo escrito la oración anterior, decidí buscarla en Google y encontré react-script)

En el pasado, llamé a la “programación reactiva” la “recolección de basura de los próximos 10 años”. Quiero decir, algo increíblemente útil, que elimina una gran cantidad de problemas innecesarios del 99% de los programadores de aplicaciones, que se va generalizando, ya sea en nuevos idiomas o en nuevos marcos estándar.

Todavía creo que eso es verdad. Pero claramente, aunque reactivo es una gran mejora en el “infierno de devolución de llamada”, todavía no es lo suficientemente simple e intuitivo.

Puede que lo haya perdido, pero todavía estoy esperando ver un marco general que pueda ocultar un diálogo asíncrono detrás de una simple metáfora de tuberías.

El equivalente a escribir:

diálogo(
formulario (“Ingrese su? nombre de usuario y? contraseña”),
check-password (nombre de usuario, contraseña),
is_ok (página (“Hello $ nombre de usuario”)),
not_ok (notificar (“No está autorizado. Inténtelo de nuevo”), vuelva a intentarlo ())
);

Quizás el mar de Smalltalk es el ejemplo más cercano. ¿Hay otros?

El momento en que intenta escribir algunos pseudocódigos para este diagrama de flujo es el momento en que ve el problema. El texto es lineal, las máquinas de estados se representan mejor en gráficos bidimensionales.

Estoy seguro de que hay un millón de compiladores de diagrama de código de estado gráfico por ahí. Ninguno de ellos está lo suficientemente integrado o integrado con el resto de la base de código y las herramientas que utilizamos. Creo que una vez que la programación reactiva se convierta en una práctica general, tendremos más posibilidades de crear editores gráficos para las máquinas de estado también.

Esto no es absolutamente un problema tecnológico. Tecnológicamente podría haberse resuelto hace 30 años. Es un problema cultural / convencional. Solo necesita los estándares adecuados para convertirse en “bueno …” estandarizado y todos podríamos estar interceptando diálogos complejos en forma de simples diagramas de transición de estado.

En 5 – 10 años tal vez suceda. O tal vez no lo hará.

Python tiene un gran futuro en criptografía y desarrollo rápido de aplicaciones.
Ruby on Rails será una marca registrada en el desarrollo web.
Java seguirá siendo famoso durante los próximos 10 años por lo menos.
PHP permanecerá para siempre, siempre y cuando sea de código abierto y la increíble comunidad esté viva.

¡Es correcto y emocionante que nadie realmente sepa! La tasa de innovación en los lenguajes de programación es asombrosa con nuevos que salen cada mes.

Dicho esto, la vida útil de los lenguajes de programación es larga, por lo que es probable que continúes viendo los lenguajes más populares hoy en día (Java, C #, Go, Python) aún en 10 años. ¡Los mejores deseos!

Mira la historia. Duran mucho tiempo. Ellos evolucionan con el tiempo. Creo que los lenguajes principales todavía estarán en un juego de mojor como C, C ++, java, python, ruby, groovy. Los lenguajes como C # probablemente ganarán más nombre y podrían usarse para un uso más general. HTML, PHP, .net podría tener nuevas versiones. COBOL podría quedar desactualizado a medida que las organizaciones se están moviendo más hacia la nube. Lo más importante es que los nuevos idiomas pueden ser más sofisticados.

Los lenguajes de programación tienden a tener vidas más largas que la tecnología que soportan. Preveo que los lenguajes principales como Java, Python, C / C ++ todavía son comunes. Tal vez algunos idiomas flotarán hacia arriba y otros flotarán hacia abajo.