选择哪种编程语言?

作者:Paul Barry

在本文中,我调查了几种流行的编程语言,并就何时适合使用它们提供了一些个人意见。我还将讨论每种语言可用的一些开发工具。希望在本文结束时,Paul 将能够做出明智的决定。(还包括一份简短的注释参考书目)。

首先让我列出五个竞争者:C、C++、Java、Python 和 Perl。当然,还有许多其他编程语言;然而,提到这五种语言的次数比大多数语言都多,尤其是在 Linux 世界中。

在依次查看每种语言之前,我们可以对它们都说一件事:它们都是通用语言,可以用于大多数编程任务。一个普遍的区别是,C 和 C++ 是编译型语言,很像 Fortran,而 Python 和 Perl 是解释型语言,就像大多数版本的 BASIC 一样。Java 介于两者之间;源代码被编译成中间格式,然后被解释执行。

C 语言的历史可以追溯到 UNIX 的第一个版本——它被用来编写大部分操作系统。Linux 内核以及操作系统的大部分其他部分也是(主要)用 C 语言编写的。这并非偶然,因为 C 语言作为系统级编程工具非常出色。C 语言让您可以完全控制您所做的一切。尽管 C 语言是一种小型编程语言,但魔鬼在于细节,所有这些控制都是有代价的。您,程序员,必须处理内存的分配和释放。还有通过指针和指针运算直接操作内存的问题需要处理。这基本上排除了 C 语言用于日常编程的可能性。但是,如果您想摆弄您的内核代码或编写设备驱动程序,您最好投入大量时间来掌握 C 语言。

Linux 附带的 C 编译器是 GNU C 编译器,gcc。不要被商业供应商(及其花哨的广告)所愚弄,认为 gcc 功能不足。编译器技术非常出色且非常成熟。可以从几家商业组织获得 gcc 的付费支持,最著名的是 Cygnus(现在是 Red Hat 的一部分),gcc 的维护者。也可以获得免费支持;请查看 GNU 服务目录 https://gnu.ac.cn/prep/service.html 以获取有关这两种支持类型的更多详细信息。

那么,您何时会决定购买商业 C 编译器,尤其是在 Linux 捆绑了 gcc 的情况下?好吧,有了 gcc 的所有可用支持,为您的编译器付费可能很难证明是合理的。如果您是从 Wintel 和 Macintosh 平台迁移过来的,您可能会对命令行开关和 makefile 感到反感,更不用说 vi 的编辑模式了。如果您追求的是集成开发环境 (IDE),Linux 也有很多。通常,这些集成工具托管在 GUI 中,IDE 提供对您将用于编辑、编译、链接、调试和运行代码的工具的集中和一致的访问。IDE 的示例包括 KDevelop 和 Source Navigator。GUI 构建器也存在,开源世界中最著名的是 Glade(请参阅网页资源侧边栏)。如果您真的喜欢当前平台上可用的 IDE 工具,您也可以在 Linux 上找到它们。MetroWerks 的 CodeWarrior 就是这样一种产品,它也适用于 Wintel 和 Macintosh 平台。请准备好您的信用卡。

C 语言还有另一个有趣的特性。它构成了本文讨论的所有其他语言的基础。C++ 被设计为 C 语言的一个非常接近的超集。Python 和 Perl 是用 C 语言编写的。据我所知,Java 是一种主要用 C 语言编写的衍生语言。再次重复一遍,C 语言作为系统级编程工具非常出色。

C++ 包含了 C 语言的所有功能,甚至更多。“更多”指的是大量包含的面向对象 (OO) 技术,以及更好的类型安全、命名空间支持、模板和异常处理。如果您正在计划一个大型系统级项目或应用程序,C++ 可能是一个不错的选择。它的使用可以使代码比等效的 C 代码更模块化且更易于维护。请记住,我对 C 语言所说的一切也适用于 C++,所有这些新技术都可能难以掌握。如果使用得当,它也可能非常棒。当然,如果您不想使用新功能,也不需要使用,因为 C++ 不会将它们强加给程序员。对于 OO 技术尤其如此,如果使用不当,它可能会很混乱。

令人惊讶的是,用于普通 C 语言的 gcc 编译器也可以处理和编译用 C++ 编写的代码,这可以使从 C 语言到 C++ 的过渡从工具的角度来看相对轻松。要让 gcc 编译 C++ 代码,只需将编译器调用为 g++ 而不是 gcc。(您也可以依赖 gcc 的内置行为,如果文件扩展名以 .C、.cc、.cpp、c++、.cp 或 .cxx 结尾,它会将您的代码编译为 C++)。

在查看 C 和 C++ 时,值得考虑的是这些语言的大量可用库。如果您计划编写一些 GUI 代码,您会发现大量 API 和库可以在 GNOME、KDE 和纯 X 中使用。常用的库包括 Qt、ACE 和 Gtk--。如果您真的喜欢 C++,请花时间查看标准 C++ 库,它现在是 ISO C++ 标准的一部分。该库包括称为 STL(标准模板库)的技术。我大约在四年前的高级 OO 课程中首次接触 STL,并认为它是我见过的最酷的 C++ 代码片段。它现在是 C++ 本身的一部分,这值得称赞。

Java,除其他外,被宣传为与 C++ 相似,但更简单。这对 C++ 程序员来说是个好消息,但对我们其他人来说却并非如此——大多数编程语言都比 C++ 容易!事实上,有些人认为 Java 更接近 C,但有一些主要例外;Java 完全是面向对象的(即,您必须以 OO 方式编程),摒弃了 C 和 C++ 的指针,并提供自动内存管理(这在许多程序员眼中是一个巨大的优势)。

在本文讨论的所有编程语言中,Java 在产生最多的炒作和副本方面赢得了头筹。要相信其创造者和管理者 Sun Microsystems,Java 是您永远需要的全部编程语言。不要轻易被愚弄。

每个 Java 实现都提供一个 Java 虚拟机 (JVM),它位于主机操作系统之上。您编写的 Java 代码被“编译”以在此 JVM 上运行,而不是在主机操作系统上运行,并且 JVM 存在于包括 Linux 在内的所有主要平台上。由于所有这些不同系统上的 JVM 应该是相同的,因此不允许特定于任何一个平台的操作(至少,理论上是这样)。Java 本地接口允许特定于平台的程序员绕过此限制。

询问大多数不使用 Java 的程序员,他们认为 Java 最大的缺点是什么,绝大多数人会评论运行时性能。简而言之,它可能很差。每个 Java 供应商都在努力解决这个问题,并且有大量的即时 (JIT) 编译器可用。JIT 技术在很大程度上提高了 Java 的运行时性能;然而,与等效 C/C++ 代码的运行时性能相比,Java 仍然(并且很可能永远)排在第二位。这更多与语言的设计有关,而不是与实现有关。如果您喜欢 Java 并且希望它可以编译,请不要担心——gcc 编译器也可以(编译成机器代码)您的 Java 代码。当然,当您这样做时,您将失去所有 Java 可移植性优势。您也成为了实验的一部分,因为 gcc 中的 Java 支持仍在进行中。

当然,一旦您编译了您的 Java 代码(使用 Java 编译器,而不是 gcc),它应该可以在任何 JVM 上运行,而与平台无关。因此,理论上,您在 Linux 上开发的基于 Java 的程序可以以“编译形式”运送给 Wintel 和 Macintosh 世界的用户。同样,理论上,该程序应该在每个目标平台上以相同的方式运行。当然,您需要确保您要运送到的每个 JVM 都支持您正在编写的 Java 版本。明智的程序员(以及那些想要保住工作的人)最好在他们针对的每个 JVM 上测试他们开发的应用程序。这是一个编写一次代码一次,编译一次一次,并在每个地方测试它的案例。

Java 非常庞大,拥有一个庞大得令人望而生畏(并且还在增长)的标准库,这使得学习和掌握它变得令人生畏。然而,Java 很有趣,因为它对互联网高度敏感。如果您的计划是为网页编写小程序,那么您将很难获得比 Java 提供的更好的支持。

标准 Java 库充满了可供程序员重用的好东西,包括从高级数据结构到 GUI 工具包的一切。其中最有用的是 Swing 技术,在最新版本的 Java 中,它呈现出程序员配置的 OS/GUI 的外观。这意味着可以在 X Windows 或 Mac 之上拥有 Windows 的外观。

Java 工具和 JVM 是免费提供的,并且应该随大多数主要 Linux 发行版一起提供。Sun 免费提供全套命令行工具供下载,并且大量传统工具供应商非常愿意向所有人销售基于 Java 的 IDE。

如果您刚刚阅读了最后几个段落后,感觉到我对 Java 印象不深,那么您就对了。对于某些人来说,Java 被认为是通用应用程序开发(这占其大部分受欢迎程度)的 C 和 C++ 的一个很好的进步,但在我看来,它还不足以引起所有兴奋。这很好地将我带到了最后两个竞争者:Python 和 Perl。

Python 和 Perl 的伟大之处在于,在 C、C++ 或 Java 中可能需要几页代码才能完成的事情,使用这些编程语言只需几行代码即可完成。如果您需要一个快速的小程序来做一些有用的事情,Python 和 Perl 都可以让您在很短的时间内生成一些可以工作的东西。与 Java 一样,Python 和 Perl 会为您处理内存分配和释放。与 C、C++ 和 Java 不同,Python 和 Perl 都在更高的级别上运行,并且通常被称为“脚本”语言。

Python 是一种很酷的小型语言。它设计精良、紧凑、易于学习且编程有趣。Python 强烈鼓励程序员以 OO 方式编程,但不要求这样做。在我看来,它是学习 OO 编程时使用的最佳语言之一。Python 中 OO 的实现简洁明了,同时又非常强大。基本的 Python 执行环境也是这里讨论的五种语言中最具交互性的,这可能非常有用(尤其是在调试代码时)。

Python 因赋予空格语法意义而受到很多批评。例如,如果一段代码与 if 语句关联,那么代码需要缩进在 if 语句下方,以便关联关系在 Python 中起作用。一些程序员讨厌这种想法。他们应该克服它,因为 Python 的缩进方法有效地消除了代码中花括号和分号的需要,这(如果您像我一样是老 C 语言程序员)需要一些时间来适应。但是,您会适应它的,并且在使用 Python 一段时间后,您几乎不会注意到它们不见了。当然,所有这些缩进的好处在于,Python 代码往往看起来非常整洁,无论实际是谁编写的。

与 Java 一样,Python 也有一个庞大的可重用代码标准库。Python 是一个交互式解释器,并且(通常)从命令行运行。一个实验性的 IDE,称为 IDLE,随当前发行版一起提供,并提供一个 GUI 托管的开发环境。虽然功能不全,但 IDLE 提供了对未来发展方向的一瞥。与 Python 相关的另一个有趣的项目是 JPython。这是完全用 Java 编写的 Python 实现。因此,如果您的目标系统有 JVM,您可以使用 JPython 对其进行编程。JPython 正在更名为 Jython,因为 JPython 人员已经脱离了 CNRI(国家研究倡议公司),并且 CNRI 拥有 JPython 商标。Jython 人员说新名称会逐渐被接受。我们将拭目以待。

我对 Python 感到担忧的是,它的创建者似乎正在将其定位为现代 Pascal 的等价物。这种策略很可能弊大于利。Pascal 最出名的是作为教学语言的选择,尽管它在一些备受瞩目的技术中得到应用:当 Apple Computer 发布 Macintosh 时,其应用程序编程语言是 Pascal;Inprise Corporation 使用面向对象的 Pascal 作为其 Delphi RAD 工具的基础。不幸的是,对于 Pascal 来说,“教学语言”的标签是一种耻辱,阻止了许多人认真对待它。同样的命运很可能在等待 Python。让我们希望这种情况不会发生。

许多 Perl 程序员会告诉您,如果没有 Perl,他们都将使用 Python 编程。Python 的问题在于存在 Perl,并且它一直在变得更好。

Perl 是一种庞大的编程语言。也许 Perl 的徽标是一只骆驼并非偶然。Perl 如此庞大的部分原因是,在 Perl 中“有不止一种方法可以做到!”(正如他们的座右铭所说)。这被一些人视为巨大的福音,对另一些人来说则令人困惑。有些人喜欢 Perl 以多种方式做事的能力,而另一些人则纠结于选择“一种真正的方法”来做某事。在 Perl 文化中,没有一种真正的方法,并且鼓励 Perl 程序员选择最适合他们的方法。这种以想要的方式工作的自由是 Perl 成功的原因之一。

另一个原因是 CPAN,即综合 Perl 存档网络。CPAN 在许多镜像互联网站点上可用,它提供了对大量 Perl 可重用模块的访问,包括从与数据库对话和处理 XML 到使用 GUI 的一切。事实上,几乎每种可以想象到的编程技术用途都已被“CPAN 化”。如果您正在考虑 Perl,请花几分钟时间查看位于 www.perl.com/CPAN 的附加模块列表。

Perl 可以与 Tk 技术(来自 TCL 的著名技术)一起用于编程 GUI。(Python 也使用 Tk 进行 GUI 编程,称该技术为 tkInter)。也存在对其他 GUI 工具包的支持,最著名的是 Gtk 的 Perl API(GIMP 使用)。查看 CPAN 以获取更多详细信息。

不要被愚弄,认为 Python 和 Perl 不能用于编程大型、复杂的应用程序。就 Perl 而言,可能需要比 Python 更多的程序员纪律。当然,您不会使用这些编程语言中的任何一种来编写操作系统或设备驱动程序,但其他一切都是公平的游戏。与 Java 一样,Python 和 Perl 在原始执行速度方面表现不佳。毕竟,它们都是解释器。如果性能对您至关重要,您需要超越这些语言并选择 C 或 C++。正如您可能想象的那样,Python 和 Perl 作为休闲程序员的工具非常出色。

大多数 Linux 发行版已经在其 CD-ROM 中包含了这些编程语言。(Red Hat 大量使用 Python 来执行系统管理任务,而 Perl 是 Mandrake 和 Debian 人员的最爱)。尝试它们并决定哪一个最适合您,您无需花费任何费用(除了您的时间)。祝您编程愉快!

注释参考书目

C 编程语言,第 3 版,作者 Brian Kernighan 和 Dennis Ritchie (Prentice Hall)——最初于 1978 年编写,这是语言作者对 C 语言的经典介绍。

在 Macintosh 上学习 C++,作者 Dave Mark (Addison-Wesley)——不要让封面上的“Macintosh”字样吓到您。这是我见过的对 C++ 的最佳入门描述之一。它假设具备一些 C 语言的先验知识。所有编程示例都将在 Linux 上运行。同一作者还撰写了在 Macintosh 上学习 Java,我也强烈推荐。

C++ 编程语言(第 3 版),作者 Bjarne Stroustrup (Addison-Wesley)——语言作者的经典 C++ 教材。除非您拥有本书,否则您不能称自己为 C++ 程序员。同样值得关注的是,同一作者的C++ 的设计与演化 (Addison-Wesley)。

Java 权威指南,第 3 版,作者 David Flanagan (O'Reilly)——如果您已经了解 C 和/或 C++,那么本书将使您快速掌握 Java。它也可以作为该语言非常方便的快速参考。

学习 Python,作者 Mark Lutz 和 David Ascher (O'Reilly)——对 Python 所有方面的温和介绍。OO 的来龙去脉也得到了充分详细的介绍,以便为新手提供对这种编程技术的初步了解。

Python 基本参考,作者 David Beazley (New Riders)——对语言特性的良好回顾,以及优秀的桌面参考。

Perl:程序员伴侣,作者 Nigel Chapman (Wiley)——当从另一种编程语言迁移到 Perl 时,(在我看来)没有比这更好的教材了。这是我最喜欢的 Perl 书籍。

Perl 编程,第 3 版,作者 Larry Wall、Tom Christiansen 和 Jon Orwant (O'Reilly)——俗称“骆驼”,这本经典的 Perl 参考书(最近已修订)是所有认真的 Perl 程序员的必备之物。

网页资源

https://gnu.ac.cn - GNU 项目(和 gcc)的所在地。http://www.research.att.com/~bs/C++.html - C++ 创建者 Bjarne Stroustrup 的主页。http://www.kdevelop.org - KDE KDevelop IDE 的官方主页https://#/products/support/gnupro/ - “专业”RedHat 开发工具列表,包括有关 Source Navigator 的信息http://glade.pn.org - GTK+/Gnome 界面构建器http://java.sun.com - Java 技术的官方主页,位于 Sun Microsystemshttps://pythonlang.cn - Python 编程社区的官方网站http://www.jpython.org - JPython 网站http://sourceforge.net/projects/jython - 有关 Jython 项目(JPython 的继任者)的信息https://perldotcom.perl5.cn - Perl 在互联网上的家http://www.cpan.org - Perl 的综合 Perl 存档网络 (CPAN)

Paul Barry (paul.barry@itcarlow.ie) 在爱尔兰卡洛理工学院 (http://www.itcarlow.ie) 讲授计算机网络。自 1986 年以来(以各种身份),他一直受雇使用 COBOL、Fortran、Pascal、C 和 C++ 编程。尽管详细研究了 Java 和 Python,但他最喜欢的编程语言仍然是 Perl。

电子邮件:ljeditors@ssc.com

加载 Disqus 评论