代码之家  ›  专栏  ›  技术社区  ›  GRB

托管代码(特别是.NET)是否会变为“非托管”?

  •  3
  • GRB  · 技术社区  · 15 年前

    最近我和我的一个朋友聊了几个月,他开始了C++课程(他第一次接触编程)。我们大致了解了C_和.NET的主题,他向我指出,对于所有常见的问题(低速、可断字节码等),他认为这是“注定”的。我在所有这些问题上同意了他,但我坚持说这是注定要失败的,只是因为我觉得,像C语言这样的语言最终可以变成本地代码(如果微软选择从字节码中改变.NET的实现,JIT运行时环境将直接编译成像C++程序一样的本机代码)。

    我的问题是,我出去吃午饭了吗?我的意思是,这可能需要大量的工作(而且可能会破坏太多的东西),但是没有什么神奇的屏障可以阻止C代码被本地编译(如果有人想这样做的话),对吗?曾经有一段时间,C++被认为是一种非常高级的语言(它仍然是,但不像过去那么多),但现在它是微软原生API的基石(C)。有一天,.NET可以和C++在同一水平上的想法似乎只是时间和精力的问题,而不是语言设计中的一些根本缺陷。

    编辑 :我应该补充一点,如果.NET的本机编译是可能的,那么为什么微软选择不走这条路呢?为什么他们选择了JIT字节码路径?

    7 回复  |  直到 15 年前
        1
  •  28
  •   Community bastianneu    7 年前

    Java使用字节码。C,虽然它使用IL作为中间步骤,但是 总是 编译为本机代码。IL永远不会被直接解释为Java字节码的执行。如果您真的想,甚至可以在发布之前预编译IL(提示:性能通常更好 从长远来看 如果你不这样做。

    认为C慢的想法是可笑的。一些 WinForms组件 速度很慢,但如果你知道自己在做什么,C语言本身就是一种非常快的语言。在当今这个时代,它通常都归结为算法;如果实现了一个坏的冒泡排序,语言选择将不会帮助您。如果C帮助您使用更高级别的更高效算法(根据我的经验,通常是这样),这将超过任何其他速度问题。


    基于您的编辑,我还想再次解释(典型的)编译路径。

    C编译为IL。此IL分发到本地计算机。用户运行程序,然后该程序被JIT编译为该计算机的本机代码。 一旦 . 下次用户在那台机器上运行程序时,他们运行的是完全本地的应用程序。还有一个JIT优化器可以让事情变得有点混乱,但这是一般情况。

    这样做的原因是允许单个机器对该机器进行适当的编译时优化。与将同一个完全编译的应用程序分发给每个人相比,最终得到的代码平均更快。


    关于反编译:

    首先要注意的是,如果您真的想要,可以在发布之前预编译到本机代码。在这一点上,您已经接近了与发布本机应用程序相同的级别。然而,这并不能阻止一个坚定的人。

    它也在很大程度上误解了经济学。是的,也许有人会对你的工作进行逆向工程。但这是假设应用程序的所有价值都在技术上。对于程序员来说,过分看重代码和低估 产品 :界面设计、营销、用户联系、持续创新。如果你做得对,一点额外的竞争将帮助你,因为它会增加你的市场需求。如果你做错了,隐藏你的算法不会救你。

    如果你更担心你的应用程序出现在瓦雷斯网站上,你会更被误导。无论如何,它会出现在那里。更好的策略是 engage those users .


    目前,采用(IMO)的最大障碍是框架的可再分配性在规模上变得巨大。希望他们能在一个相对较近的版本中解决这个问题。

        2
  •  1
  •   BFree    15 年前

    您是否认为C是托管代码这一事实是一个设计缺陷??

        3
  •  1
  •   wendazhou    15 年前

    C可以使用诸如NGEN之类的工具进行本机编译,Mono(开源.NET框架)团队开发了完整的AOT(提前)编译,允许C在iPhone上运行。但是,完全编译是没有意义的,因为它破坏了跨平台的兼容性,并且某些特定于机器的优化无法完成。但是,还要注意,.NET不是一种解释语言,而是一种JIT(及时)编译语言,这意味着它在机器上本机运行。

        4
  •  1
  •   Raj    15 年前

    伙计,你可以用ngen.exe把你的C程序集编译成本机映像。

    你是说.NET设计有缺陷吗?正是.NET把微软从糟糕的vb 5,vb 6,com时代带回到了游戏中。这是他们最大的赌注之一

    Java也做同样的事情,所以你建议Java也是一个错误吗?

    规则。大型供应商——请注意,.net在所有规模的公司中都取得了巨大的成功(除了那些开源的家伙——这没什么错)。所有这些公司都对.NET框架进行了大量投资。

    根据我来说,把C速度与C++相比较是一个疯狂的想法。C++是否为一个世界级的框架提供了被管理的环境?

    如果你如此偏执于反编译,你可以总是混淆你的程序集。

    它不是关于c++ v/s c*,管理的v/s非托管。两者在各自的领域都是同样优秀和同样强大的

        5
  •  0
  •   andleer    15 年前

    C可以本机编译,但基本类库不太可能去那里。另一方面,我真的没有看到超越JIT的优势。

        6
  •  0
  •   Adam Jaskiewicz    15 年前

    当然可以,但真正的问题是为什么?我的意思是,当然,它可能很慢(ER),但大多数时候,性能上的任何主要差异都归结为设计问题(错误的算法、线程争用、占用资源等),而不是语言问题。至于“易碎”字节码,考虑到采用率,它似乎并不是大多数公司真正关心的问题。

    归根结底,这项工作的最佳工具是什么?对某些人来说,它是C++;对于其他人来说,是Java;对于其他人来说,是Cype、Python或Erlang。

        7
  •  0
  •   Igor Brejc    15 年前

    注定的?因为假定的性能问题? 比较一下价格怎么样:

    • 编程器时间
    • 硬件组件

    如果应用程序存在性能问题,则 许多的 比较便宜的只是购买自己更好的硬件,相比之下,你从一个更高的抽象语言切换到一个较低的一个好处(我没有任何反对C++,我一直是一个C++开发者很长一段时间)。

    在试图找到与C++垃圾代码中的内存泄漏相比较时,如何比较维护问题?

    “硬件是便宜的,程序员是昂贵的”: http://www.codinghorror.com/blog/archives/001198.html