1. 爱玩数码首页
  2. 投稿

机器语言指令由什么和什么组成(聊一聊计算机语言进化史)

语言是用于交流的,计算机语言就是人与机器的交流。

按照通常的划分,人与计算机交流的语言分三种,从低到高为机器语言、汇编语言、高级语言

一、最底层的机器语言

别看现在电脑的功能很厉害,但电脑的底层能够识别只有“0”和“1”,专业说叫低电平和高电平,换句话说,就是有还是没有。

所以最初的电脑语言,就是0和1组成的数字,也就是二进制数。计算机发明之初,人们用计算机能识别的语言去命令计算机干这干那,一句话,就是写出一串串由“0”和“1”组成的指令序列交由计算机执行,这种语言,就是机器语言

机器语言指令由什么和什么组成(聊一聊计算机语言进化史)

 

0和1组成的二进制数字跟我们习惯的10进制不同,比如3就是11,4就是100,7就是111,9是1001,16是,10000,很长,在编程时不方便。

机器语言的定义:是用二进制代码表示的计算机能直接识别和执行的一种机器指令的集合。

它是计算机的设计者,通过计算机的硬件结构,来赋予计算机的操作功能,具有灵活、直接执行和速度快等特点。

一条指令就是机器语言的一个语句,它是一组有意义的二进制代码,指令的基本格式如:操作码字段+地址码字段。(这些指令也全都是二进制的数字)

其中操作码指明了指令的操作性质及功能,地址码则给出了操作数或操作数的地址。

用机器语言编写程序,编程人员要首先熟记所用计算机的全部指令代码和代码的涵义,比如0001代表相加,0010代表相减,0100代表读取,0111代表循环,等等。

手编程序时,程序员得自己处理每条指令和每一数据的存储分配以及输入输出,还得记住编程过程中每步所使用的工作单元处在何种状态。

这是一件十分繁琐的工作,编写程序花费的时间往往是实际运行时间的几十倍或几百倍。

而且,编出的程序全是些0和1的指令代码,直观性差,还容易出错。

现在,除了计算机生产厂家的专业人员外,绝大多数的程序员已经不再去学习使用机器语言。

二、汇编语言

为了减轻使用机器语言编程的痛苦,人们进行了一种有益的改进:用一些简洁的英文字母、符号串来替代一个特定的指令的二进制串,比如,用“ADD”代表加 法,“MOV”代表数据传递等等。

这样一来,人们很容易读懂并理解程序在干什么,纠错及维护都变得方便了,这种程序设计语言就称为汇编语言,即第二代计算机语言。

汇编语言的定义:是面向机器的程序设计语言。在汇编语言中,用助记符代替操作码,用地址符号或标号代替地址码。这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言。于是汇编语言亦称为符号语言。

然而计算机是不认识这些符号的,这就需要一个专门的程序,专门负责将这些符号翻译成二进制数的机器语言,这种翻译程序被称为汇编程序

汇编程序是系统软件中语言处理系统软件。汇编程序把汇编语言翻译成机器语言的过程称为汇编。

在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。

虽然汇编语言十分依赖于机器硬件,移植性不好,但效率仍十分高,针对计算机特定硬件而编制的汇编语言程序,能准确发挥计算机硬件的功能和特长,程序精炼而质量高,所 以至今仍是一种常用而强有力的软件开发工具。

汇编语言不像其他大多数的程序设计语言一样被广泛用于程序设计,准确说它仍然是一种低级语言。

在今天的实际应用中,它通常被应用在底层,在硬件操作和高要求的程序优化的场合。比如驱动程序、嵌入式操作系统和实时运行程序也都需要汇编语言。

我在上大学的时候,有一门课就是汇编语言,由于实操条件的限制,加上主讲老师讲的太枯燥,导致我们都学得很差,考试成绩惨不忍睹。

最后辅导老师告诉我们只能用根号 乘10的计算方法来填成绩,也就是36分以上就算及格,否则,全班就没几个及格的。

而我工作后做过电子仪表设计,里面的单片机系统也相当于一套计算机,我自己应用汇编语言进行编程,才真正明白汇编语言到底是咋回事。

三、顺便说一下16进制

我使用汇编语言编程时都采用16进制,123456789ABCDEF,A是10,B是11,C是12, D是13,E是14,F是15,10是16,11是17、、、

16进制可以跟二进制无缝对接,因为1-15每个数字都一一对应于4位的二进制数,比如8对应1000,A对应1010,F对应1111,在编程时,两个16进制的数字就相当于8位的二进制数,也就是8个0或1。例如8F,就是10001111。

而计算机底层的寄存器是8位的,能存储8个0或1,这8个0或1可以被一起读取并识别。

所以计算机使用8位的块(字节,byte),作为最小的可寻址的内存单位,而不是访问内存中单独的位。

一个字节由8位组成,用二进制表示,它的值域是 0000 0000 ~ 1111 1111;用十进制表示,它的值域是 0 ~ 255。

可以看出,用二进制表示法太冗长,而十进制表示法与二进制模式的互相转换很麻烦,替代的方法是以16为基数,即十六进制。

所以这就是汇编语言用16进制的原因。

明白了吗?用16进制编写的计算机语言,也可以直观地对计算机底层进行控制。

举个最简单的例子,一串程序代码,ASS,B3,49,第一个代码ASS代表一个指令(赋值),第二个数字B3代表要赋值的数码管的位置(地址),第三个数字49(相当于二进制的01001001)代表要赋的值,这8个0或1对应的是数码管的8个发光二极管,哪个是1哪个亮。

这一串执行之后的结果,就是某一位置的由8个发光二极管组成的一个数码管被点亮,显示了一个数字。

四、不管最低级的机器语言还是高一级的汇编语言,理论上都可以实现复杂的运算和功能。

其实计算机能发展到今天的程度,最本质的根源就是速度差,是人的速度和光速的差。。

我们辛辛苦苦编写的几十上百千万个指令,进到计算机里面去执行,也就是一瞬间的事。

因为计算机底层的速度是电子速度,那是跟光速一样的,对人类来说,那是快的不能再快的一个概念,一秒钟我们只能眨一次眼,计算机却可以完成无数次运算。

我们编了一个10万个代码的程序,能让计算机在极短时间完成某一个功能,那今后再需要这个功能,直接调用这10万个代码就行了,它仍然是用极短时间完成。这上面我们花费的精力和计算机花费的时间,几乎可以忽略不计。

就这样不断累积,计算机能干的事情也就越来越多越来越复杂,最终达到了现在的水平。

而这些不断的累积,也使得人类可以用越来越接近人类语言的方式来进行编程,这就是高级语言。

五、 高级语言

从最初与计算机交流的痛苦经历中,人们意识到,应该设计一种这样的语言,这种语言接近于数学语言或人的自然语言,同时又不依赖于计算机硬件,编出的程序能 在所有机器上通用。

经过努力,1954年,第一个完全脱离机器硬件的高级语言—FORTRAN问世了,然后呢,共有几百种高级语言出现,有重要意义的 有几十种,影响较大、使用较普遍的有FORTRAN、ALGOL、COBOL、BASIC、LISP、SNOBOL、PL/ 1、Pascal、C、PROLOG、Ada、C++、VC、VB、Delphi、JAVA 等。

高级语言的发展也经历了从早期语言到结构化程序设计语言,从面向过程到非过程化程序语言的过程。

相应地,软件的开发也由最初的个体手工作坊式的封闭式 生产,发展为产业化、流水线式的工业化生产。

1969年,提出了结构化程序设计方法,1970年,第一个结构化程序设计语言—Pascal语言出现,标志着结构化程序设计时期的开始。80 年代初开始,在软件设计思想上,又产生了一次革命,其成果就是面向对象的程序设计。

再往后就不细说了,总结计算机语言发展的特性:

(1) 简单性:提供最基本的方法来完成指定的任务,只需理解一些基本的概念,就可以用它编写出适合于各种情况的应用程序 。

(2) 面向对象:提供简单的类机制以及动态的接口模型。对象中封装状态变量以及相应的方法,实现了模块化和信息隐藏;提供了一类对象的原型,并且通过继承机制,子类可以使用父类所提供的方法,实现了代码的复用 。

(3)安全性 :用于网络、分布环境下有安全机制保证。

(4)平台无关性:与平台无关的特性使程序可以方便地被移植到网络上的不同机器、不同平台。

在高级语言里面,我大学里学过Pascal,毕业设计用的是BASIC,工作后用过VB,都涉入不深,跟真正的程序猿相距甚远。

不过我一直没有中断跟程序员打交道,理解他们工作的艰苦和繁琐,每一次编程都是一个系统工程,从需求、沟通、设计结构、文档、敲代码、测试等等,做下来要花费大量的时间和精力。

机器语言指令由什么和什么组成(聊一聊计算机语言进化史)

 

六、聊一下C语言和 JAVA

C语言:

第三代语言中,C语言是最重要的,可以称之为“现代语言的鼻祖”。其他很多语言都跟C语言有千丝万缕的联系。

C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。

它由美国贝尔实验室的D.M.Ritchie于1972年推出,1978年后,C语言已先后被移植到大、中、小及微型机上,它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。

它的应用范围广泛,具备很强的数据处理能力,不仅仅是在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件,三维,二维图形和动画,具体应用比如单片机以及嵌入式系统开发。

而C++显然就是C语言的升级版,看名字我们就知道了,就是C语言面向对象的版本.

机器语言指令由什么和什么组成(聊一聊计算机语言进化史)

 

在C的基础上,1983年又由贝尔实验室的Bjarne Strou-strup推出了C++。 C++进一步扩充和完善了C语言,成为一种面向对象的程序设计语言。

前面说到我给单片机编程用的是汇编,可就在同时,一个很强大的竞争对手开发出一个新型设备,他们的技术人员用的就是C++,而那个技术员原来竟然都不是计算机相关专业的,学的是机械制造。

C++就是当时最先进的软硬件结合的工具,那个技术员掌握了这门手艺,一跃成为那家公司最顶尖的研发高手,被奖励了一套住房。

如果我说这个你还无法形成直观印象,那说一个目前跟我们关系最密切的,手机的安卓和苹果OS系统,它们都是使用C语言和汇编开发出来的。

JAVA:

上世纪90年代初,SUN公司的James Gosling(高司令,^_^)领导的Green项目,着力打造一个分布式的、可以在消费类电子产品(如电视机顶盒)使用的系统架构。

这种架构中,要求写的代码可以运行在各种消费类电子产品中,即要求代码的中立性、跨平台性。

最初,Green项目使用的C++,但是在研发过程中发现C++并不能很好的适应新的需求。于是,这些高人对C++编译器做了改写,仍然不太理想,不太符合跨平台的特性。牛人有牛人特有的牛脾气,于是,大家决定重起炉灶,开始研发一种新的语言,即JAVA.

经过一年半的研发,整个产品研发完成。但是,很遗憾,消费类电子产品并没有高速的发展起来,JAVA进入蛰伏期。

可是,无心插柳柳成荫。

90年代中末期,有一个改变世界的大事出现了:互联网的爆发式增长。在传统产业,例如钢铁产业要想取得产量翻番,那需要很多年的时间。但是,在互联网行业都是呈指数级增长,爆炸式的增长。google可以在短短几年就增长到上千亿美元市值。

互联网将各种各样的电脑连到了一起,这时,我们发现电 脑的操作系统各种不同。因此,急需一种跨平台的语言,通过它编写的程序可以在各种平台上运行。JAVA正好符合这种需求。使用JAVA编写的applet程序给了90年代的人们极大的震撼,于是JAVA迎来了他的黄金时代。

JAVA诞生后,经历了如下版本的发展变化:

• 1991年,Sun公司的Green项目,Oak

• 1995年,推出Java测试版

• 1996年,JDK1.0

• 1997年,JDK1.1

• 1998年,JDK1.2,大大改进了早期版本的缺陷,是一个革命性的版本,更名为Java2

• 2004年,J2SE 5.0 (1.5.0) Tiger老虎

• 2006年,J2SE 6.0 (1.6.0) Mustang野马

• 2011年,JAVASE7.0

机器语言指令由什么和什么组成(聊一聊计算机语言进化史)

 

JAVA的特性和优势

简单性

就是c++语法的纯净版。没有头文件,指针运算,结构,联合,操作符重载,虚基类等等。由于语法基于c,因此学习起来完全不费力。

面向对象

面向对象是一种程序设计技术,他将重点放在数据(即对象)和对象之间的接口上。

可移植性(跨平台性)

这是JAVA的一个重要的优势。JAVA代码或者说字节码、二进制码可以跨平台的移植,而不用管具体的操作系统和硬件环境。

JAVA本身就是面向网络的,只有在网络环境中才能显示出他的优势,比如:现在我有一个网络环境,要让我的笔记本和手机交互,笔记本环境是windows发出一个让手机定时录音的JAVA代码,手机只有简单Linux内核操作系统,照样可以完美的执行这个代码。

“一次编写,随处运行”:“write once, run anywhere”

JAVA在设计时就很注重移植和跨平台性。比如:JAVA的Int永远都是32位。不像c++可能是16,32,可能是根据编译器厂商规定的变化。这样的话程序的移植就会非常麻烦。

高性能

JIT(JUST IN TIME)即时编译。将一些“热点”字节码编译成本地机器码,并将结果缓存起来,在需要的时候重新调用。这样的话,使JAVA程序的执行效率大大提高,某些代码甚至接近c++的效率。随着这种技术的一天天完善,也许有一天会超越编译代码的效率。

分布式

JAVA是为internet的分布式环境设计的,因为他能够处理tcp/ip协议。事实上,通过url访问一个网络资源和访问本地文件是一样简单的。Java还支持远程方法调用(RMI,remote method Invocation),使程序能够通过网络调用方法。

动态性

就是在需要时将某些代码添加到正在运行的程序中。反射机制。当需要把某些代码添加到正在运行的程序中时,动态性是一个非常重要的特性。Java的动态特性是其面向对象设计方法的扩展。它允许程序动态地装入运行过程中所需要的类,这是C++语言进行面向对象程序设计所无法实现的

多线程

多线程的使用可以带来更好的交互响应和实时行为。多线程的简单性是Java成为主流服务器端开发语言的主要原因之一。

安全性

Java适合于网络/分布式环境,为了达到这个目标,在安全性方面投入了很大的精力,使Java可以构建防病毒,防篡改的系统。

健壮性

Java是一种健壮的语言,吸收了C/C++ 语言的优点,但去掉了其影响程序健壮性的部分(如:指针、内存的申请与释放等)。

Java程序不可能造成计算机崩溃。Java系统仔细检测对内存的每次访问,确认它是合法的,而且不致引起任何问题。

不过,即使Java程序也可能有错误。如果出现某种出乎意料之事,程序也不会崩溃,而是把该例外抛弃。再通过异常处理机制,程序就会发现这类例外,并加以处理。

JAVA三大版本的区别

SUN公司推出了JAVAEE、JAVASE、JAVAME适应各种不同平台上的开发和运行工作。

• J2EE (JAVAEE)

–Java2EnterpriseEdition:

– 定位在服务器端的应用

• J2SE(JAVASE)

–Java 2 Standard Edition

– 定位在个人计算机上的应用

• J2ME (JAVAME)

–Java 2 Micro Edition

– 定位在消费性电子产品的应用上。

我和软件开发人员最近的交集是配合开发一个安防公司的综合报警监控系统,这套系统采用的就是J2EE,定位在服务器端,而且是分布式的,租用了阿里云服务器,可以无限扩展,支撑百万千万用户。

我看那位软件开发负责人的工作模式,他有一套专门用于软件系统开发的工具,可以涵盖软件系统开发管理的方方面面,实时全面地给参与开发的程序员分配开发任务,掌控开发进度。

这小伙不简单,他之前是一个拥有千万用户婚恋网站的技术总监。我们之所以与他合作,还因为他曾经为另一家安防公司开发过一套类似系统。

现在的软件开发,采用哪种计算机语言和工具只是其中的一部分,更重要的是开发团队的组建,尤其是开发负责人的技术和管理沟通水平,以及对业务需求的了解掌握程度。

他的团队人员都是具备一定经验的,分布在全国各地,但丝毫不影响整体开发的进度和质量。

我和他早期都是利用邮件和即时通信来沟通协调,只有在进入调试实操阶段,他自己过来亲临现场,发现问题解决问题。

而且,就算软件完成正式发布运行,大头还在后面,就是随后日常的维护和补充改进完善。而因为人家还要把精力放在新的软件开发上,不想在以后的维护费用上跟我们扯皮,我又招聘了一个刚毕业的大学生,跟他学习掌握,负责日常的运营维护。

总之,JAVA的跨平台通用性,使得它成为现在互联网社会实现万物互联的首选软件工具,电脑、手机、摄像头、穿戴设备、传感器、、、未来不知会不会出现另一个更牛的,至少目前就是它。

JAVA语言为什么能够成功

一个产品的成功和一个人的成功是一个道理。除了自身具备过硬的优势外,还需要那么一点点狗屎运,甚至狗屎运非常关键。

就是我们所讲的天时地利人和。JAVA的成功除了自己具备跨平台特性外,更重要的是正好踩中了互联网发展的节奏。

微软的成功除了windows好用外,也是正好踩中了个人电脑发展的节奏。

所以,我们除了自己努力外,也需要出去走走努力踩一坨狗屎才行!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至87172970@qq.com举报,一经查实,本站将立刻删除。

发表评论

登录后才能评论