Erlang + SublimeText 編程環(huán)境搭建指導(dǎo)

下載安裝 Erlang 運(yùn)行環(huán)境?download,將?bin目錄配置到 PATH 環(huán)境變量中方便調(diào)用。
下載安裝 SublimeText?www.sublimetext.com
安裝 SublimeText 插件管理器 Package Control
安裝 SublimeText LSP 插件??lsp.sublimetext.io
安裝 Erlang 語(yǔ)言服務(wù)器?erlang_ls?(Windows 平臺(tái)下可能需要自行編譯)

安裝 Sublime Text 語(yǔ)言服務(wù)插件,插件本身使用 Erlang 開發(fā),可以直接下載源代碼編譯安裝。需要注意,它本身依賴了幾個(gè)代碼倉(cāng)庫(kù),在構(gòu)建時(shí)會(huì)自動(dòng)克隆到 build 目錄下,或者插件或是依賴庫(kù),根據(jù) rebar.config 或者 rebar.lock 配置指示,可以插件下載到指定目錄。國(guó)內(nèi)網(wǎng)絡(luò)訪問(wèn)不了 git 服務(wù)器,可以使用 git@github.com 以 SSH 協(xié)議嘗試訪問(wèn):
構(gòu)建腳本 Makefile 中的命令 `rebar3 as dap escriptize` 表示構(gòu)建包含 Debug Adapter Protocol (DAP) 調(diào)試信息的輸出。
1. https://github.com/erlang-ls/erlang_ls/releases/download/0.48.1/els_dap-win32.tar.gz
2. https://github.com/erlang-ls/erlang_ls/releases/download/0.48.1/erlang_ls-win32.tar.gz
3. https://microsoft.github.io/debug-adapter-protocol/
0. https://lsp.sublimetext.io/language_servers/#erlang
1. https://github.com/sublimelsp/LSP-elixir
2. https://github.com/erlang-ls/erlang_ls
3. https://erlang-ls.github.io/
執(zhí)行構(gòu)建命令后,會(huì)生成 erlang_ls 腳本,這就是 LSP 服務(wù)入口程序。這是一個(gè) escript 腳本,Windows 系統(tǒng)下配置 command 時(shí)需要前綴 escript.exe 命令去執(zhí)行它。插件官方發(fā)布的 0.48.1 版本還會(huì)在 Windows 10 平臺(tái)下引發(fā) main 入口函數(shù)未定義問(wèn)題,生成的文件有問(wèn)題。
源代碼構(gòu)建也會(huì)產(chǎn)生錯(cuò)誤面終止,Gradualizer 模塊代碼中調(diào)用函數(shù)時(shí)可能少傳了參數(shù),可以添加一個(gè) utf8 默認(rèn)值。另一處問(wèn)題是定義了未使用的函數(shù) eep48_docs,將其相關(guān)代碼行注解即可:
Rebar3 在 Windows 10 執(zhí)行編譯不順利,還到官網(wǎng)上下載編譯好的 rebar3。將下載的 rebar3 文件移動(dòng)到 erl 的環(huán)境變量目錄下,創(chuàng)建一個(gè) `erlang_ls.cmd` 即可執(zhí)行相應(yīng)的 rebar3 腳本,Linux 系統(tǒng)則會(huì)自動(dòng)處理:
這段腳本的意思是,將命令行的腳本名保存到 rebarscript 變量中,然后 `"%rebarscript:.cmd=%"` 表示將其中的 `.cmd` 擴(kuò)展名刪除,而 `%*` 表示命令行中傳入的所有參數(shù),然后使用 escript 執(zhí)行它。
比如,如下查看版本命令,執(zhí)行的是 erlang_ls.cmd,就會(huì)調(diào)用 escript 執(zhí)行 erlang_ls 這個(gè)編譯好的腳本文件。
Install the Erlang Language Server.
Open Preferences > Package Settings > LSP > Settings and add the "erlang-ls" client configuration to the "clients":
Erlang OTP 最初是愛立信為開發(fā)電信相關(guān)產(chǎn)品而產(chǎn)生,即 OTP - Open Telecom Platform 縮寫,Erlang 開源前這個(gè)名字多少還有點(diǎn)品牌效應(yīng)。無(wú)論 Erlang 還是 OTP 都早已不再局限于電信應(yīng)用:更貼切的名字應(yīng)該是“并發(fā)系統(tǒng)平臺(tái)”。
Erlang 是一種面向并發(fā) Concurrency Oriented,面向消息 Message Oriented 的函數(shù)式 Functional 編程語(yǔ)言。
Erlang 應(yīng)用場(chǎng)景
- 分布式產(chǎn)品,網(wǎng)絡(luò)服務(wù)器,客戶端,等各種應(yīng)用環(huán)境。
- Erlang 也可以作為一種快速開發(fā)語(yǔ)言,進(jìn)行原型開發(fā)。
- 應(yīng)用需要處理大量并發(fā)活動(dòng)。
- 需要良好的軟件或硬件 fault-tolerant 容錯(cuò)能力。
- 軟件產(chǎn)品需要在多服務(wù)器中具有良好的伸縮能力,而不必大改動(dòng)。
- 容易實(shí)現(xiàn)不中斷服務(wù)進(jìn)行升級(jí)過(guò)程,如游戲服務(wù)器。
- 軟件需要在嚴(yán)格的時(shí)間片響應(yīng)用戶,如游戲服務(wù)器。
游戲服務(wù)端開發(fā)非常有用!如果低延遲對(duì)你的應(yīng)用來(lái)說(shuō)很重要,那么平心而論,不選 Erlang 反而顯得很奇怪了。
2019年4月20日,Erlang 語(yǔ)言設(shè)計(jì)者 Joe Armstrong 去世,享年 68 歲。
1986 年,Joe Armstrong 和 Robert Virding、Mike Williams 在電信公司愛立信共同創(chuàng)造了應(yīng)對(duì)大規(guī)模并發(fā)場(chǎng)景的編程語(yǔ)言 Erlang,這一語(yǔ)言起初是愛立信的私有語(yǔ)言,后于 1998 年開源。
Erlang 是一門相對(duì)小眾的編程語(yǔ)言,這一點(diǎn)與 Lisp 很像 —— 小眾但影響很大。Joe Armstrong 曾用一句話概括過(guò) Erlang 的優(yōu)點(diǎn):一次編寫,永遠(yuǎn)運(yùn)行。
Joe Armstrong 在論文中是這樣認(rèn)為的:幾乎所有傳統(tǒng)的編程語(yǔ)言對(duì)真正的并發(fā)都缺乏有力的支持——本質(zhì)上是順序化的,而語(yǔ)言的并發(fā)性都僅僅由底層操作系統(tǒng)而不是語(yǔ)言提供。
而用對(duì)并發(fā)提供良好支持的語(yǔ)言,也就是作者說(shuō)的`面向并發(fā)的語(yǔ)言` COL - Concurrency Oriented Language 來(lái)邊寫程序,則是相當(dāng)容易的:
- 從真實(shí)世界的活動(dòng)中識(shí)別出真正的并發(fā)活動(dòng)
- 識(shí)別出并發(fā)活動(dòng)之間的所有消息通道
- 寫下能夠在不同消息通道中流通的所有消息
其次,通過(guò)定下的九條原則性思想設(shè)計(jì),寫出來(lái)天然支持分布式系統(tǒng)的 Erlang 以及 OTP 框架,真的做到了他說(shuō)的實(shí)現(xiàn)面向并發(fā)的語(yǔ)言。
> - everything is a process.
> - process are strongly isolated.
> - process creation and destruction is a lightweight operation.
> - message passing is the only way for processes to interact.
> - processes have unique names.
> - if you know the name of a process you can send it a message.
> - processes share no resources.
> - error handling is non-local.
> - processes do what they are supposed to do or fail.
- 一切皆進(jìn)程
- 進(jìn)程強(qiáng)隔離
- 進(jìn)程的生成與銷毀都是輕量的操作
- 消息傳遞是進(jìn)程交互的唯一方式
- 每個(gè)進(jìn)程有唯一的名字
- 你若知道進(jìn)程的名字,就可以向他發(fā)消息
- 進(jìn)程之間不共享資源
- 錯(cuò)誤處理非本地化
- 進(jìn)程要么正常跑著,要么馬上掛掉
就以上九條的觀念,設(shè)計(jì)出的 Erlang 語(yǔ)言,成就了可靠性達(dá)到 99.9999999% 的目前世界上最復(fù)雜的 ATM 交換機(jī)。
其三,let it crash 思想的提出與實(shí)現(xiàn)。
程序不可能處理一切錯(cuò)誤,因此程序員只要力所能及的處理顯然易見的錯(cuò)誤就好了,而那些隱藏著的,非直覺性的錯(cuò)誤,就讓他崩掉吧——本來(lái)就很有可能是極少見的錯(cuò)誤,經(jīng)常出現(xiàn)的?就需要程序員人工處理了,這是緊急情況,就算 try catch 所有錯(cuò)誤也無(wú)法避免,因?yàn)橄到y(tǒng)已經(jīng)陷入崩潰邊緣了,茍延殘喘下去只是自欺欺人。并且,不恰當(dāng)?shù)厥褂?try catch 還會(huì)埋下隱患,讓系統(tǒng)帶病運(yùn)轉(zhuǎn)。
其四,一切進(jìn)程都是輕量級(jí)的,都可以被監(jiān)控 monitor,有 Supervisor 專門做監(jiān)控。你可以方便的用一個(gè) supervisor 進(jìn)程去管理子進(jìn)程,supervisor 會(huì)根據(jù)你設(shè)定的策略,來(lái)處理意外掛掉的子進(jìn)程。這種情況的問(wèn)題的是,錯(cuò)誤處理稍微做不好就會(huì)掛,策略有:
- one_for_one:只重啟掛掉的子進(jìn)程
- one_for_all:有一個(gè)子進(jìn)程掛了,重啟所有子進(jìn)程
- rest_for_one:在該掛掉的子進(jìn)程 創(chuàng)建時(shí)間之后創(chuàng)建的子進(jìn)程都會(huì)重啟。