计算机语言是人与计算机进行交流的工具,是用来书写计算机程序的工具。
可以通俗地理解为,你用用特定的语言与特定的对象(特定操作系统与CPU的计算机)沟通,关键是需要有个翻译,这个翻译就是编译器或解释器,同样的语言,针对不同的对象(特定的CPU和操作系统)需要有不同的编译器或解释器。所以说编程语言是“设计”出来的,设计只需要思考和写文档,而该语言的编译器或解释器才是“开发”出来的。
(编译原理讲到了“自举编译器”。大意就是先用底层语言(应该是汇编)写一个能运行,但效率极低的C语言编译器(底层语言不好优化),有了C语言的编译器以后,就可以用C语言好好写一个编译器了,用之前那个运行没问题,但效率低得编译器编译一下,就得到了可以使用的编译器了。)
编译器也是程序,所以也需要用编程语言来编写,很多编程语言是用别的更基础的语言开发的,其中用最多的就是C语言。C语言编译器很多,大部分都是用别的C语言编译器编译出来的,而最早的C语言编译器是用汇编语言写出来的,最早的汇编语言编译器是通过“编译器自举”开发出来的。
从最基本的角度看,一种编程语言就是把一组特定的词汇,按照一组特定的语法规则组合到一起,形成计算机可以通过某种方式“理解”的东西,可以让计算机据此执行特定的动作。
首先要决定你想设计的语言应该解决什么问题。面对不同的领域、不同的需求、不同的抽象层级、不同的思考范式,也就产生了各有特长的编程语言。专注于高效、便捷地解决某特定范畴之内问题的语言,叫做领域专用语言(Domain Specific Language,DSL),而可以跨越若干领域解决问题的语言,叫做泛用语言(General-Purpose Language,GPL)。常见的 DSL 比如 MATLAB、SQL 等等;常见的 GPL 如汇编、C、Python。当然,两类语言之间的分界并不是很明显,有些语言一开始是作为 DSL 设计的,后来渐渐朝着 GPL 的方向发展,比如 PHP 和JavaScript;反过来也有大量基于 GPL 开发而来的 DSL。
先看看这件事情的最底层。所谓“计算机执行动作”,其实只是“把一个二进制数字传入 CPU,然后等待什么事情发生”的形而上描述。二进制计算机所能理解的唯一东西就是二进制数字,称为“机器码”。比如:
10110 000 01100001
这串数字,对于某颗 CPU 来说,就是“把01100001 放到 000 号寄存器里”的指令,其中“10110”的部分,就是 CPU 能懂得的“放入”指令。这样的指还有许许多多,比如做加法、求逻辑“与”,跳转,加密等等,全都只是一些二进制数字而已。
对人类来说,这种纯数字的写法太难记忆,就把它转写成:
MOV AL, 97
其中 MOV 代表“10110”,AL 代表 000 号寄存器,97 则是二进制数 01100001 的十进制表示。其他的数字指令也一并用这种简记法来转写。使用这样的一种转写方法来写程序,就是汇编语言(当然,这是一种极度简化的说法)。