Quali sono le principali debolezze di Python come linguaggio di programmazione?
L'essenza delle mie lamentele con Python si riduce a due cose:
- Molto del linguaggio consiste in casi speciali piuttosto che in caratteristiche generali che si combinano in modi ortogonali. Questo si traduce in infelicità e strani casi d'angolo.
- Guido van Rossum ha una storia di errori nella progettazione del linguaggio (ad esempio, http://neopythonic.blogspot.com/2009/04/tail-recursion-elimination.html), il che significa che possiamo aspettarci che continui a sbagliare in futuro.
Alcuni esempi:
- Python ha una perpetua confusione dello scopo. Per quanto posso dire, questo è dovuto al fatto che van Rossum non ha capito inizialmente lo scope lessicale, quindi ha sbagliato. (Questo non è un problema esclusivo di Python. Sembra abbastanza comune tra le prime versioni dei linguaggi di scripting). Originariamente, Python aveva uno scope dinamico, che tutti tranne RMS concordano che è sbagliato. Poi hanno eliminato l'ambito dinamico, ma hanno fatto in modo che gli ambiti interni non potessero nemmeno vedere le variabili degli ambiti esterni, il che è bizzarro in un linguaggio presumibilmente strutturato a blocchi. Ora gli ambiti interni possono vedere gli ambiti esterni ma non possono mutarli, il che è bizzarro in un linguaggio presumibilmente orientato agli oggetti. Qualcuno potrebbe affermare che questa è una caratteristica, ma è un incidente di implementazione. Sono sicuro che quando lo sistemerà, romperà qualcos'altro.
- David Parnas ha inventato l'information hiding più di tre decenni fa, ma è "non Pythonic", così Python si sta perdendo probabilmente il più grande progresso nella programmazione dal FORTRAN 2.
- eval rompe l'alfa-equivalenza - cioè, non si possono cambiare arbitrariamente i nomi delle variabili, perché alcune occorrenze di variabili possono nascondersi in stringhe, il che rende la struttura di binding di Python indecidibile.
- Python è untyped, il che significa che un sacco di errori che sono facilmente individuabili in anticipo non vengono rilevati in Python finché non accadono. Ad alcune persone piace così - e più potere a loro! - ma vale sempre la pena considerare se è una caratteristica sbagliata per la vostra particolare applicazione
- Gli spazi bianchi sintattici possono essere piacevoli, ma rendono la generazione del codice più difficile di quanto debba essere. Questo non è un problema difficile da risolvere. Haskell vi permette di usare sia gli spazi bianchi sintattici che una sintassi equivalente che coinvolge parentesi graffe e punti e virgola. Una va bene per le persone e l'altra per la metaprogrammazione, e non c'è una buona ragione per non supportarle entrambe. Non aiuta il fatto che quando le persone lo hanno richiesto, gli implementatori di Python sono stati molto snob al riguardo. (Provate da __future__ import braces.)
- Limitare i corpi dei lambda ad essere espressioni piuttosto che dichiarazioni è arbitrario e fastidioso. Che le dichiarazioni e le assegnazioni di variabili siano dichiarazioni piuttosto che espressioni è arbitrario e fastidioso. La distinzione dichiarazione/espressione è arbitraria e fastidiosa.
- "La [tabella hash] è una struttura dati stellare". Python, come gli altri linguaggi basati su tabelle, vi incoraggia ad usare "mappature" per molte cose dove i datatypes a somma di prodotti (algebrici) sarebbero più appropriati. Questo è inefficiente, ma più importante, è soggetto ad errori. Per continuare a citare Perlis, "I programmatori non devono essere misurati dalla loro ingegnosità e dalla loro logica, ma dalla completezza della loro analisi dei casi". La mancanza di supporto di Python per strutture di dati appropriate incoraggia la struttura del programma che nasconde l'analisi dei casi. Correzione: Andrew Cooke fa notare che le tuple con nome (http://docs.python.org/library/collections.html#namedtuple-factory-function-for-tuples-with-named-fields) affrontano parte di questo problema.
Tutto ciò detto, preferisco ancora lavorare con Python che con PHP. Ma questo è come dire che preferirei mangiare Jack in the Box piuttosto che McDonald's. Potrebbe essere leggermente più appetibile, ma è ancora piuttosto brutto.
Articoli simili
- Qual è la differenza tra linguaggio macchina, linguaggio assembly e linguaggio di alto livello nei computer?
- In quale linguaggio di programmazione è codificato Netflix? Come si usa questo linguaggio?
- Il linguaggio assembly è considerato un linguaggio di programmazione funzionale?
- Quali corsi online gratuiti sono buoni per imparare il linguaggio di programmazione Python?