Linguaggi di programmazione e differenze: breve panoramica
I programmi scritti con i linguaggi di programmazione sono di solito contenuti all’interno di un file sorgente tradotto in automatico per trasformare le informazioni in operazioni o elementi manipolabili dal computer. Tali linguaggi generano sistemi operativi, driver, oggetti eseguibili, applicazioni, ma anche grafici che, come nel caso di TeX o postscript, permettono tra le varie cose di controllare l’automazione.
In linea generica diciamo che la programmazione può suddividersi in linguaggi:
- imperativi (propongono comandi per la manipolazione del contenuto della memoria e le operazioni da eseguire in modo arbitrario. Ogni elemento presente lascia traccia nella memoria centrale);
- funzionali (danno dei comandi che calcolano risultati partendo dai dati di ingresso e non consentono che le funzioni modifichino la memoria del computer);
- dichiarativi (descrivono oggetti informatici come la struttura di un database e la sequenza delle loro dichiarazioni non è relazionata al tempo);
- procedurali (permettono di generare operazioni di alto livello scomponendole in procedure o funzioni);
- logici (consentono di ideare sistemi matematici logici);
- e orientati agli oggetti (semplificano le realizzazione di schemi predefiniti tramite i quali le problematiche standard della programmazione trovano soluzioni standardizzate).
Un’ulteriore suddivisione va fatta tra linguaggio interpretato, compilato o JIT. Nel primo caso il sorgente viene direttamente interpretato da un software. Nel secondo caso un software compilatore legge il sorgente e lo rende un oggetto eseguibile. Nel terzo caso, invece, il linguaggio è compilato in modo tale da poter essere eseguito da una macchina virtuale. Naturalmente tale suddivisione è mutevole anche a seconda del paradigma supportato.
I linguaggi di programmazione differiscono poi a seconda del criterio analizzato. Il general purpose, per esempio, è pensato per creare software in molteplici contesti applicativi, mentre lo special purpose è ideato per creare software in contesti specifici. Al contrario dei linguaggi applicativi, quelli di sistema servono per sviluppare software di sistema. I linguaggi imperativi si danno delle istruzioni da seguire, mentre quelli dichiarativi forniscono obiettivi da far raggiungere al sistema.
Se nei linguaggi basati su testo il programma è espresso in modo puramente testuale, in quelli visuali è espresso in modo grafico. E se nei linguaggi strongly-typed a ogni valore corrisponde un tipo specifico, in quelli loosely typed questa cosa non succede. Un altro esempio di differenza è quello dei linguaggi con gestione automatica delle risorse e di quelli con gestione manuale: in tal caso cambia la presenza o meno di un garbage collector per la gestione della memoria.
Un’ulteriore precisazione da fare, consiste nel fatto che i linguaggi di programmazione basati su testo cambiano in base alla sintassi adoperata. Ciò significa che quelli con sintassi simil-C utilizzano parentesi graffe, quelli simil-LISP utilizzano parentesi tonde e quelli simil-Pascal utilizzano keywords.
Molte volte si parla poi di linguaggi interpretati e compilati, riferendosi semplicemente a una qualità dell’implementazione dei linguaggi stessi piuttosto che dei linguaggi effettivi. Lo stesso discorso va fatto anche per i linguaggi da cui derivano eseguibili nativi per una determinata architettura e per i linguaggi da cui derivano eseguibili per una macchina virtuale: ci si riferisce sempre a peculiarità dell’implementazione.
Come è evidente da quanto appena detto, la programmazione varia moltissimo a seconda del linguaggio scelto: variazione che va a incidere in primis sulle funzionalità effettivamente eseguibili e sugli obiettivi da raggiungere. I casi riportati rappresentano solo alcuni degli esempi concretamente disponibili e citarli tutti sarebbe pressoché impossibile. Ma la panoramica offerta da un’idea piuttosto precisa sulle differenze esistenti.
