计算机语言与编码

时间:2022-12-03 03:36:21

计算机语言分类

机器语言

底层语言,运行速度最快,掌握难度大.
由于计算机内部只能接受二进制代码,因此,用二进制代码0和1描述的指令称为机器指令,全部机器指令的集合构成计算机的机器语言,用机器语言编程的程序称为目标程序.只有目标程序才能被计算机直接识别执行
机器语言编写的程序无明显特征,难以记忆,不便阅读和书写,且依赖于具体机种,局限性很大.
除了计算机生产厂家的专业人员外,绝大多数的程序员已经不再去学习机器语言了.

尽管机器语言好像是很复杂的,然而它是有规律的。存在着多至100000种机器语言的指令。以下是一些示例:

# 指令部份的示例
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]

汇编语言

知识点:偏底层,除了二进制外增加字符,难度也比较大,运行速度仅次于机器语言.
汇编语言的实质和机器语言是相同的,都是直接对硬件操作,只不过指令采用了英文缩写的标识符,更容易识别和记忆。它同样需要编程者将每一步具体的操作用命令的形式写出来。汇编程序的每一句指令只能对应实际操作过程中的一个很细微的动作。例如移动、自增,因此汇编源程序一般比较冗长、复杂、容易出错,而且使用汇编语言编程需要有更多的计算机专业知识,但汇编语言的优点也是显而易见的,用汇编语言所能完成的操作不是一般高级语言所能够实现的,而且源程序经汇编生成的可执行文件不仅比较小,而且执行速度很快.

# 汇编的hello world,打印一句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         ; 调用内核功能

高级语言

知识点

  1. 软件层面看不见机器的硬件结构,但是一些高级语言提供了与汇编语言的调用接口;
  2. 能将许多先关的机器指令整合成单条指令,简化指令;
编译型语言
  1. 预编译:源代码写好后,在执行之前,编译器直接将源代码编译成机器码,只编译一次,编译的时候根据对应的运行环境生成机器码,系统环境不同,编译后的可执行文件也不同;
  2. 链接:把各个模块的机器码和依赖库串联起来生成 可执行文件.
    优点: 执行效率高;
    缺点: 跨平台型差,开发效率低(修改代码需要重新进行预编译);
    代表语言:c,c++,siwft
解释型语言

不需要编译,只在运行程序的时候翻译成机器语言.
每运行一次就翻译一次.
优点: 跨平台型好(前提是安装解释器), 开发效率高(修改代码直接修改);
缺点: 执行效率低(每次运行之前都需要编译一次);
代表语言: javascript, python, php, perl;

混合型语言

属于解释性语言.
字节码(Bytecode): 一种包含执行程序,由一序列op代码/数据对组成的二进制文件.的中间代码.
编译器先将源码编译成字节码,特定平台上的虚拟机器将字节码转译成可直接执行的指令.
代表语言: java

其他分类

动态语言和静态语言
动态语言:在运行时候可以改变其结构的语言.
静态语言:与动态语言相反.

动态类型语言和静态类型语言
动态类型语言:只在运行期间才做类型检查的语言.例如: python, javascript, php, ruby, swift
静态类型语言:在编译前或者说在运行前确定数据类型.例如: java, C, C++, C#

强类型语言和弱类型语言
强类型语言:一旦一个变量被指定了某个数据类型,如果不经过转换,那么它就永远是这个数据类型.例如: java,C#,python,ruby
弱类型语言:数据类型可以被忽略.一个变量可以赋不同数据类型的值,一旦给一个整型变量a赋一个字符串值,那么a就变成字符类型.例如: javascript,php.


编码

要解决的主要问题是将文字转换成二进制代码;
字符 >> 编译 >> 十进制(可查看) >> 二进制 >> 解码 >> 字符

# 单位
bit位,计算机中最小的表示单位
8bit = 1bytes 字节,最小的存储单位,1bytes 缩写为 1B
1KB=1024B
1MB=1024KB
1GB=1024MB
1TB=1024GB
1PB=1024TB
1EB=1024PB
1ZB=1024EB
1YB=1024ZB
1BB=1024YB

ASCII

American Standard Code for Information Interchange.
只适合英文. 一个字节,最多表示256个字符,可表示字符:0-9 A-Z a-z 和一些常见的符号;
例如:字符'a' >> 97 >> 00110001

# 二进制位与对应的十进制数字
1     1   1   1   1   1  1   1
256  128  64  32  16  8  4   1

gbk:

可以表示中文,两个字节表示,但是每个国家都存在编译自己语言的编码,没有统一起来;

unicode

编码界的通用语言,包含了跟全球所有国家的字符的映射关系,
两个字节表示,若表示ascii原本只需要一个字节可以表示现在需要2bytes,在存储和传输过程就出现了资源浪费,例如;
字母A用ASCII编码是十进制的65,二进制的01000001,
字符0用ASCII编码是十进制的48,二进制的00110000,
汉字已经超出了ASCII编码的范围,用Unicode编码是十进制的20013,二进制的01001110 00101101.
如果把ASCII编码的A用Unicode编码,只需要在前面补0就可以,因此,A的Unicode编码是00000000 01000001,所以若用Unicode编码存储ASCII中的字符时候会占用双倍的内存空间.

UTF8

UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间.
在计算机 内存 中,统一使用Unicode编码,当需要 保存到硬盘 或者需要 传输 的时候,就以UTF-8格式编码,例如用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode格式字符加载到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8格式保存到文件,如下图:
计算机语言与编码

python2和python3的区别

python2:默认编码是ascii,解释器仅以文件头声明的编码去解释你的代码,加载到内存后,并不会主动帮你转为unicode.

python3:默认的编码是utf8,在读取硬盘的二进制数据到内存时:
1.对以utf-8编码的文件以utf-8的格式进行解码,即decode('utf-8'),自动转换成unicode格式,由于unicode有与其他语言例如gbk等有对应关系,所以通过映射表会显示相应的图形,即汉字或其他语言;
2.若硬盘的文件不是以utf8格式存储的,那么读取时,会出现乱码.
例如硬盘二进制文件是以gbk方式编译的话,由于以gbk编码汉字是以两个字节存储的,但是utf-8 格式编码是以 三个字节存储汉字的,解码时仍然按照三个字节去解码汉字,所以会出现乱码;

常见编码错误原因
1.Python解释器的默认编码;
2.Python源文件文件编码;
3.Terminal使用的编码;
4.操作系统的语言设置 掌握了编码之前的关系后,挨个排错就好;