著名黑客雷蒙评价最重要的几种编程语言

          虽说C语言在内存管理方面存在严重的缺陷,不过它还是在某些应用领域里称王称霸。对于那些要求最高的效率,良好的实时性,或者与操作系统内核紧密关联的程序来说,C仍然是很好的选择。

  C 良好的可移植性也为它加了分。不过现在很多其他的语言可移植性越来越好,C在这方面的优势可能会逐渐丧失。

  现有的很多程序可以产生非常棒的C代码,比如语法分析器、GUI Builder 等,这时候C语言也是有吸引力的,因为你所需要编写的代码只是整个程序的一小部分。

  再有,我们当然应该认识道,C语言对于程序员来说具有无可替代的价值。就我这里讨论的每一种语言而论,只要你发掘的足够深,到最后你会看到它们的内核都是用纯正的、可移植的C写成的。

  到了今天这个时候,我们最好把C看成是 UNIX 虚拟机上的高级汇编语言。

  就算是其他的高级语言完全可以满足你的工作需要,抽出时间来学习C语言也仍然有益,它能帮助你在硬件体系的层次上思考问题。

  即使到了今天,最好的C语言教程仍然是 1988 年出版的K&R第二版 The C Programming Language.

  总结:C最出色的地方在于其高效和贴近机器,最糟糕的地方在它的内存管理地狱。

  C++

  C++最初发布于 1980 年代中期,当时面向对象语言被认为是解决软件复杂性问题的银弹。C++的面向对象特性看相去使其全面超越了C,支持者认为 C++ 将迅速把上一代语言挤到陈列馆里去。

  但是历史并非如此。究其原因,至少有一部分归咎于 C++ 本身。为了与C兼容,C++被迫作出了很多重大的设计妥协,结果导致语言过分华丽,过分复杂。为了与C兼容,C++并没有采用自动内存管理的策略,从而丧失了修正C最严重问题的机会。

  另外一部分原因,恐怕要算到面向对象身上。看起来 OO 并没有很好的达成人们当年的预期。我就这个问题调研过,我发现使用 OO 方法导致组件之间出现很厚的粘合层,并且带来了严重的可维护性问题。今天让我们来看看开放源码社区,你会发现 C++ 的应用还是集中在 GUI,游戏和多媒体工具包这些方面,在其他地方很少用到。要知道,面向对象也只是在这些领域被证明非常成功,而开放源码社区的选择,很大程度上体现了程序员的自由意志,而不是公司管理层的胡乱指挥。

  也许 C++ 实现 OO 的方法有问题。有证据表明 C++ 程序在整个生命周期的开销高于相应的C,Fortran 和 Ada 程序。不过,究竟这是否应该归咎与 C++ 的 OO 实现上,还不清楚。

  最近几年,C++加入了很多非 OO 的思想,其异常思想类似 Lisp,STL 的出现是非常了不起的。

  其实 C++ 最根本的问题在于,它基本上只不过是另一种传统的语言。STL 中的内存管理比先前的 new/delete 和C的方案要好的多,但是还是没有解决问题。对于很多应用程序而言,其 OO 特性并不明显,相比与C,除了增加复杂度之外没有获得很多好处。

  总结:C++优点在于作为编译型语言,把效率与泛型和面向对象特性结合起来,其缺点在于过于华丽复杂,倾向于鼓励程过分复杂的设计。

  Java

  Java 的设计很聪明,它采用了自动内存管理,这是最大的改进,支持 OO 设计带来的好处虽然不那么突出,不过也很值得赞赏,相比C++,其 OO 设计规模小而且简单。

  相对于 Python 而言,Java 有一些明显的失误。有些地方设计的还是太复杂,甚至有缺陷。Java 的类可见性和隐式 scoping 规则太复杂了。Interface 机制是为了避免多继承带来的问题而设计的,但是要理解和使用它还是挺难。内部类和匿名类导致令人困惑的代码。缺乏有效的析构机制,使得除了内存之外的其他资源(比如互斥量和锁)管理起来很困难。Java 的线程不可靠,其I/O机制很强大,但是读取一个文本文件却非常繁琐。

  Java 没有管理库版本的机制,从而形式上重蹈了了 Windows DLL 地狱的覆辙。在类似应用服务器这样的环境里,这引起了大量的问题。

  总体而言,我们可以说除了系统编程和对效率要求极高的程序之外,Java 在大部分领域优于C++。经验表明,Java 程序员似乎不太容易象 C++ 程序员那样构造过度的 OO 层,不过在 Java 中这仍然是个严重问题。

  Java 是否优于诸如 Perl,Python 这样的语言?我们还不是很清楚,很大程度上似乎跟程序规模有关。其擅长的领域基本上于 Python 相似,在效率上无法跟C/C++相提并论,在小规模的、大量使用模式匹配和编辑的项目里也无法匹敌 Perl。在小项目里,Java 显得过分强大了。我们猜测 Python 更适合小项目,而 Java 适合大项目,不过这一点并没有得到有力的证明。

  Python

  Python 是一种脚本语言,可以与C紧密整合。它可以与动态加载的C库模块交换数据,也可以作为内嵌脚本语言而从C中调用。其语法类似C和模块化语言的杂合,不过有一个独一无二的特征,就是以缩进来确定语句块。

  Python 语言非常干净,设计优雅,具有出色的模块化特性。它提供了面向对象能力,但不强迫用户进行面向对象设计。其类型系统提供了强大的表达能力,类似 Perl,具有匿名 lambda 表达式,这点又让 Lisp 黑客们感到亲切 Python 依靠 Tk 提供方便的 GUI 界面开发能力。

  在所有的解释型语言里,Python 和 Java 最适合多名程序员以渐进方式协同开发大型项目。在很多方面,Python 比 Java 要简单,它非常适合与构造快速原型,这一点使得它对于 Java 有独特优势:对于那些既不很复杂,又不要求高效率的程序,Python 十分合适。

  Python 的速度没法跟C/C++相比,不过在今天的高速 CPU 上,合理地使用混合语言编程策略使得 Python 的上述弱点被有效地弥补。事实上,Python 几乎被认为是主流脚本语言中最慢的一个,因为它提供了动态多态性。在大量使用正则表达式的小型项目,它逊于 Perl。对于微型项目而言,shell 和 Tcl 可能更好,Python 显得太过强大了。

  总结:Python 最出色的地方在于,它鼓励清晰易读的代码,特别适合以渐进开发的方式构造大项目。其缺陷在于效率不高,太慢,不但跟编译语言相比慢,就是跟其他脚本语言相比也显得慢。

评价并不精辟,感觉没有什么深度相关推荐

  1. 整理 读过感觉不错的深度学习博客(更新中)

    1.          http://blog.csdn.NET/zouxy09/article/details/8775488  (深度学习)学习笔记整理系列 2.          https:/ ...

  2. SVO深度解析(一)之简介和评价

    之前研究VSLAM时,本人对SVO研究过一段时间,那个时候没有时间总结, 现在快毕业了,总结一下自己了解的算法吧.... 对SVO的总结共分为3各部分,分别为简介和评价部分.跟踪部分.深度滤波部分(建 ...

  3. 图像处理:以图像分类和图像深度估计为例,如何将研究想法进行迁移学习应用?

    图像处理涵盖了图像识别.图像分割.图像分类.深度估计等各个子领域/方向,当论文看到一定程度时,总会闪现一些灵感,但是常常就此打住,因为思想的类比难以下手? 举例来说,在NLP领域的transforme ...

  4. 神经网络 深度神经网络,深度神经网络通俗理解

    简述深度学习的基本方法. 深度学习,需要怎么做到? 最佳答案1.深度学习,首先要学会给自己定定目标(大.小.长.短),这样学习会有一个方向:然后要学会梳理自身学习情况,以课本为基础,结合自己做的笔记. ...

  5. 深度学习已入末路,谁能引领下一代AI?

    https://www.toutiao.com/a6656350889747415556/ AI能将一根香蕉照片识别成一台烤面包机,尽管AI在训练阶段可能被展示了数千张香蕉.蛞蝓.蜗牛以及其他类似物体 ...

  6. 刚刚,旷视开源深度学习框架「天元」:Brain++内核,研发和落地都在用;孙剑:COCO三连冠背后的秘密武器...

    乾明 发自 凹非寺  量子位 报道 | 公众号 QbitAI 耗费资源打造优化6年,迭代到8.0版本,旷视技术体系的关键支柱,现在正式对外开源. 刚刚,深度学习驱动之下最早创业的中国AI独角兽旷视,宣 ...

  7. AI专家Marcus质疑深度学习:面临十大挑战(含参考文献)

    夏乙 若朴 安妮 编译整理 量子位 出品 | 公众号 QbitAI 多年坚持为深度学习泼冷水的纽约大学心理学教授马库斯老师(Gary Marcus),今天终于写了一篇长长的文章,将自己的对深度学习的看 ...

  8. 还说不会深度学习,三招帮你“炼丹”成功

    深度学习领域发展仍是火热朝天,众多方向门派百花齐放,CV和NLP领域一直是高手云集,Transformer最近异军突起,卷起一片波澜,其他众多领域,包括:迁移学习.强化学习.集成学习等,也有着各派的掌 ...

  9. 人人都可以创造自己的AI:深度学习的6大应用及3大成熟领域

    导读:深度学习,也称"阶层学习"或"分层学习",是基于学习数据表征的更广泛的机器学习方法系列的一部分,而不是基于特定任务的算法.深度学习通过组合低层特征形成更加 ...

最新文章

  1. 学python就业要看哪些书-人人学Python,为什么就业拿高薪的那么少?
  2. 【Python】pymysql基础:数据库操作
  3. STL中的unique函数
  4. linux yum php环境,centos下yum搭建安装linux+apache+mysql+php环境教程
  5. spring @Value注解#和$区别
  6. Material Design入门(三)
  7. 语法糖 python_Python___语法糖
  8. 阿里云-设备影子概览
  9. 如何解决“指定的服务已被标记为删除”错误
  10. 全国行政区划代码(json版)
  11. STM32基础知识及环境搭建
  12. MBI5020 16位恒流驱动芯片
  13. 学计算机应用技术掉头发,为什么程序员更容易脱发呢?
  14. unity3d-学习笔记8-卡牌游戏制作(实现动态读取卡片信息并且在游戏界面展现)
  15. 好玩的智力测试题-精品
  16. 【转载】除了Teamviewer,这些优秀的远程软件你用了吗
  17. 完美解决Macbook安装win 10调节亮度的问题
  18. 【个人向】《春物》 小说原文关键段落摘录
  19. 快乐玩前端:情人节请用代码表达你的爱意,女友收到都哭了
  20. 三次样条曲线CubicSpline

热门文章

  1. 添加softmax层_PyTorch入门之100行代码实现softmax回归分类
  2. Oralce的图形化界面----plsql developer涉及到的知识点总结
  3. 计算机视觉编程——OpenCV
  4. 2021全国大学生物联网大赛记
  5. CCF-CSP 201903-2 二十四点 Python语言 模拟栈实现
  6. 文巾解题 1446. 连续字符
  7. 文巾解题 203. 移除链表元素
  8. R语言实战应用精讲50篇(二十七)-R语言实现随机森林(附R语言代码)
  9. R语言应用实战系列(三)-智能推荐模型的构建
  10. Flink从入门到精通100篇(十七)-Spark/Flink广播如何实现作业配置动态更新?