- 2,223
- 1,854
- CPU
- Intel I9-10900KF 3.75GHz 10x 125W
- Dissipatore
- Gigabyte Aorus Waterforce X360 ARGB
- Scheda Madre
- Asus 1200 TUF Z590-Plus Gaming ATX DDR4
- HDD
- 1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
- RAM
- DDR4 32GB 3600MHz CL18 ARGB
- GPU
- Nvidia RTX 3080 10GB DDR6
- Audio
- Integrata 7.1 HD audio
- Monitor
- LG 34GN850
- PSU
- Gigabyte P850PM
- Case
- Phanteks Enthoo Evolv X ARGB
- Periferiche
- MSI Vigor GK30, mouse Logitech
- Net
- FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
- OS
- Windows 10 64bit / OpenSUSE Tumbleweed
Viene generato un codice intermedio, che non è ancora il codice macchina di un'architettura specifica.Infatti so che le uniche cose che hanno in comune un interprete e un compilatore sono il lexer e il parser. Poi come faccia il compilatore a trasformare tutto in codice macchina per me è un mistero. Ha un set di istruzioni in assembly per ogni istruzione pronto all’uso? Boh
Considera che i compilatori attuali ottimizzano anche il codice: non si tratta di "avere in memoria le istruzioni", ma soprattutto di ottimizzare il codice prima dell'emissione. Per fare un esempio stupido:
C:
int sum = 0;
for(int i=0; i<n; i++) {
int number = 0x12346;
sum += (number * i);
}
In un codice come questo una delle ottimizzazioni che avviene è sicuramente spostare la variabile "number" prima del ciclo for, in quanto viene inizializzata ripetutamente ma il suo valore rimane costante, non cambia.
Un altro caso "semplice", è identificare quelle variabili alle quali assegni un valore che è costante, ma attraverso alcune operazioni, tipo:
C:
int number = 24 * 60 * 60;
Questa viene identificata in fase di compilazione e viene direttamente emesso il risultato, "assegnandolo" direttamente alla variabile number; quindi nell'assembly vedresti concettualmente tipo:
Codice:
mov [number], 86400
Tutto il codice macchina viene poi emesso per l'architettura target al termine di tutto il processo di compilazione.
Non mi ricordo più moltissimi "dettagli" sulle varie fasi, è un argomento che avevo affrontato per curiosità, ma che non ho mai approfondito veramente.
Sicuramente una delle cose che dovrai avere, ma questo già con l'interpretato, è una certa "dimestichezza" con alberi e grafi.
Allora, mi sono documentato un po’ (ma ho compreso molto poco). Da quello che ho capito la parte scritta a mano si occupa di creare i token e fare il parsing, poi llvm si occupa della traduzione in asm e poi in binario
LLVM è quello che ho citato sopra: viene utilizzato in svariati progetti, e si, in sostanza ti consente di emettere delle istruzioni nel codice macchina dell'architettua che vuoi. Il compilatore CLang fa da front-end di LLVM, per esempio.