梅冠华-2019-04-19
翻译自C++学习网站 learncpp(www.learncpp.com) 第0章 第2节
https://www.learncpp.com/cpp-tutorial/introduction-to-programming-languages/
0.2 编程语言简介
现代计算机有着令人难以置信的速度,而且一直在变得更快。然而随之产生了一些明显的瓶颈:计算机实际上仅仅能理解非常有限的命令,而且必须被精确地告知要做什么。
计算机程序(通常也被成为应用)是指令的集合,以便让计算机来执行它们以完成某些任务。创建该程序的过程就是编程。程序员通常通过生产源代码(一般缩写为代码)来创建程序,代码是命令的列表,它们键入在一个或多个文本文件中。
物理上组成一个计算机并用来执行程序的相关计算机部件的集合称之为硬件。当计算机程序被载入进内存,之后硬盘顺序地执行每个操作,这一过程称之为运行或执行程序。
Machine Language 机器语言
计算机的CPU是没法讲C++语言的,CPU所能直接理解的为数不多的指令集称为机器代码(或机器语言或指令集)。
这里有个例子——机器语言指令:10110000 01100001
追溯至计算机发明之初的年代,程序员不得不直接拿机器语言来写程序,这是相当困难和耗时的工作。
这些指令是如何组织的已经超出了该简介的范畴,但是有趣的是两件值得注意的事情。首先,每个指令是由1和0的序列构成的,每个单独的0或者1称之为一个二进制码(binary digit),或简写为比特(bit)。构成一个单独指令的比特数是不同的——比如,某些CPU的指令集通常是32比特长度的,而某些CPU(例如x86系列,你可能喜欢用)的指令是变长度的。
其次,每个二进制码集合被CPU理解为一个指令来做非常具体的工作,比如比较两个数,或是把这个数放到哪个内存位置上。然而,因为不同CPU有着不同的指令集,为一个CPU写的指令无法用于不识别这些指令集的另一个CPU上。这意味着程序通常不可移植(无需大量修改即可直接使用)到不同类型的系统上,不得不全部推倒和重写一遍。
Assembly Language 汇编语言
鉴于机器语言对于人类的阅读和理解而言是如此困难,汇编语言出现了。在汇编语言中,每个指令被定义成简短的缩写(而非比特集),还能使用名字和其他数字。
看下前面的同样的指令写成汇编语言是什么样子:mov al, 061h
这使得汇编比机器语言更好阅读和书写,然而,CPU无法直接理解汇编语言。反而是,汇编程序必须转化为机器语言,它才能被计算机执行,该转化过程是通过使用一个称之为汇编(assembler)的程序来完成的。汇编语言写的程序运行起来非常快速,因此在对速度非常苛求的场合,汇编语言当今仍有应用。
然而,汇编仍旧有很多缺点。首先,哪怕来做非常简单的任务,汇编语言仍旧需要众多的指令。虽然单独的指令对人们来说尚可理解,然而理解整个程序是干什么的则非常艰难(这有点像是通过查看每个单独的字母来理解整句话的意思)。其次,汇编语言仍旧没有很好的移植性——适用于某个CPU的汇编语言写成的程序将很有可能无法工作在那些使用不同指令集的硬件上,那么就不得不重写或进行大量修改。
High-level Languages 高级语言
为实现易读性和移植性,新的编程语言例如C、C++、Pascal(以及后续的语言例如Java、Javascript和Perl)不断涌现。这些语言称为高级语言,因为它们设计思想就是让程序员在编写程序时不需要考虑程序将来会在哪种电脑上运行。
还是前面那个同样的指令,写成C/C++语言就是:a = 97;
与汇编语言很像,用高级语言写的程序必须翻译成计算机所能理解的格式方能运行。该过程有两个基本步骤:编译与解释(compling and interpreting)。
编译器是这样一个程序,其读取源代码并生成单独的可执行程序,这些程序随后将被运行。一旦你的代码已经被转换成了可执行的,你不需要再编译它们即可运行程序了。最开始的时候,编译器非常原始,会生成缓慢、未经优化的代码。然而,历经多年磨砺,编译器已经在生成快速和优化的代码上做得非常好了,而且在某些情况下其甚至比人们用汇编语言做得还要好!
这里有个关于编译过程的简单呈现:
既然C++语言通常要编译,那么我们就简短地进一步探讨下编译器。
解释器是这样一个程序,其直接执行用源代码写成的指令,而无需首先将它们编译成可执行的。解释器比编译器更加灵活,但是运行程序的效率更低,因为每当程序要运行时,解释过程都需要再做一遍,这意味着每次运行程序都需要解释器。
这里有个关于解释过程的简单示意:
选读——关于编译器和解释器优点的比较可以参考这里:link.
大多数语言都可以被编译或解释,经典的语言比如C、C++和Pascal是被编译的,反之,“脚本”(“scripting”)语言比如Perl和Javascript倾向于被解释,某些语言,比如Java,则使用两者的混合。
高级语言拥有很多令人称道的特性。
首先,高级语言非常容易阅读和书写,因为其命令非常接近我们日常使用的自然语言。其次,执行同样的任务,高级语言比低级语言所需的指令更少,这使得程序更加简洁明了、易于理解。用C++,你可以在一行内写下“a = b * 2 + 5;”来完成一定操作, 而用汇编语言,这将需要5或6个不同的指令。再次,程序可基于许多不同的系统来编译(或解释),而你不需要改变程序来适应不同的CPU(你只需要再对那个CPU编译一下就好了)。例如:
对于可移植性来说有两个一般例外。第一,许多操作系统,比如微软视窗(Microsoft Windows),包含特定的平台函数,你可以在你的代码中使用它们,这使得对于特定操作系统的编程变得非常容易,然而代价就是丧失了可移植性。在该教程中,我们将避免谈及这些特定平台的代码。
第二,某些编译器也支持特定的编译扩展包——如果你使用了它们,那么你的程序就不能不经修改,而直接被其他不支持这些扩展包的编译器来编译了,我们将在后面详细讲解这些,当你安装好编译器之后。
Rules, Best practices, and warnings 规则、最佳方案、警告
在我们继续该教程之前,我们将会高亮一些重点,它们有以下三类:
规则
规则是依据语言的要求你必需做的指令,不遵守规则将通常导致你的程序无法工作。
最佳方案
最佳方案是你应该做的事情,因为人们通常认为那种做事情的方式是标准的或者是强烈推荐的。也就是说,要么每个人都那样子做了(如果你不那样子做,那么你做的东西是人们不希望看到的),要么那样子是比别的方式要更加优越的。
警告
警告是你不应该做的事情,因为它们通常会导致未知的结果。
梅冠华-2019-04-19
翻译自C++学习网站 learncpp(www.learncpp.com) 第0章 第2节
https://www.learncpp.com/cpp-tutorial/introduction-to-programming-languages/