Da quanto so il compilatore traduce i programmi in assembly e poi l'assembler traduce il tutto in binario, ma se i processori hanno generalmente architetture diverse da famiglia a famiglia allora anche l'assembly cambia, quindi come fanno i programmatori a distribuire i loro programmi compilati in modo che siano eseguibili su tutte le piattaforme ad esempio a 64bit?
Non puoi farlo, in generale il codice compilato in nativo è dipendente sia dall'architettura della CPU che dal sistema operativo. La dipendenza verso il sistema operativo è principalmente dovuta alle syscall. Se vuoi distribuire il tuo software su diverse architetture e su diversi sistemi operativi, devi ricompilarlo per ogni singola architettura. Quando leggi di un software che può essere scaricato sia in versione 32 bit che in versione 64 bit solitamente intendono rispettivamente x86 (32 bit) e x86_64 (64 bit), che sarebbero le due architetture comunemente usate nei pc. Se il tuo computer è un arm a 64 bit (e.g., un chromebook) dovrà avere un software compilato apposta per quell'architettura, non puoi usare un software compilato per x86_64. Per esempio, nella la pagina di
download di 7zip hai una sfilza di versioni diverse: windows x86, windows x86_64, windows arm64, linux x86, linux x86_64, linux arm64, linux arm32, e molte altre. Alcune architetture sono (retro)compatibili, per esempio x86_64 è una versione migliorata di x86 e un processore x86_64 può eseguire codice x86. Se le architetture non sono compatibili, come per esempio arm64 e x86_64, che sono comunque due architetture a 64 bit, devi usare un emulatore.
Come non detto ho fatto qualche ricerca e AMD64 è comune tutti i processori a 64 bit
AMD64, x64, x86-64 e x86_64 sono nomi per la stessa architettura. Per capirci, è un po' come dire PS5 e Playstation 5: sono la stessa identica cosa. Non tutti i processori a 64 bit sono x86_64. Per esempio, il tuo cellulare molto probabilmente ha un processore arm a 64 bit che non è compatibile con x86_64.