(序言)
前两年就在想叩开计算机编程世界的大门,但是因为语言选择上的繁杂,最终停下了。去年看过一段时间的计算机程序运行原理和编程语言的原理,后来因为计算机语言的繁杂没有继续更深入的了解。当时只是把计算机语言做了分类,今天(2020.10.13)在安装visual studio时候看到那么些套件,又勾起了学习心。再次了解计算机语言,也算有所收获,所以记录下来,做个简单的梳理。一开始并没有准备写硬件底层运行流程,但是写到机器语言时候不得不提到控制硬件,提到控制硬件就又不得不提到硬件工作流程。后觉得这个应该单独放在开头,不想了解底层的可以直接跳过该篇幅。
题外话:编程的目的是让编写的程序顺利执行以达到计算机替代人完成机械重复的计算,为人节省出时间以陪伴家人朋友爱人,感受生活的美好。如果为编程而占用了和家人朋友爱人的生活时光,这样就舍本逐末了。
(硬件底层)
介绍编程语言前,先跟随博主来了解一下计算机硬件底层的工作流程:
操作系统启动时,北桥芯片将内存、显卡硬件参数传递给CPU,南桥芯片将其他硬件参数传递给北桥芯片再由北桥芯片传递给CPU。操作系统运行时,大家在操作计算机的每个动作(如点击鼠标、键盘等)都将以机器语言指令的形式经由南桥芯片传递给北桥芯片再由北桥芯片传递给CPU,CPU接收到该条机器语言指令后由内部的逻辑处理与寄存器指令集对照并按指令集处理该指令,而后由CPU内部的控制处理器将被处理后的机器语言指令传递给北桥芯片,再由北桥芯片传递给显卡芯片,显卡芯片控制显示器显示最终结果。
这里博主再简单介绍一下CPU芯片的底层(即“半导体”):CPU芯片是硅片及硅片上刻蚀形成的众多晶体管的合称。晶体管就是半导体,半导体就等同于阻器+变压器+开关,所以你看,芯片并不神秘,只是把数量众多的电阻器、变压器、开关放在了一个小板子(硅片)上。半导体是电子科技的基石,没有半导体就没有电子科技、电子设备,今年的华为芯片事件就是因为没有掌握这种半导体制造技术(怎么把那么多电阻器、变压器、开关放到那么小的板子上)造成的。
(编程语言)
现在我们开始介绍编程语言,首先,要区分一点,程序的编程过程和程序的执行过程是两个不同的概念!程序编程过程是在程序员电脑上,而程序执行过程是在程序使用者电脑上。这也是为什么很多小白对介绍编程基础的文章感到费解的地方。
计算机语言,按照可识别性分为三类:
机器语言(就是那种01011101010010...的超长表示方式)、汇编语言(那种sub ax,ax...的繁复的表示方式)、高级语言(那种printf ("123")的简短的表示方式)
随计算机一同产生的就是机器语言(或者说是电路通断信号更贴切),但编程过程过于繁重,遂产生了汇编语言(以英文符号表示各种电路通断集的语言),而随着编写程序越来越大,汇编语言还是显得过于晦涩繁复,于是就产生了高级语言(以英文语句表示汇编指令的语言),这样编程过程变得轻松容易多了。
早期高级语言中的三大主流语言(都是面向过程的):
C语言、Pascal语言、Basic语言
C语言做系统开发,Pascal做编程教学,Basic做应用开发
当代高级语言(都支持面向对象):
C++、Java、C#、VB.NET、Python、JavaScript、PHP....
早期计算机性能低下导致运行速度慢,因面向过程的方式执行起来效率高于面向对象的方式,所以早期的高级语言都是面向过程的,而当代计算机性能已经很好了,效率不高性能来补,面向对象的语言,代码修改起来方便、代码可复用率高的优点凸显,因此就自然而然被主流高级语言所采用了。
当代计算机高级语言按照编程过程和程序执行过程可分为:
1.编译型语言:在编程过程中,由第三方程序将高级语言代码转换成当前系统可识别的汇编语言指令,再转换成机器语言指令保存进文件;在程序执行的过程中,操作系统读取该文件中的机器语言指令使相应的硬件动作。
2.解释型语言:在编程过程中,将高级语言代码原样保存进文件;在程序执行的过程中,由第三方程序读取该文件中的高级语言代码并转换成当前系统可识别的汇编语言指令,再转换成机器语言指令,操作系统读取该机器语言指令使相应的硬件动作。
3.解释编译型语言:在编程过程中,将高级语言代码转换成第三方程序才能识别的类(似)机器语言指令并保存进文件;在程序执行过程中,由第三方程序读取该文件中的类(似)机器语言指令,并转换成机器语言指令,操作系统读取该机器语言指令使相应的硬件动作。
很明显,在编程过程中解释型语言效率最高、解释编译型语言效率居中、编译型语言效率最低;在程序执行过程中编译型语言效率最高、解释编译型语言效率居中、解释型语言效率最低。
终究编写程序就是用来执行用的,所以大家更关注程序执行过程中的效率。毫无疑问编译型语言效率最高,加上无需安装第三方程序就能直接执行,使之成了高级编程语言的首选语言类型。但编译型语言有一个缺点,那就是只能在支持该语言转换的操作系统上运行,比如你在Windows系统上用C++语言编写转换得到的exe程序,在Mac系统上就无法执行,因为Windows系统可识别的汇编语言指令和Mac系统可识别的汇编语言指令不同,导致在Windows上转换成的机器指令无法被Mac系统识别,也就无法使相应的硬件动作了。而解释型语言和解释编译型语言却可以在不同的操作系统中执行,原因就是需要在当前操作系统中安装第三方程序后才可以执行它们,就是这个第三方程序在你编写的程序执行过程中把代码直接转换成当前系统可识别的机器语言指令了。解释编译型语言在程序执行过程中的效率又比解释型语言高,所以如果需要一段代码在所有的操作系统上都能执行,解释编译型语言则是首选。而解释型语言的最大优点就是编程过程中效率高,随时修改随时能执行。博主本人喜欢的批处理就是解释型语言,用于对文件文件夹的操作,随时改动随时用,省去了编译的步骤,挺方便。
最后总结一下:编写的程序只在一种操作系统中执行,首选编译型语言;编写的程序要在多种操作系统中执行,首选解释编译型语言;编写的程序需要随时修改随时执行,首选解释型语言。