Entwickler-Ecke

Off Topic - 64 Bit Software


3marci - Do 16.06.11 19:20
Titel: 64 Bit Software
Hallo Leute,

ich habe mal eine frage zu 64 Bit.
Vorab: bitte denk in diesem Thread nicht an irgendwelche Frameworks wie .NET, sondern an Programme die nativ laufen, also z.B. in C++ mit der Win32 API.

Man sieht immer wieder mal in den releasenotes dass 64 Bit Software optimiert worden ist.
Meine Frage ist nun, wenn ich ein Programm nativ für 64 Bit verfügbar machen will, muss ich den Compiler einfach nur auf "64bit" stellen oder Teile des Quelltextes extra für 64 Bit anpassen?


Delete - Do 16.06.11 19:27

Du musst erstens für 64bit kompilieren und auf einem 64-Bit Rechner kompilieren.


3marci - Do 16.06.11 19:34

user profile iconj.klugmann hat folgendes geschrieben Zum zitierten Posting springen:
Du musst erstens für 64bit kompilieren und auf einem 64-Bit Rechner kompilieren.

Logisch, das wusste ich auch.
Lies dir bitte nochmal meine Frage durch, goto Threadstart;


Delete - Do 16.06.11 19:49

Lies dir doch bitte meine Antwort richtig durch. Goto #Answer2.

Du musst nicht unbedingt Code anpassen, du kannst.


Regan - Do 16.06.11 20:00

user profile icon3marci hat folgendes geschrieben Zum zitierten Posting springen:
Meine Frage ist nun, wenn ich ein Programm nativ für 64 Bit verfügbar machen will, muss ich den Compiler einfach nur auf "64bit" stellen oder Teile des Quelltextes extra für 64 Bit anpassen?

Du musst Teile des Quelltextes nicht anpassen. Der Compiler muss 64-bit beherrschen und auf einem 64-bit System laufen.


3marci - Do 16.06.11 20:06

user profile iconj.klugmann hat folgendes geschrieben Zum zitierten Posting springen:
Lies dir doch bitte meine Antwort richtig durch. Goto #Answer2.

Du musst nicht unbedingt Code anpassen, du kannst.
In deiner ersten Antwort hast du nichts davon geschrieben, ob man den Quelltext anpassen muss oder nicht.
Und das war ja meine Frage.


Th69 - Do 16.06.11 20:17

Hallo Marcel,

es kann natürlich sein, daß der bisherige Code nicht 'per se' 64-bit fähig ist (z.B. wenn man Zeiger nach int castet - und dann wieder zurück).
Man sollte unter C, C++ oder Delphi etc. dann möglichst alle Warnungen aktivieren, um mögliche Fehlerquellen zu finden.

Und gerade wenn eine Anwendung noch fremde DLLs verwendet, so müssen diese ja auch ersteinmal nach 64-bit umgestellt worden sein.


jaenicke - Do 16.06.11 20:42

user profile iconj.klugmann hat folgendes geschrieben Zum zitierten Posting springen:
Du musst erstens für 64bit kompilieren und auf einem 64-Bit Rechner kompilieren.
Was hat das für einen Grund, dass du unbedingt auf einem 64-Bit Rechner kompilieren willst?

Was Delphi betrifft: XE 2 wird zwar für 64-Bit kompilieren können, aber selbst 32-bittig bleiben. Wozu sollte man das auch umstellen und zusätzliche Probleme provozieren?
Und ich sehe auch nicht wirklich einen Grund warum andere Compiler nur als 64-Bit Compiler auch dafür kompilieren können sollten.


mkinzler - Do 16.06.11 22:02

Der Compiler muss nicht mal auf der selben Comilerplattform laufen, für welche er Code erzeugt (cross compiling)


Delete - Do 16.06.11 22:16

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconj.klugmann hat folgendes geschrieben Zum zitierten Posting springen:
Du musst erstens für 64bit kompilieren und auf einem 64-Bit Rechner kompilieren.
Was hat das für einen Grund, dass du unbedingt auf einem 64-Bit Rechner kompilieren willst?

Was Delphi betrifft: XE 2 wird zwar für 64-Bit kompilieren können, aber selbst 32-bittig bleiben. Wozu sollte man das auch umstellen und zusätzliche Probleme provozieren?
Und ich sehe auch nicht wirklich einen Grund warum andere Compiler nur als 64-Bit Compiler auch dafür kompilieren können sollten.

Mir ist bewusst, dass es Cross-Compiler gibt, allerdings halte ich generell nicht so viel von Cross-Compilern, das hat vielleicht nichts mit Delphi XE2 zu tun, aber mit meiner schlechten Erfahrung mit Cross Compilern jeglicher Art. :P


BenBE - Do 16.06.11 22:56

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.