程序
程序(Program) 告诉计算机应如何完成一个计算任务。
程序由一系列指令(Instruction) 组成,指令是指示计算机做某种运算的命令,通常包括以下几类:输入、输出、基本运算(执行最基本的数学运算(加减乘除)和数据存取)、测试和分支(测试某个条件,然后根据不同的测试结果执行不同的后续指令)、循环(重复执行一系列操作)。
编程语言
编程语言分类
编程语言(Programming Language) 分为低级语言(Low-level Language) 和高级语言(Highlevel Language)。
机器语言(Machine Language)和汇编语言(Assembly Language) 属于低级语言,直接用计算机指令编写程序,汇编语言和机器语言的指令是一一对应的。汇编语言转换成机器语言需要通过汇编器去查表将助记符替换成数字。
C、 C++、 Java、 Python等属于高级语言,用语句(Statement)编写程序,语句是计算机指令的抽象表示。高级语言转换成机器语言需要通过编译器(Compiler)进行编译(Compile),这需要花费一定时间,但是高级语言书写的程序代码更加紧凑,易读性更强,出错容易更改,而且很多高级语言是可以跨平台的,即可移植(Portable)。
所谓平台:可以指计算机体系结构(Architecture) ,也可以指操作系统(Operating System),也可以指开发平台(编译器、链接器等)。
C语言的编译过程:
有些高级语言以解释(Interpret)的方式执行,解释语言不需要编译,程序在运行时才翻译成机器语言,每执行一次需要翻译一次,因此效率比较低。解释语言的执行需要解释器,解释器(Interpreter)将命令解释执行。
编程语言的发展
第一代语言(1GL,1st Generation Programming Language):机器语言;
第二代语言(2GL,2nd Generation Programming Language):汇编语言;
第三代语言(3GL,3rd Generation Programming Language):C、C++、Java、Python等;
目前已经有了4GL(4th Generation Programming Language)和5GL(5th Generation Programming Language)的概念。
3GL的编程语言虽然是用语句编程而不直接用指令编程,但语句也分为输入、输出、基本运算、测试分支和循环等几种,和指令有直接的对应关系。而4GL以后的编程语言更多是描述要做什么(Declarative)而不描述具体一步一步怎么做(Imperative),具体一步一步怎么做完全由编译器或解释器决定,例如SQL语言(SQL,Structured Query Language,结构化查询语言)就是这样的例子。
形式语言
形式语言(Formal Language) 是为了特定应用而人为设计的语言。
形式语言有严格的语法(Syntax)规则,语法规则是由符号(Token) 和结构(Structure) 的规则所组成的。
关于Token的规则称为词法(Lexical) 规则,而关于结构的规则称为语法(Grammar) 规则。
程序的调试
程序中的错误被叫做臭虫(Bug) ,而找到这些Bug并加以纠正的过程就叫做调试(Debug)。有时候调试是一件非常复杂的工作,要求程序员概念明确、逻辑清晰、性格沉稳,还需要一点运气。
Bug分类
编译时错误:编译器只能翻译语法正确的程序,否则将导致编译失败,无法生成可执行文件。
运行时错误:编译器检查不出这类错误,仍然可以生成可执行文件,但在运行时(Run-time)会出错而导致程序崩溃。
逻辑错误和语义错误:如果程序里有逻辑错误,编译和运行都会很顺利,看上去也不产生任何错误信息,但是程序没有干它该干的事情,而是干了别的事情。当然不管怎么样,计算机只会按你写的程序去做,问题在于你写的程序不是你真正想要的,这意味着程序的意思(即语义)是错的。