1.笔者最近花了两个周的时间看了这样一本书,有关编程语言内部原理性的东西,让笔者对以前所学的东西有了更加透彻的理解,也有了更深层次的认识。先看张图片以及目录吧。
2.具体来说,书中讲的东西范围很广,包含了很多有关操作系统方面的知识,文中很多内容都是以Windows和Linux两个操作系统来讲解,可以对操作系统层面有一个较为清晰的认识,以及对编程语言从文本到可执行程序的整个过程有了了解。从细处来看,笔者印象深刻的部分有如下几点:
1.对操作系统虚存机制有了一个比较具体的认识,看到进程在操作系统中运行时的安排;
2.书中编译链接的过程的描述,笔者对自己所学过C/C++的整个执行过程有了清晰的轮廓。从文本形式的代码,通过词法分析,语法分析,语义分析,中间代码,再到目标文件。这就好像看到了如果自己去设计一门编程语言大概要做的事情,当然这也是一件十分复杂的事情,但不再是那么神秘遥远的事情。同时对编译器在你点击编译时所执行的各种操作有了理解,不在是当初那样傻瓜化的执行了。
3.再者,书中后来讲到的目标文件格式,以及对段的划分,这部分拨开了目标文件,可执行文件的面纱,让笔者了解到所看到的.obj,.exe背后的东西,当然也是复杂的,但是确实有趣的。当透过表象去理解事情内在的原理性的东西的这个过程总是非常有趣的。
4.再后面介绍的是可执行文件的装载过程,看到了一个应用程序在启动时操作系统所完成的各项工作。而不是单单鼠标点击后就开始运行那么简单。后来水到渠成的引出动态链接的概念,随着操作系统的发展,这些像是自然而然的需要,与此同时,这部分也看到了平时运行程序遇到的缺乏xx.dll的由来,就会有一种那个恍然大悟的感觉。随着计算机发展的需要,自然的引出共享库这类概念。同时提起的环境变量一类的问题,让笔者对以前安装jdk那一套看似神秘的事情有了理解,环境变量也只不过就是操作系统提供的一套简单存取键值对的做法,并不复杂。
5.后面见到的运行库,除了对进程运行时各部分的内存分布有了认识,更是对以前c,c++所包含的头文件的这个过程有了清楚地认识,这时候才发现以前做的很多都是不知道原因的傻瓜化操作。再者对main函数有了认识,并没有什么神秘的地方,只要愿意,我们本身就能让程序从任意一个符合条件的函数开始执行,换言之,他是可以替代的,当初刚开始学习编程的时候,总是对这种本应是常识的问题,抱有一种怀疑的态度,直到明白了其中的的道理。运行库的入口才是真的入口,自己所定义的main函数只不过被调用而已,在他之前,之后还有别的函数执行。
6.文中所提到的windowsAPI,除了其本身的作用外,也让人学到一种增加中间件来解决问题的思路。
7.最后一部分,作者带着实现了一个小型c/c++运行库,让笔者对以前习以为常的调用printf,scanf,malloc,free,fwrite,fread,new,delete,stream,string等有了自己动手实现的能力,也明白了其中的原理,从中可以看到要实现一个运行时库要做的工作。