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

福州市网站建设_网站建设公司_C#_seo优化

怀化网站优化联系方式,晨光文具网站建设策划书,广州建网站报价,wordpress 使用主题前言 本篇文章从整体流程上描述一下一个程序是怎么在计算机中运行的#xff0c;整个流程分为三大块#xff1a; 程序的创造程序的编译程序的运行 程序的创造 一般来说#xff0c;创造一个程序是代码工程师的责任#xff0c;虽然现在有很多工具可以不经过编码就能创造一…前言 本篇文章从整体流程上描述一下一个程序是怎么在计算机中运行的整个流程分为三大块 程序的创造程序的编译程序的运行 程序的创造 一般来说创造一个程序是代码工程师的责任虽然现在有很多工具可以不经过编码就能创造一个可运行的程序甚至游戏。但是归根揭底最终的程序都回归到一门编程语言上。 一般的情况这是一门高级编程语言可以是C/C可以是Python可以是Object-C/Swift也可以是Java等等。 经过前期的调研立项产品设计UI设计代码编写产品测试等等一系列复杂的程序多个人的集体合作经过一定的时间以后我们这个产品可能已经算是完成。 但是一个程序的创造从代码编写完成就已经结束了测试使用的一般是经过编译后的产品也就是已经经过了第二阶段 程序的编译 程序的编译普遍来说是编译器的责任几乎没有人会手动进行代码的编译工作。并且绝大部分的开发其实是使用IDE进行编译的。从源代码到可运行的程序需要经过四步的工作具体的流程可以参考文章代码到可执行文件的流程概述 我们在整个过程中以下面的代码作为例子进行描述 #include stdio.h unsigned long sum(int* src, int size); int main(int argv, char** argc) { int a[]{1,2,3,4,5,6,7,8,9,10};printf(a%lu\n,sum(a,sizeof(a)/sizeof(int)));return 0; }unsigned long sum(int* src, int size) {unsigned long result 0;for(int i 0;i size;i){result *(src);}return result; }源码阶段预处理阶段 这一步是由编译器的预处理器部分进行处理的基本就是宏的替换生成的文件为.i文件一般这个文件比较大因为包含了嵌套很多层的头文件信息就像上面的代码包含了头文件stdio.h而stdio.h头文件又包含了别的头文件只要是没有包含过的头文件都会按顺序依次添加进来。因为预处理后的文件太大就不粘贴代码了但是我看了一下预处理后的文件有18Kb之多。预处理阶段编译阶段 这一阶段是将预处理后的文件编码成汇编语言显示的汇编文件也就是.s文件汇编文件是我们最后能操作的文件了应该没有人还在敲机器指令汇编文件由一系列的段组成不同的段包含不同的数据代码数据全局数据符号表都包含在段中。 汇编文件也是我们在进行代码优化能够对比的文件比如对于switch的使用对于递归的优化等下面的代码是前面的例子生成的汇编代码 注意汇编代码已经去掉了没有使用到的头文件的信息包括变量和函数的声明 .file test1.c.text.globl sum.type sum, function sum: .LFB14:.cfi_startprocmovl $0, %edxmovl $0, %eaxjmp .L2 .L3:movslq (%rdi), %rcxaddq %rcx, %raxaddl $1, %edxleaq 4(%rdi), %rdi .L2:cmpl %esi, %edxjl .L3rep ret.cfi_endproc .LFE14:.size sum, .-sum.section .rodata.str1.1,aMS,progbits,1 .LC0:.string a%lu\n.text.globl main.type main, function main: .LFB13:.cfi_startprocsubq $56, %rsp.cfi_def_cfa_offset 64movl $1, (%rsp)movl $2, 4(%rsp)movl $3, 8(%rsp)movl $4, 12(%rsp)movl $5, 16(%rsp)movl $6, 20(%rsp)movl $7, 24(%rsp)movl $8, 28(%rsp)movl $9, 32(%rsp)movl $10, 36(%rsp)movl $10, %esimovq %rsp, %rdicall summovq %rax, %rdxmovl $.LC0, %esimovl $1, %edimovl $0, %eaxcall __printf_chkmovl $0, %eaxaddq $56, %rsp.cfi_def_cfa_offset 8ret.cfi_endproc .LFE13:.size main, .-main.ident GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.4) 4.8.4.section .note.GNU-stack,,progbits汇编代码机器代码 这一步编译器会把我们上面的汇编代码编译成机器代码也就是.o文件.o文件的文件组成没什么变化还是由段组成就是汇编指令被替换成了机器指令也就是一条条的二进制数据为什么是一条条呢因为所有的汇编指令都有编码规则就是一条汇编指令对应指定字节数的二进制序列这个对应关系是固定的但是不同的指令可以有不同的长度这一步是编码后面计算机执行程序的时候还有译码阶段。 下面是.o文件的部分代码也就是我们的代码数据这只是一小部分因为还有系统函数的调用以及需要和别的库链接的符号表等信息。000000000040055d sum:40055d: ba 00 00 00 00 mov $0x0,%edx400562: b8 00 00 00 00 mov $0x0,%eax400567: eb 0d jmp 400576 sum0x19400569: 48 63 0f movslq (%rdi),%rcx40056c: 48 01 c8 add %rcx,%rax40056f: 83 c2 01 add $0x1,%edx400572: 48 8d 7f 04 lea 0x4(%rdi),%rdi400576: 39 f2 cmp %esi,%edx400578: 7c ef jl 400569 sum0xc40057a: f3 c3 repz retq 000000000040057c main:40057c: 48 83 ec 38 sub $0x38,%rsp400580: c7 04 24 01 00 00 00 movl $0x1,(%rsp)400587: c7 44 24 04 02 00 00 movl $0x2,0x4(%rsp)40058e: 00 40058f: c7 44 24 08 03 00 00 movl $0x3,0x8(%rsp)400596: 00 400597: c7 44 24 0c 04 00 00 movl $0x4,0xc(%rsp)40059e: 00 40059f: c7 44 24 10 05 00 00 movl $0x5,0x10(%rsp)4005a6: 00 4005a7: c7 44 24 14 06 00 00 movl $0x6,0x14(%rsp)4005ae: 00 4005af: c7 44 24 18 07 00 00 movl $0x7,0x18(%rsp)4005b6: 00 4005b7: c7 44 24 1c 08 00 00 movl $0x8,0x1c(%rsp)4005be: 00 4005bf: c7 44 24 20 09 00 00 movl $0x9,0x20(%rsp)4005c6: 00 4005c7: c7 44 24 24 0a 00 00 movl $0xa,0x24(%rsp)4005ce: 00 4005cf: be 0a 00 00 00 mov $0xa,%esi4005d4: 48 89 e7 mov %rsp,%rdi4005d7: e8 81 ff ff ff callq 40055d sum4005dc: 48 89 c2 mov %rax,%rdx4005df: be 84 06 40 00 mov $0x400684,%esi4005e4: bf 01 00 00 00 mov $0x1,%edi4005e9: b8 00 00 00 00 mov $0x0,%eax4005ee: e8 6d fe ff ff callq 400460 __printf_chkplt4005f3: b8 00 00 00 00 mov $0x0,%eax4005f8: 48 83 c4 38 add $0x38,%rsp4005fc: c3 retq 4005fd: 0f 1f 00 nopl (%rax)机器代码链接 这是编译器工作的最后一步将不同的.o文件链接起来生成完整的可执行文件在linux系统就是.out文件在windows系统就是.exe文件。上面的代码经过一系列编译以后使用命令./test运行程序显示a55至此一个完整的程序结束了接下来我们介绍一下计算机是怎么执行程序的 程序的运行 程序的启动是操作系统的责任但是先别着急双击程序考虑程序在计算机中是怎么执行的先必须了解几个概念 存储器 存储器是能够保存数据的设备我们熟悉的内存就是一种存储器我们的程序代码就是保存到内存中的另外一类存储器叫做通用寄存器通常保存我们的机器指令执行的临时数据。还有一类存储器叫做状态寄存器保存我们程序执行的状态 程序计数器 也是一个存储器保存当前要执行的机器指令在内存中的地址 流程 因为我们只是介绍计算机执行程序的过程很多涉及组合电路或者逻辑电路的问题我们先不介绍后面一系列文章我会详细说明下面看一下程序的运行过程 我们双击一个应用程序或者使用命令行运行一个程序操作系统的加载器会执行一系列操作 在内存中开辟空间将我们的程序数据加载到内存备份之前程序的数据包括寄存器数据和程序计数器数据初始化程序运行的环境比如分配缓冲区等找到程序的入口点也就是我们的main函数把入口位置赋值给程序计数器 经过操作系统的一系列操作现在我们程序运行的环境已经具备了程序计数器已就位所有寄存器都可用。取指计算机根据程序计数器的值从内存中取出一条指令然后根据这条指令最前面的操作码来判断当前是一条什么指令可能是movq指令或者是addq指令或者是pushq指令都有可能但是不同的操作码会决定计算机接下来的操作也决定了程序计数器距离下一条指令的位置除了操作码以外指令还可能包含用到的寄存器编码或者内存位置编码或者常数编码译码我们取指完成后如果当前指令有寄存器的操作我们需要通过寄存器的编码拿到寄存器的数值译码阶段计算机会根据寄存器编码从寄存器中获取到数值然后输出到下一阶段。执行执行阶段会执行算术操作或者逻辑操作这些都是在中央处理器的逻辑/算数处理单元进行的。该操作可能输出一个计算后的数值也可能修改状态寄存器的值访存该阶段会根据指令类别进行内存的读取或者写入写回该阶段会根据指令的类别修改寄存器的值更新PC该阶段会根据执行结果修改下一条指令的位置写入程序计数器至此一步指令的执行就完成了然后再次执行4 需要注意的问题 上面讲的流程只是最简单的执行现在处理器使用了很多设计来加速指令的执行但是上面的流程确实是一个程序在计算机执行的过程程序执行过程中可能会需要操作系统的参与这在指令中叫做中断比如文件的读写我们必须通过中断执行操作系统的代码才可以
http://www.lebaoying.cn/news/101429.html

相关文章:

  • 如何查看一个网站的域名解析跨境电商平台排行榜
  • 旅游网站设计理念莱芜做网站公司
  • 做soho一定要做网站吗网站建设规划图
  • dnf制裁做任务网站淘宝网站是谁做的好
  • 网站制作报价是否合法佛山做网站公司哪家好
  • 装饰设计网站做网站 信息集成过程的顺序
  • 为什么选择做汉服网站搜索引擎优化课程总结
  • 手机如何建设网站注册公司费用要多少
  • 东莞网站建设服务商网站建设服务器什么意思
  • 牡丹江建设厅网站珠海知名网站
  • 一般网站的宽度是多少阿里云网站备案流程
  • 免费网站源码下载平台阜宁县住房和城乡建设局网站
  • 怎么做网站不会被屏蔽app模板网站
  • 网站集群建设解决方案公司以优化为理由裁员合法吗
  • 松江新城做网站wordpress多个站点
  • 在哪个网站上做预收款报告网站免费网站免费陪玩
  • 建设部网站官网证书编号刷q币网站建设
  • 吉林省建设厅网站做网站要买什么
  • 哈尔滨房地产型网站建设高端品牌羽绒服前十名
  • 西乡专业网站建设建设部网站79号文件
  • 在手机上建网站校园宿舍网网络设计案例
  • 简单的做海报的网站成功的个人网站
  • wordpress+游戏网站移动应用开发与服务
  • php网站安装包制作修改wordpress主体字体
  • 张家港市住房城乡建设局网站建立网站的链接结构有哪几种形式?
  • 站酷做网站服务器怎么运行网站
  • 制作app免费网站模板下载零基础自学设计
  • 企业网站的建设企业网页设制作与网站建设宝典 pdf
  • 北京网站建设制作方案宜昌微网站建设
  • 如何修改网站后台登陆入口路劲推广计划有几种状态