最近我和一位几个月前开始上C ++课程的朋友(他第一次接触编程)谈话。我们总体上讨论了C#和.NET的主题,他向我指出,他觉得它对于所有常见问题(低速,易碎的字节码等)都是“注定要失败的”。我在所有这些问题上都同意了他,但我拒绝说它注定要失败,只是因为我觉得,像C#这样的语言可能会成为本机代码(如果微软选择改变.NET的实现方式)字节码,JIT运行时环境直接编译到像C ++程序那样的本机代码。
我的问题是,我在这里吃午饭吗?我的意思是,它可能需要做很多工作(并且可能会破坏太多东西),但是没有某种类型的魔法障碍阻止C#代码本地编译(如果有人想这样做),对吧?曾经有一段时间,C ++被认为是一种非常高级的语言(它仍然是,但不像过去那么多),但现在它已成为微软原生API的基石(连同C)。在某种程度上,.NET在某种程度上与C ++处于同一水平的想法似乎只是时间和精力问题,而不是语言设计中的一些根本缺陷。
编辑:我应该补充说,如果可以进行.NET的本机编译,为什么微软选择不去那条路?为什么他们选择了JIT字节码路径?
答案 0 :(得分:28)
Java使用字节码。 C#,虽然它使用IL作为中间步骤,但总是编译为本机代码。 IL永远不会像Java字节码那样直接解释执行。如果你真的想要,你甚至可以在分发前预编译IL(提示:从长远来看,性能通常更好 如果你不这样做。)
C#慢的想法是可笑的。一些 winforms组件很慢,但如果你知道你在做什么,C#本身就是一种非常快速的语言。在这个时代,它通常归结为算法无论如何;如果您实施错误的冒泡排序,语言选择将无法帮助您。如果C#帮助您从更高级别(根据我的经验,它通常会使用)中使用更高效的算法,那将胜过任何其他速度问题。
根据您的编辑,我还想再次解释(典型的)编译路径。
C#编译为IL。此IL分发给本地计算机。用户运行该程序,然后该程序被JIT编译为该机器的本机代码一次。下次用户在该计算机上运行程序时,他们正在运行完全原生的应用程序。还有一个JIT优化器可能会让事情变得混乱,但这就是一般情况。
这样做的原因是允许单个机器进行适合该机器的编译时优化。平均而言,如果将相同的完全编译的应用程序分发给每个人,最终会得到更快的代码。
关于反编译:
首先要注意的是,如果您真的想要,可以在分发之前预编译为本机代码。此时,您将接近与分发本机应用程序相同的级别。但是,这不会阻止一个坚定的个人。
它在很大程度上也误解了经济学中的作用。是的,有人可能会对您的工作进行逆向工程。但这假设应用程序的所有价值都在技术中。程序员高估代码是非常常见的,并且低估了产品的执行:界面设计,营销,与用户的联系以及持续的创新。如果你做到了这一切,那么一点额外的竞争将通过在你的市场中增加需求来帮助你。如果你做错了,隐藏你的算法将无法拯救你。
如果您更担心自己的应用程序出现在warez网站上,那么您就会更加误导。无论如何它会出现在那里。更好的策略是engage those users。
目前,采用(imo)的最大障碍是可再分发的框架已经变得庞大。希望他们能在相对接近的版本中解决这个问题。
答案 1 :(得分:1)
您是否建议C#是托管代码的事实是一个设计缺陷?
答案 2 :(得分:1)
答案 3 :(得分:1)
dude,fyi,您始终可以使用ngen.exe将c#程序集编译为本机映像
你在暗示.net是有缺陷的设计吗?这是.net从他们蹩脚的vb 5,vb 6,com天带回了ms回到游戏中。这是他们最大的赌注之一
java做同样的事情 - 所以你建议java也是一个错误吗?
REG。大型供应商 - 请注意.net在各种规模的公司中都取得了巨大成功(除了那些开源人员 - 没有错)。所有这些公司都对.net框架进行了大量投资。
根据我的说法,将c#speed与c ++进行比较是一个疯狂的想法。 c ++是否提供了托管环境以及世界级的强大框架?如果您对反编译非常偏执,则可以随时对程序集进行模糊处理
它不是关于c ++ v / s c#,托管v / s不受管理。两者在他们自己的领域同样好,同样强大
答案 4 :(得分:0)
C#可以原生编译,但基类库不太可能去那里。另一方面,我真的没有看到超越JIT的优势。
答案 5 :(得分:0)
当然可以,但真正的问题是为什么?我的意思是,当然,它可能很慢(呃),但大多数时候,性能上的任何重大差异都归结为设计问题(错误的算法,线程争用,占用资源等)而不是语言问题。至于“可破解”字节码,考虑到采用率,它似乎并不是大多数公司的一个大问题。
真正归结为什么,这项工作的最佳工具是什么?对某些人来说,它是C ++;对于其他人,Java;对于其他人,C#,或Python,或Erlang。
答案 6 :(得分:0)
注定?因为所谓的性能问题? 如何比较价格:
如果你的应用程序存在性能问题,与从更高抽象语言转换到更低抽象语言所带来的好处相比,仅仅为自己购买更好的硬件便宜得多 更便宜(而且我不喜欢没有任何反对C ++的东西,我很长一段时间都是C ++开发人员。)
与垃圾收集的C#代码相比,在尝试查找C ++代码中的内存泄漏时比较维护问题怎么样?
“硬件便宜,程序员很贵”:http://www.codinghorror.com/blog/archives/001198.html