比方说,我在Java或Python或C ++编程的一个简单的问题,可能是建的阶乘的TCP / UDP echo服务或计算。 难道我已经操心的架构细节,也就是说,如果是32位还是64位?
恕我直言,除非我编程事做相当低层次的东西,然后我没有打扰如果32位或64位。 我要去哪里错了? 还是我纠正???
比方说,我在Java或Python或C ++编程的一个简单的问题,可能是建的阶乘的TCP / UDP echo服务或计算。 难道我已经操心的架构细节,也就是说,如果是32位还是64位?
恕我直言,除非我编程事做相当低层次的东西,然后我没有打扰如果32位或64位。 我要去哪里错了? 还是我纠正???
正确的大多数情况下,
运行时间/语言/编译器将抽象的这些细节,除非你直接与字长或二进制处于较低水平交易。
即使字节顺序是由内核中的NIC /网络堆栈抽象。 它被翻译为您服务。 当编程用C插座,你有时不得不将数据发送到处理字节顺序为网络......但这并不关注32或64倍的差异。
当二进制数据的斑点,从一个架构映射到另一个处理(如覆盖到C结构为例)如其他人所说的可能会造成问题,但是这就是为什么我们开发了基于字符等架构与协议无关。
在-其实东西像Java中抽象机器一个工序虚拟机中运行!
了解一点有关设置架构的指令,而且语法是如何编译到可以帮助你了解这个平台,编写更干净,更紧凑的代码。 我知道我的一些旧的C代码鬼脸学习后的编译器!
知道事情是如何工作的,是如何在虚拟机的工作原理,以及它是如何工作的平台上,或C如何某些++结构转化为装配总会让你成为一个更好的程序员,因为你会明白为什么事情应该做他们的方式是。
你需要了解的东西,如内存知道缓存缺失是为什么那些可能会影响你的程序。 你应该知道的事情怎么样一定实现,即使你可能只用一个接口或高层次的方式来得到它,知道它是如何工作将确保你在最好的方式这样做。
对于分组的工作,你需要了解数据是如何存储平台和如何发送跨网络平台不同可能会改变如何读取数据(字节序)。
你的编译器将让你编译的平台的最佳利用,所以只要你坚持标准和代码好了,你可以忽略大部分事情,并假设编译器会马上拿出什么是最好的。
因此,在短期,没有。 你不需要知道低层次的东西,但它绝不会伤害知道 。
上次我看了一下Java语言规范,它在整数拳击的部分包含一个荒谬的疑难杂症。
Integer a = 100;
Integer b = 100;
System.out.println(a == b);
这是保证打印true
。
Integer a = 300;
Integer b = 300;
System.out.println(a == b);
这不能保证打印true
。 这取决于运行时。 该规范离开它完全打开。 这是因为拳“实习”的对象(类似于字符串文字实习的方式)-128到127之间返回一个int,但语言运行库的实现者鼓励,如果他们想提高该限制。
我个人认为这是一个疯狂的决定,我希望他们已经修复它,因为(一次编写,随处运行?)
有时你必须费心。
你可以惊奇地发现,当这些低级别的细节突然跳出来咬你。 例如Java标准化double
为64位。 但是,Linux JVM使用“扩展精度”模式下,当双80位,只要它是在CPU寄存器。 这意味着下面的代码可能会失败:
double x = fun1();
double y = x;
System.out.println(fun2(x));
assert( y == x );
很简单,因为y被压出寄存器到存储器和从80到64位截断。
在Java和Python,建筑细节抽象出来,这样它实际上是或多或少不可能写出体系结构相关的代码。
使用C ++,这是一个完全不同的问题-你当然可以写一个不依赖于建筑细节的代码,但你必须要小心避免陷阱,特别是关于那些是体系结构相关的基本数据类型,如int
。
只要你做正确的事情,你几乎从来没有需要知道的大多数语言。 在很多时候,你无需知道,作为语言行为不改变(Java的,例如,规定了运行时的行为精确)。
在C ++和C,正确地做事情,包括不作出有关INT假设。 不要把INT指针,当你正在做的内存大小或地址的任何使用的size_t和ptrdiff_t的。 别上的数据类型的大小不计:整数必须至少16位,几乎总是为32,并且可以是64上的一些体系结构。 不要假设浮点运算将恰好在不同的机器相同的方式进行(在IEEE标准中都有一定的回旋余地)。
几乎支持所有的网络操作系统会给你一些方法来应对可能出现的字节顺序的问题。 使用它们。 使用语言设施,如因而isalpha()分类字符,而不是字符的算术运算(这可能是像EBCDIC一些奇怪)。 (当然,它现在更常见的使用wchar_t的字符作为类型,并在内部使用Unicode)。
如果你是编程在Python或Java中,解释和虚拟机分别抽象的这层建筑。 然后,您不必担心,如果它在32位或64位架构上运行。
同样不能说是为C ++,在其中你必须问问自己,有时如果你是一个32位或64位的机器上运行
您将需要关心“字节序”只有当你喜欢上了线发送和接收的原始C结构
ret = send(socket, &myStruct, sizeof(myStruct));
然而,这不是一个推荐的做法。
我们建议您定义的当事人之间的协议,例如没关系当事人的机器架构。
在C ++中,你必须非常小心,如果你想要写上32或64位工作漠然代码。 许多人错误地认为, int
可以存储一个指针,例如。
利用Java和.NET你真的没有管它,除非你正在做的非常低的水平的东西一样摆弄位。 如果您正在使用C,C ++,Fortran语言,你可能会得到通过,但我真的建议使用像在您使用明确的声明像uint64_t中和uint32_t的,以便明确“stdint.h”。 此外,您将需要建立与这取决于你是如何链接库特别,例如64位系统可能会在默认的64位编译模式下使用gcc。
一个32位的机器可以让你有一个最大4 GB的可寻址的虚拟内存。 (实际上,它比这还少,一般为2 GB或3 GB取决于操作系统和多种连接选项。)在64位机,你可以有一个巨大的虚拟地址空间(在任何实际意义,只能由磁盘限制)和一个漂亮的该死的大的RAM。
所以,如果你期待6GB数据集的一些计算(假设有一些需要语无伦次访问和不能只流了一下,在一个时间),在64位架构,你可以只将它读入内存,并做你的东西,而在32位架构,你需要一种完全不同的方式来处理它,因为你根本就没有保持整个数据集居民的选择。