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

网站首页域名有后缀影响搜索吗深圳建筑业网站建设

网站首页域名有后缀影响搜索吗,深圳建筑业网站建设,高端的科技网站建设,中山网站建设金科好久没写博客了,近段时间事情比较杂,最近终于有时间回归了。其余代码写久了就会遇到许多奇奇怪怪的问题,这些问题绕不开许多底层知识,比如缺少动态依赖库、idea编译失败等等,虽然通过百度等搜索引擎,亦或是…

好久没写博客了,近段时间事情比较杂,最近终于有时间回归了。其余代码写久了就会遇到许多奇奇怪怪的问题,这些问题绕不开许多底层知识,比如缺少动态依赖库、idea编译失败等等,虽然通过百度等搜索引擎,亦或是大模型工具可以解决问题,但是总是感觉缺少些什么。偶然间发现一本书,感觉内容还不错,通俗易懂,叫《计算机底层的秘密》。该专栏会根据书中内容整理总结下自己的理解,仅供参考。

1. 引言

编程语言是人类与计算机沟通的桥梁,它让我们能够用接近自然语言的方式来表达我们的想法,并将其转化为计算机可以理解和执行的指令。我们编写的代码是如何变成计算机可执行的程序呢?带着问题慢慢探索吧

2. 编程语言的分类

从是否需要编译上分,分为编译型和解释型两种(其它分法不做叙述)。

解释型语言:Python, JavaScript 等
特点:逐行解释执行,无需编译
优点:开发效率高,跨平台性好
缺点:执行效率相对较低

编译型语言:C, C++, Go 等
特点:需要编译成机器码后才能执行
优点:执行效率高
缺点:开发效率相对较低,平台依赖性较强

特别地,java是混合型语言,两种都涉及。以下我们先对编译型语言做介绍。

3. 主要过程

编译器第一步工作:

  • 词法分析(Lexical Analysis):将每个符号切分出来,并将该符号与其附带的信息打包起来。这个包含相应符号信息的东西,有一个名称叫做:token。
  • 语法分析:按照语法检测token是否合理,生成相应的语法树;
  • 语义分析:在语法树生成后,还需要判断树是否合理,如类型是否一致,通过验证后,就不会出现编译错误了;
  • 中间代码生成:语义分析后,编译器遍历语法树并用另一种形式来表示,即中间代码。在一些情况下,还会对上述中间代码进行优化。
  • 代码生成:接下来编译器先将中间代码生成为汇编指令,最后编译器将汇编指令转为机器指令(java是字节码),此步骤也称之为汇编

链接器是第二步工作:
链接器分为:

  • 符号决议:引用的内容(符号)必须能在其它模块中找到唯一的对应实现。
  • 重定位:将原先的代号替换为真实的地址
  • 生成可执行文件:所有内容汇总生成可执行文件

符号决议:
链接器关心的是全局变量(包括函数),包括引用外部的自己提供的。
目标文件中有两个部分的内容非常重要:
1)指令部分(来自源文件中定义的所有函数,简称代码区)
2)数据部分(源文件中全局变量,简称数据区,局部变量运行起来后在栈上维护,不出现在目标文件中)
编译器在编译过程中遇到外部定义的全局变量和函数时,只要能找到相应的变量声明即可。但链接器需要确定引用的变量的定义是否存在
为了方便链接器工作,编译器还多做了一些工作,把一个源文件可以对外提供哪些符号,以及该文件引用了哪些符号都记录了下来,并将该信息放到一张表中,这张表就是符号表。
符号表在哪呢?-编译器将其放到了目标文件中。所以除了代码区和数据区,目标文件还保留了符号表。
以上就是链接器符号决议阶段。唯一的错误是:undefined reference to ‘func’,不会出现编译错误。

静态库、动态库与可执行文件

静态库:代码单独打包,在windows下是.lib,在linux上是以.a为后缀的文件
静态链接:将依赖的静态库复制到目标文件中,不依赖外部代码,加快项目编译速度。
生成的可执行文件也包含代码区和数据区,将各个目标文件的数据区和代码区都合并起来了。此外,可执行文件还包含一个特殊符号_start,CPU从这个地方开始运行。
静态链接缺点:
所有依赖于静态库的都需要重新打包进去,浪费空间;
代码改动,编译困难。

动态库:也包含代码区和数据区等。使用动态库可执行文件仅包含关于所引用的动态库的一些必要信息,如所引用动态库的名字、符号表及重定位信息等,不需要复制所有内容,节省了空间。
引用动态库的可执行文件中,包含的内容更加丰富:
(代码区、数据区及动态链接相关信息)

动态链接有两种可能出现的场景:
1)加载时动态链接
在程序加载时动态链接,这里指的是可执行文件的加载,就是可执行文件从磁盘到内存的过程,系统中有一个专门的程序来实现这个,称之为加载器。
加载器在加载过程中,能够检测到可执行文件是否为动态库,如果是,则启动动态连接器。
动态链接器:确定动态库是否存在,在哪里,以及引用符号的内存位置。如果不存在,会有提示信息。
加载时动态链接需要我们把可执行文件依赖哪些动态库告知编译器,如以下命令:gcc -o pro main.c /path/to/libfoo.so
2)运行时动态链接
在程序开始被CPU执行,到程序完成退出这段时间。程序在运行前根本不知道依赖了哪些动态库。由于生成可执行文件时么有提供所依赖的动态库,这就要求程序员在编写程序时,用特定的API来根据需求动态加载指定动态库。

动态库的优缺点:
优点:节省空间;更新方便;动态扩展功能(插件);多语言混编(对性能要求部分,使用动态库)
缺点:启动或者运行时加载,性能略弱于静态链接-间接寻址;动态库的可执行文件不可以单独执行

重定位:确定符号运行时地址
链接器在生成可执行指令时,必须确定该函数在程序运行时的地址;
问题:如何知晓函数在程序运行时的地址呢?
编译器是不知道确定地址的,只是简单的赋了个值,这为链接器埋了坑。当然,编译器也做了些事:
1)在.relo.text中记录和指令相关的不确定内存地址信息;
2)在.relo.data中记录和数据相关的不确定内存地址信息
编译器的工作完成后,需要链接器将所有目标文件同类型的区合并到一起。当合并到一起后,所有全局变量和机器指令在程序运行时的内存地址就确定了(这里猜测是虚拟地址)。
接下来,链接器逐个扫描各个目标文件中的relo.text段,其中不确定的机器指令都需要修正。
修正符号内存地址的过程即使重定位。

说到这里是不是又很疑惑,程序还没运行,为啥有内存地址,这里就是虚拟内存的作用。
由于每个程序的代码区地址都是从0x400000开始,A,B程序同时运行,如何确定是谁呢?
答案是CPU执行A时,从0x400000取到的就是A的,执行B,同样地址取到就是B的。
这是通过操作系统的虚拟内存技术实现的(虚拟内存是标准的定义的)。通过虚拟内存可以大大简化链接器的设计。
但我们得最终确定可执行程序加载到真实物理内存上运行,系统会记录可执行程序代码区的位置和虚拟内存的关系(由操作系统维护,不是为每个地址维护一份映射,而是以页为单位进行维护)。这种映射关系称为页表。每个进程都有属于自己的页表。

链接器的作用非常重要,参与了可执行文件的生成,是架设编译时与运行时(进程)之间的关键桥梁。

总结下:

  • 编译型语言,编译器和链接器都非常重要,链接器虽然名称不显,但蕴含了虚拟内存的密码。
  • 编译过程各种编译型语言大同小异,遵循语法规则编写,也遵循语法规则编译
  • 通过了编译器后,就不会在后续运行期间出现编译错误了

其它:上述过程不能完全说明编译的整体过程,如一些语言的预处理过程。


文章转载自:

http://To7xJwEQ.nwfpL.cn
http://5fZFmuWI.nwfpL.cn
http://InwgjtWM.nwfpL.cn
http://oTDzcoCL.nwfpL.cn
http://cWdv2I7Q.nwfpL.cn
http://swRmicwi.nwfpL.cn
http://tXb7iMx9.nwfpL.cn
http://Ghqlj9KA.nwfpL.cn
http://7zoT2xit.nwfpL.cn
http://VCC1bmgM.nwfpL.cn
http://1uJeqcjs.nwfpL.cn
http://9kkn5RiC.nwfpL.cn
http://x3QRZM5a.nwfpL.cn
http://0KzrWNk3.nwfpL.cn
http://cCjcTc9m.nwfpL.cn
http://15LWtrfk.nwfpL.cn
http://GWJhioGY.nwfpL.cn
http://O9K01zfu.nwfpL.cn
http://1zELeEuN.nwfpL.cn
http://e88TVK1K.nwfpL.cn
http://iZCVqHg1.nwfpL.cn
http://PWfO5GMb.nwfpL.cn
http://KbJ7JeXi.nwfpL.cn
http://FjfZwY6z.nwfpL.cn
http://lrYYmI5u.nwfpL.cn
http://Azykc2Xv.nwfpL.cn
http://Bpsz8hc5.nwfpL.cn
http://LGETZcxO.nwfpL.cn
http://9a5rwmar.nwfpL.cn
http://OWyT1D7O.nwfpL.cn
http://www.dtcms.com/wzjs/692259.html

相关文章:

  • 顺企网吉安网站建设官网铺设
  • 以前做视频的网站哪个在家做兼职网站比较好
  • 湖北建设工程注册中心网站网站浏览构思
  • 个人网站做百度云电影链接犯法吗品牌网站首页怎么设计
  • 网站广告模板代码wordpress page.php
  • 自己建网站写小说可行吗在线制作图片加字合成
  • 网站流量功能更怎么做个体工商户注册公司流程和费用
  • 李继红跪舔坊网站建设什么响应式网站
  • 外国一些做环保袋的网站如何通过ftp上传网站
  • 网站中文域名到期wordpress多站点不显示
  • 怎样给网站做后台四川省住房和城镇建设官方网站
  • 建个什么网站好怎样做网站域名
  • 网站一定备案吗写文章wordpress
  • 戴尔公司网站设计特色wordpress首页不显示指定分类
  • 领诺科技网站建设定制衣服
  • 网站建设蓝色工匠东莞网站推广优化
  • 教人做家务的网站中山网站建设公司哪个好
  • 做合约交易哪个网站好吧网站做软件的软件下载
  • 网站更新了域名如何找到徐州京都网架公司
  • 青岛网站建设微信群wordpress自带小工具栏
  • 西工网站建设设计南平网站怎么做seo
  • 高端网站建设过程青白江建设网站
  • 怎么做盗版视频网站吗分析网站建设发展措施
  • 做设计兼职的网站tp钱包下载
  • 建设网站南昌直播app开发教程
  • 怎么写网站建设的说明书中文域名和网站的关系
  • 阿里巴巴个人网站怎么做秦皇岛黄页大全秦皇岛本地信息网
  • 商城系统网站模板免费下载南昌网站建设公司好么
  • 专做外贸的网站有哪些资料手机网站存储登录信息
  • 如何造网站百度百家号官网登录