Der Compiler muss nicht zwingend auf 64 Bit laufen, aber 64-Bit-Systeme muss er zwingend beherrschen. Ob hier Cross-Compiler besser oder schlechter sind, ist ne Frage, wie gut der Zwischen-Code jeweils umgesetzt wird. Beim GCC und LLVM dürfte sich hier kaum ein Unterschied zwischen nativem und cross-compiliertem Binary zeigen, da beide von Haus aus mit einer abstrahierten Zwischensprache intern arbeiten. Ähnliches gilt auch für FPC und DCC: Wenn der Compiler ein ungenügendes Verständnis der Architektur hat, für die er Code erzeugt, ist das ergebnis voraussichtlich unbefriedigend. Inwiefern
Borland Inprise CodeGear Embarcadero das inzwischen im Griff hat, kann ich derzeit noch nicht sagen
Zu den Microsoft-Compilern kann ich nichts sagen, da ich die nicht nutze. Irgendwie sind die seltsam ... Mal ganz davon abgesehen, dass ich sowohl nmake als auch VisualStudio nicht mag.
Andere, insbesondere kommerzielle Compiler sind mitunter auf bestimmte Plattformen hin optimiert, zeigen dann aber für den generischen Gebrauch ihre Schwächen. Zumal nicht nur der Compiler an sich guten Code erzeugen muss, sondern auch die beiliegende Runtime Library was taugen muss, da der Code ansonsten so grottig wie die Compilate von Delphi 5-7 laufen (wer Assembler kann UND sich die Binaries mal angeschaut hat, weiß, was ich meine).
Um also zu deiner Frage zurück zu kommen: Der Compiler ist ein wesentlicher Bestandteil für gute Software; ein anderer, der aber oftmals außer Acht gelassen wird, ist die Software-Architektur, die entscheident zur Qualität von Software beiträgt. Wenn ich also ein Programm schreibe und weiß, dass ich ein 64-Bit-System nutze, dann sollte ich dies in meiner Software-Architektur mit einplanen, z.B. indem ich Zugriffe auf Variablen möglichst auf 64-Bit-Datentypen gestalte, wenn dies möglich ist. Auch bei der Verwaltung von Speicher kann ich auf einem 64-Bit-System wesentlich flexibler umgehen (z.B. Vermeidung von klassischem Paging bei großen Datenbeständen, konsistente, zusammenhängende Datenbereiche, statt verstreuter Heaps, ... Leider sind dies alles Optimierungen, die in den seltensen Fällen der Compiler alleine machen kann, da dieser zwar weiß, dass hier 2^64 Bytes addressiert werden können; ob es sich daher aber lohnt, die Hashtable in Methode XY auf Grund des größeren Adressraums zu vergrößern, kann letztenendes nur der Programmierer entscheiden.
Was Compiler an dieser Stelle rausholen können, ist eine Optimierung, die ggf. paralelle Operationen für mehrere If-Abfragen zusammenfasst und daher aus 5 If-Abfragen eine einmalige Berechnung macht, bei der nur noch anhand einzelner Bits Code auszuführen ist; bestenfalls ohne Verzweigung, Cache Misses, ...
Wo wir aber grad bei 64 Bit sind: Viele Programme können den größeren Adressraum bzw. die breiteren Speicherzugriffe nicht effektiv nutzen. Da bringt dann eine Aussage wie "Optimiert für 64 Bit" nur den Vorteil, noch besoffener zu sein, als nach 32 Bit.
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.