Computer Language and Programming(计算机语言与编程)

Computer Language and Programming(计算机语言与编程)

编程语言

编程语言简介

编程语言是一种人为创造的一种语言,用以编写计算机可执行的程序(指令序列),与自然语言相似,如英语,编程语言也有词汇,语法和句法。但自然语言还是不适合用于编程,因为他们有时候会模糊,即他们的词汇和语法结构有多种解释意义。用于编程的语言必须有简单的逻辑结构和语法规则,拼写以及标点符号都要很明确。

编程语言在复杂度和功能多样性上有很多区别。有些编程语言用于处理某种特殊问题或用在计算机系统中的特殊模型上,比如FORTRAN和COBOL语言就专用于解决某种常规问题模型,FORTRAN适用于科学应用而COBOL适用于商业应用。即使这些编程语言专从事于特定的问题领域,但是他们依然具有很好的移植性,意味着他们可用在很多类型的计算机上。其他的语言如机器语言就只能用在一种特定的计算机模型或某个研究领域中的特定的计算机上。最常用的编程语言是移植性很好的而且能够高效的解决各种各样的问题,就像C语言、PASCAL语言、BASIC语言等。

编程语言的类型

编程语言可被分为低级语言和高级语言,低级语言或被称为机器语言是最基本的语言,可直接被计算机理解,机器语言视计算机制造商与型号的不同而有所区别。而高级语言需要被翻译成机器语言然后才能够被计算机识别和处理,高级语言有C、C++、PASCAL还有FORTRAN等。汇编语言是一种中间语言,它很接近机器语言但没有其他高级语言在语言层的复发性,不过依然需要转换成机器语言才能给被执行。

1.机器语言

在机器语言中,指令是一串计算机可直接识别的0、1代码。一段机器语言表示的指令通常告诉计算机四件事情:(1)在内存(RAM)里哪里可以获取到一个或两个操作数或简单的数据块,(2)执行简单的操作,如把两个数加在一起,(3)把操作结果放在哪里,(4)在哪里读取下一条指令。即使计算机最终是以机器语言的形式来读取可执行的程序,但是他们依然不是机器语言的程序,直接用机器语言来编程非常困难,因为指令仅仅是一系列的0 和1代码。一个典型的机器语言指令如10010 11001011就表示把存储寄存器A中的值加到存储寄存器B中的值。

2.高级语言

高级语言有相对复杂点的语句集合,这些语句利用了人类语言的一些语言和语法。他们比汇编、机器语言与标准的人类语言更相似,因此更容易编写复杂的程序。这些高级语言允许更快速的开发更大型更复杂的应用程序,然而高级语言必须由编译器翻译成机器语言才能够被执行,正因为这个原因,由高级语言编写的程序比汇编语言编写的程序要花费更多的执行时间和内存。

3.汇编语言

程序员可使用汇编语言很容易的生成机器语言,在汇编语言中,每条语句能够粗略的代表一条机器 语言指令,汇编语言的语句由一些助记符组成。在一个很典型的汇编语句写法中,ADD B,A就表示把存储寄存器A中的值添加到存储寄存器B中的值。汇编语言也和机器语言共享某些特征,比如可能同时用汇编和机器语言来执行一些特殊的位操作。程序员有时候会直接使用汇编语言来最小化时间消耗,因为把汇编翻译成机器语言要相对简单和省时。当需要直接控制计算机的某些部分时,就会采用汇编语言来实现,比如显示器上独立的点或打印机中独立的字符流。

高级语言的分类

高级语言通常被分为面向过程、面向函数式、面向对象或逻辑语言。今天最普遍的高级语言是面向过程的语言,在这些过程语言里,一个或多个相关的语句块,用于执行一些完整的功能就会被组织成一个程序模块,还会被赋予一个如过程A这样的名称。如果在其他地方需要一个相似的操作序列,就可以用一个简单的语句来引用该过程。实际上,一个过程就是一个迷你程序,一个很大的程序是由执行不同任务的过程组织在一起的,过程语言允许程序简短而且便于计算机读取,但是需要程序员设计得非常通用以满足不同的应用场合。

函数式语言处理过程就像数据功能一些,在程序里把他们当成一种其他形式的数据来处理,这需要很高很严密的构造程序的能力。函数式语言允许变量(程序运行时可以被指定值以及改变值的数据符号)只被赋值一次。由于变量不用被重新定义,每次都可在该程序语句中使用,自然的通过减少对执行语句具体顺序的关注来简化编程。许多来自函数式语言里的编程思想都变成了现代过程语言里的关键部分。

面向对象的语言是由函数是语言发展而来,在面向对象的语言中,程序代码和数据被组织为对象,对象进一步组织成类,类需要定义对象必需有的属性。一个简单的类示例如图书类,在这种对象里可以有小说(Novel),短故事(Short Story)。对象同样有某种与之关联的功能,通常被称为方法。计算机可通过调用对象的方法来访问该对象,方法处理对象中的数据并把结果返回给调用者。对象类还可以被组织为层级结构,一个类可以继承自另一个类,这种结构在面向对象的语言里处理一些复杂的任务非常有用。

逻辑语言使用逻辑学作为数据基础,一个逻辑程序里包含许多事实集合和if-then规则,该规则用以推断事实的真假,比如语句X是真,那么语句Y则是假。

在执行逻辑程序时,一条输入语句可由程序中的其他语句推断而来,许多人工智能的程序就由这样的语言编写而来。

语言结构和组成

编程语言采用特定的语句类型或者指令来为程序提供功能结构,程序中的语句是一种表达简单意思的基本句子,它的目的是赋予一个基本的指令给计算机。语句可以定义数据类型,可以说明数据该怎样操作,还能够说明过程或函数工作的方式。程序员用语句来操作编程语言中共同的部分,比如变量和宏定义。

数据声明语句赋予程序元素名称以及属性,也被称为定义变量,在程序中变量可以被赋予不同的值,属性变量也被称为类型变量,可以表示变量中的值,数值的精确度,还可表示范式集合如表格或数组。在许多程序语言中,一种关键的类型就是指针,指针变量本身没有实际意义的值,但他们可以寻址到其他变量,即指针指向的是其他的变量。

表达式是一种语句片,用以描述通过变量来执行的一系列计算,如X+Y/Z,涉及到的变量有X,Y,Z而所做的计算是加法和除法。赋值语句把来自表达式的计算结果赋给一个变量,而条件语句则指定用于测试的表达式然后选择是否执行其他语句。

过程和函数语句定义某种代码块,但程序中的过程或函数可以返回一个执行结果,这些语句也定义程序员可选的变量和参数种类,以及表达式访问过程或函数时,代码所返回的值得类型。许多程序语言也支持带宏定义迷你翻译程序,宏定义可以把程序员定义的代码片翻译成程序语言可理解的语句。

编程语言的发展历史

编程语言几乎可追溯到20世纪40年代数字计算机出现的时期,在50年代后期随着商业计算机的引进,汇编语言便首次出现。在50年代后期到60年代早期,第一种过程语言也被开发出来:John Backus创造了FORTRAN语言,Grace Hopper创造了COBAL语言。同时在50年代后期 John McCarthy创造了第一种函数式语言LISP,即使所有语言都在不断的更新,这三门语言在今天依然使用很广泛。

在60年代后期出现了第一种面向对象的语言如SIMULA。在70年代中期随着PROLOG(用于编写人工智能软件)的出现逻辑语言也变得很出名,在70年代期间,持续的出现了很多过程语言,如ALGOL、BASIC、PASCAL、C、Ada语言。SMALLTALK是一种具有深远意义的面向对象语言,它的出现导致了C++还有最近的Java面向对象和过程的结合。虽然逻辑语言的使用大大减少,但出现了应用于现代数据库的关系型语言,例如SQL。

JAVA编程语言

Java在编程语言的演变中是一个很出名的例子,Java借鉴了C++常用的功能但摒弃了它的复杂危险以及多余的元素,因此表现为更安全简单和易用。如下描写了Java和C++的对比:

1.Java熟悉而简单

如果你曾经用C++写过程序,你会发现Java的出现是很及时的,由于Java的语法和C++相似,你在几分钟内就会写Java程序。你将不费吹灰之力就快速且容易的完成第一个Java程序。

你会感觉你的程序里没有很多混乱(clutter)的代码,C和C++中的让人感到困惑的头文件以及预处理语句都消失了,所有的很难懂的#define和typedefs语句也没有了。你将不用再一层层的查找(delve)头文件才能找到正确的引用API,没有人愿意遭受一些痛苦才能弄明白怎样使用你的软件。

2.Java是面向对象的

如果你认为C++是一门面向对象的编程语言,那么你也会很吃惊的发现Java也是。使用Java来写一些程序后,你会有更好的面向对象的编程体验。

Java处理类和对象要更纯粹和简单,Java中的类和对象不仅仅是很便利的数据结构,他们也是整个Java语言的基础。        

在C++中,你可以声明一个类,但是也可以不用,你可以声明一个结构体或联合体来替换它,你还可以申明一套不太相关的变量并在C风格的函数中使用。在Java中,类和对象是语言的中心,所有的东西都围绕着他们,不能声明函数和过程,这些都不存在,你也不能用结构体、联合体或者typedefs,它们也没有了,你要么使用类和对象,要么不用Java,就这么简单。

Java提供了面向对象语言所有的奢侈品:类层次、继承、封装、多态,在相应的应用场景下它们都非常有用而且有效。

面向对象的开发主要原因是除了很清晰和简易以外,还可以重用对象。Jav都不仅很鼓励重用软件组件,而且还要求这样做。编写Java程序时,无论有多么简单,都需要Java API中的类和方法。

一旦你用Java来开发软件程序,你有两个选择:

1.      构建类,然后重用他们。

2.      从已有的软件组件中拷贝和挑选有用的部分来从头编写你的程序。

有了Java,从头开始不再有吸引力,Java的面向对象结构促使你开发更有用的、可剪裁的而且更简单的软件程序。

3.Java更安全更可靠

Java比C++安全是因为它阻止你做一些糟糕的事情,然而又很容易做一些你做的很好的事情。

Java不会自动的转换数据类型,你必须明确的从一个类转换成另一个类,而C++在一些很不合理的条件下都会自动的把一个类型转换成另一种类型,而且C++还有很灵活的汇编代码,Java不会假装知道你在做什么,因为它会保证你做的东西。

Java中也不存在C++中的指针,你不再间接或偶然地来访问对象,你只需申明对象然后直接引用对象即可。复杂的指针算术已经没有了,如果你需要带索引的对象集,你可以使用对象数组。“一个对象的地址”这种概念已经从编程模型中消除了,汇编语言也消失了,最终在Java中做正确的事情变得非常容易。

Java的可靠性不局限在语言层面,它延伸到了编译器和运行时系统层次,编译期检查可识别到很多未被检查到的错误,它们执行的句法检查来保证语句在语义上是正确的。

运行时也执行了大量而有效的检查操作,还记得老师曾经说过的“再三检查你的作业以确保它是正确的”的话么?Java的链接程序能够理解所有的类类型,同时还要执行编译层的检查,除此之外它也要执行边界检查以消除在错误的条件下间接地对象访问。

4.Java是安全的

如果你把一个用C/C++ 写的程序给一个熟练的黑客,然后告诉他找出一些安全漏洞。他会很容易的马上找出来:获取访问操作系统的权限,造成异常控制返回流,重写临界区,修改其他程序,浏览安全信息,获得未授权的文件系统访问。

为什么C/C++比Java更容易受攻击呢?当一个程序员开发软件时,他通常只关注怎样让软件正确而有效的工作。C/C++就不限制这些,同时还提供很多灵活的功能并允许程序员随意使用。黑客也可以利用这些功能来造成一些不良后果。总之,C/C++提供了很多受攻击的点但是却没有防御的措施。Java,在另一方面讲,天生就是防御性的。当启用了Java加载项的浏览器下载一个编译好的Java类,比如applet,它就有运行病毒的风险。由于这是常规的风险,它会受制于一系列的代码检查,最后会确保它是正确安全的。

Java运行时系统被设计来实施一项安全策略—阻止恶意代码的执行。该系统会找到对象的地址,然后根据安全规则来访问对象。除此之外,它会在编译好的类中执行字节码验证,然后通过定理证明程序来证明该字节码是否是安全的并决定是否加载或执行该代码。类是Java的基本执行单元,所有的安全策略都是基于类级别来实现的。

Java运行时系统还会从开始就隔离程序的执行。类文件会由本地系统来处理并会与其他系统分隔开来,这样会阻止远程系统通过不可靠的代码来替换本地程序。

启用Java加载项的浏览器如HotJava,允许用户Java程序访问本地系统,当Java Applet需要访问访问本地资源的权限时,比如访问文件,一个安全对话框会弹出来请求具体的用户权限,这种友好的方式保证用户总是对自己的系统有最终决定权。

5.Java支持多线程

Java像Ada,但不像其他语言,提供内置的多线程操作。多线程操作允许在一个单一程序中有多个执行线程,这也允许你的程序一次能做很多事情:制作舞蹈、播放音乐、与其他用户交互、一切看起来都是同时进行的。多线程操作是一种很重要的优势,因为它允许程序员编写独立的线程操作,而不是一堆很乱很复杂的活动。多线程操作还允许Java用空闲的CPU时间片来执行必要的垃圾收集和常规的系统维护,执行这些功能时还不会影响到程序的性能。

编写多线程程序就像同时和多个人约会一样,一切都会正常进展直到以一种意外的方式来和其他人交互。Java提供了必要的支持来保证多线程操作的安全性和正确性,Java通过提供同步的能力来保证线程间的共享信息以及线程安全。

6.Java是一种Web编程语言

事实上,Java已经成为了一种Web编程语言,它已被几乎所有的软件公司接受了。Java现在是排名第一的Web编程语言,也是开发跨平台软件的最强有力的语言。

Java发展至今已不仅仅是一门Web语言,它也成为开发分布式应用的关键部分,Sun公司产品也强调了Java在基于对象的分布式软件开发上的重要性,许多其他厂商推出的产品都把Java集成到了公用对象请求体系结构中(CORBA)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值