Commenti
- ' sarebbe meglio dire " Quale digita .. " invece di quanti?
- Bene, ho imparato che qualcosa come Prolog e C sono fondamentalmente diversi, quindi pensavo che ciascuno di essi corrispondesse a un diverso tipo di linguaggio di programmazione e speravo di avere unidea di quanti tipi.
- 2: il tipo che fa quello che vuoi e il tipo che non ' t
- Imparare a conoscere diversi tipi di linguaggi di programmazione assolutamente è costruttivo ! Potresti potenzialmente obiettare che questo dovrebbe essere chiuso come un duplicato di questo ma penso che ' siano abbastanza domande distinte per rimani separato.
- @Sova, ' consiglio di fare la tua prima scelta di nuove lingue per provare qualcosa che non ' t usa la sintassi basata su c. In questo modo ti concentrerai maggiormente su come funziona e su come ' è diverso da quello che conosci meglio.
Risposta
Dipende da come vuoi classificare le lingue. Fondamentalmente, le lingue possono essere suddivise in due tipi: imperativo lingue in cui istruisci il computer come per eseguire unattività e le 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 logic , in cui un programma è costruito attraverso un insieme di connessioni logiche. I linguaggi imperativi si leggono più come un elenco di passaggi per risolvere un problema, un po come una ricetta. I linguaggi imperativi includono C, C ++ e Java; i linguaggi funzionali includono Haskell; i linguaggi di programmazione logica includono Prolog.
I linguaggi imperativi a volte sono suddivisi in due sottogruppi: procedural 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 i linguaggi digitando: statico e dinamico . I linguaggi tipizzati staticamente sono quelli in cui la digitazione viene controllata (e solitamente applicata) prima di eseguire il programma (tipicamente durante una fase di compilazione); i linguaggi tipizzati 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 per la loro disciplina digitazione: debole digitazione, che supporta conversioni di tipo implicite e strong , che proibisce le conversioni di tipo implicite. Le linee tra i due sono un po sfocate: secondo alcune definizioni, il C è un linguaggio debolmente tipizzato, mentre altri lo considerano fortemente tipizzato. La disciplina di digitazione non è davvero un modo utile per raggruppare le lingue, comunque.
Commenti
- Stavo per proporre qualcosa di simile, ma faremo +1 e aggiungi invece commenti. Ogni categoria o combinazione ha anche numerosi spin-off creati concentrandosi su elementi particolari. LOOP, ad esempio, genera: OOP basato su prototipi, Programmazione orientata agli aspetti, Programmazione basata su componenti e così via. Anche paradigmi funzionali hanno spin-off, come linguaggi in cui un processo o thread asincrono è lunità di base e si programma componendo processi paralleli insieme.
- Come si inseriscono i linguaggi di scripting, ad esempio VBScript? Può essere un un po procedurale e un po OO in quanto si possono creare vari tipi, quindi sarebbe un ibrido?
- Questo è esattamente quello che stavo cercando. Grazie mille.
- @ I linguaggi JB King OOP di solito sono procedurali, almeno allinterno dei corpi del metodo.Inoltre, ' è un malinteso comune che OOP significhi " oggetti ". Molte lingue hanno tipi di dati e oggetti. ' cè molto dibattito su quale sia la definizione esatta di OOP, ma di solito include lereditarietà e / o lincapsulamento (stato privato) come temi principali. Una lingua senza nessuna delle due in qualche forma sarebbe difficile da classificare come linguaggio OOP.
- @sova Posso solo pensare a due lingue che funzionano in questo modo. Erlang si basa pesantemente sullelaborazione parallela, ma se vuoi qualcosa di più simile a quello di cui stavo parlando esattamente, dovresti esaminare Polyphonic C #. È ' un linguaggio di ricerca (ora piegato in C-omega) basato su Pi-Calculus (come il modo in cui FP è basato su lambda calc) Pi-calc si basa sullunità di un processo e si dichiarano processi e una combinazione di chiamate sincrone e asichette in essi. Guarda anche Arrows in FP, specialmente Haskell. Le frecce sono molto simili.
Risposta
- Assembly
- Procedurale
- Di base
- C
- Orientato agli oggetti
- C #
- Java
- Dichiarativo
- Prologo
- SQL
- Funzionale
- Lisp
- Haskell
Questi sono i principali, ma ci sono molti altri paradigmi là fuori e ci sono molte sovrapposizioni tra loro.
Commenti
- Che ne dici di dichiarativo (ad esempio Prolog, SQL)?
- @Bruce, li ho presi adesso.
- Sì, questa era lidea generale che ho imparato da qualche parte lungo la strada.
- Non dovrebbe Lassembly può essere considerato procedurale?
- 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 una menzione. en.wikipedia.org/wiki/Concatenative_programming_language
Risposta
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
Commenti
- ah! " paradigma " che bella parola! grazie
- @sova Accetterei questa come la migliore risposta, perché ci sono semplicemente troppi paradigmi da elencare in una risposta P.SE, molto meno per descrivere le sfumature di ciascuno.
Risposta
Fai clic sullimmagine per vedere il PDF.
Dovresti esaminare Paradigmi di programmazione per principianti: ciò che 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 . Non imparerai un banch di lingue in questo modo, ma imparerai i paradigmi che si celano dietro diversi tipi di lingue. Quindi, imparare una nuova lingua sarà più facile per te.
Risposta
-
Procedurale: Assemblea, Java, C #, F #, Lisp, Fortran.
-
Basato su set: SQL.
-
Basato su pattern: Perl, Regex, Snobol.
-
Basato su albero: XSLT.
-
Basato su array: APL.
Commenti
- +1 per aver utilizzato un diverso tipo di classificazione e anche per aver riconosciuto che ' procedurale ' infatti contiene la maggior parte delle classificazioni delle altre persone '. (ovviamente questo significa solo che la parola ha poco significato, e la carne è in tali suddivisioni)
Risposta
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. Anche i programmi scritti in linguaggi di alto livello vengono 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 in linguaggio assembly si traduce in unistruzione in linguaggio macchina. Sebbene le istruzioni in linguaggio assembly siano leggibili, le istruzioni sono ancora di basso livello. Uno svantaggio del linguaggio assembly è che non è portabile, perché ogni piattaforma viene fornita con un particolare linguaggio assembly.
Linguaggio di alto livello: I linguaggi di alto livello sono quelli che la maggior parte dei programmatori usa oggigiorno. Linguaggi come C, C ++ e Java sono tutti linguaggi di alto livello. I vantaggi dei linguaggi di alto livello sono che sono molto leggibili e portatili. Uno svantaggio dei linguaggi di alto livello è che sono meno potenti dei linguaggi Assembly. Perché una singola dichiarazione in un linguaggio di alto livello viene tradotta in molte dichiarazioni in linguaggio macchina.
I linguaggi di alto livello possono essere ulteriormente classificati come:
-
Linguaggi funzionali: Nel linguaggio funzionale, un programma è suddiviso in definizioni di funzione. I linguaggi funzionali sono una sorta di linguaggio dichiarativo. Si basano principalmente sul lambda-calcolo tipizzato con costanti. Alcuni dei famosi linguaggi Function sono Scala, F #, Clojure e Lisp.
-
Linguaggi procedurali: Nei 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.
-
Linguaggi di programmazione orientati agli oggetti: Nei linguaggi OOP, un programma è suddiviso in Object che contengono dati e metodi che operano sui dati. Java, C # e C ++ sono linguaggi OOP.
-
Linguaggi di programmazione logica: I linguaggi logici vengono utilizzati per creare programmi che consente al computer di ragionare logicamente. ad esempio: linguaggio logico
Per uno studio approfondito, controlla:
Risposta
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 toglierti la testa dalla sintassi e pensare di più in termini di fondamenti di come funziona un dato linguaggio. Sono dellopinione che nessuna sintassi debba diventare più voluminosa di quella basata su C e non abbia problemi con blocchi di costruzione intorno allo spazio bianco.
Compilato vs. interpretato w. Build-Process vs. Interpreted / Console:
Ho pochissima familiarità con i problemi dellambiente di compilazione e di run-time ma lo capisco cè un sacco di preoccupazioni a cui penso raramente.
Allo stesso modo ci sono molti linguaggi interpretati che hanno ancora qualcosa di un processo di compilazione per lesecuzione allinterno di una macchina virtuale come fa Java. Devi ancora ricostruire per vedere i cambiamenti alle cose.
E poi ci sono 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 e rigida:
Tendo a vedere i due come compromessi di progettazione. Quando sei a un livello molto più basso e le prestazioni sono fondamentali, la digitazione statica ha molto senso. Non ho mai capito questa nozione di uno che sia “più sicuro” di un altro in qualche modo, ma io è venuto fuori in un linguaggio molto plastico / dinamico in cui impari come funziona il sistema di battitura e cosa aspettarti, in pratica. Gli imbrogli di tipo sono raramente 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 uno sviluppatore di livello Jr. se non si conoscono alcuni dei buchi nella lingua.
Scopo a livello di blocco e ambito di funzione e?:
Il livello di blocco è il più comune (qualsiasi cosa tra {} nella maggior parte dei linguaggi di sintassi basati su c). Lambito JavaScript è costruito attorno a funzioni (che sono anche usate per costruire oggetti in modo così efficace anche oggetti). Cè anche una grande variazione nel tipo di accesso che si ha dallambito interno a un ambito esterno. Non ho familiarità con altri schemi di scoping ma sono sicuro che esistano.
OOP classico vs Prototypal OOP vs Almost-OOP (strutture in C ?) vs Non-OOP:
Anche nellOOP basato sulla classe cè molto spazio per la variazione. Se puoi eseguire lereditarietà multipla (ew, well in eccesso, ew), definire interfacce, ecc …
In JavaScript abbiamo una sorta di prototipo ibrido OOP rachitico in cui gli oggetti sono considerevolmente più semplici, altamente mutabili, ma abbiamo ancora la capacità di separare linterfaccia dalle preoccupazioni interne, che IMO è laspetto importante dellincapsulamento .
La cosa su OOP è che ci sono davvero molte cose che puoi realizzare che sono essenzialmente orientate allOOP senza essere tecnicamente OOP. Ovviamente ci sono puristi, ma in fin dei conti, Design Patterns mira al raggiungimento di certe astrazioni che funzionano bene in determinate situazioni. Non essere troppo veloce nel presumere 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 prototipi.
Funzioni di prima classe :
Non averli in una lingua è una cosa difficile per me rinunciare. Puoi 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 per funzionare nel modo desiderato. È, più di ogni altra cosa, sospetto, la cosa che ha reso JavaScript il successo che è stato definitivo nonostante sia stato progettato in due settimane e abbia ottenuto la sintassi approssimativa di Java come schema di marketing.
Chiusure:
Non sono sicuro di dove sia il dibattito per Java, ma so che molti sviluppatori Java chiedevano a gran voce questa funzione 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 dallinterno di quella funzione non sarà in grado di accedervi perché è stato raccolto dalla spazzatura. In una chiusura, il contesto di esecuzione è vincolato in modo tale che se tu “Sei in grado di fare riferimento a cose allinterno di quella funzione chiusa da un altro ambito come in un oggetto o una funzione restituita, in pratica ottieni quelle variabili come erano quando la funzione è stata chiusa. È come schiacciare il tuo piede nella porta della raccolta dei rifiuti, anche se sospetto che sia implementato più come copie di quelle variabili realizzate in variabili locali dellentità di riferimento.
Rigido / Rigoroso / Sicuro rispetto a darti tutta la corda che desideri:
Gli sviluppatori JS e gli sviluppatori Java tendono a non capirli altro e penso che abbia molto a che fare con le due lingue che ricadono sui lati quasi opposti di questo particolare spettro di progettazione. Non voglio che tu mi protegga da me stesso o dagli altri sviluppatori del mio team. Voglio fare molto di più con molto meno codice e fare tutto in modi molto diversi (ma coerenti per un dato dominio) a seconda sulla situazione. Ci sono assolutamente dei compromessi per entrambi e molte lingue tendono a cadere più nel mezzo.
Commenti
- Gee grazie. It ' è davvero bello passare attraverso lo sforzo per un voto negativo senza spiegazione.
Risposta
Penso che una scorciatoia per tutto questo sia imparare abbastanza Lisp per fare alcune cose semi-utili. La maggior parte di questi paradigmi sono nati come modi di usare Lisp, quindi “è un modo semplice per provare.
Esistono diversi “tipi” di lingue, ma ne possono sempre apparire di nuove. Fondamentalmente, lo scopo di un linguaggio è consentire la codifica di idee, concetti o requisiti, il più direttamente possibile. A tal fine, possono esserci situazioni in cui mancano i paradigmi esistenti e potrebbe essere necessario uno nuovo.
Un modo per guardare è in termini di struttura della superficie. In che modo direttamente ti consente di codificare le idee in modo conciso, in modo che se cambi idea su ciò che desideri, anche la modifica corrispondente al codice è facile, con poche possibilità di introdurre bug.
Un altro modo per guardatela in termini di struttura di controllo. Quando il linguaggio viene eseguito (se lo è) qual è lordine in cui accadono le cose, per realizzare ciò che vuoi? Esempi sono: semplice esecuzione diretta, ricorsione, backtrack, parallelismo. Una di queste scoperte da me (tosse modesta) è stata esecuzione differenziale .
Un altro punto di vista utile è che ogni volta che viene progettata una struttura di dati, un linguaggio viene Nato. I dati vengono “eseguiti” dai programmi applicativi che li esaminano e fanno le cose, proprio come un programma è solo un mucchio di dati (come i codici byte) che vengono usati da un interprete per fare le cose.
Commenti
- Fantastico. Imparerò LISP e sarò illuminato. Emozionante: D
- Tuttavia, se dici che latto di usare una struttura dati crea un nuovo linguaggio intermedio, potresti anche sostenere che un nuovo linguaggio è nato in ogni algoritmo (tutte le operazioni sono necessariamente fatte su un dato struttura), e con la riduzione, un nuovo linguaggio nasce in ogni riga di codice. Penso che tu intenda qualcosaltro, ma ' non sono ancora sicuro di aver capito?
- @sova: Per me, la teoria dellinformazione è stata una grande rivelazione (sia Shannon che Kolmogorov). ' riguarda il modo in cui i significati vengono codificati e trasmessi attraverso i canali, con concetti di larghezza di banda, rilevamento degli errori, codifica minima, casualità, ecc. Quindi, i dati codificano le informazioni 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? Lho trovato una prospettiva utile.
- @sova: (continua) Non ' devi padroneggiare tutta la matematica scoraggiante. Per me, ciò che contava era il framework che mi dava per pensare alle cose.
Answer
Devo Aggiungo che esistono linguaggi di programmazione per applicazioni specifiche. Quello che mi viene in mente è APT (Automatic Programmed Tool) un linguaggio utilizzato nella produzione di macchine utensili.
Commenti
- Me lo ricordo. Potrei anche averlo usato. Ragazzi, quello era lo stato dellarte. Non era necessario ' guidare manualmente la fresatrice, è sufficiente premere il pulsante di avvio. E se ci fosse un bug, si scatenerà linferno.
- ' ho lavorato su programmi che generano gcode per fresatrici. ' ho letteralmente tenuto e visto i risultati di bug di programmazione, spesso miei.
- Ho passato 20 anni a installare postprocessors su gobbi di sistemi.