# Framework

In informatica e specificamente nello sviluppo software, un framework (anglicismo che può essere tradotto come struttura, impalcatura o quadro strutturale) è un'architettura logica di supporto (spesso un'implementazione logica di un particolare design pattern) sulla quale un software può essere progettato e realizzato, spesso facilitandone lo sviluppo da parte del programmatore.
Il termine framework è spesso utilizzato anche all'infuori del linguaggio informatico. Lo si usa, specie nelle materie economico-gestionali, per esprimere il concetto di una modalità strutturata, pianificata e permanente, che supporta una prassi, una metodologia, un progetto, un sistema di gestione. In italiano corrisponde alle parole: architettura, struttura, quadro strutturale e simili (mentre "intelaiatura" sarebbe poco adatto per questo scopo, sebbene sia il significato originario di framework).

## Descrizione

Un framework è definito da un insieme di classi astratte e dalle relazioni tra esse. Istanziare un framework significa fornire un'implementazione delle classi astratte. L'insieme delle classi concrete, definite ereditando il framework, eredita le relazioni tra le classi; si ottiene in questo modo un insieme di classi concrete con un insieme di relazioni tra classi.
Alla base di un framework c'è sempre una serie di librerie di codice utilizzabili in fase di linking con uno o più linguaggi di programmazione, spesso corredate da una serie di strumenti di supporto allo sviluppo del software, come ad esempio un IDE, un debugger o altri strumenti ideati per aumentare la velocità di sviluppo del prodotto finito. L'utilizzo di un framework impone dunque al programmatore una precisa metodologia di sviluppo del software.

### Funzione

La sua funzione è quella di creare una infrastruttura generale, lasciando al programmatore il contenuto vero e proprio dell'applicazione. Lo scopo di un framework è infatti quello di risparmiare allo sviluppatore la riscrittura di codice già scritto in precedenza per compiti simili. Questa circostanza si è presentata sempre più spesso man mano che le interfacce utente sono diventate sempre più complesse, o, più in generale, man mano che è aumentata la quantità di software con funzionalità secondarie simili.
Ad esempio, il tipo di interazione con l'utente offerto da un menu a tendina sarà sempre la stessa indipendentemente dall'applicazione cui il menu appartiene (o almeno questo è ciò che l'utente si aspetta); in casi come questo un framework, che permette di aggiungere la funzionalità di una finestra con un menu a tendina con poche righe di codice sorgente a carico del programmatore, o magari permettendogli di disegnare comodamente il tutto in un ambiente di sviluppo, permetterà al programmatore di concentrarsi sulle vere funzionalità dell'applicazione, senza doversi far carico di scrivere codice "di contorno".

### Relazione con le librerie di run-time

Un framework può essere visto come (e in alcuni casi è) un sovrainsieme o un'aggiunta alle librerie di run-time, o tempo d’esecuzione, di un linguaggio. Per fare qualche esempio:
* Il C++ ha, oltre alla libreria standard C++, un proprio framework non grafico, la Standard Template Library (STL); tuttavia, esistono numerosi framework che estendono o, in parte, sostituiscono la STL, tra cui l'Active Template Library (ATL) e le Microsoft Foundation Classes (MFC) di Microsoft, Qt di Digia, e wxWidgets. Microsoft ha inoltre sviluppato un'implementazione del C++ (ora standard dell'ECMA: C++/CLI) che si appoggia integralmente al Framework .NET.
* Anche il C ha una propria libreria di run-time, la libreria standard del C, nota anche come libc (in ambiente Unix) o CRT (in ambiente Microsoft, da C Run-Time); tuttavia vi sono parecchi framework per il C, fra cui il GIMP Toolkit (GTK).
* Per il linguaggio C#, che non ha una propria libreria di run-time, il Framework .NET svolge anche questa funzione. Lo stesso vale per Visual Basic .NET, che è stato concepito in maniera analoga.
* Tutto il software scritto in Delphi di Borland si appoggia sulla Visual Component Library (VCL), sempre di Borland; questa libreria di fatto è un framework, poiché si prende carico di una gran quantità di servizi software non essenziali (tra i quali, appunto, la gestione dell'interfaccia grafica). Come Microsoft con il C++, anche Borland ha realizzato una versione di Delphi che si appoggia al Framework .NET.
* Sono per Java i framework Cocoon e Struts di Apache, tutti e due orientati allo sviluppo di applicazioni per Internet.
* Programmando in PHP è possibile fare uso di prodotti quali Symfony, Zend Framework, yii, Seagull, Jamp, CodeIgniter o molti altri.
* In Perl esiste il framework Catalyst, nel quale il codice viene generato a partire dallo schema di un database sottostante.
* Programmando in RPG è possibile fare uso di prodotti quali Jeniux framework, WebFacing, GUI/400 e molti altri.
* In Python esiste il framework Twisted che utilizza il paradigma di programmazione orientato agli eventi per lo sviluppo di applicazioni Internet.
* Anche WordPress dispone di numerosi framework, in grado di estenderne le funzionalità e migliorarne le prestazioni: alcuni di essi sono inclusi in theme grafici più avanzati, altri sono installabili separatamente. Tra i più noti citiamo Option Framework (che mette a disposizione delle estensioni nel backend, come ad esempio le pagine di opzioni del sito), Genesis, Titan e Redux.
* Il framework full stack Ruby on Rails, dedicato al Ruby, ha contribuito ad accrescerne la diffusione.
Nonostante questo bisogna tener ben presente che un framework concettualmente non è una libreria. La differenza sta nel fatto che le librerie sono collezioni di funzioni specializzate per un determinato compito, che possiamo chiamare quando ne abbiamo bisogno, mentre il framework è l'infrastruttura predisposta alla realizzazione di un’applicazione secondo un determinato approccio all'interno del quale inseriamo del codice che verrà opportunamente interrogato per implementare il comportamento specifico della nostra applicazione.

### Utilizzi

A volte si utilizzano framework proprietari progettati ex-novo oppure che estendono framework già esistenti; trattandosi di fatto di importazione di librerie è anche possibile combinare più framework, ciascuno utilizzato per diverse parti dell'applicazione da realizzare.