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

发表于:2018-6-15 10:18

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Thomas Hansen    来源:51testing软件测试网采编

分享:
  这位开发者已经创建了一个只需要很少量代码的操作。你不相信么?看文章你就能够了解这些信息。
  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行代码的操作系统吗?它是开源的,你可以在这里找到它。



上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号