Frage

Lassen Sie sich sagen, ich bin Programmierung in Java oder Python oder C ++ für ein einfaches Problem, könnte einen TCP / UDP-Echo-Server oder Berechnung von Fakultäts zu bauen. Muß ich habe über die Architektur Details zu kümmern, das heißt, wenn es 32 oder 64-Bit?

IMHO, es sei denn, ich bin etwas Programmierung mit ziemlich Low-Level-Zeug zu tun, dann muss ich nicht, ob seine 32 oder 64 Bit stören. Wohin gehe ich falsch? Oder bin ich richtig ???

War es hilfreich?

Lösung

richtig für die meisten Umstände

Die Laufzeit / Sprache / Compiler abstrakt diese Details, wenn Sie direkt mit Wortgrößen oder binär auf einem niedrigen Niveau zu tun.

Auch byteorder wird durch den NIC / Netzwerk-Stack im Kernel abstrahiert. Es ist für Sie übersetzt. Wenn Sie Sockets in C programmieren, müssen Sie manchmal mit Byte-Reihenfolge für das Netzwerk umgehen, wenn das Senden von Daten ... aber das bezieht sich nicht auf 32 oder 64 Bit Unterschiede.

Wenn Sie mit Blobs von binären Daten zu tun, so dass sie von einer Architektur auf eine andere Zuordnung (als Overlay auf eine C-Struktur zum Beispiel) kann zu Problemen führen, wie andere schon erwähnt haben, aber das ist, warum wir Architektur unabhängige Protokolle entwickeln, die auf Zeichen und so weiter.

In-die Tat Dinge wie Java läuft in einer virtuellen Maschine, die abstrahiert die Maschine ein weiterer Schritt!

Zu wissen, ein bisschen über den Befehlssatz der Architektur, und wie die Syntax, die kompiliert wird, können Ihnen helfen, die Plattform zu verstehen und schreiben sauberen, festen Code. Ich weiß, dass ich bei einigen alten C-Code Grimasse nach Compiler studieren!

Andere Tipps

Zu wissen, wie die Dinge funktionieren, sei es, wie die virtuelle Maschine funktioniert und wie es auf Ihrer Plattform funktioniert, oder wie bestimmte C ++ Konstrukte werden in Montage umgewandelt werden Sie immer einen besseren Programmierer machen, weil Sie verstehen, warum sollten die Dinge getan werden, die Art, wie sie sind.

Sie müssen Dinge wie Speicher zu verstehen, zu wissen, welche Cache-Misses sind und warum diejenigen, könnte Ihr Programm beeinflussen. Sie sollen wissen, wie bestimmte Dinge umgesetzt werden, auch wenn Sie nur eine Schnittstelle oder auf hohe Ebene Art und Weise nutzen kann, um es zu bekommen, zu wissen, wie es wird sicherstellen, arbeitet man es in der besten Art und Weise tun.

Für Paket Arbeit, müssen Sie verstehen, wie die Daten auf Plattformen gespeichert werden und wie das Senden, dass über das Netzwerk auf eine andere Plattform könnte sich ändern, wie die Daten gelesen (Bytereihenfolge).

Ihr Compiler beste Nutzung der Plattform machen Sie Kompilieren auf, so lange, wie Sie auf Standards und Code-Stick gut, können Sie die meisten Dinge ignorieren und die Compiler übernehmen werden zücken, was am besten ist.

Also kurz gesagt, nein. Sie brauchen nicht die niedrige Niveau Sachen zu wissen, aber es schadet nie zu wissen, .

Das letzte Mal, dass ich in der Java-Sprache spec sah, enthielt es eine lächerliche Gotcha im Abschnitt über die ganze Zahl Boxen.

Integer a = 100;
Integer b = 100;

System.out.println(a == b);

Das ist garantiert true drucken.

Integer a = 300;
Integer b = 300;

System.out.println(a == b);

Das ist nicht drucken true garantiert. Es hängt von der Laufzeit. Die Spezifikation ließ sie völlig offen. Es ist, weil ein int zwischen -128 und 127 returns „internieren“ Objekte (analog zu der Art und Weise Stringliterale werden interniert) Boxen, aber die Implementierer der Language Runtime wird ermutigt, diese Grenze zu erhöhen, wenn sie dies wünschen.

Ich halte persönlich, dass als verrückt Entscheidung, und ich hoffe, dass sie es behoben haben, da (write once, run anywhere?)

Sie müssen manchmal stören.

Sie können überrascht sein, wenn diese Low-Level-Details plötzlich springen und beißen. Zum Beispiel Java standardisierte double 64 Bit zu sein. Allerdings verwendet Linux JVM den „extended precision“ Modus, wenn die Doppel 80 Bit ist, solange es in dem CPU-Register ist. Dies bedeutet, dass der folgende Code kann fehlschlagen:

double x = fun1();
double y = x;

System.out.println(fun2(x));

assert( y == x );

Ganz einfach, weil y aus dem Register in dem Speicher und abgestumpften 80-64 Bits gezwungen wird.

In Java und Python, Architektur Details abstrahiert so entfernt, dass es in der Tat mehr oder weniger unmöglich ist, architekturabhängige Code zu schreiben.

Mit C ++, das ist eine ganz andere Sache - Sie sicherlich Code schreiben können, die nicht auf die Architektur Details abhängt, aber man muss vorsichtig sein, Fehler zu vermeiden, und zwar Basisdatentypen in Bezug auf die sind Architektur abhängig, wie int .

Solange Sie die Dinge richtig tun, werden Sie fast nie brauchen für die meisten Sprachen kennen. Auf vielen, man kann nie wissen müssen, wie das Sprachverhalten ändert sich nicht (Java, zum Beispiel, gibt das Laufzeitverhalten genau).

In C ++ und C, Dinge zu tun, schließt nicht richtig Annahmen über int machen. setzen Zeiger nicht in int, und wenn Sie etwas mit Speichergrößen oder Adressen zu tun verwenden size_t und ptrdiff_t. Nicht auf die Größe der Datentypen zählen: int mindestens 16 Bits sein muss, ist fast immer 32 und 64 kann auf einigen Architekturen sein. Gehen Sie nicht davon, dass Gleitkomma-Arithmetik wird in genau der gleichen Weise auf verschiedenen Maschinen durchgeführt werden (die IEEE-Standards haben einen gewissen Spielraum in ihnen).

So gut wie alle OSes die Vernetzung unterstützen wird Ihnen einen Weg mit möglichen endianness Probleme zu bewältigen. Benutze sie. Verwenden Sie die Sprache Einrichtungen wie isalpha () Zeichen zu klassifizieren, anstatt arithmetische Operationen auf Zeichen (die etwas seltsam wie EBCDIC sein könnte). (Natürlich ist es jetzt üblich verwenden wchar_t als Zeichentyp und verwendet intern Unicode.)

Wenn Sie in Python oder in Java programmieren, den Dolmetscher und die virtuelle Maschine bzw. abstrakte diese Schicht der Architektur. Sie müssen dann keine Sorgen zu machen, wenn es auf einer 32 oder 64-Bit-Architektur ausgeführt wird.

Das gleiche kann nicht für C ++ gesagt werden, in dem es sich manchmal fragen, wenn Sie auf einem 32 oder 64-Bit-Computern ausgeführt

Sie müssen über „Endian-ness“ kümmern sich nur, wenn Sie rohe C structs senden und empfangen über den Draht wie

ret = send(socket, &myStruct, sizeof(myStruct));

Dies ist jedoch nicht empfohlen.

Es wird empfohlen, dass Sie ein Protokoll zwischen den Parteien so definieren, es spielt keine Rolle die Parteien Maschinenarchitekturen.

In C ++, müssen Sie sehr vorsichtig sein, wenn Sie Code schreiben möchten, die unterschiedslos auf 32 oder 64 Bit arbeitet. Viele Menschen, die int fälschlicherweise annehmen kann einen Zeiger speichern, zum Beispiel.

Mit Java und .NET Sie müssen damit nicht wirklich gestört, es sei denn Sie sind sehr niedriges Niveau Sachen wie twiddling Bits zu tun. Wenn Sie mit C, C ++, Fortran Sie erhalten, indem Sie könnte aber ich würde tatsächlich mit Sachen wie „stdint.h“ empfehlen, wo man definitive verwenden erklärt wie uint64_t und uint32_t so explizit zu sein. Außerdem müssen Sie mit besonders Bibliotheken je nach bauen, wie Sie einer Verknüpfung, zum Beispiel eines 64-Bit-System gcc in einem Standard-64-Bit-Kompilierung-Modus verwenden kann.

Eine 32-Bit-Maschine ermöglicht es Ihnen, maximal 4 GB adressierbaren virtuellen Speicher zu haben. (In der Praxis ist es sogar noch weniger als die, in der Regel 2 GB oder 3 GB, je nach Betriebssystem und verschiedenen Linker-Optionen.) Auf einer 64-Bit-Maschine, können Sie einen riesigen virtuellen Adressraum haben (in jedem praktischen Sinne, nur begrenzt durch Scheibe ) und ein verdammt großes RAM.

Wenn Sie also 6GB Datensätze für einige Berechnung erwarten (sie etwas sagen, die inkohärenten Zugang braucht und kann nicht nur ein bisschen zu einer Zeit übertragen werden), auf einer 64-Bit-Architektur, die Sie einfach in RAM lesen und tun Ihre Sachen, während auf einem 32-Bit-Architektur benötigen Sie eine grundsätzlich andere Art und Weise zu nähern, da Sie einfach den gesamten Datensatz resident halten nicht die Möglichkeit haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top