㈠ 关于编译器
看来你还没入门哦,就想写一个操作系统了
嗯!有志不错,相信有一天你会成功的。
一般地说写一个OS你要会一门高级语言(如C++)一门低级语言(如汇编asm)高级语言用来做界面这方面比较容易一点。而低级用来做低层驱动这方面是高级语言所不能相比的。
当然C语言介于两者之间,也能对硬件编程,但C是16位的程序对于图形处理不是很好,我个人建议你低级语言用汇编,对硬件编程时没有那么抽象,想传送的数据很清楚知道来去的方面,但要对硬件这方面的知道要了解。还有就是像要懂操作系统原理还要知道怎么去实践这些原理这些才是重要的,选择语言不是难事,给你一个组合吧(C和asm)虽然不能做出XP这种效果来,但这个图形操作系统还是很的,就看你自己的功夫了。
对于你补充的问题呐,程序的位数好像指CPU的寄存器的位数吧,在386以前的CPU好像一条指令大是16位的(当然有的指令没这么大,有8位的)在386后的新加的指令中才有32位的,为了使386以后的CPU能使用以前的指令,规定在16位指令加上不同的指令前缀,形成32位指令形式,这里的32指令就是32位程序的指令,而你说的64位程序。。在我所学的指令里没有64位的指令,但以以前的指令在在64位上运行,也要兼容的问题吧!之所以有64位的CPU所来是指CPU一次处理数据的位数,比如说32的CPU一次能处理32位的数据,而要处理64位的就要分两次从内存中取数据而占用总线,这样会使CPU有空闲,而64位的CPU只要一次就行了,所以你理解错了,
最后一个问题是人家生在那个年代,和人家有远见,成绩不好并不代表实践不好,理论和实践是两回事,理论在好不会实践也是废话,所以人家敢做,在实践中学习,在加上机遇。这个事不是你我能说清的,只能说说个人见解罢了。。
对于计算机硬件的知道只能告诉你这么之了,,大家相互学习,共同进步吧!!
如果你想找资料的话!你把你的邮箱留下,我这有硬件,操作系统,指令这些用于写操作的资料!!
㈡ 有人用Intel C/C++编译器吗谈谈体会如何
总结一下就是这样:优化能力高、编译速度慢、要钱。
求采纳,谢谢!
㈢ 什么是编译器
编译器
编译器是一种特殊的程序,它可以把以特定编程语言写成的程序变为机器可以运行的机器码。我们把一个程序写好,这时我们利用的环境是文本编辑器。这时我程序把程序称为源程序。在此以后程序员可以运行相应的编译器,通过指定需要编译的文件的名称就可以把相应的源文件(通过一个复杂的过程)转化为机器码了。
[编辑]编译器工作方法
首先编译器进行语法分析,也就是要把那些字符串分离出来。然后进行语义分析,就是把各个由语法分析分析出的语法单元的意义搞清楚。最后生成的是目标文件,我们也称为obj文件。再经过链接器的链接就可以生成最后的可执行代码了。有些时候我们需要把多个文件产生的目标文件进行链接,产生最后的代码。我们把一过程称为交叉链接。
一个现代编译器的主要工作流程如下:
* 源程序(source code)→预处理器(preprocessor)→编译器(compiler)→汇编程序(assembler)→目标程序(object code)→连接器(链接器,Linker)→可执行程序(executables)
工作原理
编译是从源代码(通常为高级语言)到能直接被计算机或虚拟机执行的目标代码(通常为低级语言或机器言)。然而,也存在从低级语言到高级语言的编译器,这类编译器中用来从由高级语言生成的低级语言代码重新生成高级语言代码的又被叫做反编译器。也有从一种高级语言生成另一种高级语言的编译器,或者生成一种需要进一步处理的的中间代码的编译器(又叫级联)。
典型的编译器输出是由包含入口点的名字和地址以及外部调用(到不在这个目标文件中的函数调用)的机器代码所组成的目标文件。一组目标文件,不必是同一编译器产生,但使用的编译器必需采用同样的输出格式,可以链接在一起并生成可以由用户直接执行的可执行程序。
编译器种类
编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做“本地”编译器。另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做交叉编译器。交叉编译器在生成新的硬件平台时非常有用。“源码到源码编译器”是指用一种高级语言作为输入,输出也是高级语言的编译器。例如: 自动并行化编译器经常采用一种高级语言作为输入,转换其中的代码,并用并行代码注释对它进行注释(如OpenMP)或者用语言构造进行注释(如FORTRAN的DOALL指令)。
预处理器(preprocessor)
作用是通过代入预定义等程序段将源程序补充完整。
编译器前端(frontend)
前端主要负责解析(parse)输入的源程序,由词法分析器和语法分析器协同工作。词法分析器负责把源程序中的‘单词’(Token)找出来,语法分析器把这些分散的单词按预先定义好的语法组装成有意义的表达式,语句 ,函数等等。 例如“a = b + c;”前端词法分析器看到的是“a, =, b , +, c;”,语法分析器按定义的语法,先把他们组装成表达式“b + c”,再组装成“a = b + c”的语句。 前端还负责语义(semantic checking)的检查,例如检测参与运算的变量是否是同一类型的,简单的错误处理。最终的结果常常是一个抽象的语法树(abstract syntax tree,或 AST),这样后端可以在此基础上进一步优化,处理。
编译器后端(backend)
编译器后端主要负责分析,优化中间代码(Intermediate representation)以及生成机器代码(Code Generation)。
一般说来所有的编译器分析,优化,变型都可以分成两大类: 函数内(intraproceral)还是函数之间(interproceral)进行。很明显,函数间的分析,优化更准确,但需要更长的时间来完成。
编译器分析(compiler analysis)的对象是前端生成并传递过来的中间代码,现代的优化型编译器(optimizing compiler)常常用好几种层次的中间代码来表示程序,高层的中间代码(high level IR)接近输入的源程序的格式,与输入语言相关(language dependent),包含更多的全局性的信息,和源程序的结构;中层的中间代码(middle level IR)与输入语言无关,低层的中间代码(Low level IR)与机器语言类似。 不同的分析,优化发生在最适合的那一层中间代码上。
常见的编译分析有函数调用树(call tree),控制流程图(Control flow graph),以及在此基础上的变量定义-使用,使用-定义链(define-use/use-define or u-d/d-u chain),变量别名分析(alias analysis),指针分析(pointer analysis),数据依赖分析(data dependence analysis)等等。
上述的程序分析结果是编译器优化(compiler optimization)和程序变形(compiler transformation)的前提条件。常见的优化和变新有:函数内嵌(inlining),无用代码删除(Dead code elimination),标准化循环结构(loop normalization),循环体展开(loop unrolling),循环体合并,分裂(loop fusion,loop fission),数组填充(array padding),等等。优化和变形的目的是减少代码的长度,提高内存(memory),缓存(cache)的使用率,减少读写磁盘,访问网络数据的频率。更高级的优化甚至可以把序列化的代码(serial code)变成并行运算,多线程的代码(parallelized,multi-threaded code)。
机器代码的生成是优化变型后的中间代码转换成机器指令的过程。现代编译器主要采用生成汇编代码(assembly code)的策略,而不直接生成二进制的目标代码(binary object code)。即使在代码生成阶段,高级编译器仍然要做很多分析,优化,变形的工作。例如如何分配寄存器(register allocatioin),如何选择合适的机器指令(instruction selection),如何合并几句代码成一句等等。
㈣ 如何看待《自己动手写编译器,链接器》一书大量抄袭开源编译器 TCC
对于编译器来说,核心是定义的语言,从这个意义上讲,SCC编译器属于原创内容当然就谈上上抄袭,人家有这个版权声明也算合理,不过似乎没什么用,因为源代码可以公开下载,实事上就是开源了。
其实我们读者更关心一本书对我们自身是否有用,听朋友说现在编译器开发工程师起薪20k以上,要真能学会这门技术对我来说还是很有诱惑力的,毕竟国内真正写过完整编译器,链接器的人还是凤毛麟角,能掌握这门技术还是很吃香的。
㈤ 如何看待各种C++编译器扩展
扩展最大的问题是非标准,不好移植。原则上避免使用,有标准的东西最好就用标准的(比如C++11引入了原子操作类,就不要用G++的原子操作扩展了)。
但是如果你知道比如自己的产品只会在gcc下编译,那也没有什么问题。有些gcc和vc的扩展功能相同但是写法不同,需要包装一下实现一定程度的可移植性。
㈥ 如何评价 Ken Thompson 在 C 编译器里植入了后门这件事
Ken Thompson 的确做了这件事,但是并非在“第一个 C 语言编译器”,更没有夸张到“任何一台 UNIX 机器”的程度。一个 demo 、 proof of concept 而已。这个链接指向的文章也不是什么论文,而是 Ken 因为 UNIX 获得图灵奖后的演讲时提出的。
怎么评价?
人家就是牛啊!
这件事情从现在挺火的“可信计算”角度来说是很有意义的。到底怎么样算是安全可信呢?闭源不可信,那开源就可信了么?工具链可信了么?底层操作系统、甚至硬件可信了么?
㈦ C/c++编译器如何看待h和cpp文件
本质上是没有什么区别的,.h文件实现的功能是声明本文件或.cpp文件中需要被别人使用或知道的变量、类型、函数及宏定义等。.h文件就像是一个接口,具体的实现可以在.cpp中也可以在.h中。.cpp中的函数或变量即便是全局的,在没有其他.cpp文件使用...
㈧ 如何编写自己的编译器
我晕,你们老师真NB,你学的什么语言啊?是c吗?上来就让你做个编译器,你们老师吃错药了吧?
我大学同学毕业设计才是做个编译器,那会那俩人合作做的,还都是我们系公认的c最强的两个,合作还做了半年,你认为大一刚上来就做这个?!
㈨ 如何评价新编辑器Spacemacs
他这个说白了就是一个强大的配置文件
我正在用 感觉iu非常漂亮 其他的因为我不怎么自己折腾配置 跟我以前一直用的oh-my-emacs 比没有看出太大差别
就如下文。。
青年问禅师:“王菲、李亚鹏、周迅、张柏芝、谢霆锋都单身了,明星们个体很耀眼,为何在一起就不行?”禅师拿出一碟芝麻、一碟花生、一碟瓜子、一碟核桃、一碟杏仁让青年分别品尝,问他:“好吃吗?”青年点了点头。禅师又拿出一块五仁月饼给青年品尝,青年吐完恍然大悟。
㈩ 如何写一个简单的编译器
因为我这里都只写了Parser,所以就只谈谈第一次写Parser的建议。1.扔掉龙书虎书鲸鱼书。这些书都有一个问题,就是在自己手写完一个自己的Parser之前,书上写的那些鬼东西完全都不知道该怎么用,用在哪里。2.大胆地撸。不要在意性能啊