開源礦工的開發耗費了我不少精力,到今天已經整出了10萬行代碼,可是缺少文檔和註釋,不是由於刻意不添加註釋,而是由於添加的註釋會讓人不知所云。可能大部分開發者不熟悉開源礦工的開發模式,須要先有個鋪墊,後續的文字就是用來作這個鋪墊的。開源礦工不是OO也不是過程,它是面向數據編程,它是系統編程。git
一,從0開始程序員
所謂從0開始就是從虛無開始,軟件系統必定也是從0開始的。0能夠稱做Void、Virtual什麼的,Void已經被編程語言佔用了,那麼咱們用Virtual吧。github
樹是一個奇妙的結構,只要你願意你所掌握的一切知識都是樹形,你未掌握的知識也是樹形。不作多說,開源礦工系統在空間結構上和行爲結構上都要有Root(根)概念。開源礦工有根,構建開源礦工的編程語言有根,開源礦工所生存的運行時環境也有根,下層的事物咱們不作追究,開源礦工做爲生存在操做系統時空中的一個小小的應用系統來講只感知本身所須要感知的環境便可。編程
你望文生義出來的意思就是本真的意思,凡是不能望文生義的或者望文生義出的意思和聯想不一致的語言文字載體都已經被前人丟棄或者早晚被後人丟棄。咱們不使用不能望文生義的詞彙。數據結構
從源代碼的VirtualRoot類型開始。望文生義,這是虛無,這是根。這是第一個出現的東西,它處在開源礦工的最底層,全部上層建築都創建在它之上。它下面確定也有東西,但那是編程語言和運行環境的世界,咱們的世界從VirtualRoot開始。架構
VirtualRoot是個靜態類型,它不是被咱們構建而生的,有世界的時候它就已經在那裏了,它是從0開始的0,它是整個世界的根。VirtualRoot根上掛載的事物也全都是靜態的在世界開始的時候就已經在那裏的事物,直接掛載在VirtualRoot上的事物有:編程語言
上面知道VirtualRoot上掛在的CommandBus和EventBus分別是運載命令和事件的,而命令和事件是兩種不一樣類型的消息。消息是什麼?消息是消息的收發方所協定的承載信息的空間結構體,空間結構體是什麼?就是一段樹枝,樹枝的枝杈相對位置和長短編碼了能被收發方所理解的信息。編碼
事情發生前的消息。spa
事情發生後的消息。操作系統
路徑,消息所運動的路徑。
二,認識系統內的空間和時間
經過上一部分咱們知道全部的詞彙都應該是經過聯想望文生義的,那麼做用「域」的域指的就是地域、場所、空間單元、資源組織結構,無論這個詞出如今什麼領域,無論這個詞出如今人類知識樹的什麼節點它指的意思都是空間場所。
經過上一部分咱們知道全部的系統在空間結構上都是樹形,樹是一種構造規律,它是對集合的有序帶偏移量的分層排列。域就是集。
描述域以前咱們須要先描述出域中的成員,它們是:幣種、內核、礦池 等。每個成員是一個體,這個體是空間結構體,而空間結構體是一段樹枝,因此說你能夠認爲每個成員是一段樹枝。這一篇咱們在從域的角度描述問題,域是集,而樹是有序集,因此一段樹枝就是一個域,而幣種、內核、礦池等空間結構體是一段段的樹枝,因此說域中的成員也是域。就像房間裏有櫃子,櫃子裏有抽屜,抽屜裏有盒子,盒子裏有手機,手機空間裏的東西超出了咱們的世界進入到未知的域外世界去了咱們不關心。房間外面有樓,樓外面有地球,地球外面又到域外世界去了也和咱們不要緊。
人的思惟沒有尺寸,它能夠進入天體也能夠進入原子,由於它根本能夠不在木星上或原子內,它是在被觀察者外部的世界,它是在觀察者本身的內部世界創建的一種和外部世界的對應關係。人的思惟能夠進入天體也能夠進入原子,這種進入運動是人腦內部在本身的內部世界的運動而並不是真的進入了外部世界。
經過「事情發生的場所」這句話咱們知道重點在於「事情」,在於「發生」,在於「變化」,在於「運動」。 咱們的思惟沒有尺寸,它能夠在本身構建的對外部世界的映射的內部世界裏任意行走。但咱們須要準確認知本身當前被本身投射到了哪裏。 「發生」是一種變化,是運動。空間一但變化就產生了時許概念,順序一旦產生就有了先後、裏外、長短等概念。觀察者和參照點隨之而生。 空間是一種相對靜止的存在,就像人有五肢,咱們能夠將人體看做一棵樹,頭、雙手、雙腳5肢的相對位置在這棵樹上來講是固定的相對靜止的,當咱們說人體5肢之間的關係是靜止的時候咱們將本身放在了這個樹的域中,此時做爲觀察者的咱們進入了這段樹枝的世界,咱們要準確的認知此時本身沒法從樹枝的一個枝丫跳進樹外而後再由樹外到達另外一個枝丫,咱們必須在樹上運動,因此這段樹枝的相對關係是靜止的。觀察者和參照點隨運動而生,咱們必須準確認知本身做爲觀察者當前所處的位置和觀察的方向,咱們必須可以意識到做爲觀察者的本身有沒有變換位置。
開源礦工這棵系統樹內部劃分有5大域。這5大做用域是:幣種集、礦池集,內核集、幣種x內核集、礦池x內核集。咱們說開源礦工內部有這5大域,而不是說總共只有這5大域,由於開源礦工這棵樹做爲一個總體也是域啊,系統內部的每個對象也是域啊,而是說這5大域是值得顯式化描述的5大域。請記住它們,它們是:幣種集、礦池集,內核集、幣種x內核集、礦池x內核集。
三,界定系統的內外
這個系列每一篇都很短,主要用於將開源礦工架構和源代碼中的每個值得說明的概念都描述出來,由於開源礦工的源代碼上的註釋實在太少,不是由於刻意不添加註釋而是由於它的源代碼組織結構和運行時景象和大部分程序員平時所掌握的不太匹配,添加的註釋會讓人不知所云。 因此決定先有這個系列,先熟悉一下抽象的大體輪廓再去接觸開發就像是帶着地圖去那裏行走不至於迷路,後續會添加註釋,添加的註釋每每會是一些表地點的名詞和表運動的動詞每每不是完整的句子。
在上一部分咱們知道域是地域,是資源組織結構,其實就是空間,就是計算機領域所說的數據結構。在第0篇咱們信仰全部的系統在空間結構上都是樹形,之因此用「堅信」、「信念」這樣的詞是由於咱們不想證實它,我只在乎這個斷言可否幫助我節能高效的工做。如今咱們將具體化,將樹形構造定律幻化到計算機領域的數據結構,咱們認爲:一個位是一個具備一個分叉的樹,一個字節是一個具備8個分叉的樹,一個int32是一個具備4個字節分叉的樹……,由性別(2個位表示男、女、未知)、年齡、姓名組成的Person數據結構是由底層樹組成的高層樹。而且爲了概念的完整性咱們認爲一個位也有兩個枝杈,位的兩個枝杈是0和1,它們是最小的不可分割的粒子,計算機世界是離散的世界正是由於到了01後再也不能夠分割。 如今當咱們再次說開源礦工系統是一棵樹的時候,在空間結構上可能就是在說開源礦工的根、樹枝、葉子等數據結構了。
上一部分咱們還說樹是添加了偏移量的集合,既然是集合那必定有內外。咱們認爲在空間維度樹的根是最大的集合、葉子是最小的集合,在行爲維度葉子是最大的集合,根是最小的集合,也就是說咱們認爲當咱們用相對靜止的眼光看系統的時候咱們在關注空間,當咱們以運動、變化的眼光看系統的時候咱們在關注時序。在前篇咱們也屢次提到邊界、域就是地域邊界,當咱們認一個方向樹的邊界有兩端,在操做系統看來開源礦工是個進程(資源樹),操做系統的進程概念是比開源礦工更大的概念,涵蓋的空間更大因此是更大的集合。在一棵更大的樹中進程能夠被看做開源礦工的根,但這超出了咱們的系統進入到域外世界去了。前篇咱們還提到原子也超出咱們的世界了,原子只是個比喻,這裏的原子指的是bit、和由bit組成的bool、int等,由於它們在咱們的世界來講沒有意義,幣種、礦池、內核等纔是咱們的世界的事物,幣種礦池內核等數據結構中被咱們取了名稱的屬性(或者叫字段)也是咱們的世界的事物,而屬性是由bool樹、int樹、byte樹組成的,這裏的bool、int、byte、bit等概念也不屬於咱們的世界,它們就是咱們說的原子世界,它們是計算機行爲的根,由於計算機在運行時只認它們,因此說在運行時這個時序維度或者叫運動維度根是bit。兩頭的世界咱們都不關心,它們都是咱們的外。
經過上一段咱們認知到開源礦工的生存環境在咱們的系統樹外,組成開源礦工空間結構體的int、bool、bit也在咱們的系統樹外。開源礦工系統須要感知本身的生存環境,感知外部世界就是擺動本身的域內世界從而創建和域外世界的對應關係。開源礦工須要感知的外部世界的事物咱們就稱做外屬性。它們是:計算機名、物理內存、虛擬內容、BIOS信息、顯卡、驅動、文件系統等信息。
開源礦工的內屬性是什麼?能夠認爲開源礦工系統內的一切事物都是內屬性。開源礦工展現給用戶的一切都是它的內屬性,只展現給開發人員的事物也是它的內屬性。開源礦工內部創建的對外部世界事物的對應也是它的內屬性,只有當咱們在開源礦工域外好比在QQ系統中說計算機名、物理內存等外部事物的時候它們纔是和開源礦工沒有關係的外屬性。
爲何咱們要感知那麼多外部世界,由於只要咱們感知了全部須要感知的外部事物,就是說只要咱們的系統內部具備和所需認知的外部世界的對應關係,這樣咱們就能更好的適應生存環境,好比咱們要支持無盤運行只需擺動開源礦工系統內部的一個參數便可。