17611538698
webmaster@21cto.com

用五行代码开发一个操作系统

资讯 0 3096 2018-06-12 12:02:47

21CTO导读:这位开发者已经创建了一个只需要很少量代码的操作。你不相信么?看文章你就能够了解这些信息。


calendar_2011-29-06_005752.png

 
 一个模块化的操作系统只有一项工作:动态加载并初始化已经安装的模块。优先级!除了这个简单功能外,你的操作系统所做的其他,都是操作系统设计中使单片机成为臃肿软件的系统。
 
以下5行代码,就可以跑起来,这是Hyperlambda操作系统的最小代码量,就可以让你做到这一点。
list-folders:/modules/
list-files:x:/@list-folders/*?name
filter:startup.hl
load-file:x:/-/*?name
eval:x:/-/*
以上代码首先列出 /modules/目录中的所有文件夹,然后用名字叫startup.hl的程序列出这些文件夹中的文件。这个程序就是一个初始化文件,然后加载列表的文件,接着进行评估和执行这些文件。
 
这样允许我们将新的模块或组件复制到操作系统的/modules/文件夹中,将它放在我的/modules/文件夹中,则操作系统立即拥有这些组件赋予的新功能。平均安装并启动我操作系统的启动时间通常是几百毫秒。
 
因为Hyperlambda的核心功能是动态调用功能,通过引用“函数”(实际上是Active Events)作为简单的字符串。模块和模块之间不会创建静态的依赖的关系,但仍允许我们的所有模块可以调用其他任何模块的函数。它还允许我们通过简单的创建具有相同名称的函数,使新函数能够轻松替换已经有的函数实现,且不会破坏现在的用法。我甚至可以改变我的“函数”签名,通常是返回值,以及它们的整体实现,但是不会去破坏现有的组件,这样就可以实现函数应用的“多态性”,而不需要任何继承、接口或OOP。
 
上面的代码实际上就是我的操作系统。还不相信?请看如下代码:
/*
* Initialises Phosphorus Five.
*
* This is being done by evaluating all "startup.hl" files, for all modules found
* in the system.
*/


/*
* Loading all "startup.hl" files from all modules in system.
*/
list-folders:/modules/
list-files:x:/@list-folders/*?name
filter:startup.hl


/*
* Evaluating all files from above result, to make sure we initialise all modules.
*
* Notice, we will evaluate these files in the following order.
*
* 1. Micro's startup files
* 2. Desktop's startup files
* 3. All other startup files in undetermined order
*
* This is done to make sure other modules can use features from Micro and the Desktop
* in their startup files.
*/
load-file:x:@"/@list-files/*(/""~/micro/""|/""~/desktop/"")?name"
eval:x:/-/*
set:x:@"/@list-files/*(/""~/micro/""|/""~/desktop/"")"
load-file:x:/@list-files/*?name
eval:x:/-/*




可以看到,我在当前代码中加入了三行代码。这是因为我经常想在其它组件初始化时使用“micro”和“desktop”模块,以使代码保持干净。不过,我仍然可以删除或“卸载”这两个模块,这不会破坏到操作系统的核心代码,这相当于function(){}式的函数调用。
 
事实上,我也可以使用相同的代码来创建Web或桌面级操作系统,这些都可以。理论上说,我可以交换两个简单的C#程序集,可以是现有的Hyperlambda代码创建的WinForms或Xamarin应用程序,因此我们可以为WinForm应用程序使用相同的代码库。
 
虽然如此,我不建议你这样做。我链接到上面的文件,动态加载并初始化这些模块。每个模块实际上从单个角度来看都是无关紧要的。我的一些模块用来创建Ajax Widget,例如模式窗口,树视图控件,菜单控件等,其它模块本身就是整个应用程序和应用程序套件。
 
要创建自己的模块只需要建一个文件夹和一个名为“startup.hl”的文件,这样就可以扩展为自己的操作系统,这与我们以前用来创建库或COM模块的方式类似。
 
以下是我预先安装的一个“模块”的截图,这是一个完整的基于Web的IDE。
 

 
为了记录,我可以通过简单地创建一个类型为[hyper-ide.widgets.ide]的“小组件”来将我的整个IDE实例化,此时我可以重用整个IDE,就好像它是一个C#“UserControl”。
 
可以将“模块”存储在MySQL中,因为Hyperlambda毕竟只是一种文件格式,它不关心你的存储位置。此时,你的“加载文件”调用必须与“从数据库加载”调用进行交换。
 
但是,操作系统实际上只有5行代码,准确的说是8行。
 
想玩一个只包含8行代码的操作系统吗?它是开源的,你可以在这里找到它。
 
地址:https://github.com/polterguy/phosphorusfive

作者:Thomas Hansen
编译:洛逸


评论