开源矿工 记一个完整的软件是如何开发和运行的

开源矿工的开发耗费了我很多精力,到今天已经整出了10万行代码,但是缺乏文档和注释,不是因为刻意不添加注释,而是因为添加的注释会让人不知所云。可能大部分开发者不熟悉开源矿工的开发模式,需要先有个铺垫,后续的文字就是用来做这个铺垫的。开源矿工不是OO也不是过程,它是面向数据编程,它是系统编程。

一,从0开始

我们相信所有的系统都是从0开始的

我们相信,所有的系统都是从0开始的。

所谓从0开始就是从虚无开始,软件系统一定也是从0开始的。0可以称作Void、Virtual什么的,Void已经被编程语言占用了,那么我们用Virtual吧。

我们相信,所有的系统在空间结构上都是树形的,软件系统肯定不例外。

树是一个奇妙的结构,只要你愿意你所掌握的一切知识都是树形,你未掌握的知识也是树形。不做多说,开源矿工系统在空间结构上和行为结构上都要有Root(根)概念。开源矿工有根,构建开源矿工的编程语言有根,开源矿工所生存的运行时环境也有根,下层的事物我们不做追究,开源矿工作为生存在操作系统时空中的一个小小的应用系统来说只感知自己所需要感知的环境即可。

我们相信,所有的词汇都应该按照望文生义理解

你望文生义出来的意思就是本真的意思,凡是不能望文生义的或者望文生义出的意思和联想不一致的语言文字载体都已经被前人丢弃或者迟早被后人丢弃。我们不使用不能望文生义的词汇。

从源代码的VirtualRoot类型开始。望文生义,这是虚无,这是根。这是第一个出现的东西,它处在开源矿工的最底层,所有上层建筑都建立在它之上。它下面肯定也有东西,但那是编程语言和运行环境的世界,我们的世界从VirtualRoot开始。

VirtualRoot

VirtualRoot是个静态类型,它不是被我们构建而生的,有世界的时候它就已经在那里了,它是从0开始的0,它是整个世界的根。VirtualRoot根上挂载的事物也全都是静态的在世界开始的时候就已经在那里的事物,直接挂载在VirtualRoot上的事物有:

  1. JsonSerializer 它是粉碎机,它是重建器,它安装在系统的出入口处,开源矿工内部的物体流出系统前会被它打碎成下层系统的物体,下层原子世界不需要我们关注;外部系统的事物在进入我们的系统后首先会被它重建成我们的世界里事物的样子。我们的系统只有一个入口和一个出口,这唯一的出入口就是VirtualRoot,是根。
  2. MessageDispatcher 推进器、动力源,或者其它什么名字,照此理解就可以了,开源矿工系统内部运动的动力之源就是它,至于它的动力又是来自CPU这种下层世界的事物又超出我们的世界之外去了。
  3. CommandBus 命令电车,它由MessageDispatcher驱动,MessageDispatcher不是装在它里面的引擎,MessageDispatcher是电。它运载命令,命令是一种消息,消息是一种空间结构体。
  4. EventBus 事件电车,它由MessageDispatcher驱动,MessageDispatcher不是装在它里面的引擎,MessageDispatcher是电。它运载事件,事件是一种消息,消息是一种空间结构体。

Message

上面知道VirtualRoot上挂在的CommandBus和EventBus分别是运载命令和事件的,而命令和事件是两种不同类型的消息。消息是什么?消息是消息的收发方所协定的承载信息的空间结构体,空间结构体是什么?就是一段树枝,树枝的枝杈相对位置和长短编码了能被收发方所理解的信息。

Command

事情发生前的消息。

Event

事情发生后的消息。

Path

路径,消息所运动的路径。

二,认识系统内的空间和时间

域是空间场所

通过上一部分我们知道所有的词汇都应该是通过联想望文生义的,那么作用“域”的域指的就是地域、场所、空间单元、资源组织结构,不管这个词出现在什么领域,不管这个词出现在人类知识树的什么节点它指的意思都是空间场所。

域是组织结构单元

通过上一部分我们知道所有的系统在空间结构上都是树形,树是一种构造规律,它是对集合的有序带偏移量的分层排列。域就是集。

域中的成员也是域

描述域之前我们需要先描述出域中的成员,它们是:币种、内核、矿池 等。每一个成员是一个体,这个体是空间结构体,而空间结构体是一段树枝,所以说你可以认为每一个成员是一段树枝。这一篇我们在从域的角度描述问题,域是集,而树是有序集,所以一段树枝就是一个域,而币种、内核、矿池等空间结构体是一段段的树枝,所以说域中的成员也是域。就像房间里有柜子,柜子里有抽屉,抽屉里有盒子,盒子里有手机,手机空间里的东西超出了我们的世界进入到未知的域外世界去了我们不关心。房间外面有楼,楼外面有地球,地球外面又到域外世界去了也和我们没关系。

人的思维是被观察者域的域外维度

人的思维没有尺寸,它可以进入天体也可以进入原子,因为它根本可以不在木星上或原子内,它是在被观察者外部的世界,它是在观察者自己的内部世界建立的一种和外部世界的对应关系。人的思维可以进入天体也可以进入原子,这种进入运动是人脑内部在自己的内部世界的运动而并非真的进入了外部世界。

运动 —— 我们需要准确认知自己当前所处的观察者位置

通过“事情发生的场所”这句话我们知道重点在于“事情”,在于“发生”,在于“变化”,在于“运动”。 我们的思维没有尺寸,它可以在自己构建的对外部世界的映射的内部世界里任意行走。但我们需要准确认知自己当前被自己投射到了哪里。 “发生”是一种变化,是运动。空间一但变化就产生了时许概念,顺序一旦产生就有了前后、里外、长短等概念。观察者和参照点随之而生。 空间是一种相对静止的存在,就像人有五肢,我们可以将人体看作一棵树,头、双手、双脚5肢的相对位置在这棵树上来说是固定的相对静止的,当我们说人体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系统中说计算机名、物理内存等外部事物的时候它们才是和开源矿工没有关系的外属性。

为什么我们要感知那么多外部世界,因为只要我们感知了所有需要感知的外部事物,就是说只要我们的系统内部具有和所需认知的外部世界的对应关系,这样我们就能更好的适应生存环境,比如我们要支持无盘运行只需摆动开源矿工系统内部的一个参数即可。

四,系统内部的层

所谓“层”、“界”、“域”、“集合”,这些词其实是在试图表达物质系统的组成结构和运动景象中的规矩,系统的组成结构和运动景象即为架构,而层是架构的模式或者叫章法。这些不同人发明的词都是来源于对同一个规律的观察、发现、表达。不管别人是怎么想象的软件系统中的层,在开源矿工系统中值得显式提出的有这么几层:数据模式层、数据集合层、对象层。

数据模式层

源码中的NTMinerDataSchemas程序集中的就是数据模式。所谓数据模式,它是对数据结构的描述;所谓数据结构,它是一种空间结构体;所谓空间结构体,它是一段树枝,树枝的枝杈相对位置和长短中承载着系统信息。这里取名数据模式(DataSchema)暗含了“关系”概念,一段树枝上的所有枝杈都是通达相连的这就是关系,这种关系可以认为是空间摆放位置关系。别忘了沿着树下钻和上溯,一段树枝是一个集合,树枝的枝杈也是树枝同时树枝又在更大的树枝上,最终都在系统树上。数据模式层中的数据模式由基本数据类型组成;所谓基本数据类型,是计算机运行时的数据模式。NTMinerDataSchema层中的每一个数据模式都由基本数据模式组成,不存在由非基本数据模式组成的数据模式,也可以这么讲:如果一个数据模式引用了另一个数据模式,那么它引用另一个数据模式类型的数据的方式一定是通过持有另一个数据模式类型的数据记录的标识表达的,而标识是基本数据模式类型。

数据集合层

数据模式是数据的规格,相同规格的数据组成的集合就是数据集合。数据集合层中是由不同模式的数据组成的一个个不同类型的数据集合。这一层在源码中的命名形如***Set,比如ICoinSet。

对象层

如果说数据模式层和数据集合层是靠近计算机的层,那么对象层就是靠近人的层。对象和数据的主要不同是对象在数据的基础上增加了行为和充血了关系。充血了关系是什么意思?在对数据模式层的表述中我们知道数据模式都是由基本类型组成的,一种模式引用另一种模式类型的数据的方式是通过持有基本类型的数据标识表达的,充血的意思是对象在数据的基础上增加了非基本类型的属性,增加的这些非基本类型的属性值通常来自于基于持有的数据的标识从对应类型的数据集合中查找得到。之所以说对象层是靠近人的层是因为人看到的东西(界面)就是这层对象的直接的图形化表达(计算机的世界本来就是图形化的,用图形表达计算机世界是非常直接的,相反像linux那样的用字符串表达计算机的世界才是拐弯抹角的因此有人说linux的哲学一开始就是错的不可能取得像windows那样的面向人民大众的成功)。这一层在代码中的命名形如***ViewModel,比如CoinViewModel。

层与层的关系

不知道别人是怎么想象层的形状的,在我的脑子里层是球形的一层裹一层的集合的包含和被包含关系。越靠近内层越靠近计算机,越靠近外层越靠近人,计算机站在内向外看内层包含外层,人站在外向内看外层包含内层。

开源矿工官网:http://dl.ntminer.top

原文地址:https://www.cnblogs.com/ntminer/p/10966222.html