代码编译工具
1. 如何自己编译源代码
我们使用编译器将自己的源代码转换成目标代码, 使用链接器将我们的目标代码链接成一个可执行程序。另外, 我们使用一些程序在计算机中输入源代码文本并且编辑它。这些是最初的和最重要的工具, 它们构成程序员的工具集合或“程序开发环境”。 如果你使用的是命令行窗口, 就像很多专业程序员所做的那样, 你将不得不自己来编写编译和链接命令。如果你使用IDE(“交互式开发环境”或“集成式开发环境”), 就像很多程序员所做的那样, 简单地点击正确按钮就可以完成这个工作。附录C介绍了如何在你的C++实现中编译和链接。 IDE通常包括一个具有有用特性的编辑器, 例如用不同颜色的代码来区分你的源代码中的注释、 关键字和其他部分, 以及其他帮助你来调试代码、 编译和运行代码的功能。调试是发现程序中的错误和排除错误的活动, 你在前进的道路上会听到很多有关它的内容。 我们使用微软的Visual C++作?喑炭 ⒒肪呈道 H绻 颐羌虻サ厮怠氨嘁肫鳌被蚴恰癐DE”的某些部分, 那就是所指Visual C++系统。但是, 你可以使用一些提供最新的、 符合标准的C++实现的系统。我们所说的大多数内容(经过微小的修改)对所有的C++实现都将是正确的, 并且其代码可以在任何地方运行。在工作中, 我们使用几种不同的实现。
2. 代码编辑软件有哪些
编辑代码大部分是在集成开发环境中的就是IDE.
所以常用的有
VC6.0,另外可以使用辅助插件Visual Assist
VS系列也是可以的,主要是看个人喜好。
当然越新的,它支持的库文件就越新。
如果初学C,
会接触
TC系列。
另外现在还有
.net, vc7,C++ builder.
如果单个的代码编辑软件,不是集成开发环境的
有
Source Insight
Ultra Edit
Visual Slick Edit
Edit Studio
Edit Plus
等。
其实主要自己习惯用那个就好。
3. 编译工具是如何开发的例如VC6等
楼主大概想问先有鸡,还是先有蛋吧。
计算机能识别的语言叫机器语言,最初的程序就是用机器语言写的,
也就是直接在键盘敲0和1,它不要编译,直接就能运行。
后来用机器语言写了一个简单汇编编译器,
用它处理汇编语言,再用汇编语言写一个简单的c语言编译器,功能非常有限那种,之后用这个编译器能处理的C语言重写这个C编译器,这样就变成可以用C编译器编译新版本的C编译器了。
这只是一个大概的过程。
4. 什么代码编辑器比较好用
着名的代码编辑器:Microsoft Visual Studio Code、Github Atom、Sublime text、Adobe Brackets
最推荐的一种:Atom
推荐理由:
链接:如何评价 GitHub 发布的文本编辑器 Atom?
作者:韦易笑
用过不少编辑器:UltraEdit / EditPlus / (G) Vim / GEdit / NotePad++ / TextMate / ProgrammerPad / Sublime 。确实是工作上用他们写过代码的。而 VSC / Emacs 只是体验了一下基本使用方法,算不上真用。用下来的结论是:Atom 比 Vim 更 Vim,比 Emacs 更 Emacs,同样,比 Sublime 更 Sublime。
Atom 唯一的槽点就是“卡”,不过那是去年的情况了,1.0后性能数次大提升,比起sublime/vsc之类虽不算流畅,但同时编辑20个数千行的文件没有压力。如今让人感觉慢的地方主要是启动loading(也大大短于eclipse, idea),使用时并没察觉它比其他编辑器慢再哪。而文本编辑器的快慢,更重要的是“让你工作更快更有效率”。下面说说为何 Atom比其他更有效率:
兼容VIM模式
这无疑团结了一大班 Vim过来的用户,Sublime虽然也有VIM模式,但是Sublime在 mac下面的vim模式有bug,我习惯用 hjkl来移动光标,sublime再mac下hjkl移动有问题,且我习惯CTRL_[来返回NORMAL,手指不离开主键盘区,而sublime的vim模式只支持ESC返回,加上其作者经常神秘消失,最稳定的2.x版本已三年没有更新,这些问题一直得不到修正。
由于Atom的定制程度直追 Vim/Emacs,它的vim模式能够使用插件来实现,而不像sublime必须builtin,Atom的VIM模式除了官方实现外还有很多用户实现,各有所长,你不喜欢可以换,Sublime就傻逼了,觉得builtin的不行,你就没办法了,而且作者不更新你也没办法。
Atom里的Vim模式并不是强制的,你可以用也可以不用,这样入门用户也不会觉得困难,但是如果你用惯Vim的话,使用Vim模式可以取得更好的效率,我觉得Vim/Atom-VimMode能够提升效率的地方有以下三方面:
1. 手指不离开主键盘区:
所有功能皆能在主键盘区完成,不用去按方向键,不用把手挪去按Home/End,更不用动鼠标。就像咏春中强调中线理论,认为一切动作围绕中轴线开展,守护自己中轴线的同时攻击别人的中轴线。Vim/Atom-VimMode中,双手不但从不离开主键盘,并且八根手指随时守护再HOME位(ASDF, JKL;)有动作就移动,然后马上归位。
2. 细粒度微操作:
星际/dota玩的好,微操基本功,微操又快又精确,Vim/Atom-VimMode一样,比如:
if (xxxx) {}
很多人编码时习惯“成对编码”,写了申请资源的代码,先把释放资源写了,写了左括号,先把右括号给补充完,当你写完第二行代码时,需要用到“再1-2行中间插入一行”,此时你的光标停留在第二行,传统编辑器你需要:按上箭头移动光标到第一行 -> 按END键去到第一行末尾 -> 按回车插入一行,mac下的END键还需要用CMD+右来组合出来,而Vim/Atom-VimMode中,你只需要shift+o即可,手指完全不离开主键盘区,不用像传统编辑器那样,右手先移动到箭头区又移动到HOME的小键盘区,再移动回主键盘区这么麻烦,类似还有:
使用o直接再下一行插入,避免 END/回车
使用I再行首插入,避免移动半天光标。
向前/后移动一个单词到单词头、尾。
快速更改当前单词,用/来快速搜索移动光标。
dd+p来快速移动代码块,取代shift+方向键半天。
shift-j 来两行合并成一行,代替 HOME, back 若干次。
。。。
你再编辑代码的时候,90%的情况可以直接一步完成,这就叫细粒度微操,而且整个过程手都不需要离开主键盘,不像传统编辑器那样,若干笨重的操作组合再一起,操作不够细步骤多的同时手还要再:主键盘区,方向键区,扩展键区 来回移动,效率奇低。而Vim/Atom-VimMode下,手指随时守护在home区(ASDF JKL;),所有微操都是围绕HOME区进行,不会移动到任何主键盘以外的区域,更别说用鼠标、触摸板。
3. 批量操作:
比如要给下面代码每行后面加一个分号:
var x = 1var y = 2var z = 3console.log('result is ' + (x + y + z).toString())
一般做法是:移动光标到行末->END->分号->移动光标到下一行,Vim里面不需要移动光标到行末,只需循环敲入:“A;<ESC>j” 即可,本来操作就少很多。这还不是最少操作,更少操作是利用Vim里面的句号“.”功能重复上一次操作,即第一行“A;”补充了一个分号后,第二行只需要按一下"."即可重复,于是最后操作变为:
第一行:A;<ESC>
后面所有行:J.
超级爽快的操作,这样的操作还很多,你还可以单条命令对一万行代码重复上述步骤,或者把c代码拷贝到go里面先一句话把所有分号给删除了。Vim下面的名言:绝不重复。
总之如果你熟悉 VIM模式,用 Atom能感到完全自由的方式,随心所欲的书写代码,而不是被书写这件事情费脑筋,解放大脑完全用于思考而不用于打字。但是同时对不习惯VIM的人照样友好,或者对想使用VIM的便利却又痛恨VIM这个软件的简陋的人带来了福音。
脊椎记忆
“同样动作重复300次,肌肉就会有记忆,而一个动作重复600次,脊椎就会有记忆”
-- 李小龙
编辑器就是关于脊柱记忆的东西,所以多投入一些时间去了解你使用的编辑器,掌握他们的各种快捷操作和高级功能是一个能让你事半功倍的好主意。
格斗游戏玩的好的人有很多,下等高手靠熟练,中等高手靠反应,上等高手靠意识。更熟练的掌握你的编辑器,让更多日常工作固化成记忆记录再你的脊椎上,使用的时候,脊椎这枚协处理器就能完成代码编写,一个操作,刚一想到,脊椎就自动执行出来了,小脑腾出空间来组织判断,大脑腾出空间来思考更重要的东西,就像你走路,你不用思考迈腿那么自然,别人一拳过来,你潜意识一动,一连串动作就出去了,一只飞蛾飞过来,你潜意识的闭上眼睛保护眼部,这就是脊椎记忆,如果还要经过大脑绕一圈,反应慢不说,大脑这颗cpu都用在这些琐事上了,思考的时间自然少了不少。
所以从内到外的了解你的编辑器,并且熟练掌握他们,是对你提高工作效率的最佳投资,Atom的全平台支持,开放源代码,深度可定制等三个特点,比起其他闭源的,平台支持不全的,扩展少的编辑器来说能让你有不同层面的了解机会,同时为你提供足够的空间。
深度可定制系统
Vim/Emacs的精髓在于:“可以调教”,本来不顺手的东西,只要容易调教,假以时日,都会慢慢变得越来越顺手,越来越“懂你”,越来越“贴心”,以至于后面大家都离不开它了。而 Atom 也同样是一款容易被你调教的编辑器。先前给vim写过插件,给sublime写过插件,如今给Atom写过插件,横向对比下来,几个结论:
插件能做事情多少:Atom > Vim >> sublime
插件开发学习门槛:Vim > Atom > sublime
插件开发文档丰富:Atom > sublime >> Vim
Atom 的定制化程度远远高过sublime之类(不用实际看法,看看双方开发文档即可),直追 Vim / Emacs,sublime的大部分定制无外乎改改json,插件能做的事情相当有限。
Atom 的定制化系统主要有三方面:
1. 细致:
设计之初就考虑的事情,方方面面都能定制,见官方文档,以及插件:vim-mode,minimap (稍微了解下这两个类似的功能再 Atom 和 sublime的实现就能知道 sublime被甩了多少条街了)。可以细粒度的控制编辑器内所有行为,小到移动一下光标,删除当前一个字符,大到打开一个面板,比如 “core:more-up” 可以向上移动一行光标,“window:focus-pane-on-left” 可以把焦点设置到左边的面板,atom内核和大量第一方第三方packages 都是以命令的方式把基础功能提供出来,你可以随意互相调用或者设置热键。
除去命令外的API层面,几乎每个部件每个像素点都可控,比如这样的插件你永远无法再 Vim / Emacs / Sublime 下面见得到:activate-power-mode。
2. 直观:
由于使用 javascript/coffee进行开发,但 javascript/coffee是属于即便你没写过他们,读都能读得懂,VimScript就不一样了,虽然也能做相同的事情,但实话实说,晦涩难写,比如我要取得当前文件的路径和文件名,在 VimScript里面需要这么写:
let l:path = expand('%:p:h')let l:name = expand('%:t:r') 或者 let l:name = expand('%<')
而在 Atom 里我们用atom自己的功能直接取出路径来,然后进行切割:
var fullpath =atom.workspace.getActiveTextEditor().getPath();var filename = path.basename(fullpath);var filepath = path.dirname(fullpath);
就问大家一下?哪段代码更友好直观?你一眼就知道在做什么?你更愿意用按照哪段代码进行插件开发?是上面的VimScript?还是下面的 javascript ?
结论是很清晰的,Atom的 javascript开发插件更简单直观,即便没文档,看别人怎么写的自己也会了,同时灵活性大大高于VmScript,各种事件处理回调,javascript天生擅长做这些事情,还有第二行,第三行,我们用到了 node.js 的 path模块,进行文件路径切割。这样的写法,再VimScript 里面基本是无法想象的。
Vim是强大,但是毕竟是30年前的东西了,即便最熟练的 Vimer 也都承认 VimScript 的晦涩难懂,阻碍了很多人为其开发插件。而给Atom开发插件,只需要掌握javascript,掌握 javascript的人很多,学习了javascript你也可以用在很多地方。不像VimScript那样只能用在Vim里面,而正因为其晦涩,Vim新版本开始支持内嵌 python的写法:
python << EOF
import random
print random.randint(0,10)EOF
VimScript中 Python等动态的支持正是说明其开发维护者也承认 VimScript本身的古老,对比现代编程语言已经有些格格不入了,缺乏强大的描述能力,难以构建复杂的功能模块,才会去支持Python内嵌这样的写法。可大量的工作还是需要再Python之外完成,同时,并非所有平台自带的Vim都支持python,除了mac外,所有debian / ubuntu 发行版自带的Vim都不支持 Python。导致你想写一个通用的扩展还得判断下是否 has('python') 没有的话老老实实用 VimScript 去实现它,这不是折磨人么?
Sublime里面可以用原生 Python 写扩展,比 VimScript爽,但是 sublime 的插件能做的事情还不及VimScript的一半,所以怎么能指望他们能写出高端的功能来呢?
3. 强大:
Atom的内核 Electron (原来的 Atom-shell)可以理解成:Chromium + Node.JS,而整个Atom的界面,你可以理解成就是一颗 HTML 的 DOM 树结构,这意味着你可以这样:
var div = document.createElement("div"); div.innerText = "abc"; atom.workspace.addBottomPanel(div);
就可以简单的在 atom 里面增加一个显示对象,这意味着再给div加个 html的 onclick就可以实现GUI交互,界面上的对象随便写点html代码就可以控制效果,意味着你可以使用 jQuery 来为atom增加新面板,意味着你只需要写一个简单的 .css 文件就可以把 Atom 整个编辑器的外观给修改了。这在 Vim/Emacs 中是几乎不可想象的事情,sublime基本就别提了。
大量的前端开发技术和 Node.JS 基础模块供你任意使用,正是由于近年 Chromium / node.js 系列技术的成熟,和 Atom / Visual Studio Code 这类基于前端技术的客户端软件的成功,让我看到了客户端(桌面+移动)软件开发的新方向。
做VIM/Emacs不能做的事情
Vim/Emacs过去给人的映像是:几乎能做任何事情,确实如此,但毕竟是二三十年前的东西了,而他们一直坚挺到现在一方面是操作便利,更重要的是这么长时间还没有出现一款又开源又具备同样操作便利性和可扩展性的编辑器,所以Vimer, Emacser 们最乐意展示给别人看的就是他们又安装了什么插件,急于展示可以把 Vim / Emacs 装扮成了一个多像 IDE 的东西,而今天这个“可以做任何事情”的高度可定制特性已经被Atom所吸收并完全超越,就像 Atom 的开发blog:“ Introcing Atom” 上说的一样,对易用性和可展性 “决不妥协” :
We think we can do better. Our goal is a zero-compromise combination of hackability and usability: an editor that will be welcoming to an elementary school student on their first day learning to code, but also a tool they won't outgrow as they develop into seasoned hackers.
抛开易用性的这个 Atom 的明显优势不说,前面其实已说了不少 Atom 比 Vim/Emacs 更灵活强大的地方,可能有些人还有疑惑,不是说 Emacs “没有不能做的事情” 么?你看 Atom的面板里面可以嵌入一个 Terminal,Vim/Emacs一样可以嵌入啊,为何还说 Atom 比它强啊?
没错,Vim用久了会产生心理舒适区,多模式编辑使人神清气爽,命令化文本处理让你赏心悦目,但是受限于本身机制用久了会容易痛苦挣扎:虽然vim的各种扩展似乎什么事情都能做,但每个扩展却只能做到70分,总有那么30%的地方做不到位。所以用的时间长了,上半身爽的要死,下半身痛不欲生。。。。
Vim/Emacs即便大部分扩展功能也都可以称为“能用”,可几十年的历史包袱太沉,很多事情对他们来讲就是禁区,比如诡异的标签功能,容易误操作的buffer/窗口切换,缺乏异步机制,编译时间长只有傻等着,无法跟Atom一样边读代码,边运行程序看结果,对照输出结果和源代码找问题,连实现个内嵌终端都用了若干年,还实现的那么别扭。。。。。。。。。
这类硬伤有许多,再举个最简单的例子,minimap,就是 sublime那种大家喜欢的文档缩略图,这个现代编辑器必备的功能,谁能用 Vim/Emacs 实现一下看看?Atom 可以衍生出 Visual Studio Code 这样漂亮的编辑器,Vim/Emacs能衍生么?Atom可以随便用各种先进的前端技术,不当可以嵌 Terminal我甚至可以再 Atom 嵌入一个 js版本的 DOSBOX 玩老游戏《命令与征服》:
https://archive.org/details/softwarelibrary_msdos_games
Play DOS games online
当然这样并没有任何卯用,但是如果在 Atom里面内嵌一个浏览器,方便的实时预览html/css的效果呢?或者 Atom 里面内嵌一个 Markdown Previewer ,实时查看 Markdown 的效果呢?请问 Vim/Emacs 里怎么实现法?
Atom插件演示:markdown实时预览,左边写右边即时更新,100%兼容github的markdown语法
短短两年的时间,这么多优秀的插件,只想说,如今 Atom 作为 Vim/Emacs 的继承者和超越者出现了,所以社区对 Atom 的反应也是热烈的,看看下面一组数据,截止今天(2016年3月15日),Atom共有扩展插件 3500+ 个,发布不到两年的时间,这是什么概念呢?
Sublime的插件(Stats - Package Control)大概 3500+个,但是sublime发布了5年的时间。
Emacs 的插件大概有2900个,可Emacs发布到今天已经过去 25+年的时间。
Vim 的各种插件虽然有9000个,但是Vi/Vim系列的历史长达 30+年,是atom的15倍。
这就叫社区的活跃度的区别,为什么短短两年那么多开发者先后给atom贡献了各种高质量的扩展,为什么大家对atom的热情那么高?为何好多人接触了atom一段时间后都深深的爱上了它?这是有原因的。
再谈性能优化
很多人错误的觉得 Atom慢是因为使用了 JavaScript/Coffee 等 Web 技术,所以先天慢,其实这是个误区,即便使用 Web 技术它也还能快很多,同时再慢可以往C++层的 Electron 挪啊,这也是这几个版本优化的一些方向,基于 Atom 开发的 Visual Studio Code 可以那么流畅, Atom 性能优化空间还很大,了不起多参考下自己的儿子,同样开源的 vscode怎么做的。
同时 Atom编辑器1.0版本以来性能得到了很大的提升,主要是两个方面,一方面是js层的各种渲染优化,控件优化,延迟绘制,延迟加载,只绘制当前需要的东西等,另外一方面是将一些核心数据结构移动到 Electron 的 C++层,如今1.54版本性能较去年版本已经有了本质区别,运行时加载是慢些(但也比eclipse快很多),实际使用并没觉得不如别的编辑器,况且,js层的优化和C层的优化未来还有很大的空间可以进步。
不过我不太喜欢 vscode 使用 Typed Script 进行开发,用点标准技术不行么,Atom使用 JavaScript/Coffee 写的多爽,如今 Atom 正在准备慢慢的切换到 JavaScript 的新标准 ES6 上。其次 vscode 快是快在“做的事情少”,主要是可扩展性方面的努力远不及 Atom,插件机制相对弱智,所以 vscode 的社区如今还不是特别活跃,扩展也少,发布一年多只有差不多300+个扩展,远不如 Atom 的情况,如果 vscode 还是按照现有结构开发下去,可能永远不会拥有 Atom的灵活度,这样再未来就无法拥有各种丰富多彩的插件。
再说开源免费
UltraEdit 单用户版本价格: 79 美刀
UltraEdit 服务器版价格: 229 美刀(多人登录同一台服务器的桌面使用),企业版更贵
EditPlus 单用户版价格: 35 美刀,而且还只有windows版本,
Sublime 单用户版价格:70 美刀
TextMate 单用户版价格:48 欧元,而且还只有mac版本。
这些都是钱啊,可能你会说可以免费试用或者破解啊,是的个人可以,但正常来说sublime这些试用指不能拿来搞生产不能拿来工作的,个人你用用可以,但国外人家守规矩,不会乱用,这意味着失去一大批为其开发扩展的国外开发者,同时站在公司考虑IT方案的角度,免费试用和破解将来都是潜在的麻烦,现在上百人的公司微软都会来收windows的钱了,版权问题越来越严肃,你得把这笔潜在费用考虑进去,同时这些闭源的或者单平台的东西,并不值得再上面花费过多精力和投资。
抛开扩展性问题和价格问题,我们再来看各个热门的免费编辑器的试用情况:
Notepad++:免费,开源,只能运行于windows
PSPad:免费,不开源,只能运行再 Windows
Gedit:免费,开源,只能跑再 GNome下,Ubuntu用用,Windows/mac版本简直是残缺的。
Programmer's Notepad : 免费开源,只能跑 Windows
Notepad2:免费bu不开源,只能跑 Windows
更关键的是:闭源的东西个人作者可能失去兴趣不再更新,商业公司的话,你需要一个功能,就只能无限期的等待他们发慈悲加入进去。而免费开源的很多其他编辑器除去平台兼容性问题外,更重要的时扩展性差。
而同时满足:免费+开放+强扩展性的编辑器如今就只出现过三个:Vim / Emacs / Atom。他们是真正属于使用者的编辑器,他们能变成使用者希望变成的样子。这些曾经出现过得收费的或者免费的编辑器,凭借着一两个自身独有的 “卖点”,再某些时间段内都曾经流行过,可就像流星一样一闪而过,如今他们都统统完成了自己的历史使命,新的一页可以翻开了。终端环境的话确实 Vim / Emacs 继续下去,但桌面环境的话,Atom将会继续向前,走出新的一步。
5. 代码和编译程序是用什么软件
你是用什么系列单片机的?绝大部分要都是用KEIL来编写的。在KEIL里面既可以用汇编来写也可以用C语言来写,你写完了程序之后还可以在KEIL里面做软件的仿真,这种软件查错的方法给程序员带来了极大的方便。
除此之外还可以用KEIL与PROTEUS联调~~~~
个人强烈建议用KEIL来写单片机的程序
6. 什么软件可以直接进行代码的编译运行
这个要看你用什么语言了,不同语言都有不同的编辑工具
如visual studio
7. 什么是编译器
编译器
编译器是一种特殊的程序,它可以把以特定编程语言写成的程序变为机器可以运行的机器码。我们把一个程序写好,这时我们利用的环境是文本编辑器。这时我程序把程序称为源程序。在此以后程序员可以运行相应的编译器,通过指定需要编译的文件的名称就可以把相应的源文件(通过一个复杂的过程)转化为机器码了。
[编辑]编译器工作方法
首先编译器进行语法分析,也就是要把那些字符串分离出来。然后进行语义分析,就是把各个由语法分析分析出的语法单元的意义搞清楚。最后生成的是目标文件,我们也称为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),如何合并几句代码成一句等等。
8. c++编程的文本编辑器和编译器有什么区别
编译器是把你的代码(高级语言)解释为CPU指令的一种程序。
你说的这个文本编辑器应该是开发环境,编辑器就是帮助你写出正确语法的代码、设置工程属性的一个环境。
9. APP源码要用什么工具编译
sourceinsight是个代码浏览工具,它会自动对你的工程源码进行语法分析,方便你迅速查找对某个特定符号的引用。它本身不带编译器调试器,但是你可以指定要用的编译器,记得sourceinsight里有这个选项。1、->Removemissingfilefromproject选上可以避免因文件找不到而弹出错误对话框。把Misc->Usestricterconfirmationdialog选项去掉可以使确认时不输入"yes"。2、TypingSourceEditing->Indentcommandsaffect#-preprocessorstatements。去掉后(默认值),进行多行缩进时不会影响预处理语句(如#if#endif)。AutoCompletion->Usedetailedcompletionwindow,选上后,联想时可以出现该函数的详细信息。见下图:(简单)(详细)AutoCompletion->Insertparemetersforfunctions,去掉后,自动联想不会把整个参数都输出到当前行。BrowsinginLists->Matchsyllableswhiletyping(slower)。在symbollist框检索符号时是否采用音节匹配方式,如对于函数FindNext,输入find或者next都可以找到该函数。该功能可能导致反应缓慢(视工程和机器配置而定),建议关闭,因为即使在关闭状态下也可以通过先输入空格再输入单词来动态启用该功能。注意BrowsinginLists里其实有两个功能,但一般我们只能看到Matchsyllableswhiletyping这一条,应该是si的菜单设计没有做好,导致在中文windows下不能显示全,另一个功能是Matchmemberswhiletyping,用于打开/关闭按成员变量名来检索类/结构体的功能。3、FilesOpeningFiles->Sharing:Letotherprogramsmodifyfiles,以共享方式打开文件,这个很重要,保证可以在其它编辑中同时编辑该文件。典型的场景就是用ide环境去动态编译调试,而用si静态阅读。Customize'Open'Command,用于设置Ctrl+O打开的页面,默认选项是,建议保持默认。SavingFiles->,如果发现保存后就不能undo了,请检查该选项是否选中。。保存时自动去除每行尾部的空格和tab。建议选中。4、Languages自定义其它编程语言的语法解析,这个还是另写一篇来讲吧。ConditionalParsing不要错过了,这里的Conditions功能实在让人喜欢。Conditions是什么意思呢?我们的代码中一般都会有一些开关宏,通过在Conditions中配置这些宏的默认值,可以让si把配置为不开启的宏视为无效代码,从而不进行符号检索。如果源代码中的开关宏太多,还可以使用ConditionParsing中的ScanFiles来自动找出所有开关宏。5、SymbolLookups没太多特别的。6、Display显示配置和个人喜好和显示器的状态有关,偶用的x60小本,屏幕资源有限,所以在DisplayElements里把ProjectWindow,StatusBar,ToolBar,ClipWindow都关了,基本用快捷键可以代替它们。Options->。很多大师都教导我们说一行不要写太多代码。在这个指导思想下,我们不需要这个东东。Showexactcaseoffilenames。如果看不惯si把所有的文件名首字母都大写就勾上这个选项吧。。SourceLink很多时候用于外部命令输出结果的解析(如Make,lint),这个功能会把解析结果与目标窗口自动tile,很实用。Trimlongpathnameswithellipses。这个建议不要选中。事实上这个主要影响标题栏,但一般来说标题栏上的空间是充裕的,选上之后往往会令我们不知道所编辑文件的具体位置。
10. C语言的代码编辑器怎么用
C语言的代码编辑器一般使用UE,以下介绍UE的使用方法:
1、在UE上用的最多的是c语言,这里,就以c语言作为参考,看看UE的强大的操作功能。打开一个c语言文件。文件-- 打开--选择。
2、这个时候,可以看到它的函数功能和上面的快捷方式的图标是可以使用的。函数列表可以在视图--视图列表--函数列表中找到。
3、然后,可以使用ue的查看方式,这里是默认为c语言格式,还可以设置为c#,java等格式,这样可以把部分信息高亮显示。还可以在:视图 --- 查看方式-----编码方式中找到。
4、比较功能和16进制功能,这个是很强大的工具。因为,在上线的时候,不知道修改了什么就可以使用这个进行查看,还有,在linux下炒作的时候,16进制就可以看到文件中的字符编码,找到最终的错误原因。
5、还有就是ue的列模式,这个模式对于编程来说,简直逆天,当有些数据需要进行修改的时候,只是改某些列中的部分,这个就非常好用了。直接修改多列。这也是ue的一个特色吧。
6、强大的ftp功能,一般可以使用ue直接在ftp服务器上直接编辑文件,然后,直接保存在服务器上,这样呢,可以减少代码的本地管理和版本控制。
7、普通文件操作可以在快捷方式中使用新建,保存等功能,可以使用字数统计功能,具体的字数在状态栏中有显示。