当前位置: 首页 > news >正文

网站开发的层次网站建设座谈会

网站开发的层次,网站建设座谈会,做外贸的阿里巴巴网站是哪个更好,武威网站建设目录 背景 在软硬件接口中#xff0c;CPU 帮我们做了什么事#xff1f; 从编译到汇编#xff0c;代码怎么变成机器码#xff1f; 解析指令和机器码 总结延伸 背景 上大学的时候#xff0c;我们系里教 C 语言程序设计的老师说#xff0c;他们当年学写程序的时候CPU 帮我们做了什么事 从编译到汇编代码怎么变成机器码 解析指令和机器码 总结延伸 背景 上大学的时候我们系里教 C 语言程序设计的老师说他们当年学写程序的时候不像现在这样都是用一种古老的物理设备叫作“打孔卡Punched Card”。用这种设备写程序可没法像今天这样掏出键盘就能打字而是要先在脑海里或者在纸上写出程序然后在纸带或者卡片上打洞。这样要写的程序、要处理的数据就变成一条条纸带或者一张张卡片之后再交给当时的计算机去处理。 上世纪 60 年代晚期或 70 年代初期Arnold Reinold 拍摄的 FORTRAN 计算程序的穿孔卡照片图片来源 你看这个穿孔纸带是不是有点儿像我们现在考试用的答题卡那个时候人们在特定的位置上打洞或者不打洞来代表“0”或者“1”。 为什么早期的计算机程序要使用打孔卡而不能像我们现在一样用 C 或者 Python 这样的高级语言来写呢原因很简单因为计算机或者说 CPU 本身并没有能力理解这些高级语言。即使在 2019 年的今天我们使用的现代个人计算机仍然只能处理所谓的“机器码”也就是一连串的“0”和“1”这样的数字。 那么我们每天用高级语言的程序最终是怎么变成一串串“0”和“1”的这一串串“0”和“1”又是怎么在 CPU 中处理的今天我们就来仔细介绍一下“机器码”和“计算机指令”到底是怎么回事。 在软硬件接口中CPU 帮我们做了什么事 我们常说CPU 就是计算机的大脑。CPU 的全称是 Central Processing Unit中文是中央处理器。 我们上一节说了从硬件的角度来看CPU 就是一个超大规模集成电路通过电路实现了加法、乘法乃至各种各样的处理逻辑。 如果我们从软件工程师的角度来讲CPU 就是一个执行各种计算机指令Instruction Code的逻辑机器。这里的计算机指令就好比一门 CPU 能够听得懂的语言我们也可以把它叫作机器语言Machine Language。 不同的 CPU 能够听懂的语言不太一样。比如我们的个人电脑用的是 Intel 的 CPU苹果手机用的是 ARM 的 CPU。这两者能听懂的语言就不太一样。类似这样两种 CPU 各自支持的语言就是两组不同的计算机指令集英文叫 Instruction Set。这里面的“Set”其实就是数学上的集合代表不同的单词、语法。 所以如果我们在自己电脑上写一个程序然后把这个程序复制一下装到自己的手机上肯定是没办法正常运行的因为这两者语言不通。而一台电脑上的程序简单复制一下到另外一台电脑上通常就能正常运行因为这两台 CPU 有着相同的指令集也就是说它们的语言相通的。 一个计算机程序不可能只有一条指令而是由成千上万条指令组成的。但是 CPU 里不能一直放着所有指令所以计算机程序平时是存储在存储器中的。这种程序指令存储在存储器里面的计算机我们就叫作存储程序型计算机Stored-program Computer。 说到这里你可能要问了难道还有不是存储程序型的计算机么其实在没有现代计算机之前有着聪明才智的工程师们早就发明了一种叫 Plugboard Computer 的计算设备。我把它直译成“插线板计算机”。在一个布满了各种插口和插座的板子上工程师们用不同的电线来连接不同的插口和插座从而来完成各种计算任务。下面这个图就是一台 IBM 的 Plugboard看起来是不是有一股满满的蒸汽朋克范儿 一台 IBM 的 Plugboard图片来源 从编译到汇编代码怎么变成机器码 了解了计算机指令和计算机指令集接下来我们来看看平时编写的代码到底是怎么变成一条条计算机指令最后被 CPU 执行的呢我们拿一小段真实的 C 语言程序来看看。 // test.c int main() {int a 1; int b 2;a a b; } 这是一段再简单不过的 C 语言程序即便你不了解 C 语言应该也可以看懂。我们给两个变量 a、b 分别赋值 1、2然后再将 a、b 两个变量中的值加在一起重新赋值给了 a 整个变量。 要让这段程序在一个 Linux 操作系统上跑起来我们需要把整个程序翻译成一个汇编语言ASMAssembly Language的程序这个过程我们一般叫编译Compile成汇编代码。 针对汇编代码我们可以再用汇编器Assembler翻译成机器码Machine Code。这些机器码由“0”和“1”组成的机器语言表示。这一条条机器码就是一条条的计算机指令。这样一串串的 16 进制数字就是我们 CPU 能够真正认识的计算机指令。 在一个 Linux 操作系统上我们可以简单地使用 gcc 和 objdump 这样两条命令把对应的汇编代码和机器码都打印出来。 $ gcc -g -c test.c $ objdump -d -M intel -S test.o 可以看到左侧有一堆数字这些就是一条条机器码右边有一系列的 push、mov、add、pop 等这些就是对应的汇编代码。一行 C 语言代码有时候只对应一条机器码和汇编代码有时候则是对应两条机器码和汇编代码。汇编代码和机器码之间是一一对应的。 test.o: file format elf64-x86-64Disassembly of section .text:0000000000000000 main:int main() {0: f3 0f 1e fa endbr64 4: 55 push rbp5: 48 89 e5 mov rbp,rspint a 1; 8: c7 45 f8 01 00 00 00 mov DWORD PTR [rbp-0x8],0x1int b 2;f: c7 45 fc 02 00 00 00 mov DWORD PTR [rbp-0x4],0x2a a b;16: 8b 45 fc mov eax,DWORD PTR [rbp-0x4]19: 01 45 f8 add DWORD PTR [rbp-0x8],eax1c: b8 00 00 00 00 mov eax,0x021: 5d pop rbp22: c3 ret 这个时候你可能又要问了我们实际在用 GCCGUC 编译器套装GUI Compiler Collectipon编译器的时候可以直接把代码编译成机器码呀为什么还需要汇编代码呢原因很简单你看着那一串数字表示的机器码是不是摸不着头脑但是即使你没有学过汇编代码看的时候多少也能“猜”出一些这些代码的含义。 因为汇编代码其实就是“给程序员看的机器码”也正因为这样机器码和汇编代码是一一对应的。我们人类很容易记住 add、mov 这些用英文表示的指令而 8b 45 f8 这样的指令由于很难一下子看明白是在干什么所以会非常难以记忆。尽管早年互联网上到处流传大神程序员着拿小刀在光盘上刻出操作系统的梗但是要让你用打孔卡来写个程序估计浪费的卡片比用上的卡片要多得多。 从高级语言到汇编代码再到机器码就是一个日常开发程序最终变成了 CPU 可以执行的计算机指令的过程。 解析指令和机器码 了解了这个过程下面我们放大局部来看看这一行行的汇编代码和机器指令到底是什么意思。 我们就从平时用的电脑、手机这些设备来说起。这些设备的 CPU 到底有哪些指令呢这个还真有不少我们日常用的 Intel CPU有 2000 条左右的 CPU 指令实在是太多了所以我没法一一来给你讲解。不过一般来说常见的指令可以分成五大类。 第一类是算术类指令。我们的加减乘除在 CPU 层面都会变成一条条算术类指令。 第二类是数据传输类指令。给变量赋值、在内存里读写数据用的都是数据传输类指令。 第三类是逻辑类指令。逻辑上的与或非都是这一类指令。 第四类是条件分支类指令。日常我们写的“if/else”其实都是条件分支类指令。 最后一类是无条件跳转指令。写一些大一点的程序我们常常需要写一些函数或者方法。在调用函数的时候其实就是发起了一个无条件跳转指令。 你可能一下子记不住或者对这些指令的含义还不能一下子掌握这里我画了一个表格给你举例子说明一下帮你理解、记忆。 下面我们来看看汇编器是怎么把对应的汇编代码翻译成为机器码的。 我们说过不同的 CPU 有不同的指令集也就对应着不同的汇编语言和不同的机器码。为了方便你快速理解这个机器码的计算方式我们选用最简单的 MIPS 指令集来看看机器码是如何生成的。 MIPS 是一组由 MIPS 技术公司在 80 年代中期设计出来的 CPU 指令集。就在最近MIPS 公司把整个指令集和芯片架构都完全开源了。想要深入研究 CPU 和指令集的同学我这里推荐一些资料你可以自己了解下。 MIPS 的指令是一个 32 位的整数高 6 位叫操作码Opcode也就是代表这条指令具体是一条什么样的指令剩下的 26 位有三种格式分别是 R、I 和 J。 R 指令是一般用来做算术和逻辑操作里面有读取和写入数据的寄存器的地址。如果是逻辑位移操作后面还有位移操作的位移量而最后的功能码则是在前面的操作码不够的时候扩展操作码表示对应的具体指令的。 I 指令则通常是用在数据传输、条件分支以及在运算的时候使用的并非变量还是常数的时候。这个时候没有了位移量和操作码也没有了第三个寄存器而是把这三部分直接合并成了一个地址值或者一个常数。 J 指令就是一个跳转指令高 6 位之外的 26 位都是一个跳转后的地址。 add $t0,$s2,$s1我以一个简单的加法算术指令 add t0,s1, $s2, 为例给你解释。为了方便我们下面都用十进制来表示对应的代码。 对应的 MIPS 指令里 opcode 是 0rs 代表第一个寄存器 s1 的地址是 17rt 代表第二个寄存器 s2 的地址是 18rd 代表目标的临时寄存器 t0 的地址是 8。因为不是位移操作所以位移量是 0。把这些数字拼在一起就变成了一个 MIPS 的加法指令。 为了读起来方便我们一般把对应的二进制数用 16 进制表示出来。在这里也就是 0X02324020。这个数字也就是这条指令对应的机器码。 回到开头我们说的打孔带。如果我们用打孔代表 1没有打孔代表 0用 4 行 8 列代表一条指令来打一个穿孔纸带那么这条命令大概就长这样 总结延伸 只是这整个程序的机器码不是通过计算机编译出来的而是由程序员用人脑“编译”成一张张卡片的。对应的程序也不是存储在设备里而是存储成一张打好孔的卡片。但是整个程序运行的逻辑和其他 CPU 的机器语言没有什么分别也是处理一串“0”和“1”组成的机器码而已。 我们看到了一个 C 语言程序是怎么被编译成为汇编语言乃至通过汇编器再翻译成机器码的。 除了 C 这样的编译型的语言之外不管是 Python 这样的解释型语言还是 Java 这样使用虚拟机的语言其实最终都是由不同形式的程序把我们写好的代码转换成 CPU 能够理解的机器码来执行的。 只是解释型语言是通过解释器在程序运行的时候逐句翻译而 Java 这样使用虚拟机的语言则是由虚拟机对编译出来的中间代码进行解释或者即时编译成为机器码来最终执行。 然而单单理解一条指令是怎么变成机器码的肯定是不够的。接下来的几节我会深入讲解包含条件、循环、函数、递归这些语句的完整程序是怎么在 CPU 里面执行的。
http://www.w-s-a.com/news/227028/

相关文章:

  • 网站负责人 主体负责人黑龙江 建设监理协会网站
  • 手机网站焦点图代码建设工程质量检测网站
  • 墙绘做网站推广有作用没html网页制作用什么软件
  • 企业做网站有用吗网站推广的常用方法有哪些?
  • 景安做网站教程互联网小程序开发
  • 桂林北站离阳朔多远贵州省建设厅住房和城乡建设官网二建考试
  • 浙江省建设厅 网站是多少wordpress淘宝客一键
  • 网站流量少怎么做5个不好的网站
  • 随州网站建设有限公司个人申请注册公司需要多少钱
  • 东莞做商城网站建设wordpress批量下载外链图片
  • 新网站建设运营年计划书仓山区建设局招标网站
  • 网站开发天津网站建设项目组织图
  • 网站开发认证考试石家庄高端网站开发
  • 网站建设第一步怎么弄站酷网页
  • 设备网站模板江西的赣州网站建设
  • 邯郸营销型网站国际招聘人才网
  • hexo wordpress 主题织梦网站优化教程
  • 网站建设方案及上海市建设协会网站
  • 轴承外贸网站怎么做南宁网站排名优化公司哪家好
  • 沈阳企业网站建站郴州优化公司
  • cctv5+手机在线直播观看seo关键词排名优化方法
  • 网站建设公司怎么谈单怎么开通微信小程序商店
  • 深圳做网站案例一个服务器可以备案几个网站
  • 网络营销策划名词解释泉州百度推广排名优化
  • 一键生成网站的软件互联网营销师是干什么
  • 网站后台管理水印怎么做手机优化设置
  • 哪个网站做图文素材多wordpress++优化
  • 建设网站就选用什么样的公司网站类型分类有哪些
  • 找平面设计师网站网站建设须知
  • 建设联结是不是正规网站wordpress 微博同步