是否必须知道机器架构才能编写代码?

g06*_*lin 6 c++ python java 64-bit 32-bit

比方说,我在Java或Python或C++编程的一个简单的问题,可能是建的阶乘的TCP/UDP echo服务或计算.我是否需要打扰架构细节,即它是32位还是64位?

恕我直言,除非我正在编写与相当低级别的东西相关的东西,否则我不必为32或64位而烦恼.我哪里错了?还是我正确的???

Aid*_*ell 15

大多数情况都是正确的

除非您直接处理字大小或低级别的二进制文件,否则运行时/语言/编译器将抽象这些细节.

甚至字节顺序也被内核中的NIC /网络堆栈抽象化.它是为您翻译的.当编程用C插座,你有时不得不将数据发送到处理字节顺序为网络......但这并不关注32或64倍的差异.

处理二进制数据blob时,将它们从一个体系结构映射到另一个体系结构(例如,作为C结构的覆盖)可能会引起其他人提到的问题,但这就是我们基于字符等开发独立于体系结构的协议的原因.

像Java这样的事实在虚拟机中运行,它将机器抽象化了一步!

了解了一下有关设置架构的指令,而且语法是如何编译到可以帮助你了解这个平台,编写更干净,更紧凑的代码.我知道在学习编译器之后我会对一些旧的C代码做鬼脸!

  • 多年来一直没有意识到处理器硬件.自从我上次为军事武器编写实时控制器以来,我还不知道或不需要知道. (2认同)

GMa*_*ckG 15

知道事情是如何工作的,不管是虚拟机如何工作,它是如何在你的平台上工作的,或者某些C++构造如何转化为汇编,总会让你成为一个更好的程序员,因为你会理解为什么事情应该按照他们的方式完成是.

您需要了解内存之类的内容,以了解缓存未命中的内容以及这些内容可能会影响您的程序的原因.您应该知道某些事情是如何实现的,即使您可能只使用接口或高级方式来实现它,知道它如何工作将确保您以最佳方式执行它.

对于数据包工作,您需要了解数据如何存储在平台上以及如何通过网络将数据发送到不同的平台可能会改变数据的读取方式(endian-ness).

您的编译器将充分利用您正在编译的平台,因此只要您坚持使用标准和代码,您就可以忽略大多数事情,并假设编译器会剔除最好的东西.

所以简而言之,没有.你不需要知道低级别的东西,但知道永远不会伤害.


Dan*_*ker 7

我最后一次查看Java语言规范时,它在整数拳击部分中包含了一个荒谬的陷阱.

Integer a = 100;
Integer b = 100;

System.out.println(a == b);
Run Code Online (Sandbox Code Playgroud)

这是保证打印true.

Integer a = 300;
Integer b = 300;

System.out.println(a == b);
Run Code Online (Sandbox Code Playgroud)

这不保证打印true.这取决于运行时.该规格使它完全打开.这是因为在-128和127之间装入一个int会返回"interned"对象(类似于字符串文字被插入的方式),但是如果他们愿意的话,鼓励语言运行时的实现者提高该限制.

我个人认为这是一个疯狂的决定,我希望他们已经修好了(写一次,在任何地方运行?)


qua*_*dev 6

你有时候必须打扰.

当这些低级细节突然跳出来咬你时,你会感到惊讶.例如,Java标准化double为64位.但是,Linux JVM使用"扩展精度"模式,当double为80位时,只要它在CPU寄存器中.这意味着以下代码可能会失败:

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

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

assert( y == x );
Run Code Online (Sandbox Code Playgroud)

只是因为y被强制从寄存器中移出到内存中并被截断为80到64位.

  • 是的,这是一个错误.这被报告为GNU Java中的一个错误,但被忽略了:http://gcc.gnu.org/bugzilla/show_bug.cgi?id = 16122 (3认同)