版本更新最近GScript更新到v0.0.11版本,重点更新:Docker运行环境增加了byte原始类型,标准增加了一些字符串libraryStrings/StringBuilderarrayslices语法:int[]b=a[1:len(a)];具体更新请见下文。前言前段时间发布了GScript的在线游乐场。这是一个可以在线运行GScript脚本的网站。其基本原理是接收用户输入的源代码,在服务器上运行服务;在服务端,我设置了运行API的后端服务的用户权限,避免执行一些恶意请求。但是难免有些用户会进行一些耗时的操作,比如死循环,或者我提供的demo中打印杨辉三角。这本质上是一个递归函数,当打印的三角形层数太多时,它会非常耗时,而且它也非常占用CPU。有几次去查看服务器的时候,发现了几个高CPU的进程,基本都是这样的耗时操作,难免会影响服务器的性能。要用Docker来解决这类问题,自然而然会想到可以用Docker。所有资源都与宿主机隔离,不管你怎么乱来,都不会影响到宿主机。照做就行,最后修改API执行脚本的地方:stringfileName=d.unix("Asia/Shanghai")+"temp.gs";s.writeFile(文件名,正文,438);字符串密码=s。getwd();//字符串res=s.command("gscript",fileName);stringres=s.command("docker","run","--rm","-v",pwd+":/usr/src/gscript","-w??","/usr/src/gscript","crossoverjie/gscript","gscript",fileName);s.remove(文件名);r.body=res;r.ast=dumpAST(正文);r.symbol=dumpSymbol(正文);ctx.JSON(200,r);主要修改是将直接执行的GScript命令修改为调用docker执行。但实际上,仍有改进的余地。添加协程后,可以监控运行时间,超时后自动杀掉进程。我也把Docker上传到了DockerHub,现在只要想在本地体验GScript的REPL,就只需要运行Docker即可。dockerpullcrossoverjie/gscriptdockerrun--rm-itcrossoverjie/gscript:latestgscript当然也可以用Docker执行GScript脚本:dockerrun--rm-v$PWD:/usr/src/gscript-w/usr/src/gscriptcrossoverjie/gscriptgscript{yourpath}/temp.gs编写GScript标准库接下来我们重点介绍GScript标准库。事实上,编写标准库是一件费时费力的工作。既然编译器已经提供了一些可用的内置函数,那么用这些内置函数编写一些常用的工具类是没有问题的。有幸编写了GScript标准库的朋友可以作为参考。这里我做了一个样例,先看看运行效果://StringtoolclassStringBuilderb=StringBuilder();b.writeString("10");b.writeString("20");intl=b.writeString("30");strings=b.String();printf("s:%s,len=%d",s,l);assertEqual(s"102030");byte[]b2=toByteArray("40");b.WriteBytes(b2);s=b.String();assertEqual(s,"10203040");println(s);//字符串工具类Stringss=Strings();string[]elems={"name=xxx","age=xx"};stringret=s.join(elems,"&");println(ret);assertEqual(ret,"name=xxx&age=xx");boolb=s.hasPrefix("http://www.xx.com","http");println(b);assertEqual(b,true);b=s.hasPrefix("http://www.xx.com","https");println(b);assertEqual(b,false);实现源码基本上是借用了Go的标准库。我们先来看看StringBuilder。源代码:类StringBuilder{byte[]buf=[0]{};//将内容附加到buf,它返回s的长度intwriteString(strings){byte[]temp=toByteArray(s);追加(缓冲区,温度);返回长度(温度);}//将b附加到buf,它返回b的长度intWriteBytes(byte[]b){append(buf,b);返回长度(b);}//复制缓冲区到一个新的。grow(intn){if(n>0){//当剩余空间不足时。如果(cap(buf)-len(buf)
