编译器的八大功能模块
❶ 典型嵌入式linux软件部分由哪些模块组成他们的功能及相互联系 Bootloader分为哪两阶段分
典型的嵌入式系统,软件部分从下到上,分别是boot,kernel,rootfs,fsimg和上层应用。
起到的作用分别是,引导内核,启动内核,挂载根文件系统,挂载实际文件系统,开启上层应用主循环。
你问的这些问题,每一点都可以单独拿出来,长篇大论的讲很久了。建议去网上先看相关的资料。贪多求快是不好的,一个知识点一个知识点的掌握。
1.
GCC
大名鼎鼎的GNU的C/C++/Obj-C编译器,
当前版本是2.8.1,
但据说与2.7.*有兼容性
问题.
而使用较广的是gcc
2.7.2系列,
如RedHat5中带的就是gcc
2.7.2.3
有时候在Cyrix上用gcc会有些问题,
因此有一套针对Cyrix特点的gcc
2.7.2.3
我这里有RedHat5的rpms
ftp://166.111.68.98/pub/Warez-CD/Huricane-contrib
(Cyrix
2.7.2.3
&
2.8.1)
其基本结构就是一个front
end和back
end,
/usr/bin/gcc
就是个front
end,
其kernel东西都放在
/usr/lib/gcc-lib下面,
cpp是C预处理器,
cc1*的1M多的就是编译器的核心模块了
cc1
C
compiler
cc1plus
C++
compiler
cc1obj
Object-C
compiler
但gcc并没有集成Fortran的compiler,
一般要用f2c转成C后才用gcc编译
好象也还有个g77
Fortran
compiler吧?
gcc的不断发展完善使许多commercial
compiler都相形见绌,
那当然,
gcc/emacs
都由GNU创始人Richard
Stallman手创,
是GNU的旗舰产品,
质量当然没得说了:-)
由于
Unix平台的高度可移植性,
gcc几乎在各种常见的Unix平台上都有,
即使是
Win32/DOS也有gcc的port.
比如说该死的Solaris普通版本连compiler都没有,
也
就只好用gcc了...
2.
EGCS(Experimental/Enhanced
GNU
Compiler
System)
这是gcc的发展方向,
把fortran等编译器集成进来,
也许还会有Pascal?
它的构造很清晰,
把对gcc的各种改进/port都集成回去.
如gcc
2.7系列据说是
没有对Pentium进行优化的,
而egcs则把pgcc对Pentium的一些优化集成进去了
现在gcc的开发工作主要就是egcs,
由Cygnus公司领导(?),
这Cygnus公司还是很
不错的,
还出了GNU-Win32,
SourceNavigator等,
是GNU的坚实拥护者:-))
http://egcs.cygnus.com
包括了C/C++/Obj-C/Fortran
编译器,
当前最新版本1.0.2,
还在不断开发中
昨天download发现KDE
Beta4都用egcs编译了
:-)
Fortran集成进来后在/usr/lib/gcc-lib下又多了个f771的back
end,
当然
还是g77/f77
编译
我这里有egcs
1.0.2
的rpm
在RH5-CD/collect下面
3.
PGCC(Pentium
GCC)
http://www.gcc.ml.org
针对Pentium
CPU进行了编译器优化的compiler
pgcc据说用JPEG压缩解压缩测试最快可比gcc快
30%!
新版的pgcc都是基于egcs的,
以一个patch的形式release
❸ 编译器如何确定源代码的有效性
编译器使用词法分析、语法分析和语义分析三个程序功能模块检验源程序是否符合相关规则,符合无错就认为是有效的。
编译器使用目标代码生成程序功能模块生成目标代码,生成过程依据语法分析生成的语法树和语义检查及转换规则,保证生成的目标代码与源程序的算法功能等价。
目标文件与源程序算法功能是等价的,当然具有你说的算法特性。算法依靠指令的选用、指令的顺序及存储空间的使用来实现。没有顺序就没有算法。
❹ 计算机程序开发中都哪些常用的模块呢
包管理库提供了从 L ua 中加载模块的基础库。只有一个导出函数直接放在全局环境中: require。 所有其它的部分都导出在表 package 中。
1.加载一个模块。 这个函数首先查找 package.loaded 表, 检测 modname 是否被加载过。 如果被加载过,require 返回 package.loaded[modname] 中保存的值。 否则,它试着为模块寻找 加载器 。
2.require 遵循 package.searchers 序列的指引来查找加载器。如果改变这个序列,我们可以改变 require 如何查找一个模块。 下列说明基于 package.searchers 的默认配置。
首先 require 查找 package.preload[modname] 。 如果这里有一个值,这个值(必须是一个函数)就是那个加载器。 否则 require 使用 Lua 加载器去查找 package.path 的路径。 如果查找失败,接着使用 C 加载器去查找 package.cpath 的路径。 如果都失败了,再尝试 一体化 加载器 )。
3.每次找到一个加载器,require 都用两个参数调用加载器:modname 和一个在获取加载器过程中得到的参数。 (如果通过查找文件得到的加载器,这个额外参数是文件名。) 如果加载器返回非空值, require 将这个值赋给 package.loaded[modname]。 如果加载器没能返回一个非空值用于赋给 package.loaded[modname], require 会在那里设入 true 。 无论是什么情况,require 都会返回 package.loaded[modname] 的最终值。
4.如果在加载或运行模块时有错误, 或是无法为模块找到加载器,require 都会抛出错误。
一个描述有一些为包管理准备的编译期配置信息的串。 这个字符串由一系列行构成:
第一行是目录分割串。 对于 Windows 默认是 '' ,对于其它系统是 '/' 。
第二行是用于路径中的分割符。默认值是 ';' 。
第三行是用于标记模板替换点的字符串。 默认是 '?' 。
5.第四行是在 Windows 中将被替换成执行程序所在目录的路径的字符串。默认是 '!' 。
第五行是一个记号,该记号之后的所有文本将在构建 luaopen_ 函数名时被忽略掉。 默认是 '-'。
这个路径被 require 在 C 加载器中做搜索时用到。
用于 require 控制哪些模块已经被加载的表。 当你请求一个 modname 模块,且 package.loaded[modname] 不为假时, require 简单返回储存在内的值。
这个变量仅仅是对真正那张表的引用; 改变这个值并不会改变 require 使用
让宿主程序动态链接 C 库 libname 。
5.当 funcname 为 "*", 它仅仅连接该库,让库中的符号都导出给其它动态链接库使用。 否则,它查找库中的函数 funcname ,以 C 函数的形式返回这个函数。 因此,funcname 必须遵循原型 lua_CFunction (参见 lua_CFunction)。
6.这是一个低阶函数。 它完全绕过了包模块系统。和 require 不同, 它不会做任何路径查询,也不会自动加扩展名。 libname 必须是一个 C 库需要的完整的文件名,如果有必要,需要提供路径和扩展名。 funcname 必须是 C 库需要的准确名字 (这取决于使用的 C 编译器和链接器)。
这个函数在标准 C 中不支持。 因此,它只在部分平台有效 ( Windows ,Linux ,Mac OS X, Solaris, BSD, 加上支持 dlfcn 标准的 Unix 系统)。
❺ asd集成开发环境中包括什么编译器
asd集成开发环境中包括编译器代码编译器、调试器、图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。所有具备这一特性的软件或者软件套(组)都可以叫集成开发环境。如微软的Visual Studio系列,Borland的C++ Builder、Delphi系列等。该程序可以独立运行,也可以和其它程序并用。
每个IDE的针对性不同,承载的编译器不同,不同的语言有时需要不同的IDE,这里介绍几个常用IDE。
❻ 开发C语言的编译工具有哪些,各自的有什么特点
现在已经没有纯C语言的编译器了,都是用的C++编译器,由于C++兼容C,所以使用C++编译器,常用的有visual studio里的VC++编译器,DEV C++编译器,C++ bulider编译器,建议使用前2个,VC++功能强大,可以编译所有的windows程序,但是过于复杂,模块多,体积大,不宜学,但是学好了前途(钱途)无量,DEV C++是个标准的C++编译器,只有C++的基本功能,只能编写win32程序,win32控制台程序,DLL动态链接库,没有VC++提供的强大的类库支持。许多事要自己来完成。
❼ Emacs有什么优点,用Emacs写程序真的比IDE更方便吗
一个IDE无非包括如下一些功能模块:
一个编辑器;
一个编译器;
一个调试器;
其它一些辅助功能,比如用鼠标拖控件。
什么是最好的IDE?那肯定是
最好的IDE = 最好的编辑器 + 最好的编译器 + 最好的调试器有哪个IDE做到这一点了吗?只有Emacs。Emacs可以很方便地调用世界上最牛的编译器(gcc),和调试器(gdb)。也许你会说“Emacs不能拖控件啊”,没错,但在我看,拖控件并不总是一个受人欢迎的功能,至少在系统编程的时候,它毫无用处。
而
且,从学习的角度来说,“用鼠标编程”绝对是一个非常恶劣的习惯,因为这根本就是在逃避学习。“鼠标化的IDE”隐藏了很多学生应该了解的技术细节。鄙学
院的绝大多数学生居然不知道C程序是要编译之后才能运行的,他们以为写好了程序,只要“按那个“感叹号”按钮”就可以了。这就是“鼠标教学”的成果(你肯
定知道C编程这门课不归我管)。Emacs可以帮助你克服“鼠标依赖”,强迫你熟练地使用键盘。
更重要的是,Emacs不只是个IDE,
它是个ICE(Integrated Computing
Environment,这名字是我刚编出来的)。Emacs的设计目标就是,你装了个Unix或者Linux系统,不需要装任何其它软件,只要装一个
Emacs就够了,它能帮助你完成所有的任务。也就是说,除了编程,你还可以用它写论文、做幻灯片、浏览网页、收发邮件、聊天、听歌、看照片、玩游戏……
目前,好像除了直接在Emacs里看电影还不行,其它的都实现了。
Emacs如此“大一统”的设计目标显然有违Unix的设计原则,do
one thing, and do it well. 但好在Emacs是模块化的,它的每一个功能模块都绝对遵循do one thing,
and do it well原则。你不喜欢那些功能,可以不装它。
另外,还是从学习的角度来说,Emacs的学习曲线貌似比其他IDE要长不少,但是你
不必学习VC去写C/C++,
不必学习eclipse去写Java,
不必学习MS-Word去写报告、幻灯片,
不必学习……
一句话,“Everything Emacs”,可以省下大量不必要的学习时间。人生苦短,何必让你的生活被 VC/eclipse/MS-Word 搞得头昏脑胀呢? 简单而强大,本就是计科专业学生和非专业学生应有的不同 。
Emacs
绝对强大,但是否“方便”就不好说了。因为“方便”是一个很主观的概念。反正,作为一个18年的老用户,我肯定觉得方便。其他IDE太无聊了,那么花哨而
庞大的东西,却只适用于应用层编程。既不能用来写论文,又不能做幻灯片,更不能用来听歌、玩游戏。生活也太没有乐趣了。
最后一点,Emacs还是一个巨大的开放社区,在这里你能结识到更酷一些的程序员。
Emacs入门还是很简单的,它自带了一个基础教程。打开Emacs,按 Ctrl-h t , 教程就出现在你面前了。照着它边看边练,英文不太困难的话,一个小时应该可以走一遍了。之后,
Ctrl-h i m emacs就可以调出详细的Emacs使用手册;
Ctrl-h i m emacs lisp intro 可以调出Emacs Lisp入门教程;
Ctrl-h i m elisp 可以调出完整的elisp编程手册。
当然,Google永远是你最好的帮手。
❽ 编译器的功能是什么
1、编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。一个现代编译器的主要工作流程:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器(Linker) → 可执行程序 (executables)。
2、工作方法:
1)、首先编译器进行语法分析,也就是要把那些字符串分离出来。
2)、然后进行语义分析,就是把各个由语法分析分析出的语法单元的意义搞清楚。
3)、最后生成的是目标文件,也称为obj文件。
4)、再经过链接器的链接就可以生成最后的EXE文件了。
5)、有些时候需要把多个文件产生的目标文件进行链接,产生最后的代码。这一过程称为交叉链接。
❾ C语言编译器有哪些各有什么特点
C语言编译器目前主要有VC++、dev-C++、C-Free、win-TC、TC 2.0等等。
其中比较经典的VC++,微软的产品,编译器,链接器,运行,调试等功能于一体的强大开发工具,特点是功能十分强大,对于新手来说需要一段时间去摸索。
dev-C++是windows下一款开发c/c++的开发环境,使用gcc为编译器,遵循标准,功能比较强大,语法高量,可以进行单步调试(这对排除错误很重要),进行断点设置等功能,遵循C标准,是一款很强大的开发工具。
C-Free是一款支持多种编译器的专业化C/C++集成开发环境(IDE)。利用C-Free,使用者可以轻松地编辑、编译、连接、运行、调试C/C++程序。
TC 2.0:Borland公司的产品,在dos界面下编译运行,小巧、灵活,但是不能使用鼠标。
win-TC:在tc2.0的基础上加上了界面,能够使用鼠标,具有语法高量,可以嵌入汇编等特点,对新手一些,拜托了不能用鼠标的困难。
编译器,简单讲,就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。一个现代编译器的主要工作流程:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器(Linker) → 可执行程序 (executables)。
❿ c语言是干嘛的
C语言是用来编写系统的。
最开始,人们手里除了机器码就是汇编,没有别的语言。但是汇编有很多硬件相关的特性,可移植性差。贝尔实验室要解决这一问题,就研发了C语言。
C语言可以跨平台,一份代码,配上不同的编译器就可以在各大电脑上运行。除此之外,C语言效率惊人,在某些情况中,如果汇编水平中等以下,编出来的汇编甚至没有C语言生成的机器码快。
现在,NOIP(现更名为CSP-J和CSP-S)仅允许初赛和复赛使用三种语言:Pascal、C、C++,C语言的重要性不言而喻。
虽然迈入了互联网时代,但是C语言的地位也没有低到可以忽略。C语言在对空间和时间要求较高的设备(如嵌入式设备)中发挥着重要功能,也可以编写各大语言的编译器,有着比较重要的地位。
