精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

    文章

    3591

    瀏覽量

    93592
  • Go
    Go
    +關注

    關注

    0

    文章

    43

    瀏覽量

    12241
  • python
    +關注

    關注

    56

    文章

    4782

    瀏覽量

    84449
  • erlang
    +關注

    關注

    0

    文章

    16

    瀏覽量

    5738

原文標題:干貨 | Go/Python/Erlang編程語言對比分析及示例

文章出處:【微信號:ZTEdeveloper,微信公眾號:中興開發者社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    三十分鐘入門基礎Go Java小子版

    與Java功能上的對比來闡述Go語言 的基礎語法、面向對象編程、并發與錯誤四個方面。 一、基礎語法 Go
    的頭像 發表于 08-12 14:32 ?673次閱讀
    三十分鐘入門基礎<b class='flag-5'>Go</b> Java小子版

    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

    Python 轉向 Go語言的9大原因和3大缺點

    轉用一門新語言通常是一項大決策,尤其是當你的團隊成員中只有一個使用過它時。今年 Stream 團隊的主要編程語言Python 轉向了 Go
    發表于 06-17 07:40 ?6803次閱讀

    Go語言其實有很多優良特性,很多時候都可以代替Python

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

    GO語言簡介!GO是理想的編程語言嗎?

    技術實力毋容置疑,不過這哥倆都是玩Kernel的,經歷相同,理念相近,分歧會比較少,他們也都坦承C用得最多最熟,所以注定了GO的類C特性,不過這會不會導致GO設計上的思維火花不足,對OOP以及現代編程思想的支持不足,亦未可知。
    的頭像 發表于 04-29 09:47 ?4334次閱讀
    <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語言在世界各地的使用情況如何?

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

    詳解GO語言的趨勢與使用情況

    Go 語言簡單易學、性能優良。JetBrains Blog 發布了Go 語言的調查報告,看看GO 語言
    的頭像 發表于 03-17 11:05 ?3028次閱讀

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

    偶然看到有人說, Go 語言目前的火爆可能就是曇花一現而已。這個觀點我當然是不認同的。 近幾年,關于 Go 與 Java 還有 C 的對比和討論愈演愈烈,但不可否認的是,在十年多的時間
    的頭像 發表于 04-22 10:15 ?3153次閱讀
    <b class='flag-5'>Go</b><b class='flag-5'>語言</b>憑借什么成為云原生第一<b class='flag-5'>語言</b>的?

    go語言枚舉類型怎么用

    go 語言枚舉類型是這么用的?在什么場景下會用到枚舉?本文對 go 語言枚舉做了詳細講解。 枚舉,是一種重要的數據類型,由一組鍵值對組成,通常用來在
    的頭像 發表于 09-02 09:43 ?5145次閱讀

    go語言中怎么使用HTTP代理

    go語言中怎么使用HTTP代理。
    的頭像 發表于 09-01 14:41 ?2390次閱讀

    Go/Rust挑戰Java/Python地位

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

    如何讓PythonGo互相調度

    我們曾經研究過如何讓PythonGo互相調度,當時發現,將Go語言寫的模塊打包成動態鏈接庫,就能在Python中進行調度: 優劣互補!
    的頭像 發表于 11-02 11:24 ?569次閱讀
    如何讓<b class='flag-5'>Python</b>和<b class='flag-5'>Go</b>互相調度

    Go語言Python強多少

    1.都說Go語言性能非常強大,那么到底比Python強多少? 為了比較Go語言Python
    的頭像 發表于 11-02 14:05 ?523次閱讀
    <b class='flag-5'>Go</b><b class='flag-5'>語言</b>比<b class='flag-5'>Python</b>強多少