关于编译原理:手写编程语言如何为-GScript-编写标准库
版本更新最近 GScript 更新了 v0.0.11 版本,重点更新了: Docker 运行环境新增了 byte 原始类型新增了一些字符串规范库 Strings/StringBuilder数组切片语法:int[] b = a[1: len(a)];具体更新内容请看下文。前言前段时间公布了 GScript 的在线 playground, 这是一个能够在线运行 GScript 脚本的网站,其本质原理是接管用户的输出源码从而在服务器上运行的服务;这几乎就是后门大开的 XSS 攻打,为保住服务器我设置了运行 API 的后端服务的用户权限,这样能够防止执行一些歹意的申请。 但也防止不了一些用户执行了一些耗时操作,比方一个死循环、或者是我提供 demo 里的打印杨辉三角。 这实质上是一个递归函数,当打印的三角层数过高时便会十分耗时,同时也十分耗费 CPU。 有几次我去查看服务器时发现了几个 CPU 过高的过程,基本上都是这样的耗时操作,不可避免的会影响到服务器的性能。 应用 Docker为了解决这类问题,很天然的就能想到能够应用 Docker,所有的资源都和宿主机是隔离开的,无论怎么瞎折腾也不会影响到宿主机。 说干就干,最初批改了 API 执行脚本的中央: string fileName = d.unix("Asia/Shanghai") + "temp.gs" ; s.writeFile(fileName, body, 438); string pwd = s.getwd(); // string res = s.command("gscript", fileName); string res = s.command("docker","run","--rm","-v", pwd+":/usr/src/gscript","-w","/usr/src/gscript", "crossoverjie/gscript","gscript", fileName); s.remove(fileName); r.body = res; r.ast = dumpAST(body); r.symbol=dumpSymbol(body); ctx.JSON(200, r);次要批改的就是将间接执行的 GScript 命令批改为了调用 docker 执行。 ...