Bueno, es bastante difícil decir objetivamente qué lenguajes son más fáciles o más difíciles de aprender, y diferentes personas pueden encontrar diferentes lenguajes más difíciles. Aun así, hay algunos candidatos a ser "objetivamente difíciles". Así que, enumerando sólo los idiomas que conozco, de más fácil a más difícil (subjetivamente, por supuesto):
- Básico - Vamos, ¡está en el nombre! Originalmente concebido como un "lenguaje de enseñanza", no tiene mucho uso en el mundo real.
- Pascal - También un "lenguaje de enseñanza", tampoco tiene mucho uso en el mundo real. Hay que aprender un poco más de conceptos que con Basic.
- Ensamblador x86 - no se puede bajar mucho en términos de abstracción. Lo que complica las cosas es una cantidad impía de diversas extensiones (por nombrar algunas, MMX, al menos 4 versiones de SSE, FPU, etc), y al menos tres modos distintos (16, 32 y 64 bits), que todos utilizan diferentes modelos de memoria y permiten diferentes subconjuntos de comandos.
- Python - es muy fácil de aprender el lenguaje base. Pero para decir que realmente se conoce Python hay que conocer también algunas bibliotecas, y el diseño de las mismas no siempre es consistente. Así que, resumiendo, simplemente hay mucho que aprender.
- Go - muy similar a Python en términos de complejidad de aprendizaje, aunque el diseño de las bibliotecas es generalmente algo más consistente. Sin embargo, puede ser un poco más difícil de aprender, sobre todo debido a que se hace pasar por un lenguaje de bajo nivel cuando en realidad no lo es, por lo que hay un poco de desconexión a veces.
- Java - también muy similar a Python en términos de complejidad, pero podría decirse que una mayor colección de bibliotecas a tener en cuenta.
- PHP - podría estar cerca de Python en términos de complejidad, pero PHP es mucho menos consistente que Python. Las versiones más nuevas son mejores, pero son retrocompatibles, lo que significa que todavía hay un montón de cosas francamente raras en el lenguaje, y un montón de código horrible flotando por ahí.
- C - es bastante fácil si estamos hablando de aprender el lenguaje, pero hay esta cosa llamada "comportamiento indefinido" que complica mucho las cosas. Básicamente, hay unos cuantos baches en el estándar del lenguaje. Si estás usando algo de eso, que es indefinido, el compilador es libre de hacer lo que quiera, y en la mayoría de los casos no te notificará sobre eso. Dicho esto, irónicamente, el "comportamiento indefinido" está bien definido, por lo que es posible aprender y evitar. Sin embargo, eso añade complejidad de aprendizaje.
- JavaScript - el lenguaje base es realmente simple, pero hay un montón de trucos e inconsistencias, que usted necesita saber, similar al "comportamiento indefinido" en C, pero no tan bien definido. Además, últimamente, se ha añadido una gran cantidad de sintaxis francamente innecesaria en los nuevos estándares, por lo que tendrás que aprender eso también (con todas las gotas que vienen con eso, y hay unas cuantas)
- Rust - te pelearás mucho con el compilador, porque Rust intenta darte muchas garantías estáticas. Hay algunas cosas inesperadas con las que te puedes encontrar, pero en su mayor parte, es bastante consistente e intuitivo. Bueno, al menos después de envolver su cabeza alrededor de todo "garantías estáticas".
- Haskell - usted luchará con el compilador mucho, también porque Haskell intenta darle un montón de garantías estáticas, pero no necesariamente las mismas garantías que Rust hace. Haskell es mucho más fácil si tienes una formación matemática y poca o ninguna experiencia en programación (imperativa). Los programadores (imperativos) consumados a menudo tienen dificultades con Haskell porque necesitan romper primero algunos estereotipos preconcebidos. Sin embargo, Haskell está lleno de conceptos muy abstractos que pueden ser difíciles de entender al principio. Busca en Google "mónadas" para ver un ejemplo. Una intimidante lista de extensiones del lenguaje también complica un poco las cosas.
- C++ - en primer lugar, es enorme. C++ es básicamente tres lenguajes distintos que debes conocer: el preprocesador, el propio C++ y el metalenguaje de plantillas; los tres utilizan una sintaxis diferente; los tres tienen sus propios inconvenientes. También hay un montón de cosas francamente extrañas en el estándar C++, muchas de las cuales (pero no todas) son accidentes históricos. Como consecuencia, C++ está lleno de reglas a menudo poco intuitivas que hay que conocer. Añada a eso una enorme biblioteca estándar, esa cosa horrible llamada "comportamiento indefinido" heredada de C, y un poco de cosas nuevas que se introducen con cada nuevo estándar, y se obtiene un lenguaje que es involuntariamente muy difícil de aprender.
- Malbolge - un lenguaje de programación esotérico. Está diseñado específicamente para ser casi imposible de usar o aprender. Se llama así por el octavo círculo del infierno en el Infierno de Dante, lo que dice mucho sobre la intención general de sus autores.
4-9 son algo intercambiables, no hay demasiada diferencia de complejidad entre ellos. De estos 6, algunos podrían argumentar que C es el más difícil, pero de los que lo harían, la mayoría señalaría la gestión manual de la memoria. La gestión manual de la memoria no es difícil de aprender, es difícil de usar. Conceptualmente, sólo equivale a "asignar memoria antes de usarla, liberar la memoria que has asignado, no usarla después de liberarla, no intentar liberarla más de una vez". En realidad, hacer todo eso sin cometer errores es bastante difícil, y el compilador no te notificará si te equivocas. Aun así, la gestión manual de la memoria no es exclusiva de C, y no es imposible meter la pata incluso en los lenguajes de recolección de basura, así que me parece que este sentimiento no está justificado.
Puede que te hayas dado cuenta de que sólo hay un lenguaje funcional en la lista, concretamente, Haskell. También podría haber mencionado OCaml, Scala y F#, pero no estoy tan familiarizado con ninguno de ellos, así que no me siento cualificado para comentar su complejidad de aprendizaje. Estos tres lenguajes tienen partes orientadas a objetos de las que hay que preocuparse, mientras que Haskell no, así que es una cuestión abierta si son más difíciles de aprender que Haskell o no. Yo diría que añadir "objetos" de la programación orientada a objetos en el sistema de tipos hace que el sistema de tipos sea más complicado, y por tanto más difícil de aprender. Por otro lado, Haskell es a menudo más abstracto, y algunas personas tienen un poco de dificultad con eso.