Che cos'è un linguaggio "potente"?

22

Ho visto spesso persone litigare per il fatto che la loro lingua preferita è più "potente" di altre. Quando si tratta di descrivere un linguaggio di programmazione, posso capire che cosa sia un linguaggio orientato agli oggetti o che sia un linguaggio dinamico, ma non riesco ancora a capire quale sia esattamente una lingua "potente". Quali sono i tuoi pensieri?

    
posta craftsman 06.10.2010 - 22:56
fonte

12 risposte

32

Non possiamo definire cosa sia un linguaggio "potente" senza prima definire la parola "potente".

La letterale definizione del potere sarebbe "potenza", e penso che tutti possiamo essere d'accordo sul fatto che la stragrande maggioranza dei compilatori - e anche molti interpreti che non sono completi di Turing - fanno altrettanto buon lavoro di ottenere il processore per eseguire le loro istruzioni. Quindi, per quanto riguarda la definizione letterale, la risposta alla domanda sarebbe "quasi qualsiasi lingua".

In pratica, dovremmo fermarci qui; definire un "linguaggio potente" è un po 'come definire una "persona buona" o un "prodotto di qualità". C'è assolutamente la no definizione oggettiva di queste parole che potresti far concordare tutti, o anche la maggioranza degli esperti, e la maggior parte delle definizioni finisce semplicemente con introdurre la domanda . A seconda di chi parli, la potenza potrebbe essere una delle seguenti:

  • Una ricca struttura generica o biblioteca per eseguire un'ampia varietà di attività comuni
  • Una sintassi specifica del dominio sofisticata che "fa una cosa e fa bene"
  • Accesso diretto alle funzioni della macchina, ovvero la possibilità di scrivere codice di basso livello
  • Estrazione di concetti a livello di macchina, ovvero la possibilità di scrivere codice di alto livello
  • Un sistema di tipo ricco molto che consente strategie avanzate come riflessione, DI e analisi statica
  • Un sistema di tipo allentato che consente ai programmatori solo di farlo (tipo coercizione, ecc.)
  • La possibilità di trattare tutto come un oggetto , che offre verifica concettuale
  • La possibilità di trattare tutto come una funzione , che offre verifica matematica
  • Memoria automatica e gestione delle risorse (GC, RAII) che portano a un minor numero di bug
  • Gestione manuale della memoria e delle risorse, che potenzialmente può portare a prestazioni ottimizzate
  • Un importo minimo di rumore sintattico , che porta a una migliore leggibilità
  • Una più sintassi simile all'inglese , che offre una curva di apprendimento meno profonda
  • La possibilità di scrivere codice molto conciso (cioè operatore ternario, null-coalescing, null-extension)
  • La incapacità di scrivere potenzialmente codice confuso (ad esempio no operatori ternari, ecc.)

Tutti vedono cosa sta succedendo qui? Virtualmente ogni caratteristica punto elenco può essere interpretata come un segno di "potenza", e così può il suo esatto contrario!

Qualcuno, da qualche parte, ovviamente pensava che le variabili variabili fossero un'idea fantastica che avrebbe reso linguaggio molto potente . Non giudicherò; Non sono un ragazzo di PHP.

Propongo che invece di tutte queste sciocchezze della guerra santa, usiamo tutti questa definizione veramente semplice:

Il linguaggio più potente è quello che ti consente di spedire il prodotto di massima qualità al minor costo nel minor tempo possibile.

Vague? Scommetti. Ecco perché chiunque desideri definirsi un professionista deve comprendere sia i concetti di programmazione che il dominio del progetto. È l'unico modo per decidere cosa è "potente" per te.

Altrimenti potresti portare un coltello davvero grande a una sparatoria.

    
risposta data 07.10.2010 - 21:37
fonte
11

Forse prevenuto perché sono un programmatore di sistema. Penso a un linguaggio di programmazione utilizzato per tutti i programmi di programmazione di kernel, sistemi, server e applicazioni, o supporta più paradigmi di programmazione, oppure entrambi possono essere definiti "potenti".

C, C ++, D sono potenti, ma ovviamente questo è solo il mio modesto parere.

    
risposta data 06.10.2010 - 23:03
fonte
5

Ci sono alcune definizioni di potere oltre alla completezza di Turing. Mark ha citato ciò a cui tendo a pensare come "la definizione di Paul Graham". È una definizione abbastanza buona, con un solo difetto: è sbagliato. In teoria è un'ottima definizione del potere del linguaggio, ma sai cosa dicono della differenza tra teoria e pratica ...

Se tutti fossero in grado di scrivere un codice perfetto, non solo perfettamente privo di bug ma anche perfettamente a prova di futuro, in modo coerente, allora la definizione di Paul Graham sarebbe corretta. Ma ovviamente non è il caso. Nel mondo reale, la maggior parte del tempo e degli sforzi necessari per l'ingegneria del software non viene presa dalla creazione iniziale del prodotto, ma dalla manutenzione successiva. A seconda delle statistiche che ascolti, (e probabilmente varia un po 'da progetto a progetto), la manutenzione può rappresentare ovunque dal 60% al 90% dello sforzo totale che va in un programma.

La manutenzione viene spesso eseguita da persone diverse dalla persona che ha scritto il codice inizialmente, e frequentemente mesi o addirittura anni dopo la scrittura iniziale del codice, il che significa che anche per il codificatore originale potrebbe anche essere "codice di altre persone" "da quel punto. Se vuoi essere produttivo durante la manutenzione, devi essere in grado di verificare rapidamente l'intento originale del codice leggendolo.

Pertanto, un linguaggio più potente è quello che rende il codice più facile per leggere rapidamente, non uno che rende il codice più facile per scrivere rapidamente. C'è una discreta quantità di sovrapposizione tra i due, ma i concetti sono spesso anche trasversali, poiché la sintassi concisa spesso omette i dettagli che un compilatore / interprete è in grado di dedurre molto più facilmente di un programmatore di manutenzione. / p>

EDIT: C'è un altro punto importante nella descrizione del potere di una lingua: la gamma di concetti che sei in grado di esprimere e con quale facilità puoi raggiungere entrambe le estremità. A Paul Graham piace valutare questo su quanto alto è il livello di astrazione che puoi raggiungere, ma questo è solo la metà. Qualsiasi linguaggio che impone un limite inferiore di astrazione, al di sotto del quale non puoi andare quando è necessario, è azzoppato perché i dettagli che vengono sottratti sono lì per un motivo. Questa è la differenza tra un linguaggio giocattolo facilmente leggibile come COBOL e un linguaggio potente facilmente leggibile: COBOL non ha puntatori e nessun accesso all'assembly in linea, dove è possibile esprimere qualsiasi calcolo, anche quelli a cui COBOL non è adatto.

Anche il COBOL non è particolarmente adatto a colpire la fascia alta dello spettro di astrazione. Secondo Wikipedia, "nessun tipo definito dall'utente e nessuna funzione definita dall'utente", il che rende molto difficile la creazione di algoritmi e strutture dati.

    
risposta data 06.10.2010 - 23:27
fonte
4

Questo problema è stato discusso ripetutamente a lungo (ad es. su comp.lang.lisp, più volte). Non penso che nessuno abbia mai avuto una risposta "giusta", ma molte persone hanno trovato risposte che mi sembrano ovviamente sbagliate.

Nelle risposte che vedo qui, lasciami scegliere la risposta di Mason Wheeler. Da una parte, i problemi che copre sono importanti - ma dall'altra, non riesco a immaginare di chiamarli affatto legati al "potere". È un po 'come se dicesse che il suo minivan Honda è più potente di un dragster top-fuel perché è più sicuro, più silenzioso, ha una migliore maneggevolezza, più spazio per i passeggeri e una guida molto più constrongvole. Tutto ciò è assolutamente vero, ed è tutto importante. Questi fattori (tra molti altri) rendono il minivan molto più pratico e ragionevole per la maggior parte delle persone - ma non cambiano il fatto che il motore del minivan produce solo circa 250 CV mentre il dragster produce circa 8000 HP.

Il problema, ovviamente, è che con i veicoli c'è una definizione chiara di ciò che costituisce "potere" e cosa no. Con i linguaggi di programmazione, mi sembra che la discussione finisca per essere equivalente a trattare il trattamento, il comfort, la velocità, la capacità di carico e la distanza di crociera essendo tutti parti del "potere". Il risultato tende ad essere thread che funzionano all'infinito, generando molto più calore che luce. La maggior parte delle domande che si presentano fondamentalmente si riducono al grado di importanza che si attribuisce a caratteristiche completamente indipendenti e ortogonali - ad esempio, è la capacità di programmare la MMU in linguaggio assembly più o meno "potente" rispetto alla possibilità di creare funzioni di livello superiore in Haskell? Almeno IMO, non c'è un modo significativo per confrontare i due, e nessuna risposta significativa alla quale è "più potente", o implica più potere, o qualcosa di quella natura.

In quanto tale, per quanto odio, devo dire che in questo caso, l'unica risposta significativa è fondamentalmente una relativistica: un linguaggio potente è quello che trovi utile per realizzare ciò che vuoi. Le differenze tra gli obiettivi delle persone rendono la maggior parte delle misurazioni "assolute" di potenza al minimo.

    
risposta data 07.10.2010 - 22:06
fonte
3

Il giusto equilibrio tra brevità e flessibilità.

Ottima domanda. Dato che molte lingue sono "Turing complete", possiamo metterle tutte su basi uguali rispetto a ciò di cui sono teoricamente in grado. Ma non lo facciamo perché le lingue ovviamente differiscono l'una dall'altra. E qual è la differenza?

La differenza è la capacità di dire molte cose diverse con pochissimo . Se potessimo saltare fino agli estremi, potrei creare un linguaggio che sia la lingua migliore per inizializzare automaticamente un sistema di gestione dei contenuti usando un solo carattere, 'c'. Ma quale sarebbe il punto di ciò? Certo, è potente nel senso di essere molto breve, ma non è flessibile. Quello che vuoi è un linguaggio che ti permetta di dire molte cose complesse senza essere troppo prolisso. Senza essere come un'assemblea, capace di tutto sotto il sole, infinitamente flessibile ma estremamente prolisso.

Un linguaggio potente è un linguaggio che ti consente di dire molte cose diverse con la minima quantità possibile di lunghezza.

    
risposta data 06.10.2010 - 23:03
fonte
1

Una volta che hai completato Turing (ed è facile per una lingua farlo), "power" non significa molto, nel senso che qualsiasi cosa tu possa dire in una lingua completa di Turing puoi dire in un'altra. La risposta di Mark Canlas lo inchioda: la brevità e la flessibilità rendono differenza.

Detto questo, il testo di Matthias Felleisen Sulla potenza espressiva dei linguaggi di programmazione rende interessante la lettura. In esso tenta di formalizzare la nozione di espressività nelle lingue.

    
risposta data 06.10.2010 - 23:10
fonte
1

Sembra esserci molto disaccordo su ciò che costituisce il potere linguistico. È la chiarezza, la leggibilità, l'adattabilità o semplicemente la completezza di Turing? Penso che tutti questi fattori entrino in gioco, quindi forse il modo migliore per vederlo è in termini di punti. Sì, sto parlando RPG a penna e penna, qui.

L'idea è che ogni lingua abbia (approssimativamente) lo stesso numero di "punti", che può essere distribuito arbitrariamente su un certo numero di categorie. Ai fini della discussione, diciamo che gli unici fattori sono la brevità, la leggibilità e la flessibilità. Un linguaggio potrebbe quindi essere estremamente teso e flessibile, ma di conseguenza molto difficile da leggere; o molto leggibile e flessibile, ma estremamente prolisso.

(Indubbiamente, il numero di punti che una lingua deve distribuire è definito dall'abilità del progettista e dell'implementatore, ma facciamo finta che tutti i progettisti linguistici siano ugualmente bravi in ciò che fanno.)

Quando un progettista di linguaggi decide di aumentare la forza di una lingua in una categoria, logicamente elimina una frazione di quella forza potenziale da ogni altra categoria. Questo è il motivo per cui è così spesso affermato che la progettazione del linguaggio di programmazione è una questione di compromessi. Da questo punto di vista, la potenza complessiva di un linguaggio è ancora non definibile, e dobbiamo tornare al metodo provato e vero di categorizzare i linguaggi in base ai loro punti di forza relativi. Non soddisfacente? Peccato.

Puoi argomentare in due modi: che una lingua potente è quella con una distribuzione di punti relativamente uniforme (jack di tutti i mestieri, maestro di nessuno), o con il maggior numero di punti possibile in un'area senza lasciare gli altri incustoditi (specialista) . Non esiste una lingua da "uomo rinascimentale", con perfetta padronanza in numerosi campi. E se questa è la tua definizione del linguaggio più potente possibile, allora sei semplicemente sfortunato.

Per ulteriori informazioni, questo articolo (per coincidenza anche Paul Graham, che sembra avere opinioni contrastanti) tocca il Credo che, per quanto difficile possa essere la determinazione di come , i linguaggi di programmazione variano effettivamente di potenza. Sostiene piuttosto persuasivamente che è molto facile vedere come un linguaggio è meno potente di quello preferito - manca la caratteristica X - ma è molto difficile vedere come sia effettivamente una lingua davvero più potente - fondamentalmente equivalente al linguaggio X, ma con un mucchio di altre cose gettate dentro. Vi lascio con una citazione da quel foglio:

By induction, the only programmers in a position to see all the differences in power between the various languages are those who understand the most powerful one. (This is probably what Eric Raymond meant about Lisp making you a better programmer.) You can't trust the opinions of the others, because of the Blub paradox: they're satisfied with whatever language they happen to use, because it dictates the way they think about programs.
    
risposta data 07.10.2010 - 00:05
fonte
0

I linguaggi di programmazione sono strumenti: niente di più, niente di meno. Alcuni strumenti sono estremamente specializzati e adatti a scopi particolari; altri sono generalizzati e semplificati fino quasi alla inutilità.

Direi che il linguaggio più "potente" è quello che ti consente di raggiungere i tuoi obiettivi con un investimento minimo di tempo, energia e altre risorse; cioè, il linguaggio che fornisce il massimo ROI. In alcune situazioni potrebbe essere C; in altri, Java; in altri ancora, Haskell.

La cosa migliore da fare sarebbe familiarizzarsi con un'ampia varietà di lingue e per cosa sono utili. Quindi, quando arriva il momento di iniziare un nuovo progetto, puoi prendere una decisione informata su quale sarebbe il più appropriato.

    
risposta data 08.10.2010 - 04:15
fonte
-1

Le discussioni sui linguaggi di programmazione sono - IMHO - come discussioni sui client di posta in alcuni newsgroup di Linux: tendono ad essere una guerra di fuoco. Ricordo tempi in cui VB6 era popolare. C'era gente che sosteneva addirittura che non si trattava affatto di un linguaggio di programmazione, mentre altri hanno creato applicazioni sorprendenti con esso.

Penso che i linguaggi di programmazione differiscano già nel concetto in quanto i creatori avevano in mente cose diverse quando hanno creato / progettato la lingua. Quindi un linguaggio che si adatta a uno scopo - e in quelle circostanze è potente - potrebbe non adattarsi a un altro. Chiamare il linguaggio potente o no è quindi puramente soggettivo. Detto questo, non penso che ci sia una metrica che può essere applicata.

    
risposta data 07.10.2010 - 07:36
fonte
-1

Sono tutti strumenti nella tua cassetta degli attrezzi. Un martello può essere potente, ma non se hai bisogno di una chiave inglese. C / C ++ è ottimo se sei un programmatore di sistemi, ma Adobe Flash è probabilmente più adatto per quel sito di gioco che vuoi costruire.

    
risposta data 07.10.2010 - 21:15
fonte
-1

Il più Potente linguaggio di programmazione è quello che risolve il seguente problema di programmazione lineare :

Ingrandisci

    Rapidità di sviluppo
    + Facilità di lettura del codice
    + Facilità di debug
    + concisione / brevità di espressione
    + Facilità di apprendimento / insegnamento
    - Utilizzo della CPU
    - Requisiti di memoria

Oggetto a

  • Deve essere Turing completo.
  • Deve essere multi-paradigmatico : funzionale, orientato agli oggetti, programmazione logica, programmazione dei vincoli, concorrenza, calcolo distribuito, ecc.
  • Deve essere versatile , consentendo la creazione di interfacce da riga di comando, librerie di componenti, server, GUI e applicazioni Web.
  • Deve essere portabile , cioè facile da portare e mantenere in un'impostazione multipiattaforma.
  • Deve essere adattabile , cioè aperto al cambiamento e in grado di evolvere quando si verificano nuovi hardware (chip quantici), nuovi paradigmi e altre innovazioni nella tecnologia.
  • Deve incoraggiare lo sviluppo di librerie (come CPAN, CTAN e CRAN).
  • Deve essere libero e open source .

(E sì, lo so, ho già postato una risposta completamente contraddittoria, perché sono un dialetto.)

    
risposta data 07.10.2010 - 22:03
fonte
-2

Questo è stato scritto per quanto riguarda i linguaggi naturali, ma penso che sia appropriato anche per la programmazione dei linguaggi:

A belief that some languages are intrinsically superior to others is widespread, but it has no basis in linguistic fact. Some languages are of course more useful or prestigious than others, at a particular period of history, but this is due to the preeminence of the speakers at that time, and not to any inherent linguistic characteristics.
--David Crystal (ed.). The Cambridge Encyclopedia of Language 2/e (1997). p.7

"Potere" semplicemente non è attribuibile a una lingua piuttosto che un'altra. Sarebbe sciocco dire "il cinese è una lingua più potente del coreano". Allo stesso modo, è sciocco dire "APL è un linguaggio più potente di COBOL".

Ci sono stati diversi tentativi di equiparare il potere linguistico con una misura oggettiva. Credo che questi tentativi falliscano:

  • Potrebbe essere più facile trovare un lavoro negli Stati Uniti se parli inglese americano che dire Maori. Allo stesso modo, è senza dubbio più facile ottenere un lavoro di programmazione Java o C, piuttosto che LISP o J. Ma questo vantaggio economico certamente non riflette una sorta di potenza innata della lingua. Riguarda il potere dei parlanti della lingua.
  • "Ciao" non è meglio di "ni hao" o "shalom" perché è più corto. Allo stesso modo, anche se una funzione può essere espressa in modo più succintamente in APL rispetto a COBOL, anche questa non riflette un qualche tipo di potere innato della lingua.

La mia opinione è che le discussioni sul "potere di una lingua rispetto a un'altra" siano espressioni velate dei sentimenti di superiorità di chi parla in qualche altro gruppo. In breve, i suoi pregiudizi e stereotipi. Certamente, le persone che hanno dei pregiudizi credono davvero molto nei loro stereotipi, ed è improbabile che tu riesca a convincerli a cambiare idea.

    
risposta data 07.10.2010 - 07:03
fonte

Leggi altre domande sui tag