好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > Erlang初學(xué):Erlang的一些特點(diǎn)和個(gè)人理解總結(jié)

Erlang初學(xué):Erlang的一些特點(diǎn)和個(gè)人理解總結(jié)

熱門標(biāo)簽:地圖標(biāo)注如何弄全套標(biāo) 萬利達(dá)綜合醫(yī)院地圖標(biāo)注點(diǎn) 南京電銷外呼系統(tǒng)哪家好 在電子版地圖標(biāo)注要收費(fèi)嗎 電銷機(jī)器人 深圳 實(shí)體店地圖標(biāo)注怎么標(biāo) 股票配資電銷機(jī)器人 外呼系統(tǒng)會(huì)封嗎 武漢AI電銷機(jī)器人

我對 Erlang 編程理念的理解:以分布式架構(gòu)師的角度寫代碼。

函數(shù)式編程

Erlang 里面的函數(shù)是數(shù)學(xué)里面的函數(shù):必須有返回值。 只要是函數(shù)必然有返回值,函數(shù)是一個(gè)過程,以英文的句號為函數(shù)結(jié)束符。 函數(shù)結(jié)束之前的表達(dá)式就是該函數(shù)的返回值。 所以這也是在 Erlang 里面的函數(shù)不會(huì)看到任何 return 語句的原因。 C++ 等其他語言的函數(shù)和函數(shù)之前可以通過共享變量來實(shí)現(xiàn)消息傳遞。 Erlang 里面的函數(shù)不可以,消息的傳遞通過函數(shù)的傳入和傳出。 也只是為什么 Erlang 號稱天生之處并行處理的原因, 因?yàn)樗麄儾还蚕碜兞浚簿筒恍枰渔i。

很多人聽到函數(shù)式編程都會(huì)覺得高大上或者晦澀難懂。 因?yàn)楹瘮?shù)是編程沒有 for 循環(huán)語句, 但是在我看來,關(guān)鍵在于會(huì)使用【列表推倒】和【尾遞歸】來進(jìn)行循環(huán)遍歷。 說到函數(shù)式編程就會(huì)拿快速排序說事,下面這個(gè)示例是 Erlang 版本的快速排序:

復(fù)制代碼 代碼如下:

-module(sort).

-export([qsort/1]).

qsort([]) -> [];
qsort([Pivot | T]) ->
    qsort([X || X - T, X Pivot]
         ++ [Pivot] ++
         qsort([X || X - T, X >= Pivot]).


非常簡潔,[Pivot | T] 就是拿列表的第一個(gè)元素當(dāng)快排中的 Pivot 。
復(fù)制代碼 代碼如下:

[X || X - T, X Pivot]

上式就是【列表推導(dǎo)】, 含義就是找出列表 T 中所有元素小于 Pivot 中的元素組成一個(gè)新的列表。 不過,這個(gè)例子顯然性能不高,只是一個(gè)示例。

很多人一直在鼓吹函數(shù)式語言馬上就要迎來朝陽, 但是在我看來,函數(shù)式編程永遠(yuǎn)只能是小眾語言, 這就像當(dāng)年的 lisp machine ,被鼓吹的天花亂墜還是夭折了。 現(xiàn)在主流的計(jì)算機(jī)架構(gòu)都是馮諾依曼體系的,并不是最適合函數(shù)式語言的生存土壤。

一切都是常量

沒有變量,也就沒有通過變量共享狀態(tài)導(dǎo)致的資源競爭,也就不需要加鎖。 任何狀態(tài)的變化都是通過函數(shù)的輸入輸出來進(jìn)行改變, 輕量級進(jìn)程的狀態(tài)變化也是靠消息傳遞(函數(shù)的輸入輸出)來實(shí)現(xiàn)。 這也是為什么有人說函數(shù)式編程適合高并發(fā)的原因,因?yàn)樗麄儧]有變量, 一切都是常量。

輕量進(jìn)程

Erlang 里面有 spawn 函數(shù),可以快速的創(chuàng)建一個(gè) process , 這里的 process 不是操作系統(tǒng)的進(jìn)程,而是 Erlang 自己的輕量進(jìn)程。 Erlang 輕量到超乎你想象, 構(gòu)建 kv 數(shù)據(jù)庫的時(shí)候,甚至可以對不同的 key 分配給不同的進(jìn)程。 而且進(jìn)程的表示單位是 Pid ,只要知道進(jìn)程的 Pid, 哪怕該進(jìn)程是在別的機(jī)器上面,都可以很輕易的發(fā)送給它。 原因是 Erlang 的【天生自帶RPC通信】和【自帶端口映射】

天生自帶RPC通信

復(fù)制代碼 代碼如下:

ToPid ! Data

ToPid 是接受方進(jìn)程的id , Data 可以是 Erlang 的任何類型,比如
復(fù)制代碼 代碼如下:

Pid ! {name, "jb51.net"}.

也就是可以直接把任何數(shù)據(jù)結(jié)構(gòu)當(dāng)成消息發(fā)送,天生自帶 RPC 通信。 (雖然本來 RPC 的含義是“遠(yuǎn)程過程調(diào)用”,不過其實(shí)反正就是幫你序列化了數(shù)據(jù)結(jié)構(gòu),Erlang 的 ! 操作符也是如此。)

進(jìn)程端口映射

節(jié)點(diǎn)之間發(fā)消息在代碼里面的表示也還是

復(fù)制代碼 代碼如下:

ToPid ! Data

也就是在寫代碼的時(shí)候,根本不用考慮該進(jìn)程是在哪臺機(jī)器上面, 無論是本 Erlang 進(jìn)程(這里的進(jìn)程是操作系統(tǒng)級別的進(jìn)程,不是 Erlang 的輕量進(jìn)程) 內(nèi), 還是其他機(jī)器的進(jìn)程,都不用管。 這是因?yàn)橛?epmd 的存在。

Epmd是Erlang Port Mapper Daemon的縮寫,在Erlang集群中相當(dāng)于dns的作用,供給節(jié)點(diǎn)名稱到端口的查詢辦事,epmd綁定在總所周知的4369端口上。

有了 epmd ,寫分布式程序就好像寫單機(jī)程序一樣簡單。

嚴(yán)密的模塊化管理

Erlang 的模塊類似 C++ 中的 namespace(命名空間),但是比命名空間更利于高效的軟件工程管理。

在 Erlang 項(xiàng)目源碼中處處可見如下代碼。

復(fù)制代碼 代碼如下:

-module(my_app).
-export([start/2, stop/1]).

-module 指明模塊名,-export 指明導(dǎo)出的函數(shù)。 未被導(dǎo)出的函數(shù)都無法被外界調(diào)用。 從軟件工程上看的話,這樣使得模塊功能和使用方法更加清晰。 使用者只需要關(guān)心如何 -export 里面的函數(shù)即可。 相比較之下 C++ 對這方面特別不規(guī)范,而 Java 通過對類聲明為 public class 指明可以被外界使用, Node.js 也是使用 export 來顯示聲明可以被外界使用的函數(shù)。

行為模式

復(fù)制代碼 代碼如下:

-module(ecomet_app).

-behaviour(application).

%% comment: Application callbacks
-export([start/2, stop/1]).
-behavior(application).

Erlang/otp 里面的【行為模式】概念等價(jià)于 OOP 里面的接口概念。 上面代碼示例的意思就是該模塊(ecomet_app)遵守的行為模式是(application)。 剛行為模式需要實(shí)現(xiàn)的兩個(gè)接口函數(shù)就是 -export([start/2, stop/1]). 。

另一個(gè)示例如下是遵守監(jiān)督者(supervisor)行為模式, 實(shí)現(xiàn)的一個(gè)接口函數(shù)是 -export([init/1]). 。

復(fù)制代碼 代碼如下:

-module(ecomet_sup).

-behaviour(supervisor).

%% Supervisor callbacks
-export([init/1]).

監(jiān)督者機(jī)制

Erlang/otp 的天生分布式特性在監(jiān)督機(jī)制里面體現(xiàn)的很好, 每一個(gè) otp 應(yīng)用啟動(dòng)的時(shí)候,都是啟動(dòng)監(jiān)督者(supervisor)和工作者(worker)。 他們的關(guān)系是樹形結(jié)構(gòu),每個(gè)工作者的上級都會(huì)有監(jiān)督者, 每個(gè)監(jiān)督者的上級也可能有監(jiān)督者。 當(dāng)工作者異常退出的時(shí)候,監(jiān)督者會(huì)根據(jù)相應(yīng)的參數(shù)決定是否對工作者進(jìn)行重啟。 如果重啟失敗的話監(jiān)督者也會(huì)退出,而更加上層的監(jiān)督者收到信號后會(huì)對他們進(jìn)行重啟等處理。 這個(gè)監(jiān)督者機(jī)制非常好理解,其實(shí)就是 OOP 編程里面的 try ... catch 異常處理機(jī)制。 當(dāng)出現(xiàn)異常的時(shí)候一層一層的往上拋出,直到有人重啟。

otp平臺

Erlang 最強(qiáng)大的地方也是最讓我感覺難學(xué)的地方,就是它的 otp 平臺。 各種行為模式, 讓我感覺就像多年以前學(xué)習(xí) MFC 的時(shí)候, 感覺很強(qiáng)大,但是卻總是感覺自己被按死在一條特定的軌道上面奔跑, 有種不自由的疲憊感。

代碼熱切換

熱切換也叫熱升級,大部分情況下,如果需要對 C++/Java 程序進(jìn)程版本升級, 則需要重啟進(jìn)程。 Erlang 支持熱切換的意思就是可以在運(yùn)行的時(shí)候進(jìn)行代碼升級。 升級過程不影響進(jìn)程的運(yùn)行, 而且在過渡階段新舊版本還可以共存。 是不是碉堡了。這個(gè)功能對于那些需要 7x24 高可用的服務(wù)來說簡直就是爽爆了。

Erlang 進(jìn)程本身可以通過一個(gè)類似“后門”的控制臺 erl 來實(shí)時(shí)的查看狀態(tài), 甚至直接使用控制臺來修改配置等,非常方便,這對于大部分其他語言來說, 簡直就是黑魔法般神奇的存在。

典型缺點(diǎn)

1.文檔太少,出現(xiàn)問題搜索出來的答案也少。
2.Erlang 人才稀缺,招聘不易。
3.動(dòng)態(tài)語言最典型的就是調(diào)試不易。
4.上手門檻較高。

最后,我只是 Erlang 的入門初學(xué)者, 因?yàn)楣ぷ髦行枰褂?ejabberd (Erlang 的開源項(xiàng)目), 從而學(xué)習(xí)了 Erlang , 欠缺實(shí)戰(zhàn)經(jīng)驗(yàn),所以這篇文章標(biāo)題起為 【Erlang初體驗(yàn)】。

您可能感興趣的文章:
  • Go/Python/Erlang編程語言對比分析及示例代碼
  • python讀取excel表格生成erlang數(shù)據(jù)
  • Erlang實(shí)現(xiàn)的一個(gè)Web服務(wù)器代碼實(shí)例
  • Erlang中的Record詳解
  • CentOS 6.5源碼安裝Erlang教程
  • ERLANG和PYTHON互通實(shí)現(xiàn)過程詳解

標(biāo)簽:臺州 泰安 濟(jì)源 安徽 廣東 汕頭 武威 濟(jì)寧

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Erlang初學(xué):Erlang的一些特點(diǎn)和個(gè)人理解總結(jié)》,本文關(guān)鍵詞  Erlang,初學(xué),的,一些,特點(diǎn),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Erlang初學(xué):Erlang的一些特點(diǎn)和個(gè)人理解總結(jié)》相關(guān)的同類信息!
  • 本頁收集關(guān)于Erlang初學(xué):Erlang的一些特點(diǎn)和個(gè)人理解總結(jié)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 在线日本看片免费人成视久网| 同性男片在线观看播放| 日本全黄视频| 国产精品久久久久久无码| 日本女人色| 欧美男男gaygayxxx| 杨思敏版金梅瓶1一5集演员表| 青青偷拍视频| 欧美老熟妇sexvideos| 大香煮伊在2020久一二三久| 精品无码αv一区二区三区不卡| 色戒电影高清免费| 成人a网| 汇聚全球精美吹潮色xx| 机机对机机30分钟无遮挡| 后宫嫔妃开裆裤全肉h文| 99在线观看视频免费精品9| 俄罗斯式3禁忌bd| 久久久夜色精品亚洲AV软件| 大龟慢慢挺进女友闺蜜的体内小说| 一级毛片在线观看免费| 欧美扯胸罩吻胸揉屁股揉下面视频| 不要灌尿了好涨h| 张柏芝艳照全套无删减94| 国产AV一区二区三区天堂综合网| xx69日本| 女教师的诱波多野结衣| 欧美久久久久久精品免费免费直播 | 闺蜜用黄瓜折磨我| 免费b站大全永不收费2023年更新 美女被?到爽??高潮草莓网站 | a成人在线| 亚洲激情视频在线观看| 成年网站视频在线观看| 又爽又黄无遮挡的美女直播| 日韩精品一区二区三区四区蜜桃 | 2019最新中文字幕| 夜夜橹橹网站| 日本xxbb| 在线看黄色片| 嗯~啊~轻一点????丝瓜视频| 中日本幕一区二区三区电影|