在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Go和Python,Erlang的語(yǔ)言對(duì)比分析和Go編程示例概述

8nfr_ZTEdevelop ? 來(lái)源:未知 ? 作者:易水寒 ? 2018-07-21 09:52 ? 次閱讀

本文對(duì)Go和Python、Erlang做了一些有趣的分析對(duì)比,相信大家能從中感受到Go語(yǔ)言的強(qiáng)大和與眾不同。

本文主要是介紹Go,從語(yǔ)言對(duì)比分析的角度切入。之所以選擇與Python、Erlang對(duì)比,是因?yàn)樽鰹楦呒?jí)語(yǔ)言,它們語(yǔ)言特性上有較大的相似性,不過(guò)最 主要的原因是這幾個(gè)我比較熟悉。 Go的很多語(yǔ)言特性借鑒與它的三個(gè)祖先:C,Pascal和CSP。Go的語(yǔ)法、數(shù)據(jù)類型、控制流等繼承于C,Go的包、面對(duì)對(duì)象等思想來(lái)源于Pascal分支, 而Go最大的語(yǔ)言特色,基于管道通信的協(xié)程并發(fā)模型,則借鑒于CSP分支。

Go/Python/Erlang語(yǔ)言特性對(duì)比

如《 編程語(yǔ)言與范式 》一文所說(shuō),不管語(yǔ)言如何層出不窮,所有語(yǔ)言的設(shè)計(jì)離不開2個(gè)基本面:控制流和數(shù)據(jù)類型。為了提升語(yǔ)言描述能力,語(yǔ)言一般都提供控制抽象和數(shù)據(jù)抽象。本小節(jié)的語(yǔ)言特性對(duì)比也從這4個(gè)維度入手,詳見下圖( 點(diǎn)擊見大圖 )。

圖中我們可以看出,相比于Python的40個(gè)特性,Go只有31個(gè),可以說(shuō)Go在語(yǔ)言設(shè)計(jì)上是相當(dāng)克制的。

比如,它沒(méi)有隱式的數(shù)值轉(zhuǎn)換,沒(méi)有構(gòu)造函數(shù)和 析構(gòu)函數(shù),沒(méi)有運(yùn)算符重載,沒(méi)有默認(rèn)參數(shù),也沒(méi)有繼承,沒(méi)有泛型,沒(méi)有異常,沒(méi)有宏,沒(méi)有函數(shù)修飾,更沒(méi)有線程局部存儲(chǔ)。

但是Go的特點(diǎn)也很鮮明,比如,它擁有協(xié)程、自動(dòng)垃圾回收、包管理系統(tǒng)、一等公民的函數(shù)、棧空間管理等。

Go作為靜態(tài)類型語(yǔ)言,保證了Go在運(yùn)行效率、內(nèi)存用量、類型安全都要強(qiáng)于Python和Erlang。

Go的數(shù)據(jù)類型也更加豐富,除了支持表、字典等復(fù)雜的數(shù)據(jù)結(jié)構(gòu),還支持指針和接口類型,這是Python和Erlang所沒(méi)有的。特別是接口類型特別強(qiáng)大, 它提供了管理類型系統(tǒng)的手段。

而指針類型提供了管理內(nèi)存的手段,這讓Go進(jìn)入底層軟件開發(fā)提供了強(qiáng)有力的支持。

Go在面對(duì)對(duì)象的特性支持上做了很多反思和取舍,它沒(méi)有類、虛函數(shù)、繼承、泛型等特性。

Go語(yǔ)言中面向?qū)ο缶幊痰暮诵氖墙M合和方法(function)。

組合很類似于C語(yǔ)言的struct結(jié)構(gòu)體的組合方式,方法類似于Java的接口(Interface),但是使用方法上與對(duì)象更加解耦,減少了對(duì)對(duì)象內(nèi)部的侵入。

Erlang 則不支持面對(duì)對(duì)象編程范式,相比而言,Python對(duì)面對(duì)對(duì)象范式的支持最為全面。

在函數(shù)式編程的特性支持上,Erlang作為函數(shù)式語(yǔ)言,支持最為全面。

但是基本的函數(shù)式語(yǔ)言特性,如lambda、高階函數(shù)、curry等,三種語(yǔ)言都支持。 控制流的特性支持上,三種語(yǔ)言都差不多。

Erlang支持尾遞歸優(yōu)化,這給它在函數(shù)式編程上帶來(lái)便利。而Go在通過(guò)動(dòng)態(tài)擴(kuò)展協(xié)程棧的方式來(lái)支持深度遞 歸調(diào)用。Python則在深度遞歸調(diào)用上經(jīng)常被爆棧。 Go和Erlang的并發(fā)模型都來(lái)源于CSP,但是Erlang是基于actor和消息傳遞(mailbox)的并發(fā)實(shí)現(xiàn),Go是基于goroutine和管道(channel)的并發(fā)實(shí) 現(xiàn)。

不管Erlang的actor還是Go的goroutine,都滿足協(xié)程的特點(diǎn):由編程語(yǔ)言實(shí)現(xiàn)和調(diào)度,切換在用戶態(tài)完成,創(chuàng)建銷毀開銷很小。

至于Python,其多 線程的切換和調(diào)度是基于操作系統(tǒng)實(shí)現(xiàn),而且因?yàn)镚IL的大坑級(jí)存在,無(wú)法真正做到并行。

而且從筆者的并發(fā)編程體驗(yàn)上看,Erlang的函數(shù)式編程語(yǔ)法風(fēng)格和其OTP behavior框架提供的晦澀的回調(diào)(callback)使用方法,對(duì)大部分的程序員, 如C/C++和Java出身的程序員來(lái)說(shuō),有一定的入門門檻和挑戰(zhàn)。而被稱為“互聯(lián)網(wǎng)時(shí)代的C”的Go,其類C的語(yǔ)法和控制流,以及面對(duì)對(duì)象的編程范式, 編程體驗(yàn)則好很多。

Go/Python/Erlang語(yǔ)言語(yǔ)法對(duì)比

所有的語(yǔ)言特性都需要有形式化的表示方式,Go、Python、Erlang三種語(yǔ)言語(yǔ)法的詳細(xì)對(duì)比如下(點(diǎn)擊見完整大圖 第一部分 , 第二部分 , 第三部 分 )。

正如Go語(yǔ)言的設(shè)計(jì)者之一Rob Pike所說(shuō),“軟件的復(fù)雜性是乘法級(jí)相關(guān)的”。

這充分體現(xiàn)在語(yǔ)言關(guān)鍵詞(keyword)數(shù)量的控制上,Go的關(guān)鍵詞是最少 的,只有25個(gè),而Erlang是27個(gè),Python是31個(gè)。

從根本上保證了Go語(yǔ)言的簡(jiǎn)單易學(xué)。

Go語(yǔ)言將數(shù)據(jù)類型分為四類:基礎(chǔ)類型、復(fù)合類型、引用類型和接口類型。

基礎(chǔ)類型包括:整型、浮點(diǎn)型、復(fù)數(shù)、字符串和布爾型。

復(fù)合數(shù)據(jù)類型有數(shù) 組和結(jié)構(gòu)體。引用類型包括指針、切片、字典、函數(shù)、通道。

其他數(shù)據(jù)類型,如原子(atom)、比特(binary)、元組(tuple)、集合(set)、記錄 (record),Go則沒(méi)有支持。

Go對(duì)C語(yǔ)言的很多語(yǔ)法特性做了改良,正如Rob Pike在《 Less is Exponentially More 》中提到,Go的“起點(diǎn): C語(yǔ)言,解決一些明顯的瑕疵、刪除雜 質(zhì)、增加一些缺少的特性。”

比如,switch/case的case子程序段默認(rèn)break跳出,case語(yǔ)句支持?jǐn)?shù)值范圍、條件判斷語(yǔ)句;所有類型默認(rèn)初始化為0, 沒(méi)有未初始化變量;把類型放在變量后面的聲明語(yǔ)法( 鏈接 ),使復(fù)雜聲明更加清晰易懂;沒(méi)有頭文件,文件的編譯以包組織,改善封裝能力;用空接 口(interface {})代替void *,提高類型系統(tǒng)能力等等。

Go對(duì)函數(shù),方法,接口做了清晰的區(qū)分。

與Erlang類似,Go的函數(shù)作為第一公民。

函數(shù)可以讓我們將一個(gè)語(yǔ)句序列打包為一個(gè)單元,然后可以從程序中 其它地方多次調(diào)用。

函數(shù)和方法的區(qū)別是指有沒(méi)有接收器,而不像其他語(yǔ)言那樣是指有沒(méi)有返回值。

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

接口的這2中使用方式,用面對(duì)對(duì)象編程范式來(lái)類比的話,可以類比于subtypepolymorphism(子類型多態(tài))和ad hoc polymorphism(非參數(shù)多態(tài))。

從圖中示例可以看出,Go的goroutine就是一個(gè)函數(shù),以及在堆上為其分配的一個(gè)堆棧。所以其系統(tǒng)開銷很小,可以輕松的創(chuàng)建上萬(wàn)個(gè)goroutine,并且 它們并不是被操作系統(tǒng)所調(diào)度執(zhí)行。

goroutine只能使用channel來(lái)發(fā)送給指定的goroutine請(qǐng)求來(lái)查詢更新變量。這也就是Go的口頭禪“不要使用共享 數(shù)據(jù)來(lái)通信,使用通信來(lái)共享數(shù)據(jù)”。channel支持容量限制和range迭代器。

Go/Python/Erlang語(yǔ)言詞法對(duì)比

TDD Go編程示例

本小節(jié)以TDD方式4次重構(gòu)開發(fā)一個(gè)斐波那契算法的方式,來(lái)簡(jiǎn)單展示Go的特性、語(yǔ)法和使用方式,如Go的單元測(cè)試技術(shù),并發(fā)編程、匿名函數(shù)、閉包 等。 首先,看一下TDD最終形成的單元測(cè)試文件:

基于遞歸的實(shí)現(xiàn)方案:

測(cè)試結(jié)果:

基于goroutine實(shí)現(xiàn)的并發(fā)方案:

測(cè)試結(jié)果:

基于迭代的實(shí)現(xiàn)方案:

測(cè)試結(jié)果:

基于閉包的實(shí)現(xiàn)方案:

測(cè)試結(jié)果:

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3668

    瀏覽量

    94574
  • Go
    Go
    +關(guān)注

    關(guān)注

    0

    文章

    44

    瀏覽量

    12313
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4821

    瀏覽量

    85644
  • erlang
    +關(guān)注

    關(guān)注

    0

    文章

    16

    瀏覽量

    5775

原文標(biāo)題:干貨 | Go/Python/Erlang編程語(yǔ)言對(duì)比分析及示例

文章出處:【微信號(hào):ZTEdeveloper,微信公眾號(hào):中興開發(fā)者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    三十分鐘入門基礎(chǔ)Go Java小子版

    與Java功能上的對(duì)比來(lái)闡述Go語(yǔ)言 的基礎(chǔ)語(yǔ)法、面向?qū)ο?b class='flag-5'>編程、并發(fā)與錯(cuò)誤四個(gè)方面。 一、基礎(chǔ)語(yǔ)法 Go
    的頭像 發(fā)表于 08-12 14:32 ?865次閱讀
    三十分鐘入門基礎(chǔ)<b class='flag-5'>Go</b> Java小子版

    Go語(yǔ)言開發(fā)有什么優(yōu)勢(shì)?怎么學(xué)?

    帶來(lái)的各種問(wèn)題。  3. 性能優(yōu)異。Go的性能只比C/C++減少了10%左右。相對(duì)其他腳本(python/php),性能具有巨大的優(yōu)勢(shì)。  那么,Go語(yǔ)言都有哪些公司在用呢?比如goo
    發(fā)表于 12-19 16:08

    會(huì)go語(yǔ)言能做什么工作?

    讓程序員更容易地進(jìn)行維護(hù)和修改。它融合了傳統(tǒng)編譯型語(yǔ)言的高效性和腳本語(yǔ)言的易用性和富于表達(dá)性。Go語(yǔ)言作為服務(wù)器編程
    發(fā)表于 03-22 15:03

    Go開發(fā)語(yǔ)言的優(yōu)勢(shì)在哪里?

    Go語(yǔ)言是谷歌發(fā)布的第二款開源編程語(yǔ)言,可以在不損失應(yīng)用程序性能的情況下降低代碼的復(fù)雜性,并專門針對(duì)多處理器系統(tǒng)應(yīng)用程序的編程進(jìn)行了優(yōu)化,開
    發(fā)表于 03-22 15:04

    Python 轉(zhuǎn)向 Go語(yǔ)言的9大原因和3大缺點(diǎn)

    轉(zhuǎn)用一門新語(yǔ)言通常是一項(xiàng)大決策,尤其是當(dāng)你的團(tuán)隊(duì)成員中只有一個(gè)使用過(guò)它時(shí)。今年 Stream 團(tuán)隊(duì)的主要編程語(yǔ)言Python 轉(zhuǎn)向了 Go
    發(fā)表于 06-17 07:40 ?6872次閱讀

    Go語(yǔ)言其實(shí)有很多優(yōu)良特性,很多時(shí)候都可以代替Python

    Go 要想撼動(dòng)編程界的常青樹 Java 二十多年的地位無(wú)疑難度頗大。據(jù) HackerRank 數(shù)據(jù)顯示,2018 年,Java 在開發(fā)者最受歡迎的編程語(yǔ)言排行榜中仍然排名第 2,
    的頭像 發(fā)表于 02-13 10:01 ?4845次閱讀

    GO語(yǔ)言簡(jiǎn)介!GO是理想的編程語(yǔ)言嗎?

    技術(shù)實(shí)力毋容置疑,不過(guò)這哥倆都是玩Kernel的,經(jīng)歷相同,理念相近,分歧會(huì)比較少,他們也都坦承C用得最多最熟,所以注定了GO的類C特性,不過(guò)這會(huì)不會(huì)導(dǎo)致GO設(shè)計(jì)上的思維火花不足,對(duì)OOP以及現(xiàn)代編程思想的支持不足,亦未可知。
    的頭像 發(fā)表于 04-29 09:47 ?4496次閱讀
    <b class='flag-5'>GO</b><b class='flag-5'>語(yǔ)言</b>簡(jiǎn)介!<b class='flag-5'>GO</b>是理想的<b class='flag-5'>編程</b><b class='flag-5'>語(yǔ)言</b>嗎?

    Go語(yǔ)言在世界各地的使用情況如何?

    開發(fā)者 數(shù)量 所處地區(qū) ? 全球大約有 110 萬(wàn)名職業(yè) Go 開發(fā)者(特指在工作中專門將 Go 作為主力編程語(yǔ)言的群
    的頭像 發(fā)表于 02-26 14:10 ?4298次閱讀
    <b class='flag-5'>Go</b><b class='flag-5'>語(yǔ)言</b>在世界各地的使用情況如何?

    詳解GO語(yǔ)言的趨勢(shì)與使用情況

    Go 語(yǔ)言簡(jiǎn)單易學(xué)、性能優(yōu)良。JetBrains Blog 發(fā)布了Go 語(yǔ)言的調(diào)查報(bào)告,看看GO 語(yǔ)言
    的頭像 發(fā)表于 03-17 11:05 ?3154次閱讀

    Go語(yǔ)言憑借什么成為云原生第一語(yǔ)言的?

    偶然看到有人說(shuō), Go 語(yǔ)言目前的火爆可能就是曇花一現(xiàn)而已。這個(gè)觀點(diǎn)我當(dāng)然是不認(rèn)同的。 近幾年,關(guān)于 Go 與 Java 還有 C 的對(duì)比和討論愈演愈烈,但不可否認(rèn)的是,在十年多的時(shí)間
    的頭像 發(fā)表于 04-22 10:15 ?3310次閱讀
    <b class='flag-5'>Go</b><b class='flag-5'>語(yǔ)言</b>憑借什么成為云原生第一<b class='flag-5'>語(yǔ)言</b>的?

    go語(yǔ)言枚舉類型怎么用

    go 語(yǔ)言枚舉類型是這么用的?在什么場(chǎng)景下會(huì)用到枚舉?本文對(duì) go 語(yǔ)言枚舉做了詳細(xì)講解。 枚舉,是一種重要的數(shù)據(jù)類型,由一組鍵值對(duì)組成,通常用來(lái)在
    的頭像 發(fā)表于 09-02 09:43 ?5332次閱讀

    go語(yǔ)言中怎么使用HTTP代理

    go語(yǔ)言中怎么使用HTTP代理。
    的頭像 發(fā)表于 09-01 14:41 ?2545次閱讀

    Go/Rust挑戰(zhàn)Java/Python地位

    編程語(yǔ)言方面,Java 和 Python 仍然遙遙領(lǐng)先,并且分別微小增長(zhǎng)了 1.7% 和 3.4%;圍繞 Go (增長(zhǎng) 20%) 和 Rust (增長(zhǎng) 22%) 的興趣則大幅增加。報(bào)告
    的頭像 發(fā)表于 03-06 10:19 ?814次閱讀

    如何讓PythonGo互相調(diào)度

    我們?cè)?jīng)研究過(guò)如何讓PythonGo互相調(diào)度,當(dāng)時(shí)發(fā)現(xiàn),將Go語(yǔ)言寫的模塊打包成動(dòng)態(tài)鏈接庫(kù),就能在Python中進(jìn)行調(diào)度: 優(yōu)劣互補(bǔ)!
    的頭像 發(fā)表于 11-02 11:24 ?759次閱讀
    如何讓<b class='flag-5'>Python</b>和<b class='flag-5'>Go</b>互相調(diào)度

    Go語(yǔ)言Python強(qiáng)多少

    1.都說(shuō)Go語(yǔ)言性能非常強(qiáng)大,那么到底比Python強(qiáng)多少? 為了比較Go語(yǔ)言Python
    的頭像 發(fā)表于 11-02 14:05 ?711次閱讀
    <b class='flag-5'>Go</b><b class='flag-5'>語(yǔ)言</b>比<b class='flag-5'>Python</b>強(qiáng)多少
    主站蜘蛛池模板: 欧美色性视频 | 艹逼免费视频 | 久久99热精品免费观看无卡顿 | 精品国产一二三区在线影院 | 天天干天天爽 | 综合色久七七综合七七蜜芽 | 久久综合性| 亚洲射图 | 午夜噜噜噜私人影院在线播放 | 日本三级成人午夜视频网 | 欧美a视频 | 婷婷丁香社区 | 91免费视频网站 | 日本免费精品视频 | 国产成年网站v片在线观看 国产成人91青青草原精品 | 亚1州区2区3区4区产品乱码 | a天堂在线观看 | 久久天天躁狠狠躁夜夜躁综合 | 成人免费淫片95视频观看网站 | 天天色综合1 | 男女啪视频大全1000 | 成人影院久久久久久影院 | 宅男午夜视频在线观看 | 久久天天躁狠狠躁夜夜躁 | 特黄特色大片免费播放器9 特黄特色大片免费视频播放 | 亚洲 欧洲 另类 综合 自拍 | 天天插天天操 | 欧美日韩性猛交xxxxx免费看 | 午夜精品久久久久久影视riav | mide-776中文字幕在线 | 亚洲www视频| 亚洲福利视频一区二区三区 | 99久在线| 亚洲免费在线观看 | 国产大片91精品免费观看不卡 | 欧美有码视频 | 女人张开腿让男人桶视频免费大全 | 欧美成人精品欧美一级乱黄 | 亚洲免费网| 成熟女人免费一级毛片 | 狠狠色 综合色区 |