我之所以要写这个系列文章,主要还是因为有许许多多想要学习程序编写(貌似现在这已经是高中的必修课了),但苦于市面上的图书文章等过于困难或者不是特别令人满意,久久无法找到一个合理的入门处。
?
那么我既然要写这篇文章,就要把它写好,不能虎头蛇尾,更不能蛇头蛇尾。
?
第一章:导论
先说说什么是程序。
自二十世纪阿兰·图灵发明图灵机以来,计算机行业发展迅猛,而首当其冲的就是软件行业,或者,通俗一点说,程序。
那么很明确了,程序就是用在计算机上,让计算机听话工作用的。
实际上,程序(这里只说以图灵机为例,毕竟其他模式还没有得到广泛的应用)就是代码,当然是机器码,电脑看得懂,我们看不懂,而计算机去看这些代码,然后执行他们。这就是程序的用处和本质。
?
那么当然就有人要问了,我们看不懂的程序要怎么编写呢?这就是下一段要讲的,程序的五级阶梯。
?
第一级:机器语言
机器语言就是最终运行在电脑上的东西,一般仅仅是1和0,基本上没有人看得懂,但是他可以直接被电脑识别,运行效率最高,对系统依赖性最高。
第二级:汇编代码
你可能注意到了,这里我使用了“代码”而不是“语言”,因为除了机器语言,其他的计算机语言都是代码,代表了某一段机器语言。那么我们要用代码去代替机器语言的目的就是为了是它能够被我们读懂,比如:
class="汇编">MOV EAX EBX ADD ECX JMP -2
?如果你有一定的汇编语言基础,就能认出这段代码的含义(当然他并没有什么具体含义,只是不停地累加)。
怎么样,是不是好读多了呢?至少你可以看到JMP就想到jump,那么他的意思自然就是跳转了。
但是我们看得懂的东西,计算机又看不懂,于是就有了编译这个概念,就是把我们写的代码变成机器语言,让电脑能看得懂。
汇编语言的可读性较之机器语言不知道要高了多少,但是效率和系统依赖性就要差一点了。
第三级:高级语言
C,Fortran,BASIC等等,这些耳熟能详的名字(你要是不知道也没关系)都是高级语言(注意分别C和C++),他们的可读性进一步增强,而效率也同样进一步降低。比如下面这段代码:(以C为例)
#include <stdio.h> int main(int argc,char** argv) { int n=0; scanf("%d",&n); printf("The number you have entered is %d.",n); return 0; }
?代码的意思更明确了,你看,printf中有个print,很明显就是打印嘛!
当然这里也出现了函数的概念,比如上文中的int main(int,char**)就是一个函数,并被定义为程序的入口函数,程序从这里开始。
同样的,会有用汇编代码写成的编译器(compiler)把他编译成汇编代码,再由连接器(linker)把他编译成机器语言。在此过程中(以gcc为例),windows平台上的一个Hello World程序的源代码只有不到1kb,但是编译出来的机器码(exe文件)就有差不多500多kb。想象一下,那个会编写更快更容易?
第四级:面向对象的编程语言
这个词汇可能比较流行,大家也可能都有听说过,那你们知道他确切代表了什么意思吗?
实际上,对象这个概念也是为了更加贴近生活而发明的,就比如说我们看到的手机,就是一个对象,在大脑里以“一个手机”这样的格式储存,而这个手机包含了属性,比如说大小,重量等等。
那么在程序中也是一样的。比如说:(C++)
#include <iostream> using namespace std; struct cell_phone { int width; int height; float weight; } void main(int argc,char** argv) { cell_phone my_phone{600,800,180.0f}; //C++11 specification,not for old compilers! cout<<"My cell phone's resolution is "<<my_phone.width <<"x"<<my_phone.height<<" and is "<<my_phone.weight <<" grams heavy." }
?这里,一个cell_phone对象(或者说结构体)就指代了一台手机(当然只是一个例子),包含了手机的分辨率和重量这些数据,我们可以像访问真实世界的物体那样访问它们。
于是,对象使得程序更加贴近生活,我们使用”对象“这个概念去创建,访问和修改数据,程序变得更简单,更易读了。(当然其他两个也会随之降低)(而且编译出来的机器语言更对象一点关系都没有,对象的概念只存在于代码中)
这种计算机语言主要有C++,Java,Objective C,C#等等。
第五级:脚本语言
前面我们说过,随着这些阶梯一步步上升,可读性增强,效率降低,对系统的依赖性减弱。前面两个还比较好理解,最后一个读者们可能有些小疑问。但实际上这也不难理解。你想想看,有那么多系统(windows,mac,android,linux……),那么多架构(x86,x64,arm……),难道要为每一个配置都去编一遍程序?
我们的目标就是:一次编译,处处运行(compile once, run everywhere——Java),可是前面已经说了,前面几级的语言最终会被编译成计算机语言(或汇编),做不到这一点,那么怎么办呢?
答案就是:脚本语言。
脚本语言实际上就是文本文件,然后通过做好的,基于各个平台的解析器解析执行,而代码文件本身是独立与系统和平台的。
这种语言就比较多了,从广泛应用的python,php,javascript等等,到特殊应用的ActionScript(Flash的脚本语言),MATLAB的脚本语言等等。
这里不得不提的是Java。Java其实在第四和第五级阶梯之间,因为他是先编译成一种中间代码(字节码),再通过虚拟机执行的。这样做减少了解析文本代码的时间,提高了效率,而字节码本身又是不可读的,因此把它算作是在第四和第五级阶梯之间。
?
在本文中,我将使用Java进行讲解并讲解使用Java编程,不仅仅因为Java安全健壮执行速度快,而且也因为Java是当今世界上最流行的语言(没有之一!!!)
那么今天就讲到这里了,我们下次再见。