阅读更多

8顶
4踩

编程语言

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

2009-04-17 09:34 by 见习记者 RednaxelaFX 评论(3) 有5020人浏览
在我以前的一篇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
这是干嘛的呀~!~

发表评论

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

相关推荐

  • C# windows服务带托盘

    经常的我们会在windos系统中注册某些重要的应用型服务,需要开机就自动运行,因为服务是没有界面的,我们想看见他的运行状态就需要打开管理-服务和应用程序...,如果服务有日志记录还要打开这个服务的执行程序的目录查看日志文件,比较繁琐,今天我通过自身的经验发布一个通用的服务控制程序,可以方便的在托盘查看服务状态,控制服务,打开服务执行程序路径,并可以设置服务属性.只需要在App.config 里填上服务名称即可

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

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

  • windows服务+托盘控制程序

    最近写windows服务需要有界面交互,反复查阅资料发现windows服务中是无法做界面弹出的。 最后敲定方案为:windows服务+子进程 的控制方式,其中windows服务中运行服务处理事务,在子进程中弹出界面进行交互操作,界面进程由服务进行创建,并随服务停止而消亡。其中有几个技术要点,在这里做下简单记录(其中系统托盘的创建依赖于窗口,使用比较简单,在这里不再赘述): 1.创建需要同界面交互

  • 创建带自定义右键菜单的Windows系统托盘图标

    本文还有配套的精品资源,点击获取 简介:本开发项目演示了如何在Windows系统托盘区域添加自定义右键菜单功能,通过使用Visual Studio 2008和Win32 API。开发者上传了包含自定义注释的代码至CSDN,以便初学者理解和学习实现系统托盘图标及右键菜单。项目涉及的知识点包括Win32 API的使用、消息处理机制、菜单创建与管理、资源管理以及可能用到的MFC库...

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

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

  • 《完美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

  • C++简单的Windows服务+托盘控制程序例子 VS2017 + windows10 x64 亲测可用。

    C++简单的Windows服务+托盘控制程序例子 VS2017 + windows10 x64 亲测可用。

  • 隐藏Windows系统托盘图标

        曾经写过一篇Windows下的任务栏图标编程,其实那篇文章讲的是如何将我们自己的程序最小化到托盘并进行操作的编程方法。前两天看到论坛里有人讨论如何隐藏托盘图标,记得从前为朋友写过一个隐藏大智慧软件的程序,采用的方法就是将窗口最小化并隐藏大智慧在托盘上的图标,但是因为涉及到键盘钩子,最后并没有这么做,而是用添加一个虚拟桌面的方法达到了效果。    看到这篇帖子,依稀想

  • windows系统托盘显示

    windows系统托盘显示,在windows显示托盘图标。

  • windows系统托盘及托盘菜单

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

  • Win32 API 实现系统托盘程序

    托盘程序就是运行在系统托盘区域的程序,显示为桌面右下角显示区域的一个小图标。通常托盘程序带有几种功能:托盘菜单,托盘图标,气泡提示,托盘提示。例如QQ收到消息后,会在系统右下角显示闪动QQ图标。 主程序Tray.cpp #include <windows.h> #include "resource.h" #define WM_TRAY (WM_USER + 100) #def...

  • Windows获取系统托盘图标

             对于Win7系统,程序的托盘图标最终是放置在和XP一样的ToolbarWindow32工具条窗口,但是有两个地方,同样是ToolbarWindow32工具条窗口,父窗口是不一样的。在右下角可见区域,ToolbarWindow32工具条窗口的父窗口是SysPager窗口,遍历方法同XP一样。对于掩藏的ToolbarWindow32工具条窗口,必须通过点击桌面右下角的可见区域左边的...

  • Windows 中透明窗体与系统托盘实现详解

     自从windows2000起新的windows系统都支持,透明窗体这一特性,这个特性在windows系统上用VC编程实现起来非常简单下面我就具体来介绍一下具体的实现步骤.以MFC对话框程序为例其它依原理类推.在对话框的OnInitDialog()函数中加入如下代码    SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,     

  • Windows系统托盘

    _NOIFYICONDATA结构体 //系统定义的结构体 typedef struct _NOTIFYICONDATA{ DWORD cbSize;//以字节为单位的结构体大小 HWND hWnd;//接收托盘图标通知消息的窗口句柄 UINT uID;//应用程序定义的图标ID号 UINT uFlags;//图标属性 UINT uCallbackMessag...

Global site tag (gtag.js) - Google Analytics