Java入坑路程

1.概述
学习Java三年了,从一开始C语言的hello world,到Java的程序设计,迷茫过也思考过,总的来说前进方向是正确的,今天写下的内容主要包括个人历程和技术心得体会。

2.计算机体系
作为一个科班出身的程序员,其实和其他刚入门的小白一样,对hello world的程序打印充满好奇和不解,这就是编程?why so easy?why我们的程序和日常看到的软件不一样?为什么我们平时看到的QQ页面花里胡哨,hello world程序只有一个黑色的输出窗口?要讲明白上面所述的东西,得从最古老得电路板说起:
1)原始电路模型
最开始具备计算机特征的工具就是电路板了,电路板具备重复计算的功能,例如计算器就是电路板运用的产品,通过输入数字和计算规则,然后输出结果。但是重要的一点是,通电的电路板只能记录0和1信号,所以电路板只能输入二进制数字和输出二进制数字。
2)冯诺伊曼模型
因为电路板具备重复计算的快捷功能,所以得到了市场的大面积的应用,并在应用实践过程中,得出了一个冯诺伊曼模型:cpu(电路板),输入设备(键盘,鼠标,硬盘),输出设备(显示器,硬盘),存储器(内存条),why该模型是实用的,因为在重复计算过程中,人们最关注的是三个点,输入,计算,结果,因而cpu和输入设备以及输出设备在该模型毫无疑问,但是存储器为何在其中,这是因为在计算过程中cpu无法保存计算的中间状态,例如3X3+4算术中,3X3=9这个状态需要保存下来以便完成下一次9+4的计算。
3)古老的计算机
冯诺伊曼模型的最初实现挺简单的,一张有二进制标志的纸条,经过专门的硬件翻译录入到电路板上(电路板上自带存储器-寄存器),经过电路板计算,最终把二进制结果刻在纸条上完成输出。当然这有一个注意的点,输入纸条上的二进制数字是包括将要计算的数字和数字之间的计算规则。
4) 计算的演变
计算模型在发展中,在应用面上不断扩展,能处理的问题不再单指重复计算问题,已经演变成处理重复问题,计算规则从加减乘除演变成具有特定的指令规则,计算流程演变成输入字符数据(包括数字和字符串)经过一组指令(cpu的处理规则)处理,输出字符结果,例如现代人们对QQ的使用,发送方输入文本字符发送,经过网络传输,接收方得到字符文本。上述例子就是一个处理重复的问题,输入是发送方输入的文本,指令规则就是cpu执行网络传输的一组指令,输出就是接收方得到的文本。
5)语言的演变
(1)说这个事情之前,先说一个结论,编程语言演变是因为人在编程过程中出现问题而一直在推进(机器语言-二进制数字,汇编语言,C语言,Java和C++,区块链正在酝酿新兴语言)。
(2)回归正题,随着重复问题复杂度的提升,处理重复问题的一组指令程序的体积也会跟着日益庞大,如果单把这组复杂的程序(二进制数字指令组成的程序)刻在纸条上,交给电路板执行,再输出结果是可行的,但是使用二进制的数字指令组合成一套复杂的程序是容易出错和不可维护的,因为这需要编写和维护二进制程序的程序员十分了解电路板每条二进制指令的语义以及计算机可用资源的使用情况(例如内存的使用情况)。
(3)这时候出现了一个中间态语言,汇编语言,这个语言的每一条指令(例如add,remove)都存在对应的二进制的数字指令,计算机借助专门的硬件完成映射,不过汇编语言是可读的,由名知义,提高了程序的可读性,但是计算机资源管理这一块还是一片空白,编程人员使用汇编语言编写程序仍然需要自己手动显式的指明那两个寄存器之间的数据进行计算。所以汇编语言虽然解决了程序不可读的问题,但是计算机资源可用和不可用的状态还需要程序员本身去维护,这是很容易出错的,假如使用了已被使用的内存去保存数据,那么以前的数据就被新数据覆盖。
(4)这时候广为人知的c语言站出来了,其函数库解决了两个问题,完成简单功能的实现(一组汇编指令的组合)以及计算机资源的状态维护,这样使用C语言编程,程序员编写的代码行数大大减少以及避免出现已分配资源再被分配的错误。尽管C语言某些方面已经做的很好了,但是面对现代快速迭代的应用,还是无法应对,导致了C++以及JAVA等语言(也是在C基础上封装起来的语言)出世和流行,最终面向过程的C语言在硬件相关的编程领域大发光彩,面向对象的Java和C++在用户应用的编程领域也同样大展身手。
6)操作系统
计算的演变和语言的演变都是渐进的,完成整个演变的过程中需要许多依赖,也出现了许多新的概念,操作系统的出现是典型的和必不可少的。why需要操作系统,最核心是为了解决程序员手动分配计算机资源的问题以及一个友好的界面和操作以便不同的用户去应用计算机。所以操作系统的概念出生了,操作系统也是运行在计算机硬件上面的一段程序,确切地说是一段C程序以及某些汇编驱动,它随着电脑开机而启动运行,它向下管理着计算机上的硬件资源,向上暴露出一组系统接口给用户去调用。所以操作系统更像一个计算机管家的角色,其对计算机的资源一清二楚,用户程序若想使用计算机的硬件资源,必须通过操作系统提供的系统接口进行调用。在这里得介绍一下用户程序(例如QQ)和内核程序(调动硬件的驱动),不管用户程序还是内核程序都是运行在操作系统中,不过运行用户程序和内核程序的时候,操作系统内部做一层隔离,用户程序是运行在操作系统的用户态中,内核程序是运行在操作系统的内核态中,所以cpu运行系统调用(内核程序)必须处在操作系统的内核态上下文中,所以用户程序调用系统函数会使操作系统陷入内核态,这就保证了用户程序只能通过系统调用间接访问硬件资源而无法直接调用,同时保证了只能内核态分配可用的硬件资源。
7) 进程与线程
进程概念的提出,是针对日益强大的cpu处理能力而言,随着上世纪cpu的快速发展,cpu的处理能力快速增强,cpu只处理单个应用程序,严重浪费计算机资源,因为对于输入-cpu处理-输出这个模型来说,输入数据的速度远慢于cpu的处理速度,导致了cpu需要空闲等待程序录入数据完成,cpu才能进行往下处理输入数据的情况发生。所以进程概念被提出,一个进程意味着单个应用程序(例如QQ就是一个应用程序),人们为了充分利用cpu的计算能力,一般计算机都是同时在操作系统上运行多个进程,而我们现代计算机基本都是同时运行N个进程。那有了进程,why还需要有线程这个概念,内因是cpu同时处理着多个进程任务,虽然说同时,但是实质是cpu来回切换执行进程,所以cpu切换进程执行之前得把正在执行的进程中间态(进程上下文)保存下来,以便该进程下次可以恢复执行到原来状态。所以进程可拆成进程上下文+线程,线程一般指执行的单元,可以理解为可执行的指令。
8)现代计算机
再回头看看现代的计算机,因为网络连接的能力,计算机能与计算机进行通信,计算机的应用已经可以联合完成功能(例如QQ)来满足用户的需求,尽管当代计算机功能强大,但是还是离不开冯诺依曼模型(输入设备,输出设备,存储器,CPU),今天我们看到的输入设备最多是键盘,输出设备最多是显示器,cpu是intel系列,存储器是内存条,而运行在硬件之上的操作系统是Win10。除此之外,多了两个重量极硬件,显卡和网卡,显卡根据色粒渲染出绚丽的显示页面,网卡可以使计算机在网络中传输数据,自此,现代计算机介绍完毕。
9)回归hello world程序
hello world程序和QQ大型应用相同之处都涉及到C语言实现,区别在于hello world程序是一个入门级程序,经过编译成机器语言,机器语言的语义就是往控制台输出hello world字符串,而QQ是一个支撑起几亿人使用的大型程序,程序功能包括聊天窗口的构建,聊天内容传输等功能,QQ经过编译出来的机器语言十分庞大,更充分利用了现代计算机硬件的资源去实现功能。

3.Java发展轨迹
后面再补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值