Tag: compiler construction

为什么需要数字后缀?

C#语言(以及我确定的其他语言)在数字文字的末尾需要后缀。 这些后缀表示文字的类型。 例如, 5m是小数, 5f是浮点数。 我的问题是:这些后缀真的是必要的,还是可以从其上下文推断出文字的类型? 例如,代码decimal d = 5.0应该推断5.0不是double,而是小数。 这种语法会导致问题吗?

ConditionalAttribute和其他特殊类

ConditionalAttribute可用于根据定义的编译器符号删除对标记方法的调用。 我假设我们不能自己创建这个类,因为编译器必须专门查找它。 我想知道编译器或语言使用的其他类是什么,我们无法自己编码。

在C#中应用DeMorgan定理来手动优化条件语句中的布尔表达式(例如条件)是否有用

回到我在C和C ++中完成大部分工作的那一天,当然,我会手动应用deMorgan定理来优化任何非平凡的布尔表达式。 在C#中执行此操作是否有用,或者优化程序是否使这不必要?

使用MSBuild 从命令行定义预处理器值

我需要创建一个包含多个项目的现有大型应用程序的演示版本。 我想使用现有的项目,并通过预处理器指令中性化function #if DEMO mycode.NeuterNow(); #endif 我们正在使用MSBuild构建我们的应用程序,我理想地使用以下内容: MSBuild -DefineProperty:DEMO MySolution.sln 这样的function是否存在?

在C#中Foreach结构奇怪的编译错误

namespace MyNamespace { public struct MyStruct { public string MyString; public int MyInt; public bool MyBool; } public class MyClass { private List MyPrivateVariable; public List MyVariable { get { if (MyPrivateVariable == null) { MyPrivateVariable = new List(); MyPrivateVariable.Add(new MyStruct()); MyPrivateVariable.Add(new MyStruct()); } return MyPrivateVariable; } } public void MyLoop() { foreach (MyStruct ms […]

CLR编译器优化的示例

我在几个月内就.Net性能和优化做了一个演示,我想提供一些不必要的优化样本,无论如何都要由编译器完成。 我在哪里可以找到关于编译器在代码之前和之后实际能够进行哪些优化的一些解释?

C#function请求:在匿名类型上实现接口

我想知道做这样的工作需要什么: using System; class Program { static void Main() { var f = new IFoo { Foo = “foo”, Print = () => Console.WriteLine(Foo) }; } } interface IFoo { String Foo { get; set; } void Print(); } 创建的匿名类型看起来像这样: internal sealed class f__AnonymousType0<j__TPar> : IFoo { readonly j__TPar i__Field; public f__AnonymousType0(j__TPar Foo) { this.i__Field […]

C#编译器如何决定发出可重定向的程序集引用?

.NET Compact Framework引入了可重定向的程序集引用,现在用于支持可移植类库。 基本上,编译器会发出以下MSIL: .assembly extern retargetable mscorlib { .publickeytoken = (7C EC 85 D7 BE A7 79 8E ) .ver 2:0:5:0 } C#编译器如何理解它必须发出一个可重定向的引用,以及如何强制C#编译器甚至在可移植类库之外发出这样的引用?

扩展Mono C#编译器:有没有任何文档或先例?

我目前正在参与一些有趣的编程语言研究,到目前为止,该研究主要围绕使用一些非常强大的基于程序员生产力的function扩展即将推出的Java 7.0编译器。 该工作应同样适用于相关的编程语言,如C#。 我目前正在寻找原型化C#端口function的选项。 我更喜欢开源选项,以便可以与最广泛的受众分享这项工作的成果。 因此,Mono C#编译器似乎是最明显的起点。 我是一位经验丰富的C#开发人员,所以编写代码不是问题。 我主要关心的是以可维护和支持的方式扩展编译器。 在关于这个主题的Mono FAQ( 链接 )中,声明“Mono已被用作尝试C#语言的新思想的基础(有三个或四个编译器派生自Mono的C#编译器)”。 不幸的是,没有比此更多的指示,到目前为止,谷歌的搜索没有任何改变。 我想知道是否有人有这方面的任何信息。 mcs / gmcs / dmcs是否具有标准的可扩展性模型? 具体来说,我将在程序的抽象语法树上执行一些有趣的转换。 是否有一种标准机制,用于在抽象语法树生成和类型检查器之间插入function到编译器链中,然后生成代码? 到目前为止,我已经为代码编写了一些特别的扩展(主要是在代码生成器中),但这似乎不是一个可维护的解决方案,特别是考虑到我打算让我的扩展更新为Git主干单声道尽可能多。 此外,能够更新我的扩展,而不必每次进行更改时都重新编译整个编译器,这将是很好的。 我希望能够将我的所有AST操作包装到一个可以由mcs / gmcs / dmcs动态加载的.NET程序gmcs而不必直接破解核心编译器代码。 任何有关扩展Mono C#编译器的想法或指示都将非常感激! 更新(2010年10月23日) 在回答我的问题时,我决定开始研究Mono的一个分支,以便为编译器创建一个简单的可扩展性模型。 这是在它的早期阶段,但它在GitHub: http://github.com/rcook/mono-extensibility 主要提交是: http : //github.com/rcook/mono-extensibility/commit/a0456c852e48f6822e6bdad7b4d12a357ade0d01 如果有人对此项目的合作感兴趣,请告诉我!

为什么我不能在对象初始化期间使用部分限定的命名空间?

我怀疑这是一个以前被问过多次的问题,但我还没找到。 如果我不经常在文件中使用该类型,或者我using namaspacename文件顶部的using namaspacename添加以便能够编写new ClassName()我通常使用完全限定的命名空间。 但是如果只添加了完整命名空间的一部分呢? 为什么编译器找不到类型并抛出错误? 考虑嵌套命名空间中的以下类: namespace ns_1 { namespace ns_1_1 { public class Foo { } } } 因此,如果我现在想要初始化此类的实例,它可以通过以下方式工作: using ns_1.ns_1_1; public class Program { public Program() { // works, fully qualified namespace: var foo = new ns_1.ns_1_1.Foo(); // works, because of using ns_1.ns_1_1: foo = new Foo(); } } 但是以下不起作用: using […]