Electronic Technology & Software Engineering  电子技术与软件工程• 241
Program Design  •
程序设计
【关键词】Java 在线编译 程序设计 在线学
习各种程序设计课程是高校理工科类学生的必修课程。这些课程不仅使学生的逻辑分析能力、程序设计能力得到训练,还为后续的各种与编程有关的专业课程奠定了学习基础。目前学习程序设计最常用的方式是通过集成开发环境IDE 。无论用户使用何种操作系统,都有支持该平台的集成开发环境平台可供使用。诸如Windows 平台下有微软公司开发的Visual Studio ,MacOS 平台下有苹果公司开发的Xcode ,另外还有一些跨平台开发环境如Eclipse 、Apache NetBeans 和IntelliJ IDEA 等等。这些IDE 集成了编辑、编译和调试等实用且强大的功能,适用于各种桌面环境,但是通常配置也比较复杂,而且往往还有版权方面的限制,使用成本较高。而另一方面,随着移动通信网络的迅猛发展,各种移动通信设备大量普及,无线网络全面覆盖,使得几乎人人都可以通过无线宽带网络随时联网,始终在线。如果把这个途径用于程序设计的实践学习,使学生能够通过智能手机、平板电脑等各种联网设备访问在线编译器平台,就能突破时间、空间的限制,以及软件、硬件方面的约束,充分利用“碎片”时间,通过浏览器访问在线编译器,完成程序的编辑、编译等任务。
在线编译器通常使用浏览器/服务器的工作模式,将程序编译和运行的主要功能放在服务器端,客户端无需安装任何开发环境和编译器软件,直接通过浏览器打开Web 页面与服
Java 语言在线编译器的设计与实现
文/谢伟增  金振乾
务器进行交互,实现程序编写、编译及执行的
全部过程。这样不仅避免了在客户端设备上安装和配置传统编译环境的麻烦,也摆脱了对客户端设备
在线代码运行器
类型和性能的限制。基于这些优点,在线编译器的开发和应用得到不断地扩展。目前已有的在线编译器有多种不同的实现类型,各种类型也都存在一些不足,主要表现在:界面不简洁,支持编程语言种类少;传统的物理服务器在部署、资源分配、可靠性等的不足与限制;编写时无感应显示框,不能高亮显示代码等方面。
因此,我们设计了一个基于Browser/Server 模式的在线编译器,在前端页面实现了设备适配,允许用户通过各种网络终端设备访
问,在服务器端实现了源程序文档管理、后台编译和前后台信息交互的功能,提供稳定的多用户在线编译服务。
1 开发和运行环境
1.1 开发环境
开发过程中所选择的集成开发环境为JetBrains 公司的产品IntelliJ IDEA 。作为目前最主流的Java 集成开发环境之一,IntelliJ IDEA 具备强大的静态代码分析和人机工程学设计,能够显著提高开发人员的生产力,而且还有基于Apache 2.0开放式授权的社区版本可供使用。IntelliJ IDEA 原生支持maven ,可进行高级项目管理,实现快速开发。在开发环境中完成项目设计和调试以后,将其部署到服务器上就可以正常访问了。
1.2 服务器运行环境
编译服务器是确保在线编译功能得以实现的核心环节,既要具备高度的稳定性和快速的反应能力,又要能够支持大量的并发连接,因此选择以高性能、高稳定性著称的Linux 系统,各个主流发行版均可正常运行,如Debian ,Ubuntu 和CentOS 等。应用软件方面,采用成熟的OpenJDK 8,Apache Tomcat 8.5,并使用Maria DB 10作为后台数据库,为提高并发能力,还提高了数据库连接池技术。该配置稳定可靠,成本低廉,性能较好。得益于这些软件的跨平台能力,同样的系统也可以运行在Windows 平台上,提高了部署的便捷性。
2 关键技术
在线编译器的应用把编译和运行放到服务器上进行,消除了在客户端设备上安装编译环境的需求。但是要实现在线编译,有两个核心问题必须要解决:一是如何把用户在网页上输入的源程序代码交给服务器进行编译执行;二是如何将程序的运行结果或编译错误信息在网页上输出。针对这些关键问题,我们采用了以下方式来解决。2.1 动态编译的实现方式
目前常用的Java 语言动态编译的实现方案主要有:
(1)使用JavaCompiler 接口来实现Java 源程序的动态编译。
(2)通过StandardJavaFileManager 类实现Java 源程序动态编译。
(3)从内存中动态编译Java 程序。这些方式或者缺乏灵活性并效率较低,
或者不符合系统需求,或者依赖于某个具体的Java 类的版本和方法。因此我们采用了直接生成Runtime 对象,并通过Runtime 对象生成调用complie 命令或run 命令的相关进程,实现在服务器端编译和运行Java 程序的核心功能。
在调用complie 命令或run 命令时,先判断服务器端操作系统的类型,然后根据类型构建相应的编译命令行和运行命令行(命令行中还需包含需要执行的Java 程序的代码路径及主类名称)。首先通过调用相关方法进行编译操作,编译过程如果发现错误则返回错误信息,如果编译成功则继续调用相关方法进行运行操作,并返回运行结果。核心代码如下所示:
public String runCode() {
S t r i n g  o s Ty p e  = S y s t Property("os.name");
String result = ERROR;
i f  (o s T y p e .t o L o w e r C a s e ().endsWith("linux")) {
String complie = "javac " + codesPath+ "/" + className + ".java";
String run = "java -classpath " + codesPath + " " + className;
result = runCodeWithLinux(complie);if (result.length() == 0) {returnrunCodeWithLinux(run);
●基金项目:河南司法警官职业学院院级课题(2018-YB-06)。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。