qakcn
学生会会长
学生会会长
  • 注册日期2008-10-31
  • 最后登录2021-01-05
  • 生日1988-8-18
  • 光玉3394颗
阅读:1153回复:8

科普第13篇——计算机语言

楼主#
更多 发布于:2011-06-10 17:00
计算机语言有很多种,全世界上百种语言要全部讲过来那是很困难的。而且一门语言还会有多个变种,这就更多了。

不过这篇文章不是要给各位学会某种语言的,只是最基础、最简单的介绍。

计算机语言,和自然语言类似,都是有语法、词法等等规定,但是计算机语言更严格、更精确,不像自然语言那样充满了歧义,需要通过上下文来理解。
计算机科学的本质是数学,所以计算机语言的本质也是描述各种数学运算。

不少人在计算机课上都学过这个概念:低级语言和高级语言。机器语言和汇编语言是低级语言,C、BASIC等是高级语言。
但是什么是机器语言?什么是汇编语言?这恐怕就很少会介绍了。

机器语言,就是二进制序列表示的,可以被机器直接“理解”运行的语言。但计算机怎么知道什么样二进制序列表示什么样的意思呢?
其实这是人们事先规定好的,并且直接写到CPU里的。这些事先规定好的二进制序列就是“指令”,多条完成不同功能的指令构成的集合就是“指令集”。比如我们最常听说的x86,就是从Intel 8086处理器一路发展下来的指令集,我们现在用的较多的是x86-32(32位指令集,也叫IA-32)、x86-64(64位指令集,也叫x64),这就是当前主流PC的指令集。此外移动设备上常用的ARM处理器的指令集就叫ARM(还有不同版本的差异,这里就不细说了)。此外还有MIPS、PowerPC等其他指令集。而就算是x86的CPU,除了x86的指令集之外,也有SSE等用于加强多媒体处理的指令集。

为了方便说明,我们这里“发明”一种指令集吧!
1100 xxxx:把xxxx表示的数据存入寄存器A(什么是寄存器?请参见《科普第9篇——为什么32位CPU不能支持大于4GB内存?》)
1101 xxxx:把xxxx表示的数据存入寄存器B
1001 1100:把寄存器A、B里的数据相加,并放入寄存器A
1010 1100:取出寄存器A里的数据

于是我们就可以这样完成加法2+3:
1100 0010:把0010(=2)存入寄存器A
1100 0011:把0011(=3)存入寄存器B
1001 1100:把寄存器A、B里的数据相加得到0101(=5),并放入寄存器A
1010 1100:取出寄存器A里的数据0101(=5)

于是我们就计算2+3=5了。我们不必关心计算机是怎么完成计算的,我们只要知道怎么用指令去让计算机完成计算就行了。

可是,有没有觉得1010的数字很难记呢?科学家们也这么认为,于是就用一些单词来代替二进制序列,这就是汇编语言了。这些单词就叫作“助记符”。
可见,由于助记符是和指令一一对应,所以不同的指令集需要不同的汇编语言(即使不同指令集的汇编语言可能使用一样的助记符),甚至同一个指令集也有可以有多种不同的汇编语言(比如x86的汇编语言就有Intel的和UNIX的两种)。

于是我们再来给我们的指令集发明一个汇编语言吧:
PUTA x:把数据x放入寄存器A
PUTB x:把数据x放入寄存器B
ADDB:把寄存器A、B里的数据相加,并放入寄存器A
GETA:取出寄存器A里的数据

于是我们的小程序就成这样了:
PUTA 2
PUTB 3
ADDB
GETA

汇编语言不能由计算机直接运行,必须由一个叫做“汇编器”的程序把它翻译成机器语言,才能由计算机执行。

现在我们可以说一说低级语言的特性了:低级语言是与平台(这个平台可以是指指令集、操作系统或者两者的组合)相关的,一个平台上的低级语言的程序是不能拿到另一个完全不同平台上用的。

反过来,我们也就知道了高级语言的特性了:高级语言是与平台无关的。
这个说法其实不准确,因为高级语言如果要用到一些平台特有的功能的话,就与平台相关,但是除此之外,高级语言是与平台无关的。

但是高级语言与平台无关是要付出代价的。
前面说过,计算机只能直接理解运行机器语言,所以高级语言最终也要“翻译”成机器语言才能运行。这个“翻译”的过程就叫作“编译”或“解释”(两者的区别下面会讲到),最终生成与平台相关的机器语言,完成这项工作的程序就叫作“编译器”或“解释器”。
而这个过程会造成的问题就是:由于编译器或解释器也是人编的,所以效率、优化上就会有不确定性,有可能在这个平台上用这个编译器编译的代码效率很高,在那个平台上用那个编译器编译的代码就很慢。这就是高级语言必须付出的代价。
但是,高级语言通常头有比较容易记忆的语法、词法等结构,比起低级语言来人们更容易理解和书写,所以比起这些好处,需要付出的代价就显得微不足道了。(但不代表我们就不关心这个代价了,实际上语言一直在发展就是为了将这个代价的影响减到最小)

前面说过高级语言翻译成机器语言的方式有两种:
一种是编译。编译器直接把高级语言翻译成机器语言,所得到的最终程序是与平台相关的(你在Linux下编译的程序拿到Windows下就无法直接运行(无法直接运行,但是有可能通过某些第三方程序作为中间人来运行,比如虚拟机),反之亦然)。这种语言的代表就是C、C++、BASIC等。
一种是解释。通过解释运行的程序语言称为“脚本”。解释器只在调用脚本的时候才把它翻译成机器语言,但是并不保存,运行玩就释放。下次再需要运行时再次翻译。这种语言的代表就是Python、Perl、PHP、JavaScript等。

很明显解释型语言的好处是能在任何平台上运行(只要有对应平台的解释器),但是缺点就是效率太低,每次运行都得重新解释一遍。而编译型语言正好相反,效率很高,但是不能跨平台。

有没有一种方法,同时具有上述两者的有点呢?
还真有,这就是“半编译、半解释”型的语言。
这种语言在编译时不直接生成机器码,而是生成一种中间代码,被成为“字节码”,这是与平台无关的。而这个字节码是运行在一个被称为“虚拟机”(注意与上面提到的虚拟机的区别)程序上面的,由虚拟机把字节码再翻译成最终的机器语言。这个虚拟机像解释器一样需要针对不同的平台开发,所以即可以有编译型一样比较高的效率,也能有解释型一样跨平台的特性。
这种语言的代表就是Java、.NET架构(VB.NET、VC#.NET等)。有的解释型语言也可以通过这样的方式来运行。


计算机语言的概念是非常广的,只要是用来让计算机完成一定功能的语言都可以算是计算机语言。比如我们用来表示网页的HTML、用来操作数据库的SQL等等。

但是计算机语言根本是不会变的,那就是数学。所以如果你想学好计算机语言,数学是绝对不能放松的。

现在很多编程的教材不是在教人怎样编程,而是在教人怎样使用一门语言。如果不知道编程中的一些思维方式,就算学会怎么使用语言,也不能写出好程序来。

如果对C语言有兴趣的,推荐一本教材,这本教材把原理什么的都进行了讲解,让你不光知其然,还知其所以然。
《Linux C 编程一站式学习》,宋劲杉编著,电子工业出版社出版,ISBN 978-7-121-09771-3


==========之前的文章==========
科普第1篇——计算机色彩
科普第1篇补遗——CSS颜色
科普第2篇——光盘
科普第3篇——2、8、10、16
科普第4篇——电池
科普第5篇——浏览器
科普第6篇——字符编码
科普第7篇——加密解密
科普第8篇——移动通信技术
科普第9篇——为什么32位CPU不能支持大于4GB内存?
科普第10篇——智能手机简介
科普第11篇——14.52-14.49=0.0299999?
科普第12篇——为什么HTTPS会更安全?

科普番外篇1——虽然没用但了解一下也很有趣的知识
喜欢0 评分0
苏子愀然
光坂学士生
光坂学士生
  • 注册日期2011-02-16
  • 最后登录2014-11-01
  • 生日1989-12-17
  • 光玉3624颗
沙发#
发布于:2011-06-10 17:05
这是开的一个学习系列?
回复(0) 喜欢(0)     评分
ct一剑
光坂博士生
光坂博士生
  • 注册日期2010-10-04
  • 最后登录2014-08-21
  • 生日1991-10-16
  • 光玉13939颗
2楼#
发布于:2011-06-10 17:58
唉,现在光学个C语言学的我都头大0.0
回复(0) 喜欢(0)     评分
琥珀
光坂硕士生
光坂硕士生
  • 注册日期2009-06-07
  • 最后登录2020-12-09
  • 生日1989-12-26
  • 光玉6903颗
3楼#
发布于:2011-06-10 18:27
嘛~~~不知道Action script 语言算什么

现在学得头痛啊
回复(0) 喜欢(0)     评分
甜瓜包制作大师
学生会干部
学生会干部
  • 注册日期2009-11-29
  • 最后登录2021-10-09
  • 生日1994-1-6
  • 光玉3410颗
4楼#
发布于:2011-06-10 19:14
原来如此。中学计算机课完全不讲这些东西啊
回复(0) 喜欢(0)     评分
星空守护ぜ堕
光坂学士生
光坂学士生
  • 注册日期2009-10-06
  • 最后登录2021-03-21
  • 生日1990-2-25
  • 光玉3530颗
5楼#
发布于:2011-06-10 19:25
很不好意思的表示我一个学网络工程的C语言和C+什么的= =都基本没听.........唉.........一看那书头那叫一个大呀.....
我不羡慕别人的人生,这就是幸福,呵呵....[FLY][IMG]http://www.dmdjz.com.cn/attachment/Mon_1111/7_14988_32578a9294d2421.jpg[/IMG][/FLY]
回复(0) 喜欢(0)     评分
圣火之灵
光坂基金会
光坂基金会
  • 注册日期2009-10-19
  • 最后登录2016-01-23
  • 生日1989-2-1
  • 光玉2503颗
6楼#
发布于:2011-06-10 20:15
自学C语言的咱表示:压力很大!
平凡快乐的活着~!
回复(0) 喜欢(0)     评分
桜舞雪咒
学生会会长
学生会会长
  • 注册日期2009-05-01
  • 最后登录2021-10-30
  • 生日1991-3-23
  • 光玉11781颗
7楼#
发布于:2011-06-10 22:10
C语言我一直的痛苦啊
回复(0) 喜欢(0)     评分
傲娇少女丶灬
学生会书记
学生会书记
  • 注册日期2010-02-16
  • 最后登录2018-02-20
  • 生日1990-9-30
  • 光玉7139颗
8楼#
发布于:2011-06-10 22:32
现在在学hibernate 马上就去学spring了~

主要就是java方向了
回复(0) 喜欢(0)     评分
游客

返回顶部