比方说,我在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位架构,你需要一种完全不同的方式来处理它,因为你根本就没有保持整个数据集居民的选择。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top