0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Go和Python,Erlang的语言对比分析和Go编程示例概述

8nfr_ZTEdevelop 来源:未知 作者:易水寒 2018-07-21 09:52 次阅读

本文对Go和Python、Erlang做了一些有趣的分析对比,相信大家能从中感受到Go语言的强大和与众不同。

本文主要是介绍Go,从语言对比分析的角度切入。之所以选择与Python、Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性,不过最 主要的原因是这几个我比较熟悉。 Go的很多语言特性借鉴与它的三个祖先:C,Pascal和CSP。Go的语法、数据类型、控制流等继承于C,Go的包、面对对象等思想来源于Pascal分支, 而Go最大的语言特色,基于管道通信的协程并发模型,则借鉴于CSP分支。

Go/Python/Erlang语言特性对比

如《 编程语言与范式 》一文所说,不管语言如何层出不穷,所有语言的设计离不开2个基本面:控制流和数据类型。为了提升语言描述能力,语言一般都提供控制抽象和数据抽象。本小节的语言特性对比也从这4个维度入手,详见下图( 点击见大图 )。

图中我们可以看出,相比于Python的40个特性,Go只有31个,可以说Go在语言设计上是相当克制的。

比如,它没有隐式的数值转换,没有构造函数和 析构函数,没有运算符重载,没有默认参数,也没有继承,没有泛型,没有异常,没有宏,没有函数修饰,更没有线程局部存储。

但是Go的特点也很鲜明,比如,它拥有协程、自动垃圾回收、包管理系统、一等公民的函数、栈空间管理等。

Go作为静态类型语言,保证了Go在运行效率、内存用量、类型安全都要强于Python和Erlang。

Go的数据类型也更加丰富,除了支持表、字典等复杂的数据结构,还支持指针和接口类型,这是Python和Erlang所没有的。特别是接口类型特别强大, 它提供了管理类型系统的手段。

而指针类型提供了管理内存的手段,这让Go进入底层软件开发提供了强有力的支持。

Go在面对对象的特性支持上做了很多反思和取舍,它没有类、虚函数、继承、泛型等特性。

Go语言中面向对象编程的核心是组合和方法(function)。

组合很类似于C语言的struct结构体的组合方式,方法类似于Java的接口(Interface),但是使用方法上与对象更加解耦,减少了对对象内部的侵入。

Erlang 则不支持面对对象编程范式,相比而言,Python对面对对象范式的支持最为全面。

在函数式编程的特性支持上,Erlang作为函数式语言,支持最为全面。

但是基本的函数式语言特性,如lambda、高阶函数、curry等,三种语言都支持。 控制流的特性支持上,三种语言都差不多。

Erlang支持尾递归优化,这给它在函数式编程上带来便利。而Go在通过动态扩展协程栈的方式来支持深度递 归调用。Python则在深度递归调用上经常被爆栈。 Go和Erlang的并发模型都来源于CSP,但是Erlang是基于actor和消息传递(mailbox)的并发实现,Go是基于goroutine和管道(channel)的并发实 现。

不管Erlang的actor还是Go的goroutine,都满足协程的特点:由编程语言实现和调度,切换在用户态完成,创建销毁开销很小。

至于Python,其多 线程的切换和调度是基于操作系统实现,而且因为GIL的大坑级存在,无法真正做到并行。

而且从笔者的并发编程体验上看,Erlang的函数式编程语法风格和其OTP behavior框架提供的晦涩的回调(callback)使用方法,对大部分的程序员, 如C/C++和Java出身的程序员来说,有一定的入门门槛和挑战。而被称为“互联网时代的C”的Go,其类C的语法和控制流,以及面对对象的编程范式, 编程体验则好很多。

Go/Python/Erlang语言语法对比

所有的语言特性都需要有形式化的表示方式,Go、Python、Erlang三种语言语法的详细对比如下(点击见完整大图 第一部分 , 第二部分 , 第三部 分 )。

正如Go语言的设计者之一Rob Pike所说,“软件的复杂性是乘法级相关的”。

这充分体现在语言关键词(keyword)数量的控制上,Go的关键词是最少 的,只有25个,而Erlang是27个,Python是31个。

从根本上保证了Go语言的简单易学。

Go语言将数据类型分为四类:基础类型、复合类型、引用类型和接口类型。

基础类型包括:整型、浮点型、复数、字符串和布尔型。

复合数据类型有数 组和结构体。引用类型包括指针、切片、字典、函数、通道。

其他数据类型,如原子(atom)、比特(binary)、元组(tuple)、集合(set)、记录 (record),Go则没有支持。

Go对C语言的很多语法特性做了改良,正如Rob Pike在《 Less is Exponentially More 》中提到,Go的“起点: C语言,解决一些明显的瑕疵、删除杂 质、增加一些缺少的特性。”

比如,switch/case的case子程序段默认break跳出,case语句支持数值范围、条件判断语句;所有类型默认初始化为0, 没有未初始化变量;把类型放在变量后面的声明语法( 链接 ),使复杂声明更加清晰易懂;没有头文件,文件的编译以包组织,改善封装能力;用空接 口(interface {})代替void *,提高类型系统能力等等。

Go对函数,方法,接口做了清晰的区分。

与Erlang类似,Go的函数作为第一公民。

函数可以让我们将一个语句序列打包为一个单元,然后可以从程序中 其它地方多次调用。

函数和方法的区别是指有没有接收器,而不像其他语言那样是指有没有返回值。

接口类型具体描述了一系列方法的集合,而空接口 interfac{}表示可以接收任意类型。

接口的这2中使用方式,用面对对象编程范式来类比的话,可以类比于subtypepolymorphism(子类型多态)和ad hoc polymorphism(非参数多态)。

从图中示例可以看出,Go的goroutine就是一个函数,以及在堆上为其分配的一个堆栈。所以其系统开销很小,可以轻松的创建上万个goroutine,并且 它们并不是被操作系统所调度执行。

goroutine只能使用channel来发送给指定的goroutine请求来查询更新变量。这也就是Go的口头禅“不要使用共享 数据来通信,使用通信来共享数据”。channel支持容量限制和range迭代器。

Go/Python/Erlang语言词法对比

TDD Go编程示例

本小节以TDD方式4次重构开发一个斐波那契算法的方式,来简单展示Go的特性、语法和使用方式,如Go的单元测试技术,并发编程、匿名函数、闭包 等。 首先,看一下TDD最终形成的单元测试文件:

基于递归的实现方案:

测试结果:

基于goroutine实现的并发方案:

测试结果:

基于迭代的实现方案:

测试结果:

基于闭包的实现方案:

测试结果:

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程
    +关注

    关注

    88

    文章

    3431

    浏览量

    92217
  • Go
    Go
    +关注

    关注

    0

    文章

    40

    浏览量

    12178
  • python
    +关注

    关注

    51

    文章

    4657

    浏览量

    83377
  • erlang
    +关注

    关注

    0

    文章

    16

    浏览量

    5714

原文标题:干货 | Go/Python/Erlang编程语言对比分析及示例

文章出处:【微信号:ZTEdeveloper,微信公众号:中兴开发者社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    #硬声创作季 Go核心编程_Go语言的注释

    编程语言go语言
    Mr_haohao
    发布于 :2022年09月11日 17:32:45

    Go语言开发有什么优势?怎么学?

    带来的各种问题。  3. 性能优异。Go的性能只比C/C++减少了10%左右。相对其他脚本(python/php),性能具有巨大的优势。  那么,Go语言都有哪些公司在用呢?比如goo
    发表于 12-19 16:08

    go语言能做什么工作?

    让程序员更容易地进行维护和修改。它融合了传统编译型语言的高效性和脚本语言的易用性和富于表达性。Go语言作为服务器编程
    发表于 03-22 15:03

    Go开发语言的优势在哪里?

    Go语言是谷歌发布的第二款开源编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性,并专门针对多处理器系统应用程序的编程进行了优化,开
    发表于 03-22 15:04

    D语言,Go语言,Rust语言优势分析

    编者按】本文是D语言来呢后创始人、架构师Andrei Alexandrescu在问答Quora回答在取代C语言的道路上,D、Go和Rust谁的前途最光明?为什么?的答案,从自己的角度谈及了D、
    发表于 10-13 11:11 0次下载

    网易有道CEO周枫推荐Go语言并介绍Go语言的3个优点

    网易有道CEO周枫推荐Go语言。他认为Go很好地继承了C语言灵活、简单有效的思想;Go有很高的生产效率;
    的头像 发表于 01-31 14:11 4939次阅读

    Python 转向 Go语言的9大原因和3大缺点

    转用一门新语言通常是一项大决策,尤其是当你的团队成员中只有一个使用过它时。今年 Stream 团队的主要编程语言Python 转向了 Go
    发表于 06-17 07:40 6686次阅读

    GO语言简介!GO是理想的编程语言吗?

    技术实力毋容置疑,不过这哥俩都是玩Kernel的,经历相同,理念相近,分歧会比较少,他们也都坦承C用得最多最熟,所以注定了GO的类C特性,不过这会不会导致GO设计上的思维火花不足,对OOP以及现代编程思想的支持不足,亦未可知。
    的头像 发表于 04-29 09:47 4113次阅读
    <b class='flag-5'>GO</b><b class='flag-5'>语言</b>简介!<b class='flag-5'>GO</b>是理想的<b class='flag-5'>编程</b><b class='flag-5'>语言</b>吗?

    详解GO语言的趋势与使用情况

    Go 语言简单易学、性能优良。JetBrains Blog 发布了Go 语言的调查报告,看看GO 语言
    的头像 发表于 03-17 11:05 2774次阅读

    Go语言凭借什么成为云原生第一语言的?

    偶然看到有人说, Go 语言目前的火爆可能就是昙花一现而已。这个观点我当然是不认同的。 近几年,关于 Go 与 Java 还有 C 的对比和讨论愈演愈烈,但不可否认的是,在十年多的时间
    的头像 发表于 04-22 10:15 2841次阅读
    <b class='flag-5'>Go</b><b class='flag-5'>语言</b>凭借什么成为云原生第一<b class='flag-5'>语言</b>的?

    go语言枚举类型怎么用

    go 语言枚举类型是这么用的?在什么场景下会用到枚举?本文对 go 语言枚举做了详细讲解。 枚举,是一种重要的数据类型,由一组键值对组成,通常用来在
    的头像 发表于 09-02 09:43 4850次阅读

    带你了解go语言中的闭包

      【 导读】什么是闭包? 什么场景下会用闭包 ? 本文对 go 语言中的闭包做了详细介绍。 闭包是由函数及其相关引用环境组合而成的实体(即:闭包=函数+引用环境)。 Go中的闭包 闭包是函数式
    的头像 发表于 11-02 15:27 2161次阅读

    Go/Rust挑战Java/Python地位

    编程语言方面,Java 和 Python 仍然遥遥领先,并且分别微小增长了 1.7% 和 3.4%;围绕 Go (增长 20%) 和 Rust (增长 22%) 的兴趣则大幅增加。报告
    的头像 发表于 03-06 10:19 482次阅读

    如何让PythonGo互相调度

    我们曾经研究过如何让PythonGo互相调度,当时发现,将Go语言写的模块打包成动态链接库,就能在Python中进行调度: 优劣互补!
    的头像 发表于 11-02 11:24 225次阅读
    如何让<b class='flag-5'>Python</b>和<b class='flag-5'>Go</b>互相调度

    Go语言Python强多少

    1.都说Go语言性能非常强大,那么到底比Python强多少? 为了比较Go语言Python
    的头像 发表于 11-02 14:05 249次阅读
    <b class='flag-5'>Go</b><b class='flag-5'>语言</b>比<b class='flag-5'>Python</b>强多少