Assembly(汇编)、C、C++、Java、C#访谈

会长:访谈时间还差5分钟,下面我们先看看各大语言们在讨论干些什么吧。
<会长走到了幕后>
Assembly:我是计算机程序设计界的老大,用我写的程序运行效率最高,所以我觉得全世界应该都用我这门语言。

C:首先我极力反对这句话,Assembly运行效率虽高,但开发效率极端底下,而且特定于CPU指令集,移植等异常困难。看看由我写的程序吧,一行可以顶你Assembly十多行,而且源代码可移植,多方便啊。

C++:Assembly、 C两位请稍安勿躁,两位忽略了一个重要问题,现在软件的复杂度越来越高,你们二位在实现上都各有份额,但我们要向高处看,向OOP(面向对象编程)看齐,不然软件将难以维护。像我一样,加入了Encapsulation(封装)、Inherit(继承)、Polymorphism(多态)、 Template(模板),而运行效率也不见得比C语言低,所以用我来设计程序是最合适的。

Java:C++也谈OOP,哈哈,真可笑,你不知道自己并非完全面向对象吗?你的入口点(主函数)永远都是全局的,OOP最基本的要求是所有处理都在class(类)里面,你连最基本的一条都满足不了,哈哈。况且你自己还包含C语言,C语言完全是面向过程的啊。C++你自己要处理众多指针、资源管理等细节问题,对于现代软件来说,你真是糟透了。

C#:听Java说那些风凉话吧,我提供的服务最全面了,OOP、资源管理等等等等,对于我来说,都是不在话下的,况且我有强大的框架,以及Visual Studio IDE。MSDN等帮助文档,为一个新学员上手带来了极大的便利,况且我是由世界上最大的软件公司所开发的,相信我吧,世界上最强大的语言。

会长:<怎么都吵上啦>各位各位,我知道你们都有各自的好处,请平和下来,不要相互争论,与其争论谁好谁坏,不如大家找个共同点,一起探讨自己对程序设计的发展。访谈的时间快到了,我们赶紧赴会吧。

<大家都坐在各自的位置上了,准备接受采访>

会长:我们很荣幸的请到计算机界几大语言共同探讨程序设计的问题,我们请到的有:Assembly、C、C++、Java、C#。请大家简要介绍一下自己。

Assembly:我的名字是“汇编语言”,从计算机出现到现在,我就存在了,而且我不会消失,因为所有的语言都是先“变成”我,然后再交给CPU执行的。

C:我是一门非常经典的语言,具有语言级的平台移植性,使用我比较简单,而且一切都掌握在程序员手中,编译后我不会产生其他代码。其实我可以直接翻译成汇编代码。

C++:我是在C的基础上,加入了面向对象特性而产生的,从我开始,OOP便流行了起来,OOP为软件开发带来了非常大的进步。

Java:我是由Sun公司开发的一门完全面向对象的语言,我放弃了C++的一些复杂特性,如:指针等,加入了为OOP而设立的关键字,如:interface等。我可是运行程序跨平台的哦。

C#:我是有Microsoft公司开发的一门语言,别人多说我跟Java的相似度达80%,那是一般的特性,其实还是有两点很不同的,一、我拥有强大的开发环境支持、强大的技术支持。二、继承了Microsoft的一贯作风,我不跨平台。

会长:各门语言都自我介绍完了,下面的记者们有什么问题赶紧问啊。

记者1:听了各位的自我介绍,我大概了解各门语言了,请问如果我想学习编程,要从Assembly开始,一直学下来吗?

会长:这个问题我来回答吧,首先、编程的概念非常广,对于想学习编程的人来说,首先要想好自己将编写什么类型的程序,然后对应各门语言进行学习。

记者2:请问Assembly,上面那些语言我都会用,但你说所有语言最终都变成汇编代码,然后才执行的,我写C++、Java等代码的时候,根本没有与Assembly打交道,你确信你说的话正确?

Assembly:你编写的只不过是C++、Java等的代码而已,试想一下,你写完C++等代码后,是否还有编译等过程呢?这个过程会将C++代码翻译成汇编的。对于 Java,会有类似Java虚拟机的东西,最终还是以Assembly代码交给CPU的。我对C++、Java等语言了解甚少,难免有些失误。

记者2:谢谢Assembly,我已经知道你所要表达的意思了,你是指无论什么语言,最终都要转化为汇编的形式,然后交给CPU执行。

记者3:请问Java、C#,用你们编写代码的时候,申请的内存等资源不用手动释放吗?那样会不会造成泄漏?我记得C、C++申请资源的时候,都要手动释放的。

Java、C#:我们都有各自的垃圾回收器,其可以将一些废弃的资源自动回收,然后交还给系统使用。我们要强调的一句是,并非所有资源我们都能够有效回收,一些系统资源,比如:Windows上串行的句柄等等,这些还是要手动释放的。

记者3:有些资源还是要手动释放?你们不是有垃圾回收器吗?为什么还要手动释放呢?

Java、 C#:用我们编写代码,难免会用到系统提供的功能,这些功能原本就是系统的,不属于我们语言,而系统管理的方式是串行的,必须要释放,所以我们语言也无能为力了。不过我们各自的框架库都已经够强大了,所以编写代码的时候,首先考虑使用我们提供的框架,框架实在满足不了的时候才考虑使用系统提供的功能。

记者3:哦,我想我明白了,垃圾回收是针对整个框架内部来说的,如果编写的代码超出了框架,那此语言的一些功能将不能使用,所以我们的程序应该尽量在框架范围内运行,对吗?

Java、C#:没错,这才是我们提供如此强大框架的原因啊。

记者4:刚才听到Java、C#有强大的框架,那请问C、C++你们在框架间的表现如何呢?

C:就我语言本身来说,我没有特定的框架,只有CRT(C Runtime 函数库)可供使用,从表面上来看,这是一个缺陷,但也正因为没有特定的框架,才产生了其他第三方的C语言框架,只不过这些框架没有被C/C++标准委员会列入罢了。这也保证了语言充分的扩展性。

C++:其实我有自己的框架,比如:C++标准程序库,但这个框架跟C#的.NET比较的话,那就差远了,因为C/C++没有特定的公司去维护,所以才导致今天没有强大的框架的啊。跟C语言一样,我也有非常多的扩展库,如:MFC、ATL、Qt、Gtk、Boost等等,其实这些库都很好,可以很方便的使用。

记者4:哦,虽然C/C++标准委员会没有为其加入框架,但第三方框架也是很强大的,这也是C/C++强大的生命力所在。

记者5:我提个比较广的问题,请问会长,从效率角度来评价各门语言,您怎样评价呢?

会长:嗯,此问题有深度。提到效率,首先效率分为两方面。
一、代码最终生成的可执行文件的交给CPU的效率,即执行效率。
二、编写代码的程序员的功能实现效率,即开发效率。
让我一点点来说,首先从执行效率来说,Assembly的效率最高,因为其是直接调用CPU指令完成的,不存在中间效率损失。其次当然是C了,C是处在 Assembly上的一门语言,无需直接调用CPU指令,因此效率肯定有所下降,不过听说好的编译器优化性能很不错,C能够达到汇编80%左右的执行效率。再次就到C++了,直接说C++比C的执行效率低,C++肯定是不服的,那让我们来看看具体的吧,从编写过程性语言来说,C/C++的效率完全一样,其实C++的class(包括assess level)、inherit等并不会影响C++的运行效率,主要影响其效率的罪魁祸首是关键字virtual,这个关键字引入了虚函因为数、虚函数表、多态等等OO特性,所以导致C++效率低于C的。最后,Java、C#的执行效率最低,因为其得一些高级特性(如:垃圾回收等)影响了效率。
下面说说开发效率。首先Assembly的效率最低,因为Assembly代码是用CPU指令集编写的,一个普通的操作需要几行、甚至几十行 Assembly代码。关于C、C++、Java、C#的开发效率,我不能笼统的说谁高谁低了,因为具体要看实现的功能、项目等等。不过从笼统角度来说,效率可以这样排列:C < C++ < Java、C#。毕竟越高级的语言开发效率是越高的。

记者6:我也提个广泛的问题吧,其实一门语言的存在,都有其存在价值,那会长如何评价这些语言呢?

会长:嗯,此问题的确非常广,说下去一整天也说不完啊,我大概说说这些语言的存在意义吧。
一、Assembly。Assembly是使用CPU指令编写的,所以其功能最强,一般高级语言不能甚至很难实现Assembly的底层功能,如:底层指令调用等,所以这是Assembly存在的一个价值。其次、新硬件的生产、测试等等都需要使用Assembly,在很多时候,新硬件上并不存在其他编译器,所以Assembly是唯一的选择。再次、目前病毒盛行,了解一个病毒具体的构造需要用到反汇编,这也是Assembly存在的强大理由啊。
二、C。C是一门经典的过程性语言,使用其编程可以养成良好的过程性思维。一些底层功能使用C是非常方便的,因为C编译器不会生成额外的代码,一切都在自己掌握中,这是编写实时系统、软件驱动等必须的,对比Assembly来说,C的效率并没有低很多,开发效率却大大提升。目前主流操作系统,如:Windows、Linux等,其大部分模块都用C编写,短期内也不可能改变,从这个角度来说,C也是非常具有生命力的。
三、C++。C++是在C的基础上发展而来的,对C语言进行了扩充,加入了OOP的特性。有人说C++是程序员必学的一门语言,这句话有一定的道理,如果想要了解OO底层实现机制的话,只有学习C++。C++是OO的编程语言,C是过程性的编程语言,而C++早期可以编译成C,这就是OOP与过程编程的桥梁,这是学习OO底层实现机制的最佳策略。由于历史原因,目前很大部分的核心代码都用C++编写了,跟C一样,在短期内,这也不会改变C++占据市场的地位。
四、Java、C#。这两门语言都是绝对的OOP语言,为OOP提供了许多特性。将此二门语言放在一起的目的是由于它们相似度达到80%,此二门语言开发效率最高,是敏捷开发的得力助手,在降低开发成本、迅速完成任务方面表现出色,这两门现代语言当然会有相当大的份额。

Assembly、C、C++、Java、C#:我们一直在自己的方面让计算机编程更佳美好!

会长:今天的访谈就到此结束吧,谢谢Assembly、C、C++、Java、C#。

20 Comments
  1. 沙发。这样都是复杂的课程。我就不去学习了

  2. 祝博主平安夜快乐哦,同时也提前祝博主圣诞节快乐哦。!(*^__^*) ……

  3. 呵呵,谢谢大家光临哈~这个是在搜索汇编英文单词的时候找到的,留个纪念 😳
    话说……虽然我都会,但是,一个都不精,大学教育的失败 😥
    最近比较忙,来的很少 🙁
    不一个一个回复啦,大家圣诞节快乐哈

  4. 为什么你写的我都看不懂 😈

    1. 呃。。学学就懂了,嘿嘿

  5. 哎,这些语言我表示鸭梨很大啊

  6. 面向对象是思想,和语言无关。我用C一样可以面向对象。

    1. 我确实不了解,不过好像有object-c。哎,其实都是应用的,用好就行,不用计较那么多哈。

      1. object-C和ansi C区别比较大。我坚持用C99风格写代码。

        1. 不太懂。没有细致的用过C。我学的太杂,不专一,呵呵~

Leave a Reply

Time limit is exhausted. Please reload the CAPTCHA.