Tag: compiler construction

具体来说,编译器如何积极优化生成的字节码?

我一直在阅读各种编译器的function,并且我遇到了许多编译器报告执行的“积极优化”一词。 例如,LLVM引用了以下编译时优化function: 内存/指针特定 循环变换 数据流 算术 死代码消除 内联 具体是什么意思? 假设您有以下代码片段,如何优化生成的字节代码以比编译器生成的更快地运行? 我特别感兴趣的是优化JIT驱动的运行时的字节码,例如C#,Java和Flash。 这很棘手,因为JIT只支持处理器通常执行的操作码的子集,这限制了您可以执行的优化量。 尽管如此,我仍然有兴趣看到什么是可能的,究竟是什么转换可以推动VM的极限。 虚构的代码块: for (i = 0; i > 16) – 10; }else{ out = ((in << 5) / 2) * 50 + 10; } dataOut[i] = out; } 编译器为基于堆栈的JIT VM(如Flash Player)生成的近似伪代码:(原谅我任何错误,这完全是手写的!) // i = 0 label: “forInit” push 0 writeTo “i” // while […]

说服C#编译器在成员返回后执行将停止

我不认为这是目前可行的,或者它是否是一个好主意,但这是我刚才想到的。 我使用MSTest对我的C#项目进行unit testing。 在我的一个测试中,我执行以下操作: MyClass instance; try { instance = getValue(); } catch (MyException ex) { Assert.Fail(“Caught MyException”); } instance.doStuff(); // Use of unassigned local variable ‘instance’ 为了使这段代码编译,我必须在其声明或catch块中为instance赋值。 我可以选择在Assert.Fail之后return ,但这仍然是一种解决方法,而不是编译器只知道在此之后执行无法继续。 Assert.Fail永远不会,据我所知,允许执行继续它,因此instance永远不会没有值。 那为什么我必须给它赋值? 如果我将Assert.Fail更改为类似throw ex ,则代码编译正常,我假设因为它知道exception将禁止执行进入instance将未初始化使用的点。 相反,如果我不希望测试失败,而是标记为不确定,该怎么办? 我可以做一个Assert.Inconclusive而不是Fail ,如果编译器知道之后执行不会继续,那就太好了。 那么运行时与编译时知识的情况是否允许执行在哪里进行? C#是否有理由说某个成员(在这种情况下是Assert.Fail在返回后永远不允许执行? 也许这可能是方法属性的forms。 这会对编译器有用还是不必要的复杂性? 外部unit testing 由于人们[有效]指出这是编写unit testing的愚蠢方式,因此请考虑我在unit testing领域之外的问题: MyClass instance; if (badThings) { someMethodThatWillNeverReturn(); } else […]

我可以在没有Visual Studio 2010的情况下下载C#4.0的编译器吗?

我知道CTP VS 2010图像,但我可以只下载.NET Framework 4.0和C#编译器吗?

程序集中的类顺序

是什么决定了大会中class级的顺序? 并且……有没有办法改变它? 附加信息:您可以通过自己反思来检查订购,或者您可以使用ILDASM之类的工具,禁用字母排序,然后您也可以获得订单。 顺序似乎是由编译器决定的奇怪方式。 我已经尝试了一些东西……比如重命名类(顺序保持不变),还编辑.csproj文件来改变.cs文件的顺序。 我的主要关注点是VS2008,C#,。net 3.5。 更新:我确实有一个场景,订单很重要(外部程序通过reflection通过我的assembly) – 我需要特殊订单。 除此之外 – 你是完全正确的 – 订单真的不应该紧。

将null与对象而不是具有null的对象进行比较有什么问题

我刚刚发现我可以将null与这样的Object进行比较, if(null != Object) 而不是将Object与null进行比较,例如 Object != null 如果使用前一种方法可能会出错? 这合法吗? 如果没有,那么为什么编译器接受它?

标记为Obsolete的接口方法在实现时不会从编译器发出消息

考虑这个例子 public interface IAnimal { [Obsolete(“Animals can’t eat anymore”, true)] void Eat(); } public class Animal : IAnimal { public void Eat() { Console.WriteLine(“Hello”); } } 我有一个接口IAnimal与一个废弃的方法。 Class Animal实现了该接口。 稍后,我称之为Eat方法: var animal = new Animal(); animal.Eat(); 编译器编译失败(我已将Obsolete标记为给出错误而不是警告)。 程序编译并调用方法,没有错误。 据我所知,这是编译器的一个错误。 我错过了什么吗? 注意:我使用的是VS2010

Visual Studio null引用警告 – 为什么没有错误?

我注意到了Visual Studio特有的一些东西。 首先,尝试在函数中的某处键入此(C#): class Foo { public void Bar() { string s; int i = s.Length; } } 现在,它会立即将s.Length的s标记为错误,并说“ Use of unassigned local variable ‘s’ ”。 另一方面,请尝试以下代码: class Foo { private string s; public void Bar() { int i = s.Length; } } 它将编译,并在带有警告的private string s为s加下划线,称“ Field ‘Foo.s’ is never assigned to, and will always […]

字符串连接是否在内部使用StringBuilder?

我的三个同事告诉我,没有理由使用StringBuilder代替使用+运算符进行连接。 换句话说,这对一堆字符串很好: myString1 + myString2 + myString3 + myString4 + mySt… 他们使用的基本原理是,从.NET 2开始,如果使用+运算符,C#编译器将构建相同的IL,就像使用StringBuilder一样。 这对我来说是新闻。 他们是对的吗?

MSBuild与编译器

在命令提示符下使用MSBuild和C#编译器有什么区别? 我想在不使用Visual Studio的情况下手动构建我的解决方案/项目,我想学习如何使用命令行工具。

如何检测和纠正无用的try catch块?

我已经开始使用.Net Complier Platform(Roslyn)来协助执行编码标准。 我正在努力解决的一个问题是发现并捕捉无用的try…catch块。 例如: // Would like to have this detected and offer to remove the try…catch try { // Do some work } catch(Exception ex) { throw ex; } 最好还能检测到代码使用throw ex;的事实throw ex; 而不仅仅是throw; 如: try { // So some work } catch(Exception ex) { // Log the error or anything to manage the […]