编译相关

编译的过程 :

1. 词法分析,程序被扫描成:关键字,标识符,字面量和特殊符号这些记号。

2. 语法分析,对记号进行语法分析产生语法树。(代码最终由表达式组合)

3. 语义分析,经过类型匹配和转换,把语法树上的表达式都标识上类型。

4. 运行时无关的中间码的生成,此时的语法树可以转换成三址码,并进行初步优化。

5. 生成目标代码,但此时变量的地址并未确定。

 

目标文件的内容: 段里放的都是真正的东西,比如指令,变量值。至于名称都在符号表里,所以.bss段没有内容。 符号表里列举出了所有的符号,以及那些符号对应的值或指令在哪。 在链接中用到的符号主要是函数名和变量名,而且是经过修饰的(C和C++的修饰不一样,注意extern "C")。 需要重定位的地方会被记录到重定位段里。

 

链接的背景: 程序经常改变,于是指令和变量的地址就会跟着改变,导致跳转指令也要跟着调整。 于是人们用符号标识位置,并在每次汇编的时候都重新计算符号的地址,然后统一填入。 独立编译模块变得流行,需要解决变量和函数的跨模块访问问题。

 

链接的过程:

1. 扫描所有的输入目标文件,合并相同段,分配地址空间,收集全局符号表。这一步后,所有符号都有了地址。

2. 读取重定位信息,调整代码地址。

 

常常在我脑子中转的一个问题是:context switch是哪个程序?当系统中运行一个shell,然后由shell调用hello,那个执行context switch的system call是算哪个程序?答案是:那个system call对应的那一串执行context switch的指令不是程序。程序是在操作系统之上的概念,当指令落入操作系统手中,就不是程序的概念了。如果要考虑context switch层面上的问题,计算机工作过程就不应该看成是进程切换的过程,而是单一的一维指令执行的过程,在那个层面上,没有进程的概念,只有指令周期和有限状态机的概念。

 

理解这个过程值得注意的点有:context switch对于进程来说是透明的,fork()函数也只是一个函数而已,它并不负责那个新进程是怎么创建的,它只管执行一下这条指令然后收结果,在它看来结果是立即收到的,并没有等“很多有关创建一个新进程的指令执行”再收到结果,因为那些都是它本身进程外的事情。收到结果,如果结果是0表示那个“任务”成功完成了,如果是其它的,表示那个“任务”没有完成,至于那个“任务”是什么,它并不在乎。

 

于是,我需要重新思考什么是操作系统,它给应用程序提供了怎么样一个平台,它提供的系统调用接口是怎么样的,我需要了解清楚操作系统的全貌,才能在编程的工作中游刃有余。要知道,当计算正在执行一条指令时,这条指令要么来自应用程序,要么来自操作系统,我需要知道,哪些是操作系统份内的事情,哪些是应用程序份内的事情。

 

 

 

 

转载于:https://www.cnblogs.com/caicaiandtutu/archive/2012/07/08/2581500.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361354.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

带有Swagger的Spring Rest API –创建文档

使REST API易于使用的真正关键是好的文档。 但是,即使您的文档做得不错,您也需要设置公司流程的权利,以正确,及时地发布它。 确保利益相关者按时收到是一回事,但是您也要负责API和文档中的更新。 自动完成此过程可轻松…

关于React-native的介绍以及环境搭建

React-Native介绍(后面内容的RN就是指react-native) 由facebook公司推出的,基于react,能开发原生app 原理: 1. 利用react框架写好js代码 2. 利用python、C 把我们的js代码,翻译成java代码 3. 利用andr…

别说我不会玩,我来告诉你iPhone有多烂!iPhone缺点集

港行iPhone4S入手,帮朋友整的。朋友经常出国,所以指定要越狱,装墙外软件。 大sim卡是不支持的,还好商家给了剪卡器。首先发现移动卡不支持,别告诉我欢迎门,我用的就是19位的ICCID,反正把卡装进去…

使用PrimeFaces开发数据导出实用程序

我的日常工作涉及大量使用数据。 我们使用关系数据库来存储所有内容,因为我们依赖于企业级的数据管理。 有时,具有将数据提取为简单格式(例如电子表格)的功能很有用,以便我们可以按需进行操作。 这篇文章概述了我使用P…

函数名和变量名重名问题

1.如果输出一个函数名,那么输出的就是这个函数的代码。 function test(){console.log("哈哈");}console.log(test); 2.如果变量名 和函数名 重名会怎么样? //a.如果变量有值,那么输出的就是变量的值。//b.如果变量没有值&#xff…

css3 transition的应用

css3 的transition:允许css属性值在一定的时间区内平滑的过渡。 transition-property:变换延续的时间 transition-duration:在延续时间段 transition-timing-function:变换速度变化 transition-delay:变化延迟时间 a&a…

break和continue的区别

break 1.break 语句可用于跳出循环。 2.break所在的循环体已经结束。 continue 1.continue 语句中断循环中的迭代&#xff0c;如果出现了指定的条件&#xff0c;然后继续循环中的下一个迭代。 2.continue所在的循环体并没有结束。 demo演示 for (i0;i<5;i ){if (i3) br…

Tomcat到Wildfly:配置数据库连接

此摘录摘自《 从Tomcat到WildFly 》一书&#xff0c;您将在其中学习如何将现有的Tomcat体系结构移植到WildFly&#xff0c;包括服务器配置和在其顶部运行的应用程序。 WildFly是完全兼容的Java Enterprise Edition 7容器&#xff0c;与Tomcat相比&#xff0c;它具有更多的可用…

我的开始

今天是我第一天写在博客园写东西&#xff0c;怎么说呢&#xff0c;刚毕业 正着工作呢。一头雾水 不知道怎么办&#xff0c;就从同学那里拷了分简历&#xff0c;也学着写了一份。自己还算满意。不过呢 在智联上投了40多家单位了&#xff0c;只有一家让电话面试。有点不值所错&am…

js 深拷贝和浅拷贝

js 深拷贝和浅拷贝 先举一下项目中遇到的两个例子&#xff1a; 例子1&#xff1a; var json $.parseJSON(data.data); //data.data是后台返回的值 var a json.channels; var b json.channels; console.log(ab)//true 这个例子是浅拷贝&#xff0c;a、b两个对象是完…

在jOOQ之上构建的RESTful JDBC HTTP服务器

jOOQ生态系统和社区正在持续增长。 我们个人总是很高兴看到基于jOOQ构建的其他开源项目。 今天&#xff0c;我们非常高兴为您介绍BjrnHarrtell结合REST和RDBMS的一种非常有趣的方法。 BjrnHarrtell从小就是瑞典的程序员。 他通常在Sweco Position AB上忙于编写GIS系统和集成&a…

Tiny Wings 为什么能迅速成为 iOS App Store 付费应用第一名?

Tiny Wings 不知是有意无意&#xff0c;完美的利用了人的性意识。有节奏感的上上下下&#xff0c;找准G点后毫不犹豫的迎头猛扎下去。期待自己拥有绝佳技巧&#xff0c;不放过任何一次能high起来的机会。飞上天触到云的瞬间high得全身淋漓畅快&#xff0c;连续多触云几次基本上…

node.js 搭建http调取 mysql数据库中的值

首先&#xff0c;我们先在数据库中创建两个表t_news,t_news_type;插入数据&#xff1a; 然后我们再写代码&#xff1a; //加载模块express var express require("express"); var fs require("fs"); //加载路径 var url require("url"); //加…

Spring Caching抽象和Google Guava Cache

Spring为缓存昂贵的方法调用提供了强大的开箱即用支持。 这里详细介绍了缓存抽象。 我的目的是要介绍Spring现在为框架的4.0版本提供的较新的缓存实现之一-使用Google Guava Cache 简而言之&#xff0c;请考虑一种具有几种慢速方法的服务&#xff1a; public class DummyBoo…

NHibernate.3.0.Cookbook第三章第9节的翻译

Using stateless sessions 使用无状态会话 当进行大量数据处理的时候,可能会放弃使用一些高级特性,而使用更接近底层的API来提高性能.在NHibernate中,这种高性能的底层API就是无状态的会话.本节介绍如何使用无状态会话来更新movie对象的价格. 准备 使用第一章的Eg.Core和第二章…

致电以验证您的JavaFX UI的响应能力

最近&#xff0c;Jim Weaver在他的Surface Pro上为演示安装了我的小图片索引应用“ picmodo”&#xff0c;并且GUI变成了垃圾。 显然&#xff0c;Windows Tablet上JavaFX的基本字体大小很高&#xff1a; 我认为&#xff0c;即使调整大小行为和预期一样工作&#xff0c;UI也绝…

上周热点回顾(7.9-7.15)

热点随笔&#xff1a; 2012五大主流浏览器 HTML5 和 CSS3 兼容性大比拼&#xff08;梦想天空&#xff08;山边小溪&#xff09;&#xff09; 原创&#xff1a;让密码不再被遗忘 - 在web中尝试图形口令&#xff01;&#xff08;网无忌&#xff09; 构建一个Outlook风格漂亮界面…

vuex 管理vue-router的传值

假设有这样的一种情况&#xff0c;在两个组件中。一个组件【A】主要是比如说放表格数据&#xff0c;而另外一个组件【B】是专门用来向组件A的表格添加数据的表单。这个时候就是两个兄弟组件之间传递数据了。首先想到的是使用兄弟组件传递数据的方法&#xff1a; 新建一个中间件…

命令行下使用curl,采集数据遇到的问题。

前几天遇到这样一个问题&#xff0c;写了一段php采集程序&#xff0c;里面用到了curl_init()等&#xff0c;在浏览器里可以获得数据&#xff0c;但在命令行里不可以用的php环境是wamp&#xff0c;加载了php_curl&#xff0c; php.ini文件里面加载的&#xff0c;打印phpinfo 也显…

纪事地图和Yahoo Cloud服务基准

总览 Yahoo Cloud Service Benchmark是一种相当广泛使用的基准测试工具&#xff0c;用于测试大量密钥&#xff08;例如1亿&#xff09;和少量客户端&#xff08;即由一台计算机提供服务&#xff09;的密钥值存储。 在本文中&#xff0c;我将研究如何使用Chronicle Map在具有12…