一种动态编译运行外部代码的系统及其方法与流程

文档序号:11133703阅读:257来源:国知局
一种动态编译运行外部代码的系统及其方法与制造工艺

本发明涉及一种代码运行系统及其方法,尤其涉及一种动态编译运行外部代码的系统及其方法。



背景技术:

在一个应用里面,接收外部代码片段,进行动态编译和运行,返回运行结果。此技术主要用于编程技术的在线教学、作业、测评、考试、模拟回放等技术领域。

一般而言,所有在线编程的产品都需要一个运行引擎的支持,同类产品的特点是能编译运行外部代码,一次性返回所有结果。但是,同类产品无法解决以下问题:

1)外部代码存在时间延迟,需要多次返回;2)外部代码存在输入输出,如先提示,等待用户输入,再输出;3)外部代码里有多线程,持续不断的输出;4)外部代码有死循环,在死循环里不断输出,需要能持续输出,超时自动停止。

以上这些问题,在编程语言的学习中都是很重要的内容,如果解决不了,则教学就不能达到很好的效果。



技术实现要素:

本发明为了克服现有技术的不足,提供一种动态编译运行外部代码的系统及其方法,支持所有的编程语言,支持对外部代码的各种管理流程,为外部代码里面的演示输出、输入输出、多线程、死循环等内容运行上的技术难点提供解决方案。

为此,本发明采用如下技术方案:

一种动态编译运行外部代码的系统,包括:

主应用,并设定主应用为调用者,其中,主应用指接收用户输入的代码及输入信息的应用,调用代码运行引擎并返回输出信息给用户;

运行主线程:负责独立编译运行一段代码,由于每段代码都在一个运行主线程里面运行,多用户可以互不影响;

超时控制线程:负责监控某段代码的运行是否超时,如果超时则停止运行并调用超时事件。

进一步地,所述运行主线程包括:由Runtime发起的运行进程、输入接口、输出接口三部分组成,其中:Runtime的exec方法调用命令行编译和运行指令,自动生成一个运行进程,执行代码的编译运行;输入接口负责接收主应用上用户的输入信息,发送给运行进程的输入流,由运行进程接收处理;输出接口负责监听运行进程的输出流,当由输出信息产生时,读取信息,发送给主应用进行显示。

进一步地,所述:由Runtime发起的运行进程、输入接口、输出接口三部分都以独立线程的方式存在,互不干扰。

本发明的另一方面,提供一种动态编译运行外部代码的方法,包括如下步骤:

S1:设定某一主应用为调用者,其中,主应用指接收用户输入的代码及输入信息的应用,调用代码运行引擎并返回输出信息给用户;

S2:运行主应用 ,启动运行主线程,其中,运行主线程为负责独立编译运行一段代码;

S3:启动超时控制线程,超时控制线程在启动运行主线程开始后的设定时间内对运行主线程进行检查,判断运行主线程是否存活:

如果还存活则认定为超时,结束运行主线程并触发超时处理事件;

如果运行的代码在三分钟内正常运行结束,则运行主线程乃至其中的运行进程+输入接口+输出接口都会被结束并自动销毁,之后超时线程会认定运行主线程已正常结束;

如果运行的代码存在死循环,则超时控制线程会认定运行主线程为超时;

如果运行的代码有输入,此时运行进程会被阻塞等待用户输入,之后如果用户一直没有输入,则超时控制程序也会认定运行主线程为超时;

如果阻塞等待输入后,用户有输入,此时运行进程会继续往下执行直至结束,之后超时控制线程会认定为正常结束。

进一步地,所述运行主线程包括:由Runtime发起的运行进程、输入接口、输出接口三部分组成,其中:Runtime的exec方法调用命令行编译和运行指令,自动生成一个运行进程,执行代码的编译运行;输入接口负责接收主应用上用户的输入信息,发送给运行进程的输入流,由运行进程接收处理;输出接口负责监听运行进程的输出流,当由输出信息产生时,读取信息,发送给主应用进行显示。

进一步地,所述:由Runtime发起的运行进程、输入接口、输出接口三部分都以独立线程的方式存在,互不干扰。

本发明具有如下有益效果:

1.本动态编译运行外部代码的系统,系统架构上是开放的,能非常方便的扩展更多的编程语言;

2. 系统对每份运行的代码都是线程隔离的,不同用户之间互不影响,即使有代码是死循环,也不会影响其它代码运行;

3.本产品在底层封装了运行的具体细节,以事件驱动的方式提供接口给应用层,性能非常高,适合用来实现大规模在线教学应用。

附图说明

图1为本发明中命令行调用的示意图;

图2、图3为本发明的动态编译运行外部代码的系统的结构框图。

具体实施方式

为了使本技术领域的人员更好的理解发明方案,下面将结合具体实施例及附图,对发明的技术方案进行清楚、完整的描述。

实施例1:

如图2、图3所示,一种动态编译运行外部代码的系统,包括:

主应用,设定主应用为调用者,其中,主应用指接收用户输入的代码及输入信息的应用,调用代码运行引擎并返回输出信息给用户;

运行主线程:负责独立编译运行一段代码,由于每段代码都在一个运行主线程里面运行,多用户可以互不影响;

运行主线程包括:由Runtime发起的运行进程、输入接口、输出接口三部分组成,其中:Runtime的exec方法调用命令行编译和运行指令,自动生成一个运行进程,执行代码的编译运行;输入接口负责接收主应用上用户的输入信息,发送给运行进程的输入流,由运行进程接收处理;输出接口负责监听运行进程的输出流,当由输出信息产生时,读取信息,发送给主应用进行显示;由Runtime发起的运行进程、输入接口、输出接口三部分都以独立线程的方式存在,互不干扰。

超时控制线程:负责监控某段代码的运行是否超时,如果超时则停止运行并调用超时事件。

下述为对本发明动态编译运行外部代码的系统的详细说明:

1、命令行调用:任何语言都存在编译和运行的命令行指令,例如:C/C++用gcc命令编译,用文件名运行;而java使用javac命令进行编译,用java命令进行运行。在JAVA应用里面通过调用Runtime接口,即可调用外部命令行指令,通过封装以上每种语言的命令行指令,即可实现基本的编译和运行功能,如图1所示;

2、输入输出接口:当调用Runtime.exec执行外部指令时,jvm会启动一个运行进程进行调用,此时此进程拥有自己的输入输出流,而主应用的进程需要接管运行进程的输入输出流,如图2所示;

其中:

输入接口和输出接口都是以线程的方式存在,与主进程(运行进程)独立,互不干扰;

当运行进程有产生输出时(如代码里的printf语句),输出接口会读取到运行进程的输出流产生的输出信息,发送给主应用进行显示;

当主应用上用户输入时,通过输入接口发送给运行进程,运行进程的输入流接收到输入信息,进行处理。

通过以上独立的输入输出接口的设计,引擎实现了几个场景:

(1)延迟输出:不管什么时候产生输出,输出接口都能捕获,发送给主应用显示。

(2)多线程输出:多线程共享运行进程的输出流,按照次序都会被输出接口捕获,依次发送给主应用显示。

(3)输入:当代码需要等待输入时,运行进程会被自动阻塞,等待输入接口的信息。当接收到输入信息时才会解除阻塞进行处理。

(4)输出输入配合:如果代码的逻辑是先提示用户输入,然后对用户输入进行处理,则按照时间顺序,主应用会先接收输出并显示第一次输出的提示信息,然后发送用户的输入给输入接口,再接收到处理后的输出信息并显示。例如:

第一次输出:“请输入您的姓名:”

等待用户输入:“张三”

第二次输出:“张三先生,欢迎您”。

3、超时处理

通常代码执行结束,运行进程也就自动被销毁,但有时代码可能存在死循环或者输入代码但用户不输入的情况,此时运行进程会一直结束不了,此时就需要设计一种超时处理机制,以释放长时间不结束的运行进程。

把以上调用逻辑给封装进一个独立线程执行,在此独立线程之外通过一个超时控制线程来控制是否超时,如果超时就自动停止运行并销毁有关资源,如图3所示;

其中:

(1)当主应用启动运行主线程之后,即刻启动一个超时控制线程,超时控制线程会在启动固定时间(预先配置的时间,如3分钟)之后对运行主线程进行检查,判断运行主线程是否存活,如果还存活则认定为超时,结束运行主线程并触发超时处理事件。

(2)如果运行的代码在三分钟内正常运行结束,则运行主线程乃至其中的运行进程+输入接口+输出接口都会被结束并自动销毁,之后超时线程会认定运行主线程已正常结束。

(3)如果运行的代码存在死循环,则超时控制线程会认定运行主线程为超时。

(4)如果运行的代码有输入,此时运行进程会被阻塞等待用户输入,之后如果用户一直没有输入,则超时控制程序也会认定运行主线程为超时。

(5)接上,如果阻塞等待输入后,用户有输入,此时运行进程会继续往下执行直至结束,之后超时控制线程会认定为正常结束。

实施例2:

一种动态编译运行外部代码的方法,如图3所示,包括如下步骤:

S1:设定某一主应用为调用者,其中,主应用指接收用户输入的代码及输入信息的应用,调用代码运行引擎并返回输出信息给用户;

S2:运行主应用 ,启动运行主线程,其中,运行主线程为负责独立编译运行一段代码;

所述运行主线程包括:由Runtime发起的运行进程、输入接口、输出接口三部分组成,其中:Runtime的exec方法调用命令行编译和运行指令,自动生成一个运行进程,执行代码的编译运行;输入接口负责接收主应用上用户的输入信息,发送给运行进程的输入流,由运行进程接收处理;输出接口负责监听运行进程的输出流,当由输出信息产生时,读取信息,发送给主应用进行显示;由Runtime发起的运行进程、输入接口、输出接口三部分都以独立线程的方式存在,互不干扰;

S3:启动超时控制线程,超时控制线程在启动运行主线程开始后的设定时间内对运行主线程进行检查,判断运行主线程是否存活:

如果还存活则认定为超时,结束运行主线程并触发超时处理事件;

如果运行的代码在三分钟内正常运行结束,则运行主线程乃至其中的运行进程+输入接口+输出接口都会被结束并自动销毁,之后超时线程会认定运行主线程已正常结束;

如果运行的代码存在死循环,则超时控制线程会认定运行主线程为超时;

如果运行的代码有输入,此时运行进程会被阻塞等待用户输入,之后如果用户一直没有输入,则超时控制程序也会认定运行主线程为超时;

如果阻塞等待输入后,用户有输入,此时运行进程会继续往下执行直至结束,之后超时控制线程会认定为正常结束。

将本发明应用在线教学领域,可以获得如下有益效果:

在编程语言的教学过程中,能够实现代码编写的演示、练习等过程放到云平台中去,以便老师和学生能够随时动手实践,并看到运行的结果,促进教学效率;

在编程测评过程中,能够实现根据不同的输入数据,输出对应的结果,以便系统能进行自动评分;

在引导式学习过程中,能够实现提示用户输入,然后根据用户的输入输出对应结果,让用户对编程有更加直观的认知;

在在线编程教材中,能够支持输入输出、多线程、延迟输出、死循环等重要的内容,让学生对这些内容能有更加直观的理解。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1