zoukankan      html  css  js  c++  java
  • 采访:Go语言编程

    Go语言是由Google在2009年11月份公布的,它的目标是要应对软件开发所面临的最新挑战。Go语言特别被设计为快速(包括在编译时)、支持多核的语言,并且兼顾了动态语言的简单性和静态类型语言的安全性。Mark Summerfield最近出版了《Go语言编程》一书,目的是要帮助当前的程序员学习Go语言。InfoQ最近有幸和Mark一起讨论了Go语言和他的著作。

    InfoQ:你喜欢Go语言的哪些特点?

    Mark Summerfield: Go语言有很多特点我都非常喜欢,其中最主要的是:

    • 像闪电一样快的编译。这使得编辑/编译/运行的周期和Python的编辑/运行周期一样快。
    • 非常高级的并发。你可以很轻松地使用Go语言编写并发程序,而不会有任何显式的锁。另外,goroutine通过操作系统线程多路传输的方式,这意味着,如果你的算法最好以成千上万个并发线程来表示,那么你就可以创建那么多goroutine——而对于线程,通常最好不要创建过多。
    • 无初始化和垃圾回收。这让我们避免了整整两类错误的发生,让编码更简单。
    • 语言本身非常小,让一般的程序员就可以掌握。当考虑模板语言的时候,C++98/03已经不是一般程序员所能接受的, 而C++11更大,也更复杂。与它们相比,Go语言:
    • 使用了新奇的方式来实现面向对象。我发现这种方法很有趣。
    • 对Unicode的支持。我非常喜欢Go语言让你可以使用原生UTF-8或者使用根据你想要的来使用Unicode字符的方式。
     

    InfoQ:你不喜欢Go语言的哪些特点?

    Mark: 最初我不喜欢它的错误处理方法(返回错误值作为唯一或者最后一个返回值),因为我不习惯使用这样的异常处理方式。然而,现在我非常乐于使用它了。

    我还忘了说操作符重载。IMO这个大程序包(针对big.Int和big.Rat类型)很难使用,因为你无法对操作符重载。另外,尽管Go缺少泛型,但那只是针对于类库编写者的问题。由于Go拥有其它语言特性,所以不太需要泛型,比方说它对“<”的操作符重载对于定义自定义的数据类型就非常好。

    InfoQ:从你作为作者的经历看,我发现你已经撰写了好几本关于Python的书。这两种语言相比,你的感觉如何? Go的那些方面让你想念Python? 相对而言,Go的哪些方面让你可以忘记Python?

    Mark: 我要说,总体上看来,Python 3是我最喜爱的语言。然而,Go是我最喜欢的编译型语言。
    我知道很多Python程序员都已经试过Go,但是从个人来说,如果他们想要的是更好的性能,那么最好使用numpy,如果想要快速的算法,可以使用Cython。
    Go想要成为21世纪的C语言,当然我认为时间会验证,Go会成为一种非常有影响力的语言。我确信它会导致其他语言至少增加CSP类库来支持Go样式的并发。

    在语言和标准库方面,Go已经比C更令人惊奇了。然而,C拥有很多很多第三方类库(尽管使用cgo包我们也可以在Go中使用它们)。

    我认为Go拥有足够的高级特性,可以吸引那些想要更高性能、更好的并发模型以及更自由许可的Java程序员。
    我还认为Go可以替换C++ 11,为C++程序员提供很多内容。Go的标准类库比C++更小——但是实际上包含了更多实用的现实功能。当然,C++程序员会发现Go语言没有它们所习惯的一些东西——但是在几秒钟或者几分钟内完成编译,而不是花费几十分钟甚至几个小时会让我们更有生产力,并且Go要比C++更易于维护,因为它是一种更小、更易于理解的语言。当然,Go并不是C++,在三点上还是有区别的(C预处理程序,它没有scope的概念;C++运行时语言;C++编译时语言,即模板)。

    此外,Go程序会编译成单一的可执行文件,而没有任何外部依赖。这使得部署——比方说,在一个组织中所有计算机上——更容易,不需要担心所有计算机是否都拥有相同的类库。

    Go语言即让大家感到熟悉(在C家族中),并且还在关键问题上(面向对象、并发、错误处理、轻量级语法)采取了非常先进的标准,这使得Go非常值得学习,至少我认为是主流编程中可选的一种方法。

    InfoQ:非常感谢你对Go做出的与其他语言的比较,特别是描述了与C++11相比,它是如何降低了复杂度。你是否发现C++11也做出了足够重大的变化,会导致现有的程序员在拥有足够自由度的时候考虑转换到Go语言?

    Mark: 尽管我认为从C++98/03到C++11的发展历程表示有机会可以重新评估并转换到Go语言,但是我认为大多数人实际上不会那么做。C++需要在学习上投入很多。我猜想很多程序员会继续使用C++11的子集,而不是更换语言,特别是对于比C++11小的语言(那样看起来特性也比较少)。当然也会有些人转换到Go语言,特别是那些拥有能够从Go的高级并发模型中受益的应用程序的人。

    使用C++98/03我们已经有一种形势,很多程序员使用语言的特定子集,让他们感到很舒服。当两位或更多使用不同子集的C++程序员必须一起工作,或者维护不是他们编写的C++代码的时候,就会导致问题。我认为C++11会显著地放大这个问题。

    Java的设计要比C++更简单,并在很多方面都很成功。Go是要设计成更好的C,所以我期望它会赢得更多C程序员(对他们来说全都是收获)而不是C++程序员(对他们来说既有收获,也会失去一些特性,像泛型)。

    InfoQ: 你对Go语言的简洁性大加赞赏,但是否有一些你认为应该增加的特性呢? (可能会期望增加操作符重载和泛型。)

    Mark: 我认为你可能需要操作符重载,而不需要泛型。但是我认为唯一真正缺少的是排序的映射表(ordered map)(尽管我在书中提供了对左倾红黑树的Go实现作为例子,它也填补了特定的空白)。

    InfoQ: 你在书的目录中还特别说明了专利流氓的危险。是什么让你包含这项内容呢? 你是否认为有必要提醒大家意识到这个问题,或者是特定的什么事情?

    Mark: 我一点儿也不喜欢专利:我认为那是反竞争的,并且大公司会比小公司更喜欢它。对于软件,版权就已经足够了。我之所以包含了附录,是因为现在我已经开始听说有些程序员开始从美国的市场(例如编写iOS程序的人们)撤回软件,因为不那么做的话,就需要给专利流氓支付“保护费”。软件专利使得个人程序员或者小团队更难竞争,我认为这不仅仅是可耻,而且在道德上是错误的。

    在过去的几年间,我对商业化软件有一些看法:利基(niche)产品会很有用,而不是大规模的销售团队。然而,我并不准备付出时间,因为我主要的市场还是美国,对于我来说冒着花费时间和精力的风险,而只是让专利流氓能够“偷到”更多东西,是非常不经济的。

    关于书的作者

    Mark Summerfield 以一等毕业生从威尔史旺西大学的计算机科学专业毕业。在工作之前,他继续做了一年的研究生。他从事软件工程师职业多年,在加入Trolltech之前在多家公司中工作过。他还作为Trolltech的文档管理员工作了将近三年,在那期间他编辑了Trolltech的技术杂志《Qt季刊》。Mark是《C++ GUI Programming with Qt 3 》和《C++ GUI Programming with Qt 4》的共同作者,并且是《Rapid GUI Programming with Python and Qt: The Definitive Guide to PyQt Programming》的作者。Mark是Qtrac Ltd.公司的老板,在其中他作为独立作者、编辑、培训师和顾问工作,专注于C++、Qt、Pytho和PyQt。
  • 相关阅读:
    WPF:ListView 分组合并
    WPF:ListView 分页
    SQL
    多线程27 -- ReentrantLock
    String 对象常用方法及属性 详细介绍
    js中Array 对象方法 详细介绍
    js--运算符与或非 及 if判断条件、隐式转换 介绍
    js-函数表达式和函数声明的区别
    js预编译案例分析
    js--万物皆对象
  • 原文地址:https://www.cnblogs.com/code-style/p/3446241.html
Copyright © 2011-2022 走看看