Le basi della maggior parte dei linguaggi procedurali sono praticamente le stesse.
Loro offrono:
- Tipi di dati scalari: generalmente booleani, numeri interi, float e caratteri
- Tipi di dati composti: matrici (stringhe sono casi speciali) e strutture
- Costrutti di codice di base: aritmetica su scalari, accesso ad array / struttura, assegnazioni
- Strutture di controllo semplici: if-then, if-then-else, while, per i loop
- Pacchetti di blocchi di codice: funzioni, procedure con parametri
- Ambiti: aree in cui gli identificatori hanno significati specifici
Se lo capisci, hai una buona conoscenza del 90% delle lingue del pianeta. Ciò che rende queste lingue leggermente più difficili da comprendere è l'incredibile varietà di strana sintassi che le persone usano per dire le stesse cose di base. Alcuni usano la notazione concisa che coinvolge la punteggiatura dispari (APL è un estremo). Alcuni usano molte parole chiave (COBOL è un rappresentante eccellente). Non importa molto. Ciò che conta è se la lingua è abbastanza completa da sola per svolgere compiti complessi senza farti strappare i capelli. (Prova a codificare un serio hacking di stringa nello script della shell di Windows DOS: è capace di Turing ma è davvero pessimo in tutto).
Offrono linguaggi procedurali più interessanti
- Ambiti nidificati o lessicali, spazi dei nomi
- Puntatori che consentono a un'entità di fare riferimento a un'altra, con allocazione dinamica della memoria
- Imballaggio del codice correlato: pacchetti, oggetti con metodi, tratti
- Controllo più sofisticato: ricorsione, continuazioni, chiusure
- Operatori specializzati: operazioni su stringhe e array, funzioni matematiche
Sebbene non sia tecnicamente una proprietà del linguaggio, ma una proprietà dell'ecosistema in cui vivono tali lingue, sono le biblioteche che sono facilmente accessibili o fornite con il linguaggio come parte dello strumento di sviluppo. Avere una vasta gamma di funzioni di libreria semplifica / accelera la scrittura di applicazioni semplicemente perché non è necessario reinventare ciò che fanno le librerie. Mentre Java e C # sono ampiamente ritenuti buoni linguaggi in sé e per sé, ciò che li rende veramente utili sono le enormi librerie che ne derivano e le librerie di estensioni facilmente ottenibili.
Le lingue più difficili da comprendere sono quelle non procedurali:
- Linguaggi puramente funzionali, senza assegnazioni o effetti collaterali
- Linguaggi logici, come Prolog, in cui avvengono il calcolo simbolico e l'unificazione
- Linguaggi di corrispondenza dei modelli, in cui si specificano forme che corrispondono al problema e spesso le azioni vengono attivate da una corrispondenza
- Vincoli linguistici, che consentono di specificare le relazioni e risolvere automaticamente le equazioni
- Linguaggi di descrizione dell'hardware, in cui tutto viene eseguito in parallelo
- Linguaggi specifici del dominio, come SQL, reti di Petri colorate, ecc.
Esistono due principali stili di rappresentazione per le lingue:
- Basato su testo, in cui gli identificatori denominano entità e flussi di informazioni sono codificati implicitamente in formule che utilizzano gli identificatori per denominare le entità (Java, APL, ...)
- Grafico, in cui le entità vengono disegnate come nodi e le relazioni tra entità vengono disegnate come archi espliciti tra tali nodi (UML, Simulink, LabView)
I linguaggi grafici spesso consentono lingue secondarie testuali come annotazioni nei nodi e sugli archi. I linguaggi grafici di Odder consentono ricorsivamente grafici (con testo :) nei nodi e sugli archi. Linguaggi grafici davvero strani consentono ai grafici di annotazione di puntare ai grafici che vengono annotati.
La maggior parte di queste lingue si basa su un numero molto limitato di modelli di calcolo:
- Il calcolo lambda (base per Lisp e tutti i linguaggi funzionali)
- Sistemi postali (o tecniche di riscrittura di stringhe / alberi / grafici)
- Turing machine (modifica dello stato e selezione di nuove celle di memoria)
Data l'attenzione della maggior parte dell'industria su linguaggi procedurali e strutture di controllo complesse, sei ben servito se impari bene una delle lingue più interessanti in questa categoria, specialmente se include un qualche tipo di orientamento agli oggetti.
Consiglio vivamente di apprendere Scheme, in particolare da un libro davvero meraviglioso:
Struttura e interpretazione dei programmi per computer . Questo descrive tutti questi concetti di base. Se conosci queste cose, le altre lingue sembreranno piuttosto semplici, tranne per la sintassi sciocca.