Skip to content

Commit 67069f4

Browse files
committed
Update environment.md
1 parent 2d641d9 commit 67069f4

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

environment.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ Linux/Windows/Mac OS X可以看成是不同的系统类型。3.7,8.1和El Capt
3131

3232
第三个重要的点是编程语言的版本。比如我在引言中很明显的标注出了本书所使用的语言是ISO/IEC 14882:2011中所定义的语言,通常也称之为C++11。其他的编程语言,比如Python,也有Python 2和Python 3的区分,比如Java,也有Java 7和Java 8。当我们提到某一个版本的时候,对于不同的语言,是有不同含义的。比如Java,其版本和语言是由Oracle公司的Java Language Specification所规定。比如Python,因为没有一个统一的文档作为spec,我们通常会指定Python的官方实现(即通常所说的CPython)的行为,作为改语言对应版本的行为。另外比如C++,在ISO有统一的标准委员会来管理和制定标准,所以任何时候有分歧的话,只要参照标准中的内容就可以了。
3333

34-
通畅大家会混淆的一点就是语言和实现。比如Java,其实在语言规范中并没有强行规定必须编译到Java虚拟机字节码,只是说通常可以这么做然后你去参考一下Java虚拟机规范里面要怎么搞。所以,gcc中的Java实现就是可以直接编译到对应平台程序的,Android平台可以做AOT(Ahead-of-Time)编译,或者编译的目标代码是Dalvik字节码:你当然不能说他用的不是Java。
34+
通常大家会混淆的一点就是语言和实现。比如Java,其实在语言规范中并没有强行规定必须编译到Java虚拟机字节码,只是说通常可以这么做然后你去参考一下Java虚拟机规范里面要怎么搞。所以,gcc中的Java实现就是可以直接编译到对应平台程序的,Android平台可以做AOT(Ahead-of-Time)编译,或者编译的目标代码是Dalvik字节码:你当然不能说他用的不是Java。
3535

3636
这个时候,语言所存在的意义就是规定这些实现必须做什么,不能做什么,哪些是对的,哪些是错的,哪些是未定义/未指定的行为。所以,很多人讨论语言特定(一个典型的例子比如指针)的时候,往往会陷入这个坑里:拿编译器产生的代码来描述指针的本质。这样做完全是本末倒置:语言规定了一个语言特性的行为(语义),编译器只要能够通过某些做法达到相应的要求就可以了,在这个基础之上可以做任何程度的优化来提升程序运行的时候的效率。于是,开不开优化和开多少程度的优化,编译器产生的程序可能是不一样的,但并不是说这样运行之后就得不到我们期待的结果。
3737

0 commit comments

Comments
 (0)