Doxygen
Template:Infobox Software Doxygen è una applicazione per la generazione automatica della documentazione a partire dal codice sorgente di un generico software. E' un progetto open source rilasciato sotto licenza GPL, scritto per la maggior parte da Dimitri van Heesch a partire dal 1997.
Doxygen è un sistema multipiattaforma (Windows, Mac OS, Linux, ecc.) ed opera con i linguaggi C++, C, Java, Objective C, Python, IDL (versioni CORBA e Microsoft), PHP, C#, e D. Nell'ambito del C++, è compatibile con le estensioni Qt.
E' il sistema di documentazione di gran lunga più utilizzato nei grandi progetti open source in C++. Due esempi per tutti, sono l'adozione di doxygen da parte di ACE e KDE. In Java invece, la posizione leader viene meno, in virtù della presenza del concorrente Javadoc.
Il sistema estrae la documentazione dai commenti inseriti nel codice sorgente e dalla dichiarazione delle strutture dati.
La documentazione prodotta
Il risultato finale è disponibile sotto forma di pagine html oppure nei formati CHM, RTF, PDF, LaTeX, PostScript o man pages di Unix. Il formato html prodotto si giova di un sistema di hyperlink molto curato che permette al lettore una agevole navigazione della struttura dei file sorgenti. La documentazione prodotta riporta anche il diagramma delle classi, nei casi in cui sono presenti relazioni di ereditarietà tra strutture dati. Grazie all'impiego sinergico di Doxygen con GraphViz, è possibile includere nella documentazione diagrammi delle classi per tutti gli altri tipi di relazioni tra strutture dati. I documenti possono essere generati in diverse lingue, tra cui è compreso l'italiano.
Infine, il sistema è altamente e facilmente configurabile al fine di permettere all'utilizzatore di intervenire su tutti gli aspetti della documentazione prodotta.
Il formato dei commenti
Il funzionamento di Doxygen richiede una particolare formattazione dei commenti inseriti nel codice sorgente. Le regole di formattazione, oltre ad essere analoghe a quelle degli altri prodotti della categoria, sono chiaramente documentate nel manuale. Riportiamo di seguito un esempio.
/**
* The time class represents a moment of time.
*
* \author My Name
*/
class Time {
/**
* Constructor that sets the time to a given value.
* \param timemillis is a number of milliseconds passed since Jan 1. 1970
*/
Time(int timemillis) {
...
}
/**
* Get the current time.
* \return A time object set to the current time.
*/
static Time now() {
...
}
};