Beh, è piuttosto difficile dire oggettivamente quali linguaggi sono più facili o più difficili da imparare, e persone diverse potrebbero trovare diversi linguaggi più difficili. Tuttavia, ci sono alcuni candidati ad essere "oggettivamente difficili". Quindi, elencando solo le lingue di cui sono a conoscenza, dalla più facile alla più difficile (soggettivamente, ovviamente):
- Basic - Dai, è nel nome! Originariamente concepito come "linguaggio di insegnamento", non molto usato nel mondo reale.
- Pascal - Anche questo un "linguaggio di insegnamento", anche questo non molto usato nel mondo reale. Un po' più di concetti da imparare rispetto al Basic.
- assemblaggiox86 - non può essere molto più basso in termini di astrazione. Ciò che complica le cose è una quantità spropositata di varie estensioni (per citarne alcune, MMX, almeno 4 versioni di SSE, FPU, ecc.), e almeno tre modalità distinte (16-, 32- e 64-bit), che usano tutte modelli di memoria diversi e permettono diversi sottoinsiemi di comandi.
- Python - è molto facile imparare il linguaggio base. Ma per affermare di conoscere Python è necessario conoscere anche alcune librerie, e il design delle librerie non è sempre coerente. Quindi, per farla breve, c'è semplicemente molto da imparare.
- Go - molto simile a Python in termini di complessità di apprendimento, anche se il design delle librerie è generalmente più coerente. Potrebbe essere un po' più difficile da imparare però, soprattutto perché si maschera come un linguaggio di basso livello quando in realtà non lo è, quindi a volte c'è un po' di disconnessione.
- Java - anch'esso molto simile a Python in termini di complessità, ma probabilmente una più grande collezione di librerie da conoscere.
- PHP - potrebbe essere vicino a Python in termini di complessità, ma PHP è molto meno coerente di Python. Le versioni più recenti sono migliori, ma sono retrocompatibili, il che significa che c'è ancora un sacco di roba francamente strana nel linguaggio, e un sacco di codice orribile che galleggia in giro.
- C - è piuttosto facile se stiamo parlando di imparare il linguaggio, ma c'è questa cosa chiamata "comportamento non definito" che complica molto le cose. Fondamentalmente, ci sono alcune buche nello standard del linguaggio. Se stai usando uno di questi, che è indefinito, il compilatore è libero di fare quello che vuole, e nella maggior parte dei casi non ti avviserà di questo. Detto questo, ironicamente, il "comportamento indefinito" è ben definito, quindi è possibile impararlo ed evitarlo. Ancora, questo aggiunge complessità di apprendimento.
- JavaScript - il linguaggio di base è davvero semplice, ma ci sono un sacco di intoppi e incongruenze, che è necessario conoscere, simili al "comportamento indefinito" in C, ma non così ben definito. Inoltre, ultimamente, un sacco di sintassi francamente non necessaria è stata aggiunta nei nuovi standard, quindi dovrete imparare anche questo (con tutti gli inconvenienti che ne derivano, e ce ne sono alcuni)
- Rust - combatterete molto con il compilatore, perché Rust cerca di darvi un sacco di garanzie statiche. Ci sono alcune cose inaspettate in cui ci si può imbattere, ma per la maggior parte, è piuttosto coerente e intuitivo. Beh, almeno dopo essersi messi in testa tutta la faccenda delle "garanzie statiche".
- Haskell - si combatte molto con il compilatore, anche perché Haskell cerca di dare molte garanzie statiche, ma non necessariamente le stesse garanzie di Rust. Haskell è molto più facile se avete un background matematico e poca o nessuna esperienza di programmazione (imperativa). I programmatori esperti (imperativi) spesso lottano con Haskell perché hanno bisogno di rompere alcuni stereotipi preconcetti prima. Ancora, Haskell è pieno di concetti molto astratti che potrebbero essere difficili da afferrare all'inizio. Cerca su Google "monadi" per un esempio. Una lista intimidatoria di estensioni del linguaggio complica anche un po' le cose.
- C++ - prima di tutto, è vasto. Il C++ è fondamentalmente tre linguaggi distinti di cui bisogna essere a conoscenza: il preprocessore, il C++ stesso, e il metalinguaggio dei template; tutti e tre usano una sintassi diversa; tutti e tre hanno i loro problemi. Ci sono anche un sacco di cose francamente strane nello standard C++, molte delle quali (ma non tutte) sono incidenti storici. Di conseguenza, il C++ è pieno di regole spesso poco intuitive che bisogna conoscere. Aggiungi a questo un'enorme libreria standard, quella cosa orribile chiamata "comportamento indefinito" ereditata dal C, e un bel po' di roba nuova che viene introdotta con ogni nuovo standard, e ti ritrovi un linguaggio che è involontariamente molto difficile da imparare.
- Malbolge - un linguaggio di programmazione esoterico. È progettato specificamente per essere quasi impossibile da usare o imparare. Chiamato come l'ottavo cerchio dell'Inferno nell'Inferno di Dante, che la dice lunga sull'intento generale dei suoi autori.
4-9 sono in qualche modo intercambiabili, non c'è troppa differenza di complessità tra questi. Di questi 6, alcuni potrebbero sostenere che il C è il più difficile, ma tra quelli che lo farebbero, la maggior parte punterebbe alla gestione manuale della memoria. La gestione manuale della memoria non è difficile da imparare, è difficile da usare. Concettualmente, equivale solo a "allocare la memoria prima dell'uso, liberare la memoria che avete allocato, non usare dopo averla liberata, non provare a liberare più di una volta". In realtà fare tutto questo senza errori è piuttosto difficile, e il compilatore non vi avviserà se fate un errore. Tuttavia, la gestione manuale della memoria non è un'esclusiva del C, e non è impossibile sbagliare anche nei linguaggi garbage-collected, quindi trovo che questo sentimento non sia giustificato.
Avrete notato che c'è solo un linguaggio funzionale nella lista, cioè Haskell. Avrei potuto menzionare anche OCaml, Scala e F#, ma non ho familiarità con nessuno di questi, quindi non mi sento qualificato per commentare la loro complessità di apprendimento. Tutti questi 3 hanno parti orientate agli oggetti di cui preoccuparsi, mentre Haskell no, quindi è una questione aperta se siano più difficili da imparare di Haskell o no. Direi che l'aggiunta di "oggetti" dalla programmazione orientata agli oggetti nel sistema di tipi rende il sistema di tipi più complicato, e quindi più difficile da imparare. D'altra parte, Haskell è spesso più astratto, e alcune persone hanno un po' di difficoltà con questo.