关于硬件和代码的编译链接

首先这个文章的标题我不敢说是原创的我只是应对我看书 书上的理解写的一篇读后感吧(在3个前还分不清cpu干什么的只知道这个是一个运算的东西 至于运算什么就不知道了分不清io是什么 会把内存和硬盘当做差不多的东西 其实我相信有些上手直接学java的人可能也分不清,高级语言将所有应该知道的东西全封装起来了,虽然便利了很多人,即使不懂下层是什么依然可以做得很牛。可能我不是我得了解很多很多东西以及程序如何运行,cpu如何运作,即使是具体来说也不清楚,得了解一下关键位置,主要使自己不迷糊吧)

首先先介绍一下最基本的硬件知识 和基本计算机的历史

1936年阿兰 图灵发明的第一代图灵机以来到如今已经很多很多年了 从最最简单的纸带一般的图灵机到如今大到楼层差不多高的超级计算机 发展得异常之快但是不管怎么变计算级最起码得有cpu,io, 内存,家用计算机起码得有io(鼠标键盘显示器,磁盘io)ps可能超级计算机并没有显示器之类的东西这些 但是不管怎么样说磁盘io还是得有 。

最开始因为cpu和内存的速度都差不多 但是随着主频的不断增加 最后导致内存跟不上cpu的速率所以有了缓存 之类的东西但是不管怎么说都不会离开 cpu io和内存这3块

那么操作系统又是什么东西? 考虑这个问题之前在考虑一个问题 当你磁盘io在进行读写操作的时候是不是cpu根本就没有做事情,在当时cpu本来就很昂贵的时代 cpu不做事情简直无法容忍所以为了防止cpu不打盹 只能将这个cpu充分的利用起来 怎么利用人们就开始想用观察程序来观察 如果这个cpu没有在用那么这个程序就会给人警报,告诉人们表明 这个cpu空闲了你得安排下一个程序 ,但是很可悲的就是一旦你这个 程序不重要但是你的cpu一直在处理 很简单的比方就是如果你正在进行一个计算然后你会发现你的电脑在计算完成之前电脑不能 做其他的任何事情了 所以就又得写一个优先级程序告诉cpu 这个重要那么就先弄这个 这些程序都是在管理cpu 那么把这些管理硬件的程序组合起来就是操作系统了

硬件和软件差不多了 再说一下编译器

gcc和vs 这两种编译器本来是打算 在vs上讲讲编译连接的过程但是好像他的编译和链接是连在一起的;但是也是这个机制

首先我们写好了代码

比如for (int i=0,i<10;i++)

这个在vs 上毫无疑问会报错 但是究竟在哪错了 编译分为几个阶段编译的过程 链接的过程

编译期分为预编译 编译 汇编 

预编译就是将#开头的全部处理 比如宏替换 还有将//后面的全给去掉

编译分为词法分析 语法分析 语义分析中间语言的生成 以及代码的优化

词法分析就是 把这个上面的for循环表示出来 可以简单的认为用一个数组保存起来arr【0】=for arr【1】=( 依次 下来

到了语法分析的时候发现for循环里面 应该是;而不是,就会报错

语义分析就是 比如将一个浮点型转化为一个指针 比如 int*a=0.11;这样也会报错

然后中间语言生成就是 有没有产生临时变量 在c++里面这个是很常见的

最后就是代码的优化 比如c++里面 bianl a=b;这样直接构造本来是要产生临时变量再将临时变量给a 在这里面就会优化了

然后再看一个代码

#include <stdio.h>
         int add(int ,int);
         int main()
  {
  int a=10;
int b=20;
int c=add(a,b);

}

会报错因为我只声明了没有定义 那么就会报出1>    源2.obj : error LNK2019: 无法解析的外部符号 "int __cdecl add(int,int)" (?add@@YAHHH@Z),该符号在函数 _main 中被引用 

这个编译的时候不会有问题但是程序如果要运行那么就会有问题了 因为无法解析外部符号 这个是在vs上编译和链接全做到一块了所以就直接报错了 但是在linux上就不会你只编译.o文件并不会出现问题



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值