it-swarm.it

Quanti tipi di linguaggi di programmazione ci sono?

Fondamentalmente, voglio imparare molti linguaggi di programmazione per diventare un grande programmatore. Conosco solo una manciata di profondità e Speravo che qualcuno potesse elaborare quante classi o tipi di linguaggi di programmazione disponibili. 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.

30
sova

Dipende da come vuoi classificare le lingue. Fondamentalmente, le lingue possono essere suddivise in due tipi: imperativo lingue in cui istruisci il computer come come eseguire un'attività, e dichiarativo lingue in cui dici al computer cosa fare. I linguaggi dichiarativi possono essere ulteriormente suddivisi in funzionali linguaggi, in cui un programma è costruito componendo funzioni, e logica linguaggi di programmazione, in cui un programma è costruito attraverso un insieme 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.

Le lingue imperative sono talvolta suddivise in due sottogruppi: procedurale linguaggi 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 di tipo dinamico. Esistono anche non tipizzato lingue, che include il linguaggio di programmazione Forth.

Puoi anche raggruppare le lingue in base alla loro disciplina di battitura : debole, che supporta conversioni di tipo implicite e forte digitando, 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.

73
mipadi
  • Assemblea
  • procedurale
    • Di base
    • C
  • Object-Oriented
    • C #
    • Java
  • dichiarativa
    • Prolog
    • SQL
  • Funzionale
    • LISP
    • Haskell

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

12
user1842

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. Sistemi di tipo), guarda qui: http://en.wikipedia.org/wiki/Programming_language

11
Robert Harvey

Clicca sull'immagine per vedere il PDF.Programming paradigms poster

Dovresti guardare 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.

9
mmdemirbas
  • 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.

6
Tangurena

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 linguaggi 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, ciascuna istruzione in linguaggio Assembly si traduce in un'istruzione in 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. Lingue come C, C++ e Java sono tutte lingue 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 potente delle lingue assembly. Perché una singola istruzione in una lingua di alto livello viene tradotta in molte istruzioni in linguaggio macchina.

Le lingue di alto livello possono essere ulteriormente classificate come:

  1. Linguaggi funzionali: Nel linguaggio funzionale, un programma è diviso in definizioni di funzione. 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: Nei linguaggi procedurali, un programma è scritto in una sequenza di passaggi che devono essere seguiti per produrre un risultato. COBOL, FORTRAN e C sono alcuni linguaggi procedurali.

  3. Linguaggi di programmazione orientati agli oggetti: In OOP linguaggi, un programma è diviso in Oggetto che contiene dati e metodi che operare sui dati. Java, C # e C++ sono OOP linguaggi.

  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:

4
Badar

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 del tipo Python o Ruby per far uscire la testa della sintassi e pensare più in termini di fondamenti di come funziona un determinato linguaggio. Sono dell'opinione che nessuna sintassi debba diventare più voluminosa della base in C. e non avere problemi a costruire blocchi attorno allo spazio bianco.

Compilato vs. interpretato con 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 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 codice.

Digitazione dinamica vs. rigorosa:

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 è venuto in mente 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 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.

Classica OOP vs. Prototypal OOP vs Quasi-OOP (strutture in C?) Vs Non-OOP:

Anche in base alla classe OOP c'è molto spazio per le variazioni. Sia che tu possa fare ereditarietà multipla (ew, ben in eccesso, ew), definire interfacce, ecc ...

In JavaScript abbiamo una sorta di prototipo ibrido stentato OOP dove 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 di incapsulamento.

La cosa su OOP è che ci sono davvero molte cose che puoi realizzare che sono essenzialmente orientate all'OOP senza essere tecnicamente OOP. Ci sono puristi ovviamente ma alla fine della giornata, I modelli di progettazione riguardano il raggiungimento di 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 proceduralmente. E non sto parlando di JavaScript. per niente limitato dalla sua versione sciocca di un prototipo basato sul paradigma OOP.

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 il linguaggio in modo che funzioni come desideri. È, 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 per Java, ma conosco molti Java chiedevano a gran voce questa funzione un anno o due fa. In un linguaggio non di chiusura, quando un la funzione si chiude, tutto ciò che è in qualche modo in grado di fare riferimento a cose dall'interno di quella funzione non sarà in grado di accedervi perché è stato spazzato in raccolta. In una chiusura, il contesto di esecuzione è legato in modo tale che se si è in grado di fare riferimento a cose all'interno di quella chiusa funzione da un altro ambito come in un oggetto restituito o funzione in pratica ottieni quei vars come erano quando la funzione si chiudeva. È come un inceppamento del piede nella porta della garbage collection, anche se sospetto che sia implementato più come copie di quei vars realizzati variabili locali dell'entità referente.

Rigido/Rigoroso/Sicuro contro darti tutta la corda che vuoi:

JS devs 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 di design. 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 determinato dominio) a seconda della situazione Vi sono assolutamente dei compromessi per entrambe e molte lingue tendono a cadere maggiormente nel mezzo.

3
Erik Reppen

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 è 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 (tosse modesta) scoperta è stata 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.

2
Mike Dunlavey

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.

1
Dave