VB.NET动态编译(一)

原创 2003年06月20日 09:29:00

VB.NET动态编译(一)

目录

(一)            CodeDom是什么

(二)            VB.NET的动态编译实现

(三)            如何动态执行自己的代码

(四)            如何动态生成自己的DLL

(五)            如何动态生成自己的EXE

(六)            通过接口来实现高级调用

 

 

CodeDom是什么?

       大家都知道,.NET的所有语言,最终都编译成为IL来执行。IL的指令集是一种公开的,平台无关的语言。从理论上,任何人都可以写出IL代码的编译器,来把自己的语言编译为IL语言。只要知道IL指令集和.NET PE文件的结构就可以。

       但是这里面存在一个问题。.NET Framework在不断的升级,IL的指令集可能发生变化。可能会有新的,经过优化的指令来替代老的指令。比如新出现了MMX3DNOW之类的技术。微软可以通过优化IL编译器来让IL支持新的CPU指令集。同时,也许会推出新的IL指令集来直接支持新的技术。 那么,如何让编译器能够自动适应并产生相应的优化代码?

作为.NET的开发商,微软提出了.NET下的通用编译接口(CodeDom)。任何语言的开发商,只要实现了这个接口,就可以实现这个目的。

CodeDom把“语法分析”和“IL编译”分开来实现了这个目的。举一个例子来说,VB.NET的编译器,它的编译原理应该是这样的:

1.  VB.NET编译器读入源代码并进行有效性分析

2.  编译器把源代码翻译为“定义变量”、“方法定义开始(结束)”、“IF分支判断”、“调用方法”之类的抽象的底层方法调用(注意,并不是IL语言)。这些方法都在CodeDOM中定义。*

3.  编译器调用CodeDom的内置引擎,把这些方法编译成为IL代码。

你可以在ms-help://MS.VSCC.2003/MS.MSDNQTR.2003APR.1033/cpgenref/html/cpconcodedomquickreference.htm  找到CodeDom中的常用定义。

好了,到现在,你已经知道了VB.NET的编译原理了。不知道大家有没有注意到,VS.NET的所有语言,都在一个IDE内工作。那么,微软又是如何实现在一个IDE内部,集成了多个语法工具呢?答案就是:MS通过一组特定的接口来实现。

CodeDom内置了一系列的接口和基类,通过继承(基类)和实现(接口),就可以实现一个你自己的语法分析器。在System.CodeDom.Compiler命名空间中,你可以看到这些基类和接口。如果你想写自己的Pascal编译器,只要实现这些接口,然后写上一大堆VS.NET IDE的扩展模块,就可以让VS.NET来变成Delphi.NETJ

有趣的是,微软其中还包括了一个ICodeGenerator接口,我不太清楚微软为什么要定义这个接口,可能是为了调试器的需要。MSDN上说这个接口的目的用于将IL代码反向为自然代码。也就是说,如果编译器实现了这个代码,就可以把IL代码变成该编译器所支持的代码。通过这个接口我们可以将IL代码反向为VB代码(VB的编译器实现了该接口,C#的我不清楚,应该也实现了该接口)。

 

 

*这样写只是为了便于理解。实际上并不完全是这样,是结构化的。

 

 

 

Ps:这些东西只是我一个晚上研究CodeDOM的成果,如果你觉得和你的了解有所冲突,欢迎拍砖

 

 

编译器工作原理详解

第一篇摘自:http://www.21ic.com/app/embed/201103/79359.htm 1. 词法分析 词法分析器根据词法规则识别出源程序中的各个记号(token),每个记号代表一类...
  • kai8wei
  • kai8wei
  • 2015年03月31日 09:18
  • 1521

编译程序原理VS解释程序原理

引言    在备战软考的过程中在复习程序设计语言的时候遇到这么一个考点——解释和编译的原理,并且在做真题的过程中频繁的考查两者的区别,由于复习的不是很到位所以导致丢分,所以小编又重新复习了这一块的知识...
  • u013045437
  • u013045437
  • 2015年10月29日 20:22
  • 2262

VB.NET 数组的定义 动态使用 多维数组

 我们都知道在所有程序设计语言中数组都是一个非常重要的概念,数组的作用是允许程序员用同一个名称来引用多个变量,因此采用数组索引来区分这些变量。很多情况下利用数组索引来设置一个循环,这样就可以高效地处理...
  • departure19841030
  • departure19841030
  • 2009年11月04日 00:32
  • 49233

[翻译计划]脚本引擎实现

原文标题:Implementing A Scripting Engine原文地址:http://www.flipcode.com/articles/scripting_issue01.shtml作者:...
  • daily0403
  • daily0403
  • 2006年03月26日 05:32
  • 225

C#发现之旅:于动态编译的VB.NET脚本引擎

脚本的原理   脚本,也可称为宏,是一种应用系统二次开发的技术,它能在应用系统提供的一个容器环境中运行某种编程语言,这种编程语言代码调用应用系统提供的编程接口,使得应用系统暂时“灵魂附体”,无需...
  • action20
  • action20
  • 2014年01月25日 21:37
  • 1783

vb.net 预生成事件获取SVN版本号,编译日期,版本日期

1、复制My Project文件夹下面的AssemblyInfo.vb文件,命名为ver.tmp.vb。        在这个文件中,你能找到如下两行代码:      其中...
  • mhjcumt
  • mhjcumt
  • 2012年10月10日 09:07
  • 2508

让C#语言充当自身脚本!——.NET中的动态编译

代码的动态编译并执行是一个.NET平台提供给我们的很强大的工具用以灵活扩展(当然是面对内部开发人员)复杂而无法估算的逻辑,并通过一些额外的代码来扩展我们已有 的应用程序。这在很大程度上给我们提供了另外...
  • clb929
  • clb929
  • 2016年05月12日 16:57
  • 5923

C#动态编译、执行代码

原文地址:http://blog.csdn.net/21aspnet/article/details/3281147
  • clb929
  • clb929
  • 2016年05月11日 06:43
  • 1164

倒计时程序,给出一个时间值,动态显示时间,VB.net源代码编写

  • 2009年04月10日 11:20
  • 2.58MB
  • 下载

VB.NET动态编译(一)

VB.NET动态编译(一)目录(一)            CodeDom是什么(二)            VB.NET的动态编译实现(三)            如何动态执行自己的代码(四)   ...
  • bucher
  • bucher
  • 2003年06月20日 09:29
  • 1500
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VB.NET动态编译(一)
举报原因:
原因补充:

(最多只允许输入30个字)