.NET csc和Mono mcs的兼容性

5

我知道.NET和Mono是二进制兼容的,但是对于一组源代码,csc和mcs会生成完全相同的CLI可执行文件吗?有没有办法判断一个可执行文件是使用csc还是mcs编译的呢?

2个回答

5
很多东西在规范中没有完全定义,或者是特定于实现的扩展。
未完全指定的示例:
- 类似字段的事件的同步语义;这在ecma规范中明确开放给实现;它在MS规范中被严格定义,但在c# 4.0中使用了不同的版本,该版本尚未出现在正式规范中,如果我没记错的话。 - 表达式(来自lambda)的构造; 简单地“在其他地方定义”(实际上并没有)。
实现扩展的示例:
- P/Invoke - COM接口处理(即如何在接口上调用new)
因此,不能保证在csc或[g]mcs之间具有相同的IL,甚至在不同版本的csc之间也是如此。
更进一步:根据调试设置,启用或禁用优化以及定义某些编译常量(例如DEBUG或TRACE),同一编译器将生成不同的代码。

1

我相信他们不会从相同的源代码生成相同的IL。即使是不同版本的MS C#编译器也不会。

优化器将以不同的方式工作并创建略有不同的代码。

我预计在实现复杂功能(如迭代器、为lamdas捕获的局部变量等)方面会有更大的差异...

然后还有任意的编译器生成名称,例如匿名类型。没有理由他们应该使用相同的命名方案。

如果有一些包含您的编译器名称和版本的程序集元数据,我也不会感到惊讶。


优化器存在于JIT编译器中,而不是编译器中。 - Hans Passant
1
@Hans:编译器会进行一些优化,例如:string x = "a" + s0 + s1; => string x = string.Concat("a", s0, s1);。我怀疑在这个例子中它们并没有什么区别。 - R. Martinho Fernandes
据我所知,Jitter 和编译器都有一些优化器。但你说得对,jit 优化器做了大部分微观优化。 - CodesInChaos
这些不是“微小”的优化。有关详细信息,请参见:https://dev59.com/8G855IYBdhLWcg3w_5im#4045073 这与C编译器通常执行的优化相同。 - Hans Passant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接