C#只能编译成MSIL?
发布于:2018-01-26 17:08  浏览:

对于这种基于VM的语言来说,无论是C#还是Java,他们的顺序从低到高都是字节码(IL)-->C#(Java)(这里我的意思是语言实现)-->基于C#(Java)实现的类库。
如果IL不发生变化,就拿LINQ来说吧,他做的不过是在编译时改了一个规则。
不过我仔细想了下,其实这么说好像也没什么道理,因为如果按这么说的话,那一样可以说,IL的改变不过是再解释成机器码的时候改了一下规则.... 肯定有问题啊。说的夸张点,难道C#未来某个版本进化成VB样子了,Java某个版本进化成Scala样子了,难道他们算没有变化吗?
而且,谁说C#只能编译成MSIL啊,它也可以编译成Java Bytecode和Native Code或LLVM哪,C#的改变和它编译后的目标代码应该没什么关系的。
所谓语言的改变,其实就是表面的那些变化,而不是内在变化。就好比Python语言,无论是PyPy还是IronPython和Jython实现,它“内在”变了,但语言反而应该说没有变。不是有问题,是有太大问题了。
不管语言从低到高,还是开发方法从面向过程到面向对象等,都是因为问题规模的不断增长,我们需要提高抽象的层次,在更高层次上来解决问题而来的,而这些对于更广大的应用程序员来说是无比重要的,甚至比你所说的低层修改来得更重要。如果放到单独的命名空间里,如果不改代码模板的话,开发人员使用的时候还需要引入命名空间,对他们来说太“麻烦”了。
我最喜欢懒程序员了,一般都把扩展方法和被扩展的接口放在同一个命名空间下。
不过像一些太大规模的污染,例如object,我有时考虑在某个[接口]上扩展,就像linq一样,其实也是扩展到接口。