今天开始学习《linux C编程一站式学习》这本书,今天刚把第一章读完。虽说自己已经学过了C语言,不过读完第一章后还是学到了不少东西,把以前学到的不少东西都串了起来。下面我把串起来的内容及其拓展简单地介绍一下。
何为程序?简单说,程序就是能够完成特定功能的指令序列(指令即指示计算机做某种运算的命令)。编程就是写一段指令,通过执行这段命令可以实现所期望的功能。指令让谁去执行呢?这当然是我们的计算机啦!不过我们的计算机还是比较“傻”的,她只能直接和(二进制)数字打交道,只能识别低级的机器语言指令。所以如果我们的程序是用高级语言编写的话,那么就得先将我们的程序翻译成计算机能够识别的机器指令序列,这样我们的计算机才能按照我们既定的程序实现我们期望的功能。而将高级语言翻译成低级语言主要有两种方法,即编译和解释,二者之间主要的区别在于翻译的时间不同。下面我重点谈谈当前编程语言的分类。
首先,按编程语言接近自然语言的程度来分,我们可以将编程语言分为以下几代:第一代就是最低级的机器语言;汇编语言是第二代语言;第三代是些高级语言,例如C、C++、java、python等等;第四代相比前几代更加接近我们的自然语言,它更多的是在描述要做什么而不是具体怎么去做,比如SQL;第五代我暂时还没遇到,不过书中确实提到了。
其次,按翻译的方式可以将编程语言分为编译型语言以及解释型语言。编译型语言编写的程序需要通过编译器的编译将高级语言翻译成低级的语言形成目标文件。而解释型语言编写的源程序则是需要解释器,翻译一句执行一句。由此可以看出,编译型语言的执行效率较高,因为它写的程序只需翻译一次,执行多次;此外,编译过程涉及词法、语法、语义分析及代码优化各个步骤,因此编译型源程序的执行效率还是很高的;而解释型语言编写的源程序每执行一次则需重新解释一次,效率不高。而从平台无关性来讲,机器语言与平台(即体系结构)相关,每种平台都有各自的指令集,因此编译型语言的跨平台性差些。
下面再次对编译型语言与解释型语言进行对比:
概念:
编译型:将源程序编译成二进制代码的可运行程序(期间会有目标文件的生成)。
解释型:将源程序翻译一句,然后执行一句,直至结束!
区别:
编译型:执行速度快、效率高;依赖编译器、跨平台性差些。如C、C++、Delphi、Pascal,Fortran等。
解释型:执行速度慢、效率低;依赖解释器、跨平台性好。如JavaScript、Basic等。
另外注意,并不是所有编程语言都必须是两类语言之一,java就是一个例子。java很特殊,java程序需要编译,但是没有直接编译称为机器语言,而是编译称为字节码,然后用解释方式执行字节码。
编译型与解释型,两者各有利弊。前者由于程序执行速度快,同等条件下对系统要求较低,因此像开发操作系统、大型应用程序、数据库系统等时都采用它,像C/C++、Pascal/Object Pascal(Delphi)等都是编译语言,而一些网页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性有一定要求的程序则通常使用解释性语言,如Java、JavaScript、VBScript、Perl、Python、Ruby、MATLAB 等等。
但随着硬件的升级和设计思想的变革,编译型和解释型语言越来越笼统,主要体现在一些新兴的高级语言上,而解释型语言的自身特点也使得编译器厂商愿意花费更多成本来优化解释器。