1. 程式人生 > >Erlang資料型別詳細介紹(1)

Erlang資料型別詳細介紹(1)

本文介紹 Erlang 語言中使用的各種資料型別以及這些資料型別在 Erlang 虛擬機器內部的表示和實現。瞭解資料型別的實現可以幫助大家在實際開發過程中正確選擇資料型別,並且可以更好更高效地操作這些資料型別。本文對 Erlang 資料型別及實現的總結目前是最全面的,可以作為 Erlang 資料結構的參考手冊。儘管我寫的內容都試圖在各種參考資料和 Erlang 虛擬機器原始碼中驗證,但是難免會有理解錯誤或各種低階錯誤,希望大家指正,也希望能對 Erlang 愛好者們有幫助。

Erlang資料型別回顧

Erlang 從語言的層面上說是一門比較簡單的語言,因此語言原生的資料結構也比較簡單。下面簡單回顧一下 Erlang 語言支援的資料結構:

  • 整數:小整數和大整數。Erlang 可以表達任意大小的整數,只要不超過記憶體容量。如果一個整數可以用一個機器字[注1]表示,那麼這個整數在內部通過“小整數”表示(這裡是粗略的描述,實際不到一個機器字);否則,自動升級為“大整數”表示。在使用者層面感知不到內部的具體表示,只要用就行了。示例:1,-1,123,473804731289473815748315139。
  • 浮點數:標準的 IEEE 754-1985 格式的浮點數。例如 3.14,1.234E-10,-0.5。
  • atom(原子):小寫字母開頭的不帶引號的字串,是一種字面常量,可以用來表達任何想表達的意義。也可以用單引號引起來,這樣用起來更靈活,比如第一個字母可以大寫,中間還可以插入空格。示例:abc,
    [email protected]
    ,error,ok,'Hello World'。
  • 布林值:實際上內部就是原子 true 和原子 false 表示的,但是有一些 BIF(例如 is_boolean)和操作符(例如 and 和 or 等)用於支援布林操作的語義。
  • tuple(元組):組合資料結構,相當於固定大小的陣列,每一個元素可以是任意型別。示例: {error, badarg},{person, "Siyao", 1985}。
  • list(列表):看上去和元組一樣,也是組合資料結構,每一個元素可以是任意型別,可以包含任意個元素,由於 Erlang 變數都是 immutable 的,所以列表的大小也是不可變的,但是列表的內部表示和支援的操作和元組完全不同。示例:[monday, tuesday],[{person, "Alice"}, {person, "Bob"}]。
  • 字串:實際上就是字元的列表,而字元實際上和整數沒有區別。字串就是一種採用大家熟知的字串表示語法表示字元列表的語法糖。示例:"Hello World"。注意字串用的是雙引號,而原子用的是單引號。
  • fun(匿名函式):fun 是體現 Erlang 作為函式式語言的一個重要特性。fun 是“匿名”函式,可以在程式中動態生成,可以當做資料傳入其他函式或從函式返回。因此 fun 型別的資料也是 Erlang 中的一種資料結構。示例:fun(X) -> 2*X end。
  • binary:用於表示一堆原始的無型別的位元組資料。由於 binary 是整塊的資料,所以非常適合各種資料傳輸和處理的場合。binary 可以方便地和 Erlang 中其他資料結構互相轉換,因此相當於可以在語言層面非常方便地執行資料結構的 marshalling 和 unmarshalling 操作。在 binary 中還可以打破位元組的邊界進行任意位匹配操作,因此可以非常方便地從各種二進位制資料(例如網路資料包和二進位制檔案等)中提取欄位。
  • ref:通過 BIF 呼叫 make_ref() 生成的一個幾乎唯一的值,因為在同一 Erlang 節點上,連續呼叫 \(2^{82}\) 次 make_ref() 得到的值都是不一樣的。ref 是透明的資料型別,只能拿來用,但不能對其操作。ref 資料可以放在訊息裡傳送至其他 Erlang 節點,Erlang 的分散式機制會自動加上節點相關的資訊,使得 ref 在整個叢集內保持幾乎唯一。也可以看出,ref 有兩種表示形式,一種是 local 表示形式,還有一種是 external 形式。local 版本就是在本地的表示形式,但是傳送到其他節點之後,其他節點得到的 ref 資料就是通過 external 形式表示的。
  • pid:Erlang 程序 id。類似 ref,也是透明的,也區分 local 和 external。
  • port:表示 port id,同樣也是透明的,並區分 local 和 external。

以上完整地概述了 Erlang 語言中採用的資料型別。下面我們就來看這些資料型別在 Erlang 虛擬機器內部都是怎麼表達和實現的。瞭解這些原理性的內容我們就可以更加高效地使用這些資料結構。

[注1] 這裡說的機器字(後面都簡稱“字”)指的是機器原生指標寬度的資料結構。比如在 64 位機器上,機器字長度為 8 個位元組。要注意這裡所說的機器字和 Intel 文件中的“習俗”不同。Intel 文件中因為歷史原因,一直將一個字定義為 16 位,即 2 位元組,所以 64 位寬的資料結構在 Intel 的文件中都表示為 quad word(因此在對應的彙編指令中也會新增 q 字尾)。

相關推薦

Erlang資料型別詳細介紹1

本文介紹 Erlang 語言中使用的各種資料型別以及這些資料型別在 Erlang 虛擬機器內部的表示和實現。瞭解資料型別的實現可以幫助大家在實際開發過程中正確選擇資料型別,並且可以更好更高效地操作這些資料型別。本文對 Erlang 資料型別及實現的總結目前是最全面的,可以作為 Erlang 資料結構的參考手

[轉]Xilinx Vivado的使用詳細介紹1:創建工程、編寫代碼、行為仿真、Testbench

always 選擇器 資料 多個 sign bench 通過 output tar 新建工程 打開Vivado軟件,直接在歡迎界面點擊Create New Project,或在開始菜單中選擇File - New Project即可新建工程。 點擊Next 輸入工程名稱和

Python--列表list、元組(tuple)、字典dict 詳細介紹1

在此中介紹列表(list)、元組(tuple)、字典(dict)的使用方法 檢視方法:Ctrl+Q ( 關鍵字、函式和方法的特點和區別: 關鍵字 是Python內建的、具有特殊意義的識別符號   (關鍵字後面不需要使用括號) 函式  封裝了獨立功能,可以直接呼叫  

REDIS五種基本資料型別命令操作1

REDIS 五種基本資料型別命令操作 1. 字串(string) set key value #儲存一個鍵值對 get key #通過key來去對應的值 mset key1 v1 k2 v2 #一次儲存多

JAVA——基本資料型別與陣列1

主要內容:1.識別符號與關鍵字;2.基本資料型別;3:型別轉換運算;4:輸入,輸出資料;5陣列 一:識別符號與關鍵字 1.識別符號(只是一個名字):作用:用來標識類名,變數名,方法名,型別名,陣列名,以及檔名的有效字元序列。 2.命名規則:①不能是數字字元開頭;   &nb

Kettle控制元件介紹1:生成記錄、自定義常量資料

這邊主要介紹2個控制元件,生成記錄以及自定義常量資料,屬於kettle輸入項裡。 一、生成記錄: 這是生成記錄的轉換圖,生成記錄的具體值如下: 如圖,建立三個欄位,分別為A、B、C,對其定義欄位型別和欄位值。最上面的"限制"是限制展示的數量;如圖,"限制"為5,那就展示5行。 結

mysql常用資料結構介紹1

mem_root mysql層通過mem_root管理記憶體分配,防止頻繁分配和釋放小記憶體。 mem_root的定義見include/my_alloc.h: typedef struct st_mem_root {   USED_MEM *free;  

linux的shell基礎介紹1

linux shell 8.1 shell介紹:器之間的交互1、shell是一個命令解釋器,提供用戶和機器之間的交互2、 支持特定語法,比如邏輯判斷、循環3、每個用戶都可以有自己特定的shell4、 CentOS7默認shell為bash(Bourne Agin Shell)5、 還有zsh、ksh等

條件隨機場介紹1—— An Introduction to Conditional Random Fields

結合 特征 tro charles 信息學 幫助 all div 問題 條件隨機場介紹 原文:An Introduction to Conditional Random Fields 作者: Charles Sutton (School of Informatics, U

課後筆記一:Python基礎語法介紹1

Python3.6.5我們總是找借口說還有時間去做某事,或者完成某事,結果總是不了了之。比如拖到現在才寫第一課聽課筆記。 第一節課,老師對以下內容做了分享,大致分為 環境配置 開發平臺:Mac OS Version 10.13.2 老師講課的是在Windows 10 我選擇在Mac OS進行Pyth

Xilinx Vivado的使用詳細介紹5:調用用戶自定義封裝的IP核

cond 5.4 vba adding 計算機 property with 我們 class Zedboard OLED Display Controller IP v1 介紹

資料基礎之Quartz1簡介、原始碼解析

一簡介 官網 http://www.quartz-scheduler.org/ What is the Quartz Job Scheduling Library? Quartz is a richly featured, open source job scheduling libra

資料基礎之Kafka1簡介、安裝及使用

http://kafka.apache.org   一 簡介 Kafka® is used for building real-time data pipelines and streaming apps. It is horizontally scalable,&nb

三種資料持久化方式介紹轉載

通過專案,我們瞭解到EF框架有三種資料持久化的方式,也就是標題中我所提到的三種。那麼這些方式之間又有什麼聯絡和區別呢?     篇幅原因,本篇部落格不再分別介紹每種方法如何實現的了,大家用的時候可以去Sou~一下。       先分別介紹

第五篇:基本資料型別及用法2

1 info={"k1":"v1","k2":"v2"} 2 v=info.setdefault("k3",123) 3 print(info,v) 4 #結果:{'k1': 'v1', 'k2': 'v2', 'k3': 123} 123   字典dict 1.字典的元素是鍵值

資料基礎之Spark1Spark Submit即Spark任務提交過程

Spark版本2.1.1 一 Spark Submit本地解析 1.1 現象 提交命令: spark-submit --master local[10] --driver-memory 30g --class app.package.AppClass app-1

GoLang基礎資料型別--->字典map詳解

                     GoLang基礎資料型別--->字典(map)詳解                                             作者:尹正傑 版權宣告:原創作品,謝絕轉載!否則將追究法律責任。  

display:box佈局的詳細介紹圖解

使用display:-webkit-box佈局很久了,但是每次使用的時候都是現用現查,而且發現網上沒有找到一篇非常全面的關於此佈局的介紹,今天決定寫一篇部落格來記錄這個自適應佈局。 1、首先不同的瀏覽器要做不同的相容:目前box-flex屬性還沒有得到firefox、Opera、chrome瀏覽

Java和大資料的結合學習1

一.Javase的學習 string ,stringbuffer ,stringbulider 包裝類 randrom函式和randrom類 final,成員內部類,區域性內部類,靜態內部類,匿名內部類,內部類的繼承 異常的捕獲,處理,輸出以及丟擲

第六篇:基本資料型別及用法3

集合set 1.集合由不同無序的元素組成,集合中只能存放不可變型別(數字,字串,元祖),例如:s={123,"abc",(1,2,"a")}   -重複元素會被去除,所以可用集合去重,例:不考慮順序,去除列表li中重複元素   1 li=["alex",123,"he