2.3 编程语言分类

image-20221117101922652

1. 编程语言分类

* 1. 机器语言: 由二进制组成的指令, 能被计算机直接识别并执行.
* 2. 汇编语言: 用一组英文标签代表一组二进制指令, 能被计算机直接识别并执行.
* 3. 高级语言: 用人类的自然语言编写的程序, 需要转为机器语言才能被计算器识别.
编程语言执行效率:开发效率:跨平台:
机器语言能被计算机无障碍理解并直接运行, 执行效率最高.复杂, 二进制指令难以记忆, 开发效率低.依赖具体的硬件, 跨平台性极差.
汇编语言编译后直接操作硬件, 执行效率高,但比机器语言稍低.使用英文标签编写程序, 开发效率低.依赖具体的硬件, 跨平台性差.
高级语言高级语言更贴近人类语言, 所以执行需要通过‘翻译’才能理解, 会增加很多额外的代码,这样会降低软件执行效率.开发者无需考虑硬件, 语言更贴近人类, 开发效率得到极大的提升.不依赖硬件, 依赖编译器, 解释器, 跨平台性极强.

image-20221027051045431

2. 低级语言

低级语言(机器语言, 汇编语言): 更接近于机器指令.       
越是低级的语言对机器越是友好, 越是符合机器的思考方式, 因此执行效率高.

3. 高级语言

高级语言: 更接近于人类的思维模式.
越是高级的语言对人类越是友好, 越是符合人类的思考方式, 因此开发效率高.

高级语言想要在计算机上执行, 必须先翻译成计算机能识别的二进制语言才能执行.
按翻译的过程可以分为两种: 编译型, 解释型.
* 识别编译型需要安装编译器, 识别解释型需要安装解释器.

4. 编译型语言

编译型: 运行时直接编译成机器可以执行的程序, 除非修改程序源代码, 否则无需再编译.
* 执行效率高, 比解释型语言运行要快, 跨平台性低于解释型. 
编译型常见语言:
C语言: 一个平台上编译的程序不能跨平台运行, 想要在不同的平台上运行需要自行编译.

Java: 号称一处编码, 处处运行, 1990年横空出世. Java 有一个编译的过程, 
       java 源代码编程成字节码文件 .class , 该文件需要运行在操作系统的 jvm 虚拟机下.

Go: 可以跨平台编译, Windows 平台下所有 Go 代码编译成一个其他平台的可执行文件.

5. 解释型语言

解释型: 运行时需要专门的解释器, 将源代码临时转换成特定平台的机器码,
解释器也占计算机的资源, 运行速度较慢. 运行依靠解释程序, 每次执度需要翻译,
翻译一行执行一行, 只要平台提供相应的解释器, 就可以运行源代码, 方便源程序移植.
* 因为要一行一行翻译后执行, 这个翻译过程非常耗时, 解释性语言运行速度会受到一定的影响.

解析型常见语言: Python, JavaScript, PHP

image-20221115131219374

6. 弱类型语言

弱类型(Weak): 变量可以赋不同数据类型的值, 允许将一块内存看作多种类型, 
比如直接将整型变量与字符变量相加.
// JS |  允许两种不同类型的变量相互操作
var num = 10


// 打印 整型num 与 字符串类型'a'的结果, 与结果的变量.
console.log(num + 'a', typeof (num + 'a'));

运行工具窗口显示:
10a string

7. 强类型语言

强类型(strong): 强制数据类型定义, 没有强制类型转化前, 不允许两种不同类型的变量相互操作.
# Python
num = 1

# 不允许两种不同类型的变量相互操作
print(num + 'a')

运行工具窗口显示:
<class 'int'>

TypeError: unsupported operand type(s) for +: 'int' and 'str'
类型错误: + 不支持的操作数类型: “int”和“str”
# Python
num = 3

print(num * 'a')  # aaa

Python 字符串可以和整数相乘, 却不能相加?
Python 属于强类型语言, 按道理是无法进行算数运算的.

Python 中为了方便程序员的使用, 把闲置的乘法符号重新定义了一下, 使其不再表示乘法, 而是重复n次.

8. 静态类型语言

静态类型语言(statically typed languages): 
数据类型在编译期间(或运行之前)确定的, 变量在使用前要声明变量的数据类型.
把检查类型放在编译期间的好处, 是可以提前检查可能出现的类型错误.
// C语言 | 需要声明变量的数据类型.
int homo = 114514;

9. 动态类型语言

动态类型语言(dynamically typed languages): 
'运行期'才对数据类型进行检查, 在编写代码的时候可以不指定变量的数据类型.
# Python | 不需要声明变量的类型.
a = 1

10. 常见语言类型

Python 属于 解释型 强类型 动态语言,
程序的执行依赖于解释器, 每次执行都需要翻译, 翻译一行, 执行一行.
不同类型的变量不能相互操作, 定义变量不指定变量的数据类型.

image-20221115171823725

11. Python 运行机制

11.1 Python 执行过程
解释器执行 Python 脚本会调用自身的编译功能转换该程序为二进制形式的中间编码,
并整理为 PyCodeObject 对象形式暂时保存在内存中, 
字节码会被发送到 Python 虚拟机 PVM (Python Virtual Machine), 
PVM 迭代运行字节码指令, 一个接一个完成操作.
11.2 字节码文件
一个 Python 脚本被另一个程序调用时, 
被调用的脚本生成的 PyCodeObject 对象会保存到 .pyc 字节码文件中.
下次运行时, 如果没有修改过源代码, 直接加载 .pyc 文件运行, 省略编译过程.
修改过就重新编译, 解释器会自动检查源文件和字节码文件的时间戳.
如果没有写入权限, 字节码会在内存中生成, 程序运行完后字节码被丢弃.

* 当前执行的主程序不会生成pyc文件.
*  import ...  from ... import 等方式导入主程序的模块才会生成pyc文件.
在同一个目录下新建 a.py  b.py 两个脚本文件.
# a.py
def a():
	print('a')
    
# b.py
import a

2022-11-15_01524

11.3 生成字节码文件
Python 字节码省略了源代码的解析翻译过程, 执行运行速度要快一些.
并不是所有的脚本文件执行都会生成字节码, 可以同步一些模块将程序翻译成字节码文件保存.

* 如果不想将项目暴露源码, 将字节码文件提交即可, 对方只需要有解释器变可以运行.
1. 生成单个
* 1. 使用 py_compile 模块将 .py 文件翻译成 .pyc 文件.
     在脚本文件所在目录下回生成一个__pycache__的目录, .pyc 文件保存在这个目录中.
# 导入模块
import py_compile
# 指定 py 文件的路劲生成字节码文件
py_compile.compile(r'C:\Users\13600\PycharmProjects\test\hello.py')

image-20221115121240011

* 2. 执行 .pyc 文件.

image-20221115123607270

2. 批量生成
使用 compileall 模块针对一个目录下所有的 .py 文件进行编译. 
在脚本文件所在目录下回生成一个__pycache__的目录, .pyc 文件保存在这个目录中.
import compileall
compileall.compile_dir(r'C:\Users\13600\PycharmProjects\test')

2022-11-15_01525

12. Python 效率问题

Python 的缺点是运行速度相对慢点, 真正拖慢 Python 速度的不是解释器, 而是以下原因:

* 1. Python 是动态语言, 造成运行时的不确定性影响运行效率.

* 2. Python 是解释执行, 不支持JIT (just in time compiler).

* 3. Python 中一切皆对象, 每个对象都需要维护引用计数, 增加额外的工作.

* 4. Python GIL, 全局解释器锁导致无法实现真正并发.

* 5. 垃圾回收机制, 会中断正在执行的程序, 造成所谓的顿卡.

Python 的慢也没有想象中的那么严重, 因为程序速度不再那么重要, 不一定非要追求极致.
最为重要的是产品的研发速度.

程序员大牛 Donald Knuth 说过过早优化是万恶之源, 
在开发的中早期, 追求运行速度和效率是费力不讨好的, 
进行敏捷开发和快速迭代才是当下软件开发的王道模式,  Python 正是为此而生.

Python 语法简洁, 包含大量的标准库和第三方库,
用较少的语句就可以完成其它语言上百条语句才能完成的任务,
这无疑大大提高了开发的速度和效率, 帮助你在尽可能短的时间内完成工作.

文章的段落全是代码块包裹的, 留言0是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言1是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言2是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言3是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言4是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言5是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言6是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言7是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言8是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言9是为了避免文章提示质量低.


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值