Un compilatore è un programma che traduce il codice sorgente scritto in un linguaggio di programmazione di alto livello (come C, C++, Java e così via) in un linguaggio di basso livello, solitamente codice macchina o un linguaggio intermedio, che può essere eseguito direttamente dal processore di un computer. In un altro articolo abbiamo visto tutte le differenze tra linguaggi compilati e interpretati. Un compilatore online si rivela particolarmente utile per coloro che desiderano provare rapidamente piccoli frammenti di codice, fare esperimenti o imparare un nuovo linguaggio di programmazione senza dover configurare un ambiente di sviluppo completo.
I progetti open source offrono la possibilità di esaminare il codice sorgente del programma e verificare, ad esempio, che i file binari pubblicati sugli store online o sui siti Web degli sviluppatori siano effettivamente prodotti a partire dal codice di programmazione pubblicamente condiviso.
In tutti quei casi in cui il codice sorgente non risultasse disponibile, lo studio approfondito del funzionamento di un’applicazione diviene più complicato e necessita di un’attività di reverse engineering. A questo proposito, per decompilare un file eseguibile esistono diversi tool che aiutano a ricreare il codice di alto livello o una rappresentazione ad esso il più possibile vicina.
Compiler Explorer, un compilatore online intelligente che supporta 70 linguaggi di programmazione
Uno dei progetti che lasciano letteralmente a bocca aperta anche chi da anni si occupa di sviluppo software, è Compiler Explorer.
Appena aperta la home page dell’applicazione, sulla sinistra si trova un riquadro che accoglie il codice di programmazione mentre a destra compare l’output compilato, solitamente in linguaggio Assembly.
Compiler Explorer supporta circa 70 linguaggi diversi, oltre 2.000 compilatori e un ampio ventaglio di architetture per l’esecuzione del codice compilato, tra cui x86, ARM, RISC-V, MIPS, AVR, Tensa, 68k, PowerPC, SPARC e addirittura la storica architettura 6502.
Uno strumento come Compiler Explorer diventa imprescindibile per chiunque sia interessato al mondo dei compilatori e, in generale, all’architettura dei computer e degli altri dispositivi elettronici. Trattandosi di un progetto open source (è ospitato in questo repository GitHub), vista la sua stessa natura, è addirittura possibile ospitare autonomamente Compiler Explorer per fare gli esperimenti in locale, senza appoggiarsi ad alcun server remoto.
Per quali finalità è possibile usare Compiler Explorer
L’autore di Compiler Explorer, Matt Godbolt, ha già spiegato a maggio 2024 che cosa si può fare con il suo potente strumento. Vi invitiamo a fare riferimento al contenuto di questo video YouTube.
Nel nostro articolo, limitiamo a mettere in luce alcune finalità davvero interessanti di questo splendido compilatore online. In primo luogo, è possibile controllare il codice Assembly generato per le diverse architetture. Ad esempio, quali sono le differenze tra il codice destinato alla piattaforma x86-64 e quello “confezionato” da un certo compilatore per AMD64 e RISC-V?
Addirittura, se si parla di architettura NVIDIA CUDA, Compiler Explorer può restituire il codice PTX (Parallel Thread Execution). Si tratta di un linguaggio Assembly virtuale utilizzato all’interno dell’ecosistema di programmazione CUDA e creato a partire dal codice sorgente scritto in linguaggi di programmazione ad alto livello come C o C++. PTX è usato come passaggio intermedio prima della generazione del codice binario specifico per il dispositivo target ed è progettato per essere indipendente dall’architettura specifica della GPU di destinazione.
Ogni singola istruzione Assembly può essere studiata lasciandovi per qualche istante il puntatore del mouse. Un semplice clic con il tasto destro, selezionando la voce View Assembly documentation, permette di accedere a una serie di risorse aggiuntive.
Per impostazione predefinita, agendo sul menu a tendina posto nel pannello di sinistra, è possibile scegliere il linguaggio di programmazione quindi digitare o incollare il codice nell’area sottostante.
A destra si possono invece specificare più compilatori, così da rendersi conto di come uno stesso codice sia reso in Assembly, in modo talvolta significativamente differente, a seconda del compilatore prescelto.
Linguaggi interpretati: Compiler Explorer genera il bytecode corrispondente
A dimostrazione di quanto Compiler Explorer sappia adattarsi a qualsiasi esigenza, l’applicazione non è solamente un compilatore online. Si occupa infatti di gestire i linguaggi interpretati, come ad esempio Python e Ruby, per poi mostrare il bytecode prodotto.
Il bytecode è una rappresentazione intermedia del programma che può essere eseguita da un interprete o da una macchina virtuale. È formato da un insieme di istruzioni indipendenti dalla piattaforma che possono essere interpretate o tradotte in linguaggio macchina.
Nel caso di Java, ad esempio, il bytecode è eseguito sulla Java Virtual Machine (JVM), mentre il bytecode C# sulla Common Language Runtime (CLR). L’approccio consente ai programmi di essere eseguiti su diverse piattaforme senza dover essere ricompilati per ciascuna di esse.
Compiler Explorer accetta in ingresso anche opzioni da passare al compilatore online, ad esempio flag di ottimizzazione, di debug o flag specifici del compilatore stesso.
Con un clic sul menu More, Settings, è possibile regolare parametri come il comportamento della piattaforma (linguaggio di default, colorazione degli elementi, scorciatoie da tastiera, funzionalità dell’editor, compilazione automatica del sorgente a ogni modifica,…). Per annullare le personalizzazioni e ripristinare la configurazione iniziale di Compiler Explorer, basta fare clic su More quindi sulla voce Reset code and UI layout.
Credit immagine in apertura: iStock.com – Manfort Okolie