青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

loop_in_codes

低調(diào)做技術(shù)__歡迎移步我的獨(dú)立博客 codemaro.com 微博 kevinlynx

Erlang使用感受

用erlang也算寫了些代碼了,主要包括使用RabbitMQ的練習(xí),以及最近寫的kl_tservericerl。其中icerl是一個(gè)實(shí)現(xiàn)了Ice的erlang庫。

erlang的書較少,我主要讀過<Programming Erlang>和<Erlang/OTP in Action>。其實(shí)erlang本身就語言來說的話比較簡單,同ruby一樣,類似這種本身目標(biāo)是應(yīng)用于實(shí)際軟件項(xiàng)目的語言都比較簡單,對(duì)應(yīng)的語法書很快可以翻完。

這里我僅談?wù)勛约涸诰帉慹rlang代碼過程中的一些感受。

語法

erlang語法很簡單,接觸過函數(shù)式語言的程序員上手會(huì)很快。它沒有類似common lisp里宏這種較復(fù)雜的語言特性。其語法元素很緊湊,不存在一些用處不大的特性。在這之前,我學(xué)習(xí)過ruby和common lisp。ruby代碼寫的比common lisp多。但是在學(xué)習(xí)erlang的過程中我的腦海里卻不斷出現(xiàn)common lisp里的語法特性。這大概是因?yàn)閏ommon lisp的語法相對(duì)ruby來說,更接近erlang。

編程模式

erlang不是一個(gè)面向?qū)ο蟮恼Z言,它也不同common lisp提供多種編程模式。它的代碼就是靠一個(gè)個(gè)函數(shù)組織出來的。面向?qū)ο笳Z言在語法上有一點(diǎn)讓我很爽的是,其函數(shù)調(diào)用更自然。erlang的接口調(diào)用就像C語言里接口的調(diào)用一樣:

func(Obj, args)
Obj->func(args)

即需要在函數(shù)第一個(gè)參數(shù)傳遞操作對(duì)象。但是面向?qū)ο笳Z言也會(huì)帶來一些語法的復(fù)雜性。如果一門語言可以用很少的語法元素表達(dá)很多信息,那么我覺得這門語言就是門優(yōu)秀的語言。

表達(dá)式/語句

erlang里沒有語句,全部是表達(dá)式,意思是所有語法元素都是有返回值的。這實(shí)在太好了,全世界都有返回值可以讓代碼寫起來簡單多了:

    Flag = case func() of 1 -> true; 0 -> false end, 

命名

我之所以不想寫一行python代碼的很大一部分原因在于這門語言居然要求我必須使用代碼縮進(jìn)來編程,真是不敢相信。erlang里雖然沒有此規(guī)定,卻也有不同的語法元素有大小寫的限定。變量首字母必須大寫,atom必須以小寫字母開頭,更霸氣的是模塊命名必須和文件名相同。

變量

erlang里的變量是不可更改的。實(shí)際上給一個(gè)變量賦值,嚴(yán)格來說應(yīng)該叫bound,即綁定。這個(gè)特性完全就是函數(shù)式語言里的特性。其帶來的好處就像函數(shù)式語言宣揚(yáng)的一樣,這會(huì)使得代碼沒有副作用(side effect)。因?yàn)槌绦蚶锏乃泻瘮?shù)不論怎樣調(diào)用,其程序狀態(tài)都不會(huì)改變,因?yàn)樽兞繜o法被改變。

變量不可更改,直接意味著全局變量沒有存在的意義,也就意味著不論你的系統(tǒng)是多么復(fù)雜地被構(gòu)建出來,當(dāng)系統(tǒng)崩潰時(shí),其崩潰所在位置的上下文就足夠找到問題。

但是變量不可改變也會(huì)帶來一些代碼編寫上的不便。我想這大概是編程思維的轉(zhuǎn)變問題。erlang的語法特性會(huì)強(qiáng)迫人編寫非常短小的函數(shù),你大概不愿意看到你的函數(shù)實(shí)現(xiàn)里出現(xiàn)Var1/Var2/Var3這樣的變量,而實(shí)際上這樣的命名在命令式語言里其實(shí)指的是同一個(gè)變量,只不過其值不同而已。

但是我們的程序總是應(yīng)該有狀態(tài)的。在erlang里我們通過不斷創(chuàng)建新的變量來存儲(chǔ)這個(gè)狀態(tài)。我們需要通過將這個(gè)狀態(tài)隨著我們的程序流程不斷地通過函數(shù)參數(shù)和返回值傳遞下去。

atom

atom這個(gè)語法特性本身沒問題,它就同lisp里的atom一樣,沒什么意義,就是一個(gè)名字。它主要用在增加代碼的可讀性上。但是這個(gè)atom帶來的好處,直接導(dǎo)致erlang不去內(nèi)置諸如true/false這種關(guān)鍵字。erlang使用true/false這兩個(gè)atom來作為boolean operator的返回值。但erlang里嚴(yán)格來說是沒有布爾類型的。這其實(shí)沒什么,糟糕的是,對(duì)于一些較常見的函數(shù)返回值,例如true/false,erlang程序員之間就得做約定。要表示一個(gè)函數(shù)執(zhí)行失敗了,我可以返回false、null、failed、error、nil,甚至what_the_fuck,這一度讓我迷惘。

list/tuple

erlang里的list當(dāng)然沒有l(wèi)isp里的list牛逼,別人整個(gè)世界就是由list構(gòu)成的。在一段時(shí)間里,我一直以為list里只能保存相同類型的元素,而tuple才是用于保存不同類型元素的容器。直到有一天我發(fā)現(xiàn)tuple的操作不能滿足我的需求了,我才發(fā)現(xiàn)list居然是可以保存不同類型的。

list相對(duì)于tuple而言,更厲害的地方就在于頭匹配,意思是可以通過匹配來拆分list的頭和剩余部分。

匹配(match)

erlang的匹配機(jī)制是個(gè)好東西。這個(gè)東西貫穿了整個(gè)語言。在我理解看來,匹配機(jī)制減少了很多判斷代碼。它試圖用一個(gè)期望的類型去匹配另一個(gè)東西,如果這個(gè)東西出了錯(cuò),它就無法完成這個(gè)匹配。無法完成匹配就導(dǎo)致程序斷掉。

匹配還有個(gè)方便的地方在于可以很方便地取出record里的成員,或者tuple和list的某個(gè)部分,這其實(shí)增強(qiáng)了其他語法元素的能力。

循環(huán)

erlang里沒有循環(huán)語法元素,這真是太好了。函數(shù)式語言里為什么要有循環(huán)語法呢?common lisp干毛要加上那些復(fù)雜的循環(huán)(宏),每次我遇到需要寫循環(huán)的場(chǎng)景時(shí),我都誠惶誠恐,最后還是用遞歸來解決。

同樣,在erlang里我們也是用函數(shù)遞歸來解決循環(huán)問題。甚至,我們還有l(wèi)ist comprehension。當(dāng)我寫C++代碼時(shí),我很不情愿用循環(huán)去寫那些容器遍歷代碼,幸運(yùn)的是在C++11里通過lambda和STL里那些算法我終于不用再寫這樣的循環(huán)代碼了。

if/case/guard

erlang里有條件判定語法if,甚至還有類似C語言里的switch…case。這個(gè)我一時(shí)半會(huì)還不敢評(píng)價(jià),好像haskell里也保留了if。erlang里同haskell一樣有g(shù)uard的概念,這其實(shí)是一種變相的條件判斷,只不過其使用場(chǎng)景不一樣。

進(jìn)程

并發(fā)性支持屬于erlang的最大亮點(diǎn)。erlang里的進(jìn)程概念非常簡單,基于消息機(jī)制,程序員從來不需要擔(dān)心同步問題。每個(gè)進(jìn)程都有一個(gè)mailbox,用于緩存發(fā)送到此進(jìn)程的消息。erlang提供內(nèi)置的語法元素來發(fā)送和接收消息。

erlang甚至提供分布式支持,更酷的是你往網(wǎng)絡(luò)上的其他進(jìn)程發(fā)送消息,其語法和往本地進(jìn)程發(fā)送是一樣的。

模塊加載

如果我寫了一個(gè)erlang庫,該如何在另一個(gè)erlang程序里加載這個(gè)庫?這個(gè)問題一度讓我迷惘。erlang里貌似有對(duì)庫打包的功能(.ez?),按理說應(yīng)該提供一種整個(gè)庫加載的方式,然后可以通過手動(dòng)調(diào)用函數(shù)或者指定代碼依賴項(xiàng)來加載。結(jié)果不是這樣。

erlang不是按整個(gè)庫來加載的,因?yàn)橐矝]有方式去描述一個(gè)庫(應(yīng)該有第三方的)。當(dāng)我們調(diào)用某個(gè)模塊里的函數(shù)時(shí),erlang會(huì)自動(dòng)從某個(gè)目錄列表里去搜索對(duì)應(yīng)的beam文件。所以,可以通過在啟動(dòng)erlang添加這個(gè)模塊文件所在目錄來實(shí)現(xiàn)加載,這還是自動(dòng)的。當(dāng)然,也可以在erlang shell里通過函數(shù)添加這個(gè)目錄。

OTP

使用erlang來編寫程序,最大的優(yōu)勢(shì)可能就是其OTP了。OTP基本上就是一些隨erlang一起發(fā)布的庫。這些庫中最重要的一個(gè)概念是behaviour。behaviour其實(shí)就是提供了一種編程框架,應(yīng)用層提供各種回調(diào)函數(shù)給這個(gè)框架,從而獲得一個(gè)健壯的并發(fā)程序。

application behaviour

application behaviour用于組織一個(gè)erlang程序,通過一個(gè)配置文件,和提供若干回調(diào),就可以讓我們編寫的erlang程序以一種統(tǒng)一的方式啟動(dòng)。我之前寫的都是erlang庫,并不需要啟動(dòng),而是提供給應(yīng)用層使用,所以也沒使用該behaviour。

gen_server behaviour

這個(gè)behaviour應(yīng)該是使用頻率很高的。它封裝了進(jìn)程使用的細(xì)節(jié),本質(zhì)上也就是將主動(dòng)收取消息改成了自動(dòng)收取,收取后再回調(diào)給你的模塊。

supervisor behaviour

這個(gè)behaviour看起來很厲害,通過對(duì)它進(jìn)行一些配置,你可以把你的并發(fā)程序里的所有進(jìn)程建立成樹狀結(jié)構(gòu)。這個(gè)結(jié)構(gòu)的牛逼之處在于,當(dāng)某個(gè)進(jìn)程掛掉之后,通過supervisor可以自動(dòng)重新啟動(dòng)這個(gè)掛掉的進(jìn)程,當(dāng)然重啟沒這么簡單,它提供多種重啟規(guī)則,以讓整個(gè)系統(tǒng)確實(shí)通過重啟變成正常狀態(tài)。這實(shí)在太牛逼了,這意味著你的服務(wù)器可以7x24小時(shí)地運(yùn)行了,就算有問題你也可以立刻獲得一個(gè)重寫工作的系統(tǒng)。

熱更新

代碼熱更新對(duì)于一個(gè)動(dòng)態(tài)語言而言其實(shí)根本算不上什么優(yōu)點(diǎn),基本上動(dòng)態(tài)語言都能做到這一點(diǎn)。但是把熱更新這個(gè)功能加到一個(gè)用于開發(fā)并發(fā)程序的語言里,那就很牛逼了。你再一次可以確保你的服務(wù)器7x24小時(shí)不停機(jī)維護(hù)。

gen_tcp

最開始我以為erlang將網(wǎng)絡(luò)部分封裝得已經(jīng)認(rèn)不出有socket這個(gè)概念了。至少,你也得有一個(gè)牛逼的網(wǎng)絡(luò)庫吧。結(jié)果發(fā)現(xiàn)依然還是socket那一套。然后我很失望。直到后來,發(fā)現(xiàn)使用一些behaviour,加上調(diào)整gen_tcp的一些option,居然可以以很少的代碼寫出一個(gè)維護(hù)大量連接的TCP服務(wù)器。是啊,erlang天生就是并發(fā)的,在傳統(tǒng)的網(wǎng)絡(luò)模型中,我們會(huì)覺得使用one-thread-per-connection雖然簡單卻不是可行的,因?yàn)閠hread是OS資源,太昂貴。但是在erlang里,one-process-per-connection卻是再自然不過的事情。你要是寫個(gè)erlang程序里面卻只有一個(gè)process你都不好意思告訴別人你寫的是erlang。process是高效的(對(duì)我們這種二流程序員而言),它就像C++里一個(gè)很普通的對(duì)象一樣。

在使用gen_tcp的過程中我發(fā)現(xiàn)一個(gè)問題,不管我使用哪一種模型,我竟然找不到一種溫柔的關(guān)閉方式。我查看了幾個(gè)tutorial,這些混蛋竟然沒有一個(gè)人提到如何去正常關(guān)閉一個(gè)erlang TCP服務(wù)器。后來,我沒有辦法,只好使用API強(qiáng)制關(guān)閉服務(wù)器進(jìn)程。

Story

其實(shí),我和erlang之間是有故事的。我并不是這個(gè)月開始才接觸erlang。早在2009年夏天的時(shí)候我就學(xué)習(xí)過這門語言。那時(shí)候我還沒接觸過任何函數(shù)式語言,那時(shí)候lua里的閉包都讓我覺得新奇。然后無意間,我莫名其妙地接觸了haskell(<Real World Haskell>),在我決定開始寫點(diǎn)什么haskell練習(xí)時(shí),我發(fā)現(xiàn)我無從下手,最后,Monads把我嚇哭了。haskell實(shí)在太可怕了。

緊接著我懷揣著對(duì)函數(shù)式語言的濃烈好奇心看到了erlang。當(dāng)我看到了concurrent programming的章節(jié)時(shí),在一個(gè)燥熱難耐的下午我的領(lǐng)導(dǎo)找到了我,同我探討起erlang對(duì)我們的網(wǎng)游服務(wù)器有什么好處。然后,我結(jié)束我了的erlang之旅。

時(shí)隔四年,這種小眾語言,居然進(jìn)入了中國程序員的視野,并被用于開發(fā)網(wǎng)頁游戲服務(wù)器。時(shí)代在進(jìn)步,我們總是被甩在后面。

posted on 2013-05-09 21:24 Kevin Lynx 閱讀(5504) 評(píng)論(0)  編輯 收藏 引用 所屬分類: erlang

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久伊人免费视频| 亚洲一区黄色| 国产亚洲人成a一在线v站| 亚洲缚视频在线观看| 国产精品婷婷午夜在线观看| 亚洲国产mv| 激情成人av| 亚洲一区二区三区在线| 日韩亚洲视频| 欧美va天堂va视频va在线| 久久精品视频在线看| 国产精品久久久久久久久久三级 | 久久久久久久久久码影片| 亚洲欧美成人一区二区在线电影 | 久久精品视频在线看| 欧美影院午夜播放| 国产精品黄色| 亚洲剧情一区二区| 亚洲片区在线| 免费日韩成人| 奶水喷射视频一区| 激情六月婷婷综合| 欧美一区二区三区四区在线| 香蕉久久一区二区不卡无毒影院| 欧美日韩一区二区在线观看视频| 亚洲黄页一区| 亚洲深夜福利视频| 欧美日韩一区二区高清| 亚洲乱码国产乱码精品精| 日韩亚洲在线| 欧美日韩国产黄| 一本色道久久加勒比88综合| 亚洲视频999| 欧美日韩国产123区| 91久久在线观看| 一本色道久久综合亚洲精品按摩| 欧美精品一区二区三区久久久竹菊 | 亚洲欧洲视频| 欧美国产第一页| 亚洲精选91| 亚洲午夜av| 国产伦精品一区二区三区免费| 亚洲一级在线观看| 久久久久九九九| 影视先锋久久| 欧美激情亚洲综合一区| 亚洲乱码久久| 欧美亚洲尤物久久| 韩国女主播一区二区三区| 久久综合久久综合久久| 亚洲国产精品电影| 亚洲欧美日韩在线不卡| 国产一区二区三区免费观看| 久久久久国产一区二区三区| 亚洲国产高清视频| 亚洲欧美国产制服动漫| 国产亚洲精品久| 嫩草成人www欧美| 日韩视频专区| 久久一区免费| 宅男精品视频| 韩国欧美一区| 欧美日韩一区二区三区在线看 | 欧美精品高清视频| 亚洲欧美成人| 亚洲激情自拍| 欧美中在线观看| 亚洲人成人99网站| 国产精品久久久久久久久久妞妞 | 久久综合久久88| 亚洲精品中文字幕在线| 国产日韩欧美a| 欧美承认网站| 久久激情综合网| 在线中文字幕日韩| 亚洲第一精品久久忘忧草社区| 校园激情久久| 999亚洲国产精| 永久免费精品影视网站| 国产精品女人网站| 欧美黄色一级视频| 久久久久国产精品一区| 在线亚洲观看| 亚洲美女在线视频| 欧美激情一区二区三区在线视频观看 | 亚洲一区影音先锋| 亚洲精品一区二区三区不| 国产一在线精品一区在线观看| 欧美黄色aaaa| 久久久久久婷| 国产精品99久久不卡二区| 亚洲福利精品| 久久裸体艺术| 亚洲影音一区| 亚洲精品日韩久久| 狠狠色噜噜狠狠狠狠色吗综合| 欧美日韩福利在线观看| 久久精品青青大伊人av| 亚洲毛片在线观看| 亚洲国产aⅴ天堂久久| 久久久999精品免费| 一区二区三区日韩精品视频| 在线观看福利一区| 国产欧美在线视频| 国产精品jizz在线观看美国| 欧美美女操人视频| 免费日韩一区二区| 欧美在线三级| 欧美一区午夜精品| 亚洲一区中文| 一区二区三区欧美亚洲| 一区二区三区欧美成人| 亚洲欧洲一区二区三区久久| 久久午夜电影网| 欧美专区日韩专区| 亚洲女人小视频在线观看| 99视频一区二区三区| 国产亚洲一区在线| 欧美色综合天天久久综合精品| 欧美超级免费视 在线| 久久久久www| 久久久久99精品国产片| 久久福利毛片| 欧美一区二区三区在线免费观看 | 农夫在线精品视频免费观看| 久久激情中文| 久久精品91久久久久久再现| 午夜精品视频| 久久电影一区| 久久久97精品| 亚洲第一中文字幕| 亚洲国产三级| 亚洲韩日在线| 亚洲精品乱码视频| 亚洲欧洲美洲综合色网| 亚洲精品一区二区网址| a91a精品视频在线观看| 亚洲欧美制服中文字幕| 欧美一区二区三区四区视频| 欧美一区二区在线看| 久久精品人人做人人爽电影蜜月| 久久精品免费播放| 久久中文精品| 欧美乱人伦中文字幕在线| 国产精品社区| 国产真实久久| 亚洲精品麻豆| 亚洲欧美国产视频| 久久久综合网| 免费看精品久久片| 在线一区欧美| 久久精品国产999大香线蕉| 榴莲视频成人在线观看| 欧美精品在线极品| 国产精品一区二区男女羞羞无遮挡| 精品88久久久久88久久久| 亚洲人成高清| 亚洲欧美日韩专区| 久久青草欧美一区二区三区| 欧美国产高清| 亚洲三级电影全部在线观看高清| 亚洲字幕在线观看| 麻豆精品视频在线| 国产精品区一区二区三| 影音先锋久久精品| 亚洲免费电影在线| 玖玖精品视频| 亚洲免费高清| 久久久久久黄| 国产精品成人午夜| 亚洲级视频在线观看免费1级| 亚洲夜晚福利在线观看| 久热精品在线| 亚洲性感激情| 欧美成人免费全部观看天天性色| 国产一区视频观看| 亚洲天堂激情| 欧美不卡福利| 亚洲欧美卡通另类91av| 欧美日韩你懂的| 亚洲成在人线av| 欧美一区影院| 日韩亚洲欧美成人一区| 久久理论片午夜琪琪电影网| 国产日韩一区二区三区| 一本到12不卡视频在线dvd| 久久综合中文字幕| 午夜视频久久久久久| 欧美日韩小视频| 亚洲视频一区在线| 欧美激情bt| 久久精品首页| 国产噜噜噜噜噜久久久久久久久| 亚洲激情视频在线| 欧美国产三区| 久久青青草综合| 国产主播一区二区| 欧美一区在线直播| 午夜欧美电影在线观看| 国产精品美女黄网|