聊聊计算机&编程语言

一.计算机和外界交互

大家可能有概念,计算机处理的都是01这种二进制数据(怎么实现处理的后面解释),那么交互问题大抽象上就简单了,任何问题都抽象成数字【编码】输入,进行数字计算【运算】得到结果数字,再还原【解码】输出。这里涉及很多物理原理、跟输入输出硬件有关,涉及到硬件接口软件驱动相关知识,能力有限不去深究了。抽像下大致流程如下:

185617_ybav_811247.png

二.数字在计算机內怎么体现

数字到二进制就不解释了,现实生活中除了现在常用的10进制外,原本就存在其他进制计数法,对计算机来说,二进制最合适,那么关键问题落在,0和1在电子世界是怎么表示的? 还是自底向上做按个人理解来说。

  • 电路可以导电,有电流电压。
  • 还很多基础元器件控制电流,开关、电容、电阻、半导体、晶体管等都有自己特性。比如电路只能一个方向通过等等。
  • 导线和这些元器件搞一起,可以实现一些电子原件(),根据若干导线的输入电压不同,决定一个导线(输出)的通断。
  • 那么上电(有电压)代表1,断电(无电压)代表0,配合的输入输出,数字运算就这么神奇表示出来。
  • 那么N多个(and or not xor)组合(组合后输入端和输出端都有多个导线,就行可以表示多个位),可以实现具体功能的电路,表示加法、选择等等,特定的输入有特定的输出,形成组合电路
  • 有种叫振荡器电路的产生“时钟信号”。
  • 有通过改变固化某些物理的状态(如磁性),实现存储。
  • “时钟”和存储后的电子电路就更加魔法起来---计算机。

电子电路发展:

185634_si5W_811247.png

 

三.日常用的应用从编程到机器码

大家应该形成了常识,我们计算机上用的应用,都是由“编程语言”开发的,那么,我们可以思考下,什么“编程语言”,我想主要原因就是通用计算机的出现,希望一台计算机干各种活,那我们就得用“编程语言”告诉他每个活怎么干。

1.概念

一般编程语言,是用来定义计算机程序的形式语言,一般包括。

  • 高级语言:更接近自然语言和数学公式的编程,用人们更易理解,所以,写给人看的,计算机不能直接理解。
  • 汇编语言:符合语言,机器指令的符号化,帮助人记忆。
  • 机器指令:CPU能直接识别并执行的指令(所以CPU不同指令有区别),机器指令通常由操作码和操作数两部分组成,它的表现形式是二进制编码。
2.高级语言到机器指令

反过来从机器指令到高级语言,更好理解下面按顺序大概说明编程语言的改进过程。 语言发展:

185647_6rBA_811247.png

      2.1.机器指令:(人的大脑太难记)

0xB0 0x20

      2.2.汇编语言:(好记了点,跟机器指令一对一翻译)

mov al, 30h

但是这个指令只做了从内存中指定的位置搬移数据一个字节宽度的数据到 al 寄存器。

     2.3.汇编宏: (又简单了点,一套预先定义好的指令序列,替换变量展开后,再一对一翻译。)

multiply MACRO opr1, opr2, result
push dx
push ax
mov ax,opr1
imul opr2
mov result, ax
pop ax
pop dx
ENOM

两个字相乘的宏,调用可以

multiply cx, var, xyz

    2.4.高级语言(更接近自然语言表达,与硬件结构无关)
宏的引入,启发了程序结构化表达,编程语言能不能,更容易学习掌握,更强的表达能力。 为了贴近自然语言,那到机器指令,就得一般经历“词法分析”-->"单词流"-->"语法分析"-->"抽象语法树"-->“解释器/编译器”-->“机器指令”。 由编译器或解释器来处理不同平台的区别,它们又依靠操作系统来屏蔽不同的硬件区别。
编译器:就是把源程序翻译成机器语言。
解释器:是一种能够把高级编程语言逐行转译,它不会先一次性把整个程序转译过来。

    2.5.JAVA语言执行过程
废话下过程:“.java"-->".class"-- JVM-->机器指令,从这里看出java是不到机器指令,只会到.class文件,由虚拟机来完成程序的运行,因为虚拟机的存在,让java语言某种层面实现了跨平台。

  • 理解“.class”文件
    文件内容:一组以8位字节位基础的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件中。没有任何分割符。
    逻辑内容: u1- u4:分别代表1-4个字节的符号数,cp_info叫“表”,习惯以_info来表示,是复合数据类型。这两种类型构成.class文件,文件描述类的构成,包括文件类型、java版本、父类、接口、方法等所有运行需要的数据(包括字节码指令),先不细解释,逻辑结构大致如下。
struct Class_File_Format {
   u4 magic_number;
   u2 minor_version;
   u2 major_version;
   
   u2 constant_pool_count;
   cp_info constant_pool[constant_pool_count – 1];
   
   u2 access_flags;
   u2 this_class;
   u2 super_class;
   
   u2 interfaces_count;
   u2 interfaces[interfaces_count];
   
   u2 fields_count;
   field_info fields[fields_count];
   
   u2 methods_count;
   method_info methods[methods_count];
   
   u2 attributes_count;
   attribute_info attributes[attributes_count];
}
  • “.java"-->".class"
    通过"javac编译器",把.java源文件编译成.class,大致过程如下:

185704_DkZw_811247.png

  • “.class"通过JVM运行
    遵循“java虚拟机规范”实现,常用的是“HotSpot”,安卓是“Dalvik”虚拟机,可以通过命令看。
xxx:~xxx$ java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)

像HotSpot虚拟机是解释器和编译器并存(mixed mode)架构,有些解释执行,有些热点代码即时编译。并在即时编译的时候做了很多编译优化技术,包括编译策略、内联、安全点消除等等,可以学习《深入理解java虚拟机》和《java虚拟机规范》等相关书籍。

四.简单总结

模块化叠加的世界

不管是硬件发展、计算机发展、编程语言发展都是模块化分工改进叠加的过程。 模块化用来分割,组织和打包。每个模块完成一个特定的子功能,所有的模块按某种方法组装起来,成为一个整体,完成整个系统所要求的功能。 模块具有以下几种基本属性:接口、功能、逻辑、状态,功能、状态与接口反映模块的外部特性,逻辑反映它的内部特性。

涉及学科:

185719_Nz6k_811247.png

计算机发展
发展阶段逻辑元件运算速度(每秒)软件应用
第一代[1946-1958]电子管 电子射线管几千次到几万次机器语言、汇编语言军事研究、科学计算
第二代[1958-1964]晶体管、磁芯几十万次监控程序、高级语言数据处理、事务处理
第三代[1964-1971]中小规模集成电路、半导体几十万次到几百万次操作系统、编辑系统、应用程序有较大发展开始广泛应用
第四代[1971-至今]大规模超大规模集成电路、集成度更高的半导体上千万次到上亿次操作系统完善、数据库系统、高级语言发展、应用程序发展渗入社会各级领域

转载于:https://my.oschina.net/greki/blog/1591600

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值