Quanti tipi di linguaggi di programmazione ci sono? [chiuso]


30

Fondamentalmente, voglio imparare molti linguaggi di programmazione per diventare un grande programmatore. Conosco solo una manciata di profondità e speravo che qualcuno potesse approfondire quante classi o tipi di linguaggi di programmazione ci sono . Ad esempio come li raggrupperesti insieme se dovessi impararli in gruppo.

Proveniente da un background Java, ho familiarità con la tipizzazione statica, ma so che oltre alla tipizzazione dinamica ci deve essere una tale varietà di lingue disponibili che mi piacerebbe vedere una suddivisione categorica, se possibile.


2
Non sarebbe meglio dire "Che tipo .." invece di quanti?
Amir Rezaei,

Bene, ho imparato che qualcosa come Prolog e C sono fondamentalmente diversi, quindi pensavo che ognuno corrispondesse a un diverso tipo di linguaggio di programmazione e speravo di capire quanti tipi.
sova,

7
2: il tipo che fa quello che vuoi e il tipo che non lo fa
Matt Ellen

1
Imparare su diversi tipi di linguaggi di programmazione è assolutamente costruttivo ! Potresti potenzialmente sostenere che questo dovrebbe essere chiuso come un duplicato di questo, ma penso che siano abbastanza distinte domande da rimanere separate.
Peter Boughton,

1
@Sova, ti consiglierei di fare la tua prima scelta di nuove lingue per provare qualcosa che non usa la sintassi basata su c. Ciò ti focalizzerà maggiormente su come funziona rispetto a come è diverso da quello che conosci meglio.
Erik Reppen,

Risposte:


73

Dipende da come vuoi classificare le lingue. Fondamentalmente, le lingue possono essere suddivise in due tipi: lingue imperative in cui istruisci il computer su come svolgere un'attività e lingue dichiarative in cui dici al computer cosa fare. I linguaggi dichiarativi possono essere ulteriormente suddivisi in linguaggi funzionali , in cui un programma è costruito componendo funzioni e logicalinguaggi di programmazione, in cui un programma è costruito attraverso una serie di connessioni logiche. Le lingue imperative leggono più come un elenco di passaggi per risolvere un problema, un po 'come una ricetta. I linguaggi imperativi includono C, C ++ e Java; linguaggi funzionali includono Haskell; i linguaggi di programmazione logica includono Prolog.

I linguaggi imperativi sono talvolta suddivisi in due sottogruppi: linguaggi procedurali come C e linguaggi orientati agli oggetti . I linguaggi orientati agli oggetti sono un po 'ortogonali ai raggruppamenti, tuttavia, poiché esistono linguaggi funzionali orientati agli oggetti (OCaml e Scala sono esempi).

Puoi anche raggruppare le lingue digitando: statico e dinamico . Le lingue tipizzate staticamente sono quelle in cui la tipizzazione viene controllata (e generalmente applicata) prima di eseguire il programma (in genere durante una fase di compilazione); le lingue tipizzate dinamicamente rimandano il controllo del tipo al runtime. C, C ++ e Java sono linguaggi di tipo statico; Python, Ruby, JavaScript e Objective-C sono linguaggi tipizzati dinamicamente. Esistono anche linguaggi non tipizzati , che includono il linguaggio di programmazione Forth.

Puoi anche raggruppare le lingue in base alla loro disciplina di digitazione : digitazione debole , che supporta conversioni di tipo implicite e digitazione forte , che proibisce conversioni di tipo implicite. Le linee tra i due sono un po 'sfocate: secondo alcune definizioni, C è un linguaggio debolmente tipizzato, mentre altri lo considerano fortemente tipizzato. La disciplina di battitura non è comunque un modo utile per raggruppare le lingue.


1
Stava per porre qualcosa di simile, ma farà +1 e aggiungerà commenti invece. Ogni categoria o combinazione ha anche numerosi spin-off creati concentrandosi su elementi particolari. OOP, ad esempio, genera: OOP basato su prototipo, programmazione orientata agli aspetti, programmazione basata su componenti e così via. I paradigmi funzionali hanno anche spin-off, come i linguaggi in cui un processo o thread asincrono è l'unità base e si programma componendo insieme processi paralleli.
CodexArcanum,

Come si adatterebbero i linguaggi di scripting, ad esempio VBScript? Può essere un po 'procedurale e un po' OO in quanto si possono creare vari tipi, quindi lo renderebbe un ibrido?
JB King,

Questo e 'esattamente quello che stavo cercando. Grazie mille.
sova,

3
Le lingue @JB King OOP di solito sono procedurali, almeno all'interno degli organi del metodo. Inoltre, è un'idea sbagliata comune che OOP significhi "oggetti". Molte lingue hanno tipi di dati e oggetti. C'è molto dibattito su quale sia l'esatta definizione di OOP, ma di solito include l'ereditarietà e / o l'incapsulamento (stato privato) come temi principali. Una lingua senza una delle due forme sarebbe difficile classificarla come lingua OOP.
CodexArcanum,

2
@sova Posso solo pensare a due lingue che funzionano in quel modo. Erlang si basa pesantemente sull'elaborazione parallela, ma se vuoi più esattamente ciò di cui stavo parlando, dovresti esaminare Polyphonic C #. È un linguaggio di ricerca (ora ripiegato in C-omega) basato su Pi-Calculus (come il modo in cui FP si basa su lambda calc) Pi-calc si basa sull'unità di un processo e dichiari i processi e una combinazione di sincrono e asych li chiama. Guarda anche le frecce in FP, in particolare Haskell. Le frecce sono molto simili.
CodexArcanum,

12
  • montaggio
  • Procedurale
    • Di base
    • C
  • Orientato agli oggetti
    • C #
    • Giava
  • Dichiarativo
    • Prolog
    • SQL
  • Funzionale
    • blesità
    • Haskell

Questi sono i principali, ma ci sono molti altri paradigmi là fuori e c'è molta sovrapposizione tra loro.


Che ne dici di dichiarativo (ad esempio Prolog, SQL)?
Bruce Alderman,

@Bruce, li ho ora.

Sì, questa è stata l'idea generale che ho imparato da qualche parte lungo la strada.
sevenseacat,

6
L'assemblea non dovrebbe essere considerata procedurale?
MattDavey,

2
Che ne dici di linguaggi di programmazione concatenativi (basati su stack), come Forth e Factor? Potresti considerarlo un tipo di programmazione funzionale, ma è probabilmente abbastanza distinto da meritare menzione. it.wikipedia.org/wiki/Concatenative_programming_language
KChaloux

11

Per i tipi di linguaggi di programmazione (paradigmi), guarda qui:
http://en.wikipedia.org/wiki/Programming_paradigm

Per altre caratteristiche dei linguaggi di programmazione (ad es. Type Systems), guarda qui: http://en.wikipedia.org/wiki/Programming_language


ah! "paradigma" che bella parola! grazie
sova,

@sova Accetterei questa come la migliore risposta, perché ci sono semplicemente troppi paradigmi da elencare in una risposta di P.SE, tanto meno per descrivere le sfumature di ciascuno.
Rei Miyasaka,

9

Clicca sull'immagine per vedere il PDF. Poster dei paradigmi di programmazione

Dovresti guardare i paradigmi di programmazione per i manichini: cosa ogni programmatore dovrebbe sapere di Peter Van Roy. Questo ti darà una panoramica di come sta andando fuori.

Se vuoi andare oltre, puoi leggere Concetti, tecniche e modelli di programmazione per computer . In questo modo non imparerai un banchetto di lingue, ma imparerai paradigmi che stanno dietro diversi tipi di lingue. Quindi, imparare una nuova lingua sarà più facile per te.


6
  • Procedurale: Assembly, Java, C #, F #, Lisp, Fortran.

  • Basato su set: SQL.

  • Basato sul modello: Perl, Regex, Snobol.

  • Basato su albero: XSLT.

  • Basato su array: APL.


2
+1 per l'utilizzo di un diverso tipo di classificazione e anche per il riconoscimento che "procedurale" in realtà contiene la maggior parte delle classificazioni delle altre persone. (ovviamente questo significa solo che la parola ha pochissimo significato e che la carne è in tali suddivisioni)
Javier

4

Esistono diversi modi per rispondere a questa domanda, ma in termini possono essere classificati come:

Linguaggio macchina: il linguaggio macchina è un linguaggio di programmazione di basso livello. È facilmente comprensibile dai computer ma difficile da leggere dalle persone. Questo è il motivo per cui le persone usano linguaggi di programmazione di livello superiore. I programmi scritti in lingue di alto livello sono anche compilati e / o interpretati in linguaggio macchina in modo che i computer possano eseguirli.

Linguaggio assembly: il linguaggio assembly è una rappresentazione del linguaggio macchina. In altre parole, ogni istruzione di linguaggio assembly si traduce in un'istruzione di linguaggio macchina. Sebbene le dichiarazioni del linguaggio assembly siano leggibili, le dichiarazioni sono ancora di basso livello. Uno svantaggio del linguaggio assembly è che non è portatile, poiché ogni piattaforma è dotata di un particolare linguaggio assembly.

Linguaggio di alto livello: le lingue di alto livello sono ciò che la maggior parte dei programmatori usa al giorno d'oggi. I linguaggi come C, C ++ e Java sono tutti linguaggi di alto livello. I vantaggi delle lingue di alto livello sono che sono molto leggibili e portatili. Uno svantaggio delle lingue di alto livello è che sono meno potenti delle lingue assembleari. Perché una singola istruzione in un linguaggio di alto livello viene tradotta in molte dichiarazioni del linguaggio automatico.

Le lingue di alto livello possono essere ulteriormente classificate come:

  1. Linguaggi funzionali: in Linguaggio funzionale, un programma è diviso in definizioni di funzioni. I linguaggi funzionali sono una specie di linguaggio dichiarativo. Si basano principalmente sul calcolo lambda tipizzato con costanti. Alcuni dei famosi linguaggi funzione sono Scala, F #, Clojure e Lisp.

  2. Linguaggi procedurali: in Linguaggi procedurali, un programma è scritto in una sequenza di passaggi che dovrebbero essere seguiti per produrre un risultato. COBOL, FORTRAN e C sono alcuni linguaggi procedurali.

  3. Linguaggi di programmazione orientati agli oggetti: nei linguaggi OOP, un programma è diviso in oggetti che contengono dati e metodi che operano sui dati. Java, C # e C ++ sono linguaggi OOP.

  4. Linguaggi di programmazione logica: i linguaggi di logica vengono utilizzati per creare programmi che consentono al computer di ragionare logicamente. es .: linguaggio logico

Per uno studio approfondito, controlla:


3

Tendo a pensare in termini di funzionalità:

Sintassi:

C-based o what-have-you. Java ha una sintassi basata su C. Consiglio vivamente di provare qualcosa come Python o Ruby per far uscire la testa dalla sintassi e pensare di più in termini di fondamenti di come funziona un determinato linguaggio. Sono dell'opinione che nessuna sintassi debba diventare più voluminosa della C-based e non avere problemi a costruire blocchi di spazio bianco.

Compilato vs. interpretato w. Build-Process vs. Interpreted / Console:

Ho pochissima familiarità con le preoccupazioni relative al tempo di compilazione e al tempo di runtime, ma capisco che ci sono molte preoccupazioni a cui raramente penso.

Allo stesso modo ci sono molti linguaggi interpretati che hanno ancora qualcosa di simile a un processo di compilazione per l'esecuzione all'interno di una macchina virtuale come fa Java. Devi ancora ricostruire per vedere le modifiche alle cose.

E poi c'è JavaScript e Python che puoi eseguire al volo, comando per comando in una console in un ambiente live. Tutti e tre possono portare a modi molto diversi di scrivere il codice.

Digitazione dinamica vs. rigida:

Tendo a vedere i due come compromessi del design. Quando sei ad un livello molto più basso e le prestazioni sono fondamentali, la digitazione statica ha molto senso. Non ho mai capito in qualche modo questa nozione di essere "più sicuro" di un altro, ma mi è venuta in un linguaggio molto plastico / dinamico in cui impari semplicemente come funziona il sistema di digitazione e cosa aspettarti, in pratica. I tipi di shenanigans raramente sono una preoccupazione per me in JS. In un certo senso la flessibilità può rendere le cose più robuste, anche se è vero che un tocco più arcano per un dev di livello Jr. più se non si conoscono alcuni dei buchi nella lingua.

Ambito Block-Level vs. Function Scope vs.?:

Block-Level è il più comune (qualsiasi cosa tra {} nella maggior parte dei linguaggi di sintassi basati su c). L'ambito JavaScript si basa su funzioni (che vengono utilizzate anche per creare oggetti in modo efficace anche oggetti). C'è anche una grande variazione nel tipo di accesso che hai dall'ambito interno a un ambito esterno. Non ho familiarità con altri schemi di scoping ma sono sicuro che esistono.

OOP classico vs. OOP prototipo vs Quasi-OOP (strutture in C?) Vs Non-OOP:

Anche nelle OOP di classe c'è molto spazio per le variazioni. Se puoi fare ereditarietà multipla (ew, beh in eccesso, ew), definire interfacce, ecc ...

In JavaScript abbiamo una sorta di OOP prototipo ibrido stentato in cui gli oggetti sono considerevolmente più semplici, altamente mutabili, ma abbiamo ancora la capacità di separare l'interfaccia dalle preoccupazioni interne, che l'IMO è l'aspetto importante dell'incapsulamento.

La cosa su OOP è che ci sono davvero un sacco di cose che puoi realizzare che sono essenzialmente orientate all'OOP senza essere tecnicamente OOP. Naturalmente ci sono puristi ma alla fine della giornata, i Design Patterns mirano a raggiungere certe astrazioni che funzionano bene in determinate situazioni. Non essere troppo veloce nel ritenere che le idee di un linguaggio basato su OOP non abbiano alcuna utilità in qualcosa che è più orientato alla procedura. E non sto parlando di JavaScript. Non è affatto limitato dalla sua versione sciocca di un paradigma OOP basato su prototipo.

Funzioni di prima classe:

Non avere questi in una lingua è una cosa difficile per me rinunciare. È possibile passare le funzioni come se fossero dati da utilizzare in altri contesti. Ciò rende gli schemi di gestione degli eventi in particolare molto facili da implementare, ma rende anche molto facile adattare la lingua in modo che funzioni nel modo desiderato. È, più di ogni altra cosa, sospetto, ciò che ha fatto di JavaScript il successo che ha avuto il massimo nonostante sia stato progettato in due settimane e sia stata sfruttata la sintassi Java-approssimativa come uno schema di marketing.

chiusure:

Non sono sicuro di dove sia il dibattito su Java, ma so che molti sviluppatori Java hanno chiesto a gran voce questa funzionalità un anno o due fa. In un linguaggio non di chiusura, quando una funzione si chiude, tutto ciò che è in qualche modo in grado di fare riferimento a cose all'interno di quella funzione non sarà in grado di accedervi perché è stato raccolto. In una chiusura, il contesto di esecuzione è vincolato in modo tale che se si è in grado di fare riferimento a elementi all'interno di quella funzione chiusa da un altro ambito come in un oggetto o funzione restituiti, si ottengono sostanzialmente le differenze come erano quando la funzione è stata chiusa. È come un inceppamento del tuo piede nella porta della raccolta dei rifiuti, anche se sospetto che sia implementato più come copie di quei vasi trasformati in vasi locali dell'entità referente.

Rigido / rigoroso / sicuro vs. offrirti tutta la corda che desideri:

Gli sviluppatori JS e Java tendono a non capirsi affatto e penso che abbia molto a che fare con le due lingue che ricadono sui lati quasi opposti di questo particolare spettro del design. Non voglio che tu mi protegga da me stesso o dagli altri sviluppatori della mia squadra. Voglio fare molto di più con molto meno codice e fare tutto in modi molto diversi (ma coerenti per un dato dominio) a seconda della situazione. Ci sono assolutamente dei compromessi per entrambe e molte lingue tendono a cadere di più nel mezzo.


Wow, grazie. È davvero bello superare gli sforzi per un voto negativo senza spiegazioni.
Erik Reppen,

2

Penso che una scorciatoia per tutti questi è imparare abbastanza Lisp da fare alcune cose semi-utili. Molti di questi paradigmi sono nati come modi di usare Lisp, quindi è un modo semplice per provare le cose.

Esistono numerosi "tipi" di lingue, ma ne possono sempre comparire di nuove. Fondamentalmente, lo scopo di una lingua è quello di consentire la codifica di idee, concetti o requisiti, il più direttamente possibile. A tal fine, possono esserci situazioni in cui i paradigmi esistenti sono carenti e potrebbe essere necessario uno nuovo.

Un modo di vedere è in termini di struttura della superficie. Quanto direttamente ti consente di codificare le idee in modo conciso, in modo che se cambi idea su ciò che desideri, anche la corrispondente modifica al codice è facile, con poche possibilità di introdurre bug.

Un altro modo di vederlo è in termini di struttura di controllo. Quando la lingua viene eseguita (se lo è) qual è l'ordine in cui accadono le cose, per realizzare ciò che vuoi? Esempi sono: semplice esecuzione diretta, ricorsione, backtrack, parallelismo. Una I (modesta tosse) scoperta era l' esecuzione differenziale .

Un altro punto di vista utile è che ogni volta che viene progettata una struttura di dati, nasce una lingua. I dati vengono "eseguiti" dai programmi applicativi che li combinano e fanno le cose, proprio come un programma è solo un mucchio di dati (come i codici byte) che vengono utilizzati da un interprete per fare le cose.


Freddo. Imparerò LISP e sarò illuminato. Emozionante: D
sova,

Tuttavia, se si afferma che l'atto di utilizzare una struttura di dati crea una nuova lingua intermedia, si potrebbe anche sostenere che una nuova lingua è nata in ogni algoritmo (tutte le operazioni sono necessariamente eseguite su una struttura di dati) e, con la riduzione, una nuova lingua nasce in ogni riga di codice. Penso che intendi qualcos'altro però, ma non sono ancora sicuro di aver capito?
sova,

@sova: Per me la teoria dell'informazione è stata una grande rivelazione (sia Shannon che Kolmogorov). Si tratta di come i significati vengono codificati e passati attraverso i canali, con concetti di larghezza di banda, rilevamento degli errori, codifica minima, casualità, ecc. Quindi, le informazioni di codifica dei dati e gli algoritmi sono canali. I programmi codificano le informazioni e la programmazione è un canale. Quindi, quali informazioni sono codificate? da dove viene e quando? dove sta andando? quali sono le fonti di errore (rumore)? come vengono corretti? Ho trovato una prospettiva utile.
Mike Dunlavey,

@sova: (continua) Non devi padroneggiare tutta la matematica scoraggiante. Per me ciò che contava era il quadro che mi dava per pensare alle cose.
Mike Dunlavey,

1

Devo aggiungere che esistono linguaggi di programmazione per applicazioni specifiche. Quello che viene in mente è APT (Automatic Programmed Tool) un linguaggio usato nella produzione di macchine utensili.


Me lo ricordo. Potrei anche averlo usato. Ragazzo, quello era lo stato dell'arte. Non è stato necessario guidare manualmente la fresatrice, basta premere il pulsante di avvio. E se ci fosse un bug, si scatenerà l'inferno.
Mike Dunlavey,

Ho lavorato su programmi che generano gcode per fresatrici. Ho letteralmente tenuto e visto i risultati della programmazione di bug, spesso i miei.
David Thornley,

Ho trascorso 20 anni a installare postprocessor su sistemi di sistemi.
Dave,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.