阅读更多

8顶
4踩

编程语言

原创新闻 Common Compiler Infrastructure(CCI)开源了!

2009-04-17 09:34 by 见习记者 RednaxelaFX 评论(3) 有5042人浏览
在我以前的一篇blog,LINQ与DLR的Expression tree(3):LINQ与DLR及另外两个库的AST对比里,我提到了Common Compiler Infrastructure(CCI)源自Project 7,用于为.NET平台提供一套实现编程语言用的公共基础设施。这套基础设施不但也用与编译器编写,也可用于代码分析、代码优化、代码生成等多种功能。FxCop就一直依赖于CCI来提供PE文件解析和写入的相关功能。Visual Studio中的代码分析功能也是基于CCI的特化版。.NET 4的Code Contract也在使用CCI……

2天前,这套类库终于公开发布了,而且是基于Ms-PL许可证开源发布了。此刻我难以压抑激动的心情。

CCI是在微软研究院Redmond的研究所的支持下,由Herman Venter宣布开源的。

目前发布了的CCI包括三部分,都是以source-only的方式发布的:
CCI on CodePlex:

Common Compiler Infrastructure: Metadata components
这部分提供了对PE文件及其中的元数据的操作,包括PE文件的读、写、遍历、转换等功能,也提供了一些反编译到源码的支持;同时它还包括对PDB文件的读、写功能。
使用过Mono.Cecil的同学可以考虑看看CCI对Metadata的支持是否能更好的满足需要。

Common Compiler Infrastructure: Code and AST Components
这部分提供了连接编译器前端与后端的桥梁,也就是对AST的支持。CCI包含了大量AST节点类型,可以支持大部分程序语言中设计的语法结构的语义。在编译器前端生成了合适的AST之后,CCI提供了后端支持将AST编译为IL,免除了编译器编写的一大痛苦。
这部分可用于替代CodeDOM原本的地位。

Common Compiler Infrastructure: Sample applications
这部分包含了一些使用CCI的例子,目前有一个Small Basic编译器。日后还会不断有新的例子加入。

其中CCI的主要文档都在CCI-AST的那个部分的Documentation目录里。

值得一提的是,CCI并不提供编译器前端的功能,也就是说词法分析器和文法分析器都不在CCI的功能范围内。但现成的解析器生成器非常多,随便挑一款与CCI配合都没问题。如果是像ANTLR一类有自己的AST类层次的库,可以在前端生成了AST后转换为CCI的AST,这样就能与CCI其余的部分联系上了。

相关链接:
Channel 9上关于CCI开源的访谈(3:33)
Research in Software Engineering Group based in the Microsoft Research Redmond Laboratory(RiSE)

P.S. 以前Colin老大问过CCI的获取方式和使用许可,当时我回复说只能从FxCop或者Zonnon获取CCI相关的程序集,但FxCop的许可里指明了其附带的CCI不得用于FxCop以外的用途,所以当时觉得很无奈。现在这玩意儿终于开源了啊 T T
8
4
评论 共 3 条 请登录后发表评论
3 楼 RednaxelaFX 2009-04-17 14:49
sinoyster 写道
对java有啥好处?

大概没什么直接的好处吧。由于整个CCI都以BSD风格的Ms-PL许可证开源,即便是Java社区也可以从中汲取经验就是了。.NET社区有许多库都是从Java移植过去然后再逐渐改进的,包括NUnit和Nibernate都是如此;反过来也未尝不可。
CCI-AST的部分与平台相关性不强,如果要借鉴移植到Java上难度不会很大,虽然Java这边已经有诸如JJTree之类的库也是与AST处理相关的。

P.S. 原来管理员能直接把论坛帖转发到新闻频道的啊……|||
2 楼 sinoyster 2009-04-17 13:28
对java有啥好处?
1 楼 whaosoft 2009-04-17 10:32
这是干嘛的呀~!~

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • windows服务+托盘控制程序

    开发windows服务时,使用共享内存机制和系统托盘应用程序进行界面交互,用于控制服务和显示服务的状态

  • 从Window系统托盘控制Windows服务

    VB.NET有许多内建的类,可以让我们轻松创建Windows服务程序,但如何轻松控制这些服务呢?一般是到管理工具里面进行控制。本文将描述如何创建一个运行在系统托盘里的程序来轻松控制一个服务程序。至于如何创建服务程序,可以参考.NET SDK或其它创建服务程序的文章,本文的例子利用IIS的W3SVC服务来做例子,来控制IIS的停止与启动。      要开发这样的程序,我们先打开Microsoft V

  • ObjectDock Tray插件:个性化系统托盘管理

    本文还有配套的精品资源,点击获取 简介:ObjectDock是一款Windows桌面美化工具,模仿Mac OS的Dock栏,为Windows用户提供直观便捷的任务管理和程序启动方式。其tray插件增强了系统托盘的灵活性,允许用户自定义托盘区域显示、隐藏以及图标的大小和布局。插件支持个性化定制、高效管理、托盘扩展、通知中心和快捷操作等特性,为Windows用户带来更美观、高效...

  • Windows用户态程序高效排错 -- 异常(Exception)和通知(Debug Event)

     理解操作系统对程序的反馈:异常(Exception)和通知(Debug Event)本小结首先介绍异常的原理和相关资料,再举例说明异常跟崩溃和调试是如何紧密联系在一起的。最后说明如何利用工具来监视异常,获取准确的信息。2.3.1  异常(Exception)的方方面面和一篇字字珠玑的文章异常是CPU,操作系统和应用程序控制代码流程的一种机制。正常情况下,代码是顺序执行的,比如下面两行

  • windows 服务与系统托盘之间的交互

    有的时候我们需要自己写服务,而且需要给绑定一个 托盘!用来更加方便的 控制我们的程序!例如 QQ 那种! 下面我来讲一下他们之间是怎么关联的!    有怎么几步!   1,自己写一个服务,(上一篇博客中有详细的介绍,可以去参考!)   2,桌面交互的配置            在serviceInstaller1_Committed事件中添加如下代码:             Conn

  • 编程控制windows防火墙的exception list.

     如果我们的程序需要访问网络,希望在安装的时候自动将我们的程序加入到 windows firewall的exception list中,以保证对用户的透明,这篇文章介绍了如果做。 Microsoft发布了一个helper dll来操作防火墙,给我们带来了很大方便: Windows Firewall for Game Developers http://msdn.microsof

  • android.os.DeadObjectException出现该怎么解决

    今天出现了android.os.DeadObjectException异常。那么DeadObjectException什么意思呢,字面意思当前对象“死”了,也就是没有了呗!那好首先来看看完全的log日志: 01-12 14:55:45.934 1240-1296/? W/WindowAnimator: Failed to dispatch window animation state change.

  • object expected出现错误怎么办

    今天在做项目的时候遇到一个非常之郁闷的一个问题,运行Web,出现object expected错误!,调式还调试不出是哪里出了问题,运行以前的项目也会出现这个错误!我非常之郁闷,在网上搜了好久,终于被我搜到了这个错误的解决方案,通过搜索这个错误,看见有很多人也遇到跟我一样的错误! 现在我讲解决方法贴出来。 重新注册组件jscript.dll试试 第一、打开电脑,选择电脑屏幕左下角“开始”...

  • 编写随Windows启动自动运行的程序

    通过设置和读取注册表,可以实现我们的应用程序随Windows的启动即可执行的功能。下面就是实现的代码:Form1.vbImports Microsoft.Win32.RegistryPublic Class Form1Inherits System.Windows.Forms.Form#region " Windows 窗体设计器生成的代码 "Public Sub New()MyBase.

  • windows系统托盘及托盘菜单

    window系统托盘及托盘菜单 下面是一个MFC写的wifi助手程序用于实现系统托盘的代码片段 void CWiFiAssistantDlg::OnClose() {  // TODO: 在此添加消息处理程序代码和/或调用默认值  ExitPtDlg exitPtDlg;  int varReturn = exitPtDlg.DoModal();  if(varReturn ==

  • Object和异常类

    一、Object类 Object类:是所有类的祖先类。 在重写equals方法的同时,一般也要重写hashCode方法。当且仅当两个对象变量引用同一个对象时,equals才返回真。相等对象必须具有相等的哈希值。 任何对象在装载到内存时都会自动生成一个有关类字节码class文件的对象,用object类对象的getClass()可获取到这个对象。同一个类产生的所有对象它们的class文...

  • 两种方法实现托盘功能

    1为了实现托盘功能,我们可以使用消息机制来进行实现 我们需要使用到windows的一个API函数:BOOL Shell_NotifyIcon( DWORD dwMessage, PNOTIFYICONDATA lpdata);其中dwMessage可以取以下值: NIM_ADD 向托盘中加入一个图标 NIM_MODIFY 修改托盘中的图标 NIM_DELETE 从托盘中删除一个图标 参数p

  • 《完美C/C++》创建windows系统托盘程序

    #include #define IDR_PAUSE 12 #define IDR_START 13 LPCTSTR szAppClassName = TEXT("服务程序"); LPCTSTR szAppWindowName = TEXT("服务程序"); HMENU hmenu;//菜单句柄 LRESULT CALLBACK WndProc(HWND hwnd, UINT messag

  • python ping命令 最小化_Python:程序最小化到托盘功能实现

    本文讲解如何装python的开发的命令行程序最小化到托盘的方法,并提供菜单操作功能。上个月使用python实现了一个多功能抓图工具,见《Python:一个多功能的抓图工具开发(附源码)》,此程序为一个命令行程序,windows下运行时会弹出一个cmd窗口,里面什么内容也没有,用户使用时直接按下快捷键进行操作。一直想着优化一下,今天想到是否以通过最小化到托盘,并提供菜单操作和快捷键操作两种方式,这样...

Global site tag (gtag.js) - Google Analytics