A recompilação de um programa produz um binário idêntico bit a bit?
Para todos os compiladores? Não. O compilador C #, pelo menos, não tem permissão.
Eric Lippert tem um detalhamento completo sobre por que a saída do compilador não é determinística .
[O] compilador C # por design nunca produz o mesmo binário duas vezes. O compilador C # incorpora um GUID recém-gerado em todos os assemblies, toda vez que você o executa, garantindo assim que nenhum dois assemblies sejam idênticos bit a bit. Para citar a especificação da CLI:
A coluna Mvid deve indexar um GUID [...] exclusivo que identifica esta instância do módulo. [...] O Mvid deve ser gerado recentemente para cada módulo [...] Enquanto o próprio [runtime] não faz uso do Mvid, outras ferramentas (como depuradores) [...] contam com o fato de que o Mvid quase sempre difere de um módulo para outro.
Embora seja específico para uma versão do compilador C #, muitos pontos do artigo podem ser aplicados a qualquer compilador.
Primeiro, estamos assumindo que sempre obtemos a mesma lista de arquivos sempre, na mesma ordem. Mas, em alguns casos, isso depende do sistema operacional. Quando você diz "csc * .cs", a ordem na qual o sistema operacional oferece a lista de arquivos correspondentes é um detalhe de implementação do sistema operacional; o compilador não classifica essa lista em uma ordem canônica.