可扩展,弹性Brainf * CK作为服务

2021-04-09 16:46:04

如果您想开始学习编程语言 - 在其中写一个BF解释器。五月,这一直是许多新人进入编程的共同建议。我们都知道典型的解决方案是如何看起来的:

但是,嘿,这不是现在应该如何完成的事情!首先,共同的事实是“C是不安全”,因此应该以所有成本避免。我们正在写一个翻译,一个严肃而复杂的软件,所以Java,Go,Python,至少生锈会是一个很好的开始。

然后,每个初级程序员都知道计算机不可靠,并且在本地计算机上不应在解释器中运行这种关键工具。从一开始就更好地将其移入云中。没有什么比你从自己的口袋里支付其CPU使用量更好地说“我对自己的软件”。

当然,巨石是如此古老的学校。看,BF Interpreter一直在等待将语义上分成自包含的微服务。我们如何完成解析,另一个移动指针和第三个递增并递减内存单元?声音逻辑,绝对降低了解释器的复杂性。

当我们做解析时 - 我们需要注意循环。理想情况下,我们应该将循环开始地址放在堆栈上,并在需要跳回并重复循环时弹出它。但是,他们的理智思想中的任何人都会手动将如此复杂的数据结构写作!幸运的是,快速谷歌曲表明,Redis已经拥有列表和堆栈,它是一个具有良好声誉和许多Githib星的软件,所以我们最好委托处理堆栈。一些琐碎的LPUSH / LPOP命令将完成所有工作,我们的服务仍然很小并集中。

移动指针也不那么简单。我们在哪里存储指针值?我建议我们拿一个mongodb并将指针作为文件。是的,现在它只是一个数字,但谁知道我们将来需要储存什么?我们很幸运在这里,Mongo甚至有一个US $ inc函数来增量号码,好像被创建以便在BF口译员中使用!与我的SRE同行说话证明,如果蒙古还没有奇怪的问题 - 他们肯定应该试一试生产!

最后,对存储器单元的操作。哇,这很难。内存很大,应该是可靠的。 PostgreSQL怎么样?它的战斗测试了,我们可以设置几个副本。事实上,让我们走一步,并考虑性能。我们不能将所有内存单元放入一个数据库中。这会很慢。我们如何在另一个甚至地址中放置奇怪的地址?这样的分配碎片应该加快一些东西。

显然,我们需要在前面的某种负载平衡器。 而且,我们完成了! 你觉得我正在开玩笑吗? 这是一个原型 - https://github.com/zserge/bfapi - 它与我们设计的工作相同。 从StackOverflow复制了大多数代码,证明它是正确的,我们可以跳过写作测试并节省一段时间。 事实上,该服务仅在400毫秒运行了“Hello World”脚本! 这比网络上的典型页面加载速度更快,证明了我们的设计是一个真正的改进! 我希望你很喜欢这篇文章。 您可以遵循 - 并贡献 - 在Github,Twitter或通过RSS订阅。