如何制做在线编译代码的网站?
就如同一些代码比赛网站一样,直接上传代码就可以在网页上看到运行结果,go语言官方网站也有着类似功能。如何实现?有没有现成的解决方案?
回复内容:
如果需要的是现成的解决方案,这个就不错:
https://github.com/mattgodbolt/gcc-explorer
效果预览:
Compiler Explorer
如果是针对传统使用方法的编程语言实现一个的话涉及的内容很杂,包括:
- Web服务器+Web服务器与后端程序交互的组件(这个可以用现成的,我用的是nginx+FCGI)
- 后端程序
后端核心就是一个类似调用系统给的类似execl的API执行一下对应编译工具,用这个API时还得精心处理一下管道,把输出内容导出来显示回网页。
但是因为这类程序和OJ一样,是网络上的公共服务而且居然还允许用户上传代码编译执行,所以问题主要集中在安全处理上,而且安全问题的处理高度依赖操作系统。
以Linux为例,安全方面包括但不仅包括以下内容:
- 依赖环境构建、沙盒
- 运行身份,包括GID、UID
- 资源限制,包括socket、文件操作、核心转储大小、文件数、子进程数等等
- syscall限制
- 执行时间限制,包括运行时间和CPU时间
- 文件系统压力
Windows下是另一堆问题要解决,比Linux复杂得多(也许是我不太会用Windows)。
我认识一人,自己实现了一个类似Haskell的东西,有和Go Playground差不多的在线运行网页,我问他怎么那么快把那么多东西都搞完了,他说,“整个语言就是用JS实现的,所以有浏览器就能运行,不需要后端”,这也是一种思路。
前两天的课程设计上正好根同学一块儿设计了一个简单的在线比赛平台,而且平时也经常到网站上做比赛,就简单说下它的实现吧。把代码提交到网站之后,将其保存成代码,在PHP或JSP中有调用系统命令的东西,如PHP中的exec函数。此时你需要一个判题的脚本,对得到的代码进行编译,运行,得到运行信息之后保存到数据库中,如在php中就可以写一个实现的语句:
exec("./onj $destFile $file", $output, $verdict);这就是调用判题功能,原则上可以用任何语言写。onj就是用python写的,对代码进行编译,运行和判断。它需要得到一个比赛题目的标准输入,将标准输出重定向到一个文件中,然后对标准答案进行对比,可以得出用户提交的代码是否能得出正确的结果。
//from onj project - Processfile.php - line 105
这样的系统在网上好多了,推荐几个:
1. ONJ http://sourceforge.net/projects/onj/ php,代码十分工整,我很喜欢,中文支持不完善。
2.NEUOJ https://github.com/yangzhe1991/neuoj判题是用python写的。
3.HUSTOJ http://code.google.com/p/hustoj/国内好像用的比较多的,我没用过。
//自己写的太丑了,就不帖出来了。
这种比赛的网站搞ACM的人相对熟悉,如果有认识的人可以问问。 直接以web进程fork的问题是web是轻量级的,并发数大一些很正常。
而编译和运行则比较重量级,不能并发太多,必须控制。
所以应该有个任务队列的机制,先后有序的进行。
至于安全,可以另外开一个话题了。 应该是直接调用编译命令,检查输出结果吧。
至于安全问题,应该可以用一个权限级别很低的用户来做这个事。

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Laravel memudahkan mengendalikan data sesi sementara menggunakan kaedah flash intuitifnya. Ini sesuai untuk memaparkan mesej ringkas, makluman, atau pemberitahuan dalam permohonan anda. Data hanya berterusan untuk permintaan seterusnya secara lalai: $ permintaan-

Pelanjutan URL Pelanggan PHP (CURL) adalah alat yang berkuasa untuk pemaju, membolehkan interaksi lancar dengan pelayan jauh dan API rehat. Dengan memanfaatkan libcurl, perpustakaan pemindahan fail multi-protokol yang dihormati, php curl memudahkan execu yang cekap

Laravel menyediakan sintaks simulasi respons HTTP ringkas, memudahkan ujian interaksi HTTP. Pendekatan ini dengan ketara mengurangkan redundansi kod semasa membuat simulasi ujian anda lebih intuitif. Pelaksanaan asas menyediakan pelbagai jenis pintasan jenis tindak balas: Gunakan Illuminate \ Support \ Facades \ http; Http :: palsu ([ 'Google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

Penyimpanan :: Kaedah Muat turun Rangka Kerja Laravel menyediakan API ringkas untuk mengendalikan muat turun fail dengan selamat sambil menguruskan abstraksi penyimpanan fail. Berikut adalah contoh menggunakan penyimpanan :: muat turun () dalam pengawal contoh:

Adakah anda ingin memberikan penyelesaian segera, segera kepada masalah yang paling mendesak pelanggan anda? Sembang langsung membolehkan anda mempunyai perbualan masa nyata dengan pelanggan dan menyelesaikan masalah mereka dengan serta-merta. Ia membolehkan anda memberikan perkhidmatan yang lebih pantas kepada adat anda

Artikel membincangkan pengikatan statik lewat (LSB) dalam PHP, yang diperkenalkan dalam Php 5.3, yang membolehkan resolusi runtime kaedah statik memerlukan lebih banyak warisan yang fleksibel. Isu: LSB vs polimorfisme tradisional; Aplikasi Praktikal LSB dan Potensi Perfo

Pembalakan PHP adalah penting untuk memantau dan menyahpepijat aplikasi web, serta menangkap peristiwa kritikal, kesilapan, dan tingkah laku runtime. Ia memberikan pandangan yang berharga dalam prestasi sistem, membantu mengenal pasti isu -isu, dan menyokong penyelesaian masalah yang lebih cepat

Bekas perkhidmatan dan penyedia perkhidmatan Laravel adalah asas kepada seni bina. Artikel ini meneroka bekas perkhidmatan, butiran pembekal perkhidmatan, pendaftaran, dan menunjukkan penggunaan praktikal dengan contoh. Kita akan mulakan dengan ove
