目录
❤ 机器语言
机器语言的编程
❤ 汇编语言
❤ 高级语言(编程语言)
编译型
解释型
❤ 动态语言和静态语言
❤ 强类型定义语言和弱类型定义语言
❤ 主流语言介绍
C语言
C++
java
python
JavaScript
SQL
PHP
python从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129328397?spm=1001.2014.3001.5501
机器语言是一种指令集的体系,机器语言是机器能直接识别的程序语言或指令代码,无需经过翻译,每一操作码在计算机内部都有相应的电路来完成,或指不经翻译即可为机器直接理解和接受的程序语言或指令代码,机器语言是用来定义计算机程序的形式语言,用来向计算机发出指令
- 优点:执行效率高
- 缺点:开发的效率低
由于计算机内部只能接受二进制代码,因此,用二进制代码0和1描述的指令称为机器指令,全部机器指令的集合构成计算机的机器语言,用机器语言编程的程序称为目标程序。只有目标程序才能被计算机直接识别和执行。但是机器语言编写的程序无明显特征,难以记忆,不便阅读和书写,且依赖于具体机种,局限性很大,机器语言属于低级语言。
例如:
# 指令部份的示例
0000 代表 加载(LOAD)
0001 代表 存储(STORE)
...
# 暂存器部份的示例
0000 代表暂存器 A
0001 代表暂存器 B
...
# 存储器部份的示例
000000000000 代表地址为 0 的存储器
000000000001 代表地址为 1 的存储器
000000010000 代表地址为 16 的存储器
100000000000 代表地址为 2^11 的存储器
# 集成示例
0000,0000,000000010000 代表 LOAD A, 16
0000,0001,000000000001 代表 LOAD B, 1
0001,0001,000000010000 代表 STORE B, 16
0001,0001,000000000001 代表 STORE B, 1[1]
汇编语言,即为一种低级语言,它用人类容易记忆的语言和符号来表示一组0和1的代码
也就是说,早期的程序员如果想要编程,就要将0,1数字编写的程序代码打在纸带或者卡片上,1打孔,0不打孔,再将程序通过制袋机或者卡片机输入计算机,进行运算。我们可想而知,当时的程序员是多么厉害。但是他们很快发现编写的都是0,1很难辨别和记忆,因为程序员要面对的是01010100011...的数字,稍微错一个数字也不太好发现,因此,就产生了汇编语言
我们先了解一些基础的知识
- 机器语言
所谓机器语言,就是只用0和1两个二进制数书写的编程语言。它有的时候也叫作原生代码(Native Code)。这里需要注意,只要CPU种类不同,对机器语言的解释也就不同。- 编译器
由于计算机只能读懂机器指令,所以就需要一个能够将汇编指令转换成机器指令的翻译程序,这样的程序我们称其为编译器。程序员用汇编语言写出源程序,再用汇编编译器将其翻译为机器码。就像我们写的Java,OC,等等,都是由编译器最终转换成01代码,最后由计算机执行。- 时钟信号的频率
由时钟发生器发送给CPU的电信号的频率。单位是MHZ(兆赫兹 = 100万回/秒)。时钟信号是0和1两个数之间反复变换的电信号,类似于滴答滴答左右摆动的钟摆一样。通常我们把发出一次滴答的时间称作一个时钟周期。
举例一段简单的代码:
LD A,207
OUT(2),A
LD A,255
OUT(2),A
这样的一段代码,初次见到我们肯定不太理解其意思。它就是汇编语言。我们现在在简单分析一下这段代码(不解释功能):
类似于LD、OUT这种类英语或者英语单词的东西,我们叫它:
助记符
它是根据指令功能的单词起一个相似的昵称,并将这个昵称做一个1对1的映射,而与其对应的就是0和1的组合。
那什么叫汇编语言呢?顾名思义,就是使用助记符的编程语言叫做“汇编语言“。
汇编语言的语法
汇编语言的语法很简单,相比我们学的OC、Java等语言,它的语法只有一个:把标签、操作码(指令)和操作数(指令的对象)并排写在一行。
举个简单的例子:
标签 操作码 操作数
LD A,207
OUT (2),A
LOOP: IN A,(0)
OUT (1),A
JP LOOP
这便是一个汇编代码(没有实际意义)。这里的标签就是给该行代码对应的内存地址起个名字,下次想要跳转到该行代码的时候可以直接使用标签跳转。这里需要注意:
机器语言是二进制数,而汇编语言则是使用十进制或者十六进制数来记录数据。
接下来,就让我们看一下Z80 CPU的主要指令:
这里需要注意一下:
num表示的是数值,(num)表示的是num的地址
reg表示的是寄存器,(reg)表示存储在名为reg的寄存器中的地址。
这里说道了寄存器,其实寄存器就是CPU内部存储数据的地方。Z80 CPU中所带的寄存器有:
A、B、C、D、E、F、H、L、IR、 IX、 IY、 SP、 PC。
在汇编语言中,可以将寄存器的名字指定为操作数
接下来让我们简单分析前面的那一段代码。
LD A,207:就是把207写入到寄存器A
OUT (2),A:就是把寄存器A中的值写入到地址2中
IN A,(0):从地址0中读出数据,存放到寄存器A中
OUT (1),A:把寄存器A中的值写入到地址1中
JP LOOP:跳转到LOOP:标签,循环执行。
也就是说,我们按照上面的转换方法就可以将汇编语言转成机器语言。例如
LD A ,207 ,转成机器语言就是00111110 11001111
JP LOOP,转成机器语言就是: 11000011 num,这里的num是地址,这里注意需要用16比特的二进制数替代作为内存地址的num,也就是00000000 00010000 (也就是00010000假如是IN A,(0)的地址,扩充之后就是00000000 00010000),因此JP LOOP的机器语言就是:
11000011 00010000 00000000。
这里你也许会疑惑,num的八个0怎么跑后面了呢?
这里需要注意,将一个2字节的数据存储到内存时,存储顺序是低八位在前、高8位在后,也叫小端序。与此相反的叫大端序。CPU种类不同,端序也不同,Z80用的小端序,因此将低八位放到了前面,高八位的00000000放到了后面,就成了:11000011 00010000 00000000。
至此,我们就成功的将汇编语言转换成了机器语言,其他的助记符到机器语言的转换可以自行搜索查看
汇编打印一句hello world,需要写十多行代码
; hello.asm
section .data ; 数据段声明
msg db "Hello, world!", 0xA ; 要输出的字符串
len equ $ - msg ; 字串长度
section .text ; 代码段声明
global _start ; 指定入口函数
_start: ; 在屏幕上显示一个字符串
mov edx, len ; 参数三:字符串长度
mov ecx, msg ; 参数二:要显示的字符串
mov ebx, 1 ; 参数一:文件描述符(stdout)
mov eax, 4 ; 系统调用号(sys_write)
int 0x80 ; 调用内核功能
; 退出程序
mov ebx, 0 ; 参数一:退出代码
mov eax, 1 ; 系统调用号(sys_exit)
int 0x80 ; 调用内核功能
编程语言主要从以下几个角度为进行分类,编译型和解释型、静态语言和动态语言、强类型定义语言和弱类型定义语言,每个分类代表什么意思呢,我们一起来看一下
- 优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行。
- 缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件。
如C、C++、Delphi等
- 优点:有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护。
- 缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。
如Python、Java、PHP、Ruby等语言
动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言,其他的各种脚本语言如VBScript也多少属于动态类型语言。
静态类型语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等。
- 强类型定义语言:强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。举个例子:如果你定义了一个整型变量a,那么程序根本不可能将a当作字符串类型处理。强类型定义语言是类型安全的语言。
- 弱类型定义语言:数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。
下图是2023年跟2022年的主流语言排行榜的对比
Mar 2023 | Mar 2022 | Change | Programming Language | Ratings | Change | |
---|---|---|---|---|---|---|
1 | 1 | Python | 14.83% | +0.57% | ||
2 | 2 | C | 14.73% | +1.67% | ||
3 | 3 | Java | 13.56% | +2.37% | ||
4 | 4 | C++ | 13.29% | +4.64% | ||
5 | 5 | C# | 7.17% | +1.25% | ||
6 | 6 | Visual Basic | 4.75% | -1.01% | ||
7 | 7 | JavaScript | 2.17% | +0.09% | ||
8 | 10 |
|
SQL | 1.95% | +0.11% | |
9 | 8 | PHP | 1.61% | -0.30% | ||
10 | 13 | Go | 1.24% | +0.26% | ||
11 | 9 |
|
Assembly language | 1.11% | -0.79% | |
12 | 15 | MATLAB | 1.08% | +0.28% | ||
13 | 12 | Delphi/Object Pascal | 1.06% | -0.06% | ||
14 | 23 |
|
Scratch | 1.00% | +0.47% | |
15 | 17 |
|
Classic Visual Basic | 0.98% | +0.38% | |
16 | 11 |
|
R | 0.93% | -0.44% | |
17 | 30 |
|
Fortran | 0.79% | +0.40% | |
18 | 16 |
|
Ruby | 0.76% | +0.10% | |
19 | 26 | Rust | 0.73% | +0.22% | ||
20 | 14 |
|
Swift | 0.71% | -0.20% |
C 语言是一种通用的高级语言,最初是由丹尼斯·里奇在贝尔实验室为开发 UNIX 操作系统而设计的。UNIX 操作系统,C编译器,和几乎所有的 UNIX 应用程序都是用 C 语言编写的。由于各种原因,C 语言现在已经成为一种广泛使用的专业语言。
C语言是一门面向过程的计算机编程语言,与C++、Java等面向对象编程语言有所不同。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。C语言描述问题比汇编语言迅速,工作量小、可读性好,易于调试、修改和移植,而代码质量与汇编语言相当。C语言一般只比汇编语言代码生成的目标程序效率低10%~20%。因此,C语言可以编写系统软件。
特点:
易于学习,进行结构化编程
c语言所产生的代码运行速度与汇编语言编写的代码运行速度几乎一样
预编译处理使C语言更有弹性
优点:
代码量小
生成目标代码质量高,运行速度快
跨平台,可移植性强
使用指针,灵活性强
允许直接访问物理地址,对硬件进行操作
缺点:
数据安全性有很大问题
语法限制不严格,映像程序安全性
指针太过灵活,初学难度有点大
C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。
特点:
支持数据封装和数据隐藏
支持集成和重用
面向对象
支持多态性
优点:
类型检查比c语言更加严格
增加了面向对象机制
增加了泛型编程机制
增加了函数重载和运算符重载
提供了标准库STL
缺点:
没有垃圾回收机制,可能引起内存泄漏
Java 是最典型的面向对象语言。Java 不仅吸收了 C++ 语言的各种优点,还摒弃了 C++ 里难以理解的多继承、指针等坑爹概念。今明两年毕业的大学生大多是 Java 的同龄人(1995 年)。
特点:
纯面向对象
支持分布式
跨平台,移植性强
是一门编译性语言
支持多线程,高性能
优点:
面向对象
稳健、安全、可移植、高性能
跨平台
编译型静态语言
缺点:
编译速度慢
Python 是一款服务器端解释型开源非编译脚本语言。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是 C/C++)很轻松地联结在一起
te'dian
解释性语言
拥有丰富的库
跨平台
可移植、可扩展
支持GUI编程
可嵌入
优点:
简单,易学
免费,开源
可移植性强
属于解释性的一门动态语言
面向对象
拥有丰富的库
强制性缩进代码使得代码规范
缺点:
运行速度慢
国内市场小
中文资料匮乏
职业路线:
- 用 Django 框架进行 Web 开发:和 Java 没什么两样。
- 用 PIL 框架进行图形处理
- 物联网:Raspberry Pi 等物联网平台都选择了 Python 作为开发语言
- Python 有一个无所不能的 Hack 库,如果认为 “打工时不可能打工的” 就去当一个自由的黑客吧
JavaScript 是一种动态类型、弱类型、基于原型的直译式脚本语言,也是使用频率最高的给 HTML 网页增加动态功能的语言。外行最常闹的笑话是以为它是 Java 语言的分支。
优点:
减少网络数据传输
javascript可以方便的操纵HTML对象
支持分布式运算
缺点:
各浏览器对javascript支持程度不同
“web安全性”对javascript一些功能牺牲
职业路线:
- 首选 HTML5 的初心:网站和手机站的前端页面开发。
- 用 Node.js 或 Bmob 云端代码进行后台开发
- 基于 React Native、PhoneGap、Weex、HBuilder、AppCan 进行移动开发,只需写一遍代码,就有 Android 和 iOS 两个软件
- 微信开发:包括微信公众号、微信小游戏、微信小程序。不要把这个方向当成中国特色方向,国外的 Android 机也是需要 PWA开发的。
- 如果以上四样全能做到,那么你就是全栈工程师。
SQL 是一种专精于数据库的特殊目的语言。用于存取数据以及查询、更新和管理关系数据库系统。
优点:
存储过程可以重复使用, 可减少数据库开发人员的工作量,开发速度快;SQL 可设定只有某此用户才具有对指定存储过程的使用权,安全性好。
缺点:
和 Java 语言的大多数设计模式一样,SQL 开发速度是靠牺牲运行速度换来的;不同数据库系统之间的 SQL 不能完全相互通用,可移植性差。
职业路线:
掌握了 SQL 可以从事 DBA(Database Administrator,即数据库管理员),主要负责业务数据库从设计、测试到部署交付的全生命周期管理。
PHP 是一种通用开源脚本语言。语法吸收了 C 语言、Java 和 Perl 的特点,利于学习,使用广泛,主要适用于 Web 开发领域。号称 “世界上最好的语言”
优点:
php是一个免费开源语言
开发快,运行快,语法简单,方便学习
跨平台,效率高
具有很多成熟框架
有成熟社区支持php的开发
缺点:
php是个单进程的程序,不支持多线程
只支持做web开发,不方便做.exe问件、桌面应用程序、手机程序
不适合做爬虫、自动运行脚本
后期维护比较困难,后期提速空间局限性大
职业路线:
适合进行 Web 开发,配合 Node.js 效果更佳。