Tag: compiler construction

CompilerParameters.ReferencedAssemblies – 添加对System.Web.UI.WebControls的引用

我正在使用CodeDomProvider类在运行时编译类。 这适用于仅使用System命名空间的类: using System; public class Test { public String HelloWorld() { return “Hello World!”; } } 如果我尝试使用System.Web.UI.WebControls编译一个类,我收到此错误: {error CS0006:无法找到元数据文件’System.Web.UI.WebControls’} System.CodeDom.Compiler.CompilerError 这是我的代码片段: var cp = new CompilerParameters(); cp.ReferencedAssemblies.Add(“System.Web.UI.WebControls”); 如何引用System.Web.UI.WebControls命名空间?

为什么C#编译器不允许接口中的私有属性设置器?

在某些情况下,比如MVVM视图模型,我有时需要私有setter,因为视图模型公开了一个只能在内部修改的状态。 那么在接口上需要私有的setter是错误的吗? (我的意思并不是特别在所描述的场景中)如果没有,为什么C#编译器不允许它? 谢谢。

C#编译器奇怪与委托构造函数

基于以下问题 ,我发现了c#编译器的一些奇怪行为。 以下是有效的C#: static void K() {} static void Main() { var k = new Action(new Action(new Action(K)))); } 我发现奇怪的是编译器’解构’传递的委托。 ILSpy输出如下: new Action(new Action(new Action(null, ldftn(K)), ldftn(Invoke)).Invoke); 可以看出,它会自动决定使用委托的Invoke方法。 但为什么? 实际上,代码不清楚。 我们是否有一个三重包装的委托(实际)或内部委托只是’复制’到外部委托(我最初的想法)。 当然,如果意图就像编译器发出代码一样,那么应该写一下: var k = new Action(new Action(new Action(K).Invoke).Invoke); 与反编译代码类似。 任何人都可以certificate这种“令人惊讶的”转变的原因吗? 更新: 我只能想到一个可能的用例; 委托类型转换。 例如: delegate void Baz(); delegate void Bar(); … var k = […]

Microsoft CCI – 资源,编写编译器的参考资料

前段时间,我正在研究编译器,我使用System.Reflection从我的AST生成代码(IL)。 现在,我已经想到了另一个我想要处理的编译器(它将是另一个宠物项目,没有任何将在生产代码中使用,至少,现在不是)。 如您所知,宠物项目比生产代码有一个很大的优势:您可以尝试并失败。 所以,我决定尝试使用微软的CCI编写编译器。 我发现的唯一好的参考是基本语言的示例编译器(这是CCI在codeplex上的一部分),但是,我更喜欢有一些其他资源,更像是教程,书籍,文章,我可以获得除了学习代码之外的更多信息(这并不总是最好的学习方法,因为你看到了一个解决方案,但你不知道你有什么替代品,或者为什么这样的代码有效)。 那么:在编写编译器和处理AST的背景下,你有关于CCI的任何资源(教程,书籍)吗?

C#编译器和JIT都做了哪些优化?

我正在继续我的编译器类的C#编译工作。 目前我已经完成了教科书中关于编译器优化的章节。 在大多数情况下,我的教科书在编写时没有及时编译,我很好奇C#编译器执行的静态,pre-jit优化的种类与JIT过程中的执行情况。 ? 当我与人们谈论编译CLR时,我通常会听到“大多数优化都是由JIT完成的”。 是循环展开,常量折叠/传播,C#编译器在Jit之前完成指令交织还是由抖动处理? 如果它们不是由抖动处理的,那么抖动会做什么样的优化,这对于即时编译器来说是唯一的?

C#编译器版本和语言版本之间的区别

曾经有一段时间我认为Framework版本和C#版本是相同的,所以一旦你在计算机上安装下一个Framework版本,就应该使用它。 然后我发现框架没有直接与C#版本链接,并且在同一台机器上,多个C#编译器可以同居,所以编译器和C#版本可能是相同的。 现在我明白编译器版本和C#版本不一样了…… Visual Studio命令提示符( 2010 ): C:\>csc Microsoft(R)Visual C# 编译器版本4 .0.30319.33440 适用于Microsoft(R).NET Framework 4.5 VS 2013的开发人员命令提示符: C:\>csc Microsoft(R)Visual C# 编译器版本12 .0.30110.0 对于C#5 我们可以看到 – VS 2010使用编译器版本4.0用于C#4(我只能假设它,因为没有明确提到); – VS 2013使用C#5的编译器版本12.0(这是明确提到的) 知道使用不同语言版本进行编译可能会给用户带来不同的结果 问题 如何找出C#版本 (不是编译器版本 ,而是语言版本)使用VS来构建我的具体项目? C# 编译器和语言版本之间是否存在严格,清晰和透明的链接? 我是否可以向Visual Studio指出(如果从一个Studio版本迁移到另一个版本),为我的具体解决方案使用不同的编译器版本?

将C#代码翻译成AST?

目前是否可以将C#代码转换为抽象语法树? 编辑:一些澄清; 我不一定希望编译器能为我生成AST – 解析器没问题,虽然我想使用“官方”的东西。 遗憾的是Lambda表达式不够,因为它们不允许我使用语句体,这正是我正在寻找的。

在.NET / BCL源代码中混淆注释“string.Empty”的含义?

我试图理解为什么string.Empty是readonly而不是const 。 我看过这篇post,但我不明白微软写的关于它的评论。 正如Jon Skeet在评论中写道 : “我不知道 – 对我来说这没有多大意义,说实话……” 共享源公共语言基础结构2.0版本 。 string.cs位于sscli20 \ clr \ src \ bcl \ system \ string.cs中 // The Empty constant holds the empty string value. //We need to call the String constructor so that the compiler doesn’t mark this as a literal. //Marking this as a literal would mean […]

手编码解析器

对于你所有的编译器大师,我想编写一个递归下降解析器,我想只用代码来做。 没有从其他语法生成词法分析器和解析器并且不告诉我阅读龙书,我最终会到达那里。 我想进入关于为合理的简单语言实现词法分析器和解析器的细节,比如说CSS。 我想做对了。 这可能最终会成为一系列问题,但现在我开始使用词法分析器了。 可以在此处找到CSS的标记规则。 我发现自己编写这样的代码(希望你可以从这个代码片段中推断出其余部分): public CssToken ReadNext() { int val; while ((val = _reader.Read()) != -1) { var c = (char)val; switch (_stack.Top) { case ParserState.Init: if (c == ‘ ‘) { continue; // ignore } else if (c == ‘.’) { _stack.Transition(ParserState.SubIdent, ParserState.Init); } break; case ParserState.SubIdent: if (c == ‘-‘) […]

C#64位版本代码的反汇编视图比32位调试代码长75%?

编辑 我测试了32位的版本,代码很紧凑。 因此,下面是64位问题。 我正在使用VS 2012 RC。 调试是32位,Release是64位。 下面是调试然后发布一行代码的反汇编: crc = (crc >> 8) ^ crcTable[((val & 0x0000ff00) >> 8) ^ crc & 0xff]; 0000006f mov eax,dword ptr [ebp-40h] 00000072 shr eax,8 00000075 mov edx,dword ptr [ebp-3Ch] 00000078 mov ecx,0FF00h 0000007d and edx,ecx 0000007f shr edx,8 00000082 mov ecx,dword ptr [ebp-40h] 00000085 mov ebx,0FFh 0000008a and […]