在线IDE的原理及设计思路-以Java为例
在线IDE的原理及设计思路 以Java为例
原理分析
在线IDE是一种在线编译环境,它和传统编译环境最大的区别在于前者不需要复杂的客户端及复杂的库。在我们所学习的编程语言中比如Java、python等语言在本地编译是需要安装jdk的。在线编译器完全摆脱了传统的束缚,将所有的库和应用集成到云端的Web Server上面,实现了云计算。而在线IDE实现原理基本和本地开发的原理差不多,只是将所需要的环境集成到了服务器端,用户可以远程使用开发环境进行在线编译。但是在线编译由于开发环境集成到了服务器,像文件操作等一些操作就无法完美实现,这也是一个弊端,但是对于初学者来讲,使用在线编译远比去配置那些复杂的开发环境要方便许多。在线IDE的工作流程大致可以分为这几步,接收代码,编译代码,运行程序,返回结果。
接收代码
接收代码就主要是前端的任务,通过造作DOM元素,将代码整理好之后,将代码通过请求的方式提交给后台。
编译代码
后台接收代码之后,就是将代码转化为可执行的代码文件,不同的语言需要不同的做法,拿java举例,java在运行过程中,需要先将java源文件编译为class文件之后才能成功运行。因此就可以先将前端传来的代码数据保存为一个java文件,再编译成class文件。
// 编译为class文件
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager manager = compiler.getStandardFileManager(null,null,null);
List<File> files = new ArrayList<>();
files.add(new File(targetJavaOutputPath));
Iterable compilationUnits = manager.getJavaFileObjectsFromFiles(files);
// 编译
// 设置编译选项,配置 class 文件输出路径
Iterable<String> options = Arrays.asList("-d",baseOutputDir);
JavaCompiler.CompilationTask task = compiler.getTask(null, manager, null, options, null, compilationUnits);
// 执行编译任务
task.call();
运行程序
当我们将代码编译好之后,就可以用脚本、docker 等很多方式去运行代码文件,这里还是以 java 为例。
// 通过反射得到对象
// Class clazz = Class.forName("com.tommy.core.test.reflect.Test");
// 使用自定义的类加载器加载 class
Class clazz = new MyClassLoader(baseOutputDir).loadClass("com.tommy.core.test.reflect.Test");
// 得到构造器
Constructor constructor = clazz.getConstructor(String.class);
// 通过构造器 new 一个对象
Object test = constructor.newInstance("jack.tsing");
// 得到 sayHello 方法
Method method = clazz.getMethod("sayHello", String.class);
// 调用 sayHello 方法
String result = (String) method.invoke(test, "jack.ma");
System.out.println(result);
这是使用代码去执行 class 文件,并返回结果,这个步骤最重要的就是保留输出结果。这是利用代码来完成,当然也可以使用 docker 技术去实现这一功能,docker 需要的技术就很多了,这里就不做详细的介绍。
返回结果
返回结果还是就是将我们运行代码之后将控制台输出的结果返回给用户,不管是正确运行结果还是报错信息,我们都要一并返回给用户。后台将结果返回给前端,前端通过 DOM 操作为用户呈现输出结果。
设计思路
图一
关于在线 IDE 的设计思路如图一所示,总体而言可以分为三层,以下是对各部分进行详细介绍:
(1)、表面层:表面层是提供用户交互,接收用户提交信息以及呈现数据。
(2)、业务逻辑层:业务逻辑层根据语种不同分为不同的子流程,表面层会先判断用户选择的语种,再决定使用哪一个语言处理机。处理机会对表面层提供的代码进行编译运行,并且会返回运行结果传给数据连接层。
(3)、数据连接层:数据连接层接收业务逻辑层运行的结果,并将运行结果做一定的处理,数据库做好记录,并将处理好的数据返回给表面层呈现给用户。
在线 IDE 涉及到的技术很多,其中最为重要的还是各种语言的基础知识,因为在程序中我们要非常清楚代码运行的每一个步骤,才能通过编程的方式来实现程序文件的运行。