当前位置:  软件>C/C++软件

析码多目标编译器 Semo Compiler

    来源:    发布时间:2015-01-20

    本文导语:  析码多目标编译器 析码是由突壳开源开发的一个多目标编译器(国产编译器、产品级编译器、开源),基于独特的的架构设计使得该编译器在“语言”跟“目标机”的兼容性方面性能突出。项目在二零零八年二月发起,前后经过...

析码多目标编译器

析码是由突壳开源开发的一个多目标编译器(国产编译器、产品级编译器、开源),基于独特的的架构设计使得该编译器在“语言”跟“目标机”的兼容性方面性能突出。项目在二零零八年二月发起,前后经过两年的开发其整体架构已经成型,此前,突壳以一个C99前段,跟ARM体系后段发布了一个初步的演示版本,演示版本中已经可以将C语言代码编译成可以在ARM平台运行的ELF软件包。从最初的高级语言源代码到最终二进制的产生,析码由突壳开源完全自主的一个编译平台,其中的技术与代码完全来源于狂热的开发组成员,为了保证完整性,析码的开发没有使用任何第三方代码。

架构方面,“析码”的架构被划分为“前”、“中”、“后”三个段落。首先在代码上,段与段之间没有任何关联,基于这个特性,我们可以在最大可重用前提之下,使析码支持n中语言,n种机器。语言相关的部分被划分到了“前段”,而与机器相关的部分被划分到了“后段”,中段是跟具体某个语言或某型号机器无关的部分,它被完全重用了。任意语言之间有个共同点,就是前段非常地接近,这种接近是指有对应的单位可以相互转换,例如“函数”、“循环”、“条件语句”等等,忽略掉语义层的差异,不同类型的语言之间在词法跟语法上对应的单位可以等价地转换。在析码的架构中,这些语言相同的部分,或说它的相关性被隔离在了“前段”,让其某组分析器作为组件存在,这在很大程度上提高了析码编译器的语言兼容性。后段方面,硬件体系部分也是大同小异,如果把范围缩小到最小,那些差异仅仅局限于“指令集”之上,指令集抽象出来作为后段的一部分,使析码在代码生成初期不去关心具体体系,后期只需要简单地将中间形式其映射到某体系即可,如此,在更换目标机器时,只需要替换一下映射函数,提高了机器兼容性。在中段部分,它完全独立于任意语言,任意机器,它是一个纯粹的抽象模块,由抽象语法、抽象代码构成。

析码“0.3.0”特性
  • 符合C99标准的“预处理”、“词法分析”、“语法语义分析”模块。
  • 高度通用的抽象语法,可描述多种不同类型的高级语言。
  • 基于“SSA”的抽象代码。
  • 基于“York-Town”模型的寄存器分配器,高效且设备无关。
  • 支持“stdcall”、“cdecl”、“fastcall”、“armcall”,全面兼容“VC”、“GCC”、“ARMCC/TCC”等主流编译器。
  • 兼容“ARMv6体系”的汇编器“Semo Assembler”,可以独立使用。
  • 兼容“ARMv6体系”的动态链接器“Semo Dynamic Linker”,支持可重定位式“ELF”的加载与链接。
选择析码您将收获
  • 对于在校学生,析码具有完整的文档系统,它是你最佳的学习环境。
  • 对于学术研究者,突壳社区会提供全面的技术支持,可以保证你在最短的时间内搭建试验平台。
  • 对于工程开发人员,析码编译器可以提供高效的工作效率。于此同时,突壳社区还提供前后端定制服务,降低您的生产成本。
参与项目您将收获
  • 对基础软件技术全维度认识。
  • 产品级编译器开发经验。
项目历程
  • 2008 - 2009 Semo C()mpiler 0.1.0
  • 完成了一个实验性的C语言前端。
  • 2009 - 2010 Semo C()mpiler 0.2.0
  • 基本架构完成,发布第一个可以编译版本(编译出二进制)。
  • C语言前端 15%。
  • 抽象语法 99%。
  • 第0层抽象代码 99%。
  • SSA 99%。
  • ARMv6汇编代码生成器 10%。
  • ARMv6汇编器 10%。
  • ARM-ELF动态链接器 100%。
  • 2011 - 2012 Semo C()mpiler 0.3.0
  • 完成寄存器分配模块。
开发团队
  • 王全伟 突壳开源
几个问题
  • Q:目前突壳的这个项目,对于未来的发展,团队有没有大体的计划和展望?
  • A:这是一个基于GPL协议的项目,团队也是以社区这种模式在做。其它更深远的不好说,因为项目还是比较前期的,现在说一些很不实际。
  • Q:和比较成熟的国外一些开源软件比较,析码有哪些优点?
  • A:在技术方面,析码的架构绝对称得上优良,这是重要的基础。只是这个架构还很年轻,需要慢慢发展,路子比较长。
  • Q:目前对于工具的使用上的指导文档较少,对于一个刚刚接触到这个项目的新人,如何让我们花更少的时间,对整个编译器有个直观的认识?
  • A:析码有一套非常完整的文档系统(wiki,pms,blog,bbs),部分内容以后会开放出来的。
  • Q:这个项目的发起是出于兴趣还是工作需要呢?
  • A:开源社区的组织结构是比较松散的,兴趣爱好是很关键的一点。
  • Q:已经有一些开源的编译器了,为什么要自己做呢?析码怎么跟它们竞争呢?
  • A:维护别人代码是很痛苦的,而且很难将其完全掌控。竞争现在谈不上,突壳把析码做了一个基本的原型(C前段+ARM后段),其它的就要靠社区靠大家的力量了。
  • Q:析码会考虑兼容其它语言吗?或者基于它设计一门新的语言?
  • A:C前段+ARM后段的原型会作为析码的主干版本由突壳维护下去,其它版本会放到社区去做。
  • A:析码是一个编译平台,特点在于源语言跟目标机的兼容性方面,理论上基于析码设计一门语言只需要实现一个该语言的front-para就可以,同时对于这种需求我们会提供相应技术支持的。
  • Q:目前国内MCU企业,无法独立生产的关键因素是没有编译器的支持,析码以后会有这方面的支持吗?
  • A:如果有这方面需求,我们很希望能与厂家展开深入合作。从技术上来说,让析码支持某种芯片只需要实现“back-para”:主要包含汇编器、链接器,在这方面突壳已经具备成功案例。

    
 
 

您可能感兴趣的文章:

  • 交叉编译的文件在目标板无法执行
  • 菜鸟问题, GCC 编译出的目标码中函数前面有没有下划线呀?
  • 无权运行在SUSE里编译后的目标文件?
  • linux eclipse 编译c++ 没有规则可以创建目标 是怎么回事?
  • 救命了!谁给讲讲针对一块目标板定制和编译Linux内核的过程啊?
  • make编译成功之后怎么不能运行目标文件?
  • 想通过交叉编译把open dpi移植到mips64目标平台上,新手求教??
  • 请教各位高手如何控制Makefile里目标的编译顺序
  • 交叉编译的 app 放到目标板上 运行 -/bin/sh: XXX: not found
  • 请问:对于目标文件的编译中,有a.h, b.h, c.h, a.cpp, b.cpp, c.cpp中,a.h中include 了b.h, c.h
  • 交叉编译后得到的KO文件在目标板加载失败(十万火急)
  • 请教做过将linux移植到arm9上的大虾,在pc的linux下成功的tcp客户端代码交叉编译后,通过网线下到目标板就无法连接到pc上的服务器端了。
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Spring 2.0 AOP概念及AOP代理,功能和目标
  • Makefile 如何判断目标是否 伪目标 ?
  • telnet登陆目标板之后 不能运行目标板自带的程序
  • 我刚看java,知道它的目标代码是解释执行的,目标执行速度快吗?
  • 在gcc里面,用哪个参数将几个目标文件链成一个大的目标文件(不是最终的可执行文件)
  • tar 的目标文件和源文件均在磁盘上,执行tar之后,用access判断目标文件是否存在,不一定会成功。
  • 我想做个目标机是PC的嵌入式LINUX,有shell界面,telnet即可(目标机硬盘是十多M的电子盘),主机平台是redhat linux 7.3,该如何??
  • Makefile 多目标
  • 目标管理系统 GMS
  • Makefile中目标的执行顺序
  • -fpic -fPIC 位置无关目标码???
  • 求解 Makefile 伪目标的疑惑
  • make中的目标变量
  • makefile中如何生成两个目标文件?
  • gcc生成什么样的目标文件?
  • 使用Vi编辑Makefile时,目标属性问题
  • 请问目标文件里左边的一排地址是什么意思?
  • makefile中目标后跟::甚么意思?
  • cc如何指定输出目标文件的路径?
  • 如何修改目标文件中的符号?
  • 怎样查找makefile下生成的最终的目标!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3