CN106406973A - 一种动态编译运行外部代码的系统及其方法 - Google Patents
一种动态编译运行外部代码的系统及其方法 Download PDFInfo
- Publication number
- CN106406973A CN106406973A CN201611012065.3A CN201611012065A CN106406973A CN 106406973 A CN106406973 A CN 106406973A CN 201611012065 A CN201611012065 A CN 201611012065A CN 106406973 A CN106406973 A CN 106406973A
- Authority
- CN
- China
- Prior art keywords
- code
- input
- run
- thread
- main
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
Abstract
本发明涉及一种动态编译运行外部代码的系统,包括:主应用,并设定主应用为调用者,其中,主应用指接收用户输入的代码及输入信息的应用,调用代码运行引擎并返回输出信息给用户;运行主线程:负责独立编译运行一段代码,由于每段代码都在一个运行主线程里面运行,多用户可以互不影响;超时控制线程:负责监控某段代码的运行是否超时,如果超时则停止运行并调用超时事件。同时,本发明还公开了一种动态编译运行外部代码的方法。本发明支持所有的编程语言,支持对外部代码的各种管理流程,为外部代码里面的演示输出、输入输出、多线程、死循环等内容运行上的技术难点提供了解决方案。
Description
技术领域
本发明涉及一种代码运行系统及其方法,尤其涉及一种动态编译运行外部代码的系统及其方法。
背景技术
在一个应用里面,接收外部代码片段,进行动态编译和运行,返回运行结果。此技术主要用于编程技术的在线教学、作业、测评、考试、模拟回放等技术领域。
一般而言,所有在线编程的产品都需要一个运行引擎的支持,同类产品的特点是能编译运行外部代码,一次性返回所有结果。但是,同类产品无法解决以下问题:
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:启动超时控制线程,超时控制线程在启动运行主线程开始后的设定时间内对运行主线程进行检查,判断运行主线程是否存活:
如果还存活则认定为超时,结束运行主线程并触发超时处理事件;
如果运行的代码在三分钟内正常运行结束,则运行主线程乃至其中的运行进程+输入接口+输出接口都会被结束并自动销毁,之后超时线程会认定运行主线程已正常结束;
如果运行的代码存在死循环,则超时控制线程会认定运行主线程为超时;
如果运行的代码有输入,此时运行进程会被阻塞等待用户输入,之后如果用户一直没有输入,则超时控制程序也会认定运行主线程为超时;
如果阻塞等待输入后,用户有输入,此时运行进程会继续往下执行直至结束,之后超时控制线程会认定为正常结束。
将本发明应用在线教学领域,可以获得如下有益效果:
在编程语言的教学过程中,能够实现代码编写的演示、练习等过程放到云平台中去,以便老师和学生能够随时动手实践,并看到运行的结果,促进教学效率;
在编程测评过程中,能够实现根据不同的输入数据,输出对应的结果,以便系统能进行自动评分;
在引导式学习过程中,能够实现提示用户输入,然后根据用户的输入输出对应结果,让用户对编程有更加直观的认知;
在在线编程教材中,能够支持输入输出、多线程、延迟输出、死循环等重要的内容,让学生对这些内容能有更加直观的理解。
Claims (6)
1.一种动态编译运行外部代码的系统,包括:
主应用,并设定主应用为调用者,其中,主应用指接收用户输入的代码及输入信息的应用,调用代码运行引擎并返回输出信息给用户;
运行主线程:负责独立编译运行一段代码,由于每段代码都在一个运行主线程里面运行,多用户可以互不影响;
超时控制线程:负责监控某段代码的运行是否超时,如果超时则停止运行并调用超时事件。
2.根据权利要求1所述的动态编译运行外部代码的系统,其特征在于:所述运行主线程包括:由Runtime发起的运行进程、输入接口、输出接口三部分组成,其中:Runtime的exec方法调用命令行编译和运行指令,自动生成一个运行进程,执行代码的编译运行;输入接口负责接收主应用上用户的输入信息,发送给运行进程的输入流,由运行进程接收处理;输出接口负责监听运行进程的输出流,当由输出信息产生时,读取信息,发送给主应用进行显示。
3.根据权利要求2所述的动态编译运行外部代码的系统,其特征在于:所述:由Runtime发起的运行进程、输入接口、输出接口三部分都以独立线程的方式存在,互不干扰。
4.一种动态编译运行外部代码的方法,包括如下步骤:
S1:设定某一主应用为调用者,其中,主应用指接收用户输入的代码及输入信息的应用,调用代码运行引擎并返回输出信息给用户;
S2:运行主应用 ,启动运行主线程,其中,运行主线程为负责独立编译运行一段代码;
S3:启动超时控制线程,超时控制线程在启动运行主线程开始后的设定时间内对运行主线程进行检查,判断运行主线程是否存活:
如果还存活则认定为超时,结束运行主线程并触发超时处理事件;
如果运行的代码在三分钟内正常运行结束,则运行主线程乃至其中的运行进程+输入接口+输出接口都会被结束并自动销毁,之后超时线程会认定运行主线程已正常结束;
如果运行的代码存在死循环,则超时控制线程会认定运行主线程为超时;
如果运行的代码有输入,此时运行进程会被阻塞等待用户输入,之后如果用户一直没有输入,则超时控制程序也会认定运行主线程为超时;
如果阻塞等待输入后,用户有输入,此时运行进程会继续往下执行直至结束,之后超时控制线程会认定为正常结束。
5.根据权利要求4所述的动态编译运行外部代码的方法,其特征在于:所述运行主线程包括:由Runtime发起的运行进程、输入接口、输出接口三部分组成,其中:Runtime的exec方法调用命令行编译和运行指令,自动生成一个运行进程,执行代码的编译运行;输入接口负责接收主应用上用户的输入信息,发送给运行进程的输入流,由运行进程接收处理;输出接口负责监听运行进程的输出流,当由输出信息产生时,读取信息,发送给主应用进行显示。
6.根据权利要求5所述的动态编译运行外部代码的方法,其特征在于:所述:由Runtime发起的运行进程、输入接口、输出接口三部分都以独立线程的方式存在,互不干扰。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611012065.3A CN106406973A (zh) | 2016-11-17 | 2016-11-17 | 一种动态编译运行外部代码的系统及其方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611012065.3A CN106406973A (zh) | 2016-11-17 | 2016-11-17 | 一种动态编译运行外部代码的系统及其方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN106406973A true CN106406973A (zh) | 2017-02-15 |
Family
ID=58068869
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201611012065.3A Pending CN106406973A (zh) | 2016-11-17 | 2016-11-17 | 一种动态编译运行外部代码的系统及其方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106406973A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111488140A (zh) * | 2019-01-29 | 2020-08-04 | 杭州海康威视数字技术股份有限公司 | 一种支持多编程语言多编程库的方法、装置和计算机设备 |
CN113127001A (zh) * | 2021-04-28 | 2021-07-16 | 上海米哈游璃月科技有限公司 | 一种代码编译过程监控方法、装置、设备和介质 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6446225B1 (en) * | 1998-04-23 | 2002-09-03 | Microsoft Corporation | Server system with scalable session timeout mechanism |
KR20120074939A (ko) * | 2010-12-28 | 2012-07-06 | 전자부품연구원 | 컴포넌트 기반의 멀티미디어 데이터 처리 방법 |
CN103259870A (zh) * | 2013-05-31 | 2013-08-21 | 北京京东尚科信息技术有限公司 | 一种Web应用服务方法和系统 |
CN103473177A (zh) * | 2013-09-25 | 2013-12-25 | 北京大学 | 一种在线调试c/c++程序的方法 |
CN103678135A (zh) * | 2013-12-25 | 2014-03-26 | 普元信息技术股份有限公司 | 大数据环境下实现跨进程与跨线程调试的系统与方法 |
CN104268055A (zh) * | 2014-09-01 | 2015-01-07 | 腾讯科技(深圳)有限公司 | 一种程序异常的监控方法和装置 |
-
2016
- 2016-11-17 CN CN201611012065.3A patent/CN106406973A/zh active Pending
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6446225B1 (en) * | 1998-04-23 | 2002-09-03 | Microsoft Corporation | Server system with scalable session timeout mechanism |
KR20120074939A (ko) * | 2010-12-28 | 2012-07-06 | 전자부품연구원 | 컴포넌트 기반의 멀티미디어 데이터 처리 방법 |
CN103259870A (zh) * | 2013-05-31 | 2013-08-21 | 北京京东尚科信息技术有限公司 | 一种Web应用服务方法和系统 |
CN103473177A (zh) * | 2013-09-25 | 2013-12-25 | 北京大学 | 一种在线调试c/c++程序的方法 |
CN103678135A (zh) * | 2013-12-25 | 2014-03-26 | 普元信息技术股份有限公司 | 大数据环境下实现跨进程与跨线程调试的系统与方法 |
CN104268055A (zh) * | 2014-09-01 | 2015-01-07 | 腾讯科技(深圳)有限公司 | 一种程序异常的监控方法和装置 |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111488140A (zh) * | 2019-01-29 | 2020-08-04 | 杭州海康威视数字技术股份有限公司 | 一种支持多编程语言多编程库的方法、装置和计算机设备 |
CN111488140B (zh) * | 2019-01-29 | 2023-10-27 | 杭州海康威视数字技术股份有限公司 | 一种支持多编程语言多编程库的方法、装置和计算机设备 |
CN113127001A (zh) * | 2021-04-28 | 2021-07-16 | 上海米哈游璃月科技有限公司 | 一种代码编译过程监控方法、装置、设备和介质 |
CN113127001B (zh) * | 2021-04-28 | 2024-03-08 | 上海米哈游璃月科技有限公司 | 一种代码编译过程监控方法、装置、设备和介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11074052B2 (en) | Automatic compiling method for use in graphical programming | |
DE102020110688A1 (de) | Hardware-agnostischer compiler für tiefgehende neuronale netze | |
DE102020115581A1 (de) | Lenkung von planungsabhängigkeiten durch einen compiler für neuronale netze | |
CN104932905A (zh) | 一种aadl到c语言的代码自动生成方法 | |
CN86100690A (zh) | 处理机输入/输出和中断过滤器 | |
CN106406973A (zh) | 一种动态编译运行外部代码的系统及其方法 | |
US10007495B2 (en) | Code generation method for scheduling processors using hook function and exception handling function | |
Yau et al. | On storage optimization of horizontal microprograms | |
CN110865814A (zh) | 一种支持异构计算核架构的编译器实现方法和系统 | |
CN106797470A (zh) | 多操作系统多媒体数据编解码方法、装置、电子设备和计算机程序产品 | |
CN105242909A (zh) | 一种基于多版本代码生成的众核循环分块方法 | |
CN104597832B (zh) | 一种基于amba总线的plc程序调度器ip核 | |
CN106126342A (zh) | 面向智能机器人的多程序运行方法及操作系统 | |
CN106325658A (zh) | 一种基于Android的动态布局方法及系统 | |
CN109840137A (zh) | 一种操作系统移植方法和装置 | |
CN109375991B (zh) | 一种将单进程改造为多进程的方法及系统 | |
CN104598288B (zh) | Java程序执行方法和装置 | |
CN106126311A (zh) | 一种基于代数演算的中间代码优化方法 | |
Hsieh et al. | The case for exploiting underutilized resources in heterogeneous mobile architectures | |
CN105242930B (zh) | 一种自动执行程序流程图的系统及方法 | |
CN106354486A (zh) | nand flash设备管理的方法和系统 | |
Berthold et al. | High-level process control in eden | |
CN105446866A (zh) | 一种跨平台测试装置 | |
CN104615496A (zh) | 基于多层次异构结构的可重构架构的并行扩展方法 | |
CN202041807U (zh) | 一种单片机多路开发器 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20170215 |
|
RJ01 | Rejection of invention patent application after publication |