我知道这个问题的"销售推销"答案是肯定的,但技术上是否正确.
公共语言运行时(CLR)被设计为基于命令式编程(IP)的中间语言,但在处理声明性编程(DP)时这具有明显的含义.
那么,当在CLR中实现时,基于与Imperative Style不同的范式的语言效率如何?
我也觉得DP的步骤会产生一个额外的抽象层次,可能无法在所有表现形式进行建模,这是一个公平的评论吗?
我用F#做了一些简单的测试,看起来很棒,但是如果程序变得更复杂,我会错过一些东西吗?
首先,.NET平台上的各种语言肯定包含生成具有不同性能的代码的语言,因此并非所有语言都具有同等性能.它们都编译为相同的中间语言(IL),但生成的代码可能不同,某些语言可能依赖于Reflection或动态语言运行时(DLR)等.
但是,无论您使用何种语言,BCL(以及语言使用的其他库)都具有相同的性能 - 这意味着如果您使用某些库进行昂贵的计算或渲染而不进行复杂的计算你自己,使用哪种语言来称呼它并不重要.
我认为考虑问题的最佳方式不是考虑语言,而是考虑这些语言中可用的不同特征和编程风格.以下列出了其中一些:
不安全的代码:您可以在C++/CLI中使用不安全的代码,也可以在C#中使用.这可能是编写某些操作最有效的方法,但是你放弃了一些安全保障.
静态类型,命令式:这是C#和VB.Net中常用的编程风格,但您也可以使用F#中的命令式样式.值得注意的是,许多尾递归函数被编译为静态类型的命令式IL代码,因此这也适用于一些F#函数
静态类型,功能:大多数F#程序都使用它.生成的代码与命令类别使用的代码大不相同,但它仍然是静态类型的,因此没有显着的性能损失.比较命令性和功能性有点困难,因为两个版本中的最佳实现看起来完全不同.
动态类型化:IronPython和IronRuby等语言使用动态语言运行时,它实现动态方法调用等.这比静态类型代码慢一些(但DLR在很多方面都得到了优化).请注意,使用C#4.0编写的代码dynamic
也属于此类别.
还有许多其他语言可能不属于任何这些类别,但我相信上面的列表涵盖了大多数常见情况(并且绝对涵盖所有Microsoft语言).