04 2013 档案
摘要:一、关于类型什么叫做类型?简单地说,类型就是把内存中的一个二进制序列赋予某种意义。比如,二进制序列0100 0000 0111 0000 0001 0101 0100 1011 1100 0110 1010 0111 1110 1111 1001 1110如果看作是64位无符号整数类型就是4643234631018606494 而按照IEEE 754规定的浮点数二进制表示规则(见附1)双精度浮点类型则是257.331。变量类型大部分计算机语言使用变量来存储和表示数据,一些语言会给变量规定一个类型,在整个程序中(不论是编译时还是运行时),这个类型都不能被改变。与此相对,JavaScript和一些
阅读全文
摘要:1. 什么是JavaScript解析引擎?简单地说,JavaScript解析引擎就是能够“读懂”JavaScript代码,并准确地给出代码运行结果的一段程序。比方说,当你写了var a = 1 + 1;这样一段代码,JavaScript引擎做的事情就是看懂(解析)你这段代码,并且将a的值变为2。学过编译原理的人都知道,对于静态语言来说(如Java、C++、C),处理上述这些事情的叫编译器(Compiler),相应地对于JavaScript这样的动态语言则叫解释器(Interpreter)。这两者的区别用一句话来概括就是:编译器是将源代码编译为另外一种代码(比如机器码,或者字节码),而解释器是直
阅读全文
摘要:基本类型先看几个简单的例子:变量 i 的类型是 int,在内存中使用一个有符号32位单元表示(所有的图片显示了32位的内存布局;在当前的实现中,只有指针类型在64位机器上有扩展——int 仍然是32位——尽管一个实现可以选择使用64位。)变量 j 的类型是 int32,因为有明确的类型转换。即使 i 和 j 有着相同的类型结构,他们的类型是不同的;赋值 i = j 会产生类型错误,因此必须写成显式的类型转换:i = int(j)。变量 f 的类型是 float,在当前的实现中代表这一个32位的浮点值。它和 int32 有着相同的内存封装,但内部布局不同。结构和指针现在开始加快速度了。变量 by
阅读全文
摘要:文章最后本人做了一幅图,一看就明白了,这个问题网上讲的不少,但是都没有把问题说透。 一、概念 对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的。 二、为什么要字节对齐 需要字节对齐的根本原因在于CPU访问数据的效率问题。假设上面整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果取它的值的话需要访问两次内存,第一次取从0x00000002-0x00000003的一个short,第二次取从0x00000004-0x00000...
阅读全文
摘要:反射的规则在运行时反射是程序检查其所拥有的结构,尤其是类型的一种能力;这是元编程的一种形式。它同时也是造成混淆的重要来源。在这篇文章中将试图明确解释在 Go 中的反射是如何工作的。每个语言的反射模型都不同(同时许多语言根本不支持反射)。不过这篇文章是关于 Go 的,因此接下来的内容“反射”这一词表示“在 Go 中的反射”。类型和接口由于反射构建于类型系统之上,就从复习一下 Go 中的类型开始吧。Go 是静态类型的。每一个变量有一个静态的类型,也就是说,有一个已知类型并且在编译时就确定下来了:int,float32,*MyType,[]byte 等等。如果定义type MyInt intvar
阅读全文