Le basi della maggior parte dei linguaggi procedurali sono praticamente le stesse.
Offrono:
- Tipi di dati scalari: in genere booleani, numeri interi, caratteri e caratteri
- Tipi di dati composti: matrici (le stringhe sono casi speciali) e strutture
- Costrutti del codice di base: aritmetica su scalari, accesso a matrice / struttura, assegnazioni
- Strutture di controllo semplici: if-then, if-then-else, while, for loops
- Pacchetti di blocchi di codice: funzioni, procedure con parametri
- Ambiti: aree in cui gli identificatori hanno significati specifici
Se capisci questo, hai una buona padronanza del 90% delle lingue sul pianeta.
Ciò che rende queste lingue leggermente più difficili da capire è l'incredibile varietà di sintassi dispari che le persone usano per dire le stesse cose di base. Alcuni usano la notazione concisa che implica la punteggiatura dispari (l'APL è un estremo). Alcuni usano molte parole chiave (COBOL è un rappresentante eccellente). Non importa molto. Ciò che importa è se la lingua è già abbastanza completa da sola per svolgere compiti complessi senza farti strappare i capelli. (Provate a codificare un serio hacking delle stringhe nello script della shell DOS di Windows: è in grado di fare Turing ma è veramente pessimo per tutto).
Offerta 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 di memoria dinamica
- Confezione del codice correlato: pacchetti, oggetti con metodi, tratti
- Controllo più sofisticato: ricorsione, continuazioni, chiusure
- Operatori specializzati: operazioni su stringhe e array, funzioni matematiche
Pur non essendo tecnicamente una proprietà della lingua, ma una proprietà dell'ecosistema in cui vivono tali lingue, sono le librerie che sono facilmente accessibili o fornite con la lingua come parte dello strumento di sviluppo. Avere una vasta gamma di servizi di libreria semplifica / accelera la scrittura delle applicazioni semplicemente perché non è necessario reinventare ciò che fanno le librerie. Sebbene Java e C # siano ampiamente considerati come buoni linguaggi in sé e per sé, ciò che li rende veramente utili sono le enormi librerie che vengono con sé e le librerie di estensione facilmente ottenibili.
Le lingue che sono più difficili da capire sono quelle non procedurali:
- Linguaggi puramente funzionali, senza compiti o effetti collaterali
- Linguaggi logici, come Prolog, in cui si verificano computazione simbolica e unificazione
- Lingue di corrispondenza del modello, in cui specifichi le forme che corrispondono al problema e spesso le azioni vengono attivate da una corrispondenza
- Linguaggi di vincoli, che consentono di specificare le relazioni e di risolvere automaticamente le equazioni
- Linguaggi descrizione 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 sul 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 le entità vengono disegnate come archi espliciti tra tali nodi (UML, Simulink, LabView)
I linguaggi grafici spesso consentono i sottolinguaggi testuali come annotazioni nei nodi e sugli archi. I linguaggi grafici di Odder consentono ricorsivamente grafici (con testo :) nei nodi e negli archi. I linguaggi grafici realmente dispari permettono ai grafici di annotazione di puntare ai grafici che sono annotati.
La maggior parte di questi linguaggi si basa su un numero molto piccolo di modelli di calcolo:
- Il calcolo lambda (base per Lisp e tutti i linguaggi funzionali)
- Sistemi di post (o tecniche di riscrittura di stringhe / alberi / grafi)
- Macchine di Turing (modifica dello stato e selezione di nuove celle di memoria)
Dato l'interesse della maggior parte dell'industria sui linguaggi procedurali e sulle strutture di controllo complesse, sei ben servito se impari bene una delle lingue più interessanti di questa categoria, specialmente se include qualche tipo di orientamento all'oggetto.
Consiglio vivamente lo schema di apprendimento, in particolare da un libro davvero meraviglioso:
Struttura e interpretazione dei programmi per computer . Questo descrive tutti questi concetti di base. Se conosci questa roba, le altre lingue sembreranno piuttosto semplici tranne la sintassi goofy.