Quiero crear un sitio web en línea que pueda compilar y ejecutar el código fuente enviado, ¿cómo se puede lograr esto? ¿Debo crear una máquina virtual en mi servidor? Y si debo, ¿qué tipo de máquina virtual?

“¿Cómo puedo construir un sitio web para compilar código?” Es un objetivo demasiado ambiguo para considerar siquiera proporcionar una respuesta razonable que lo guíe en la dirección correcta. ¿Cuál es el problema que estás tratando de resolver aquí? ¿Cuáles son las restricciones? La pregunta, como se indicó, es demasiado abierta, y podría hablar durante horas sobre varias técnicas, cada una con sus propios pros y contras para lograr esto. Debido a la forma en que se formula la pregunta (al menos originalmente), considero que esto es un esfuerzo muy arriesgado y me siento incómodo sin intentar explicar brevemente por qué es una mala idea dar una respuesta sobre una posible forma de construir tal un sitio.

Qué idioma estás usando? Digamos, en aras de la discusión, que desea utilizar JavaScript. Bueno, en ese caso, la mejor manera de hacerlo es no hacer absolutamente nada (¡hurra, hemos escrito todo para hacer esto!) El navegador ya puede ejecutar JavaScript localmente.

Para un argumento alternativo, supongamos que desea ejecutar directamente en el hardware. Vayamos con el ensamblaje esta vez (sí, técnicamente, este lenguaje está ensamblado en lugar de compilado, pero agitemos nuestra varita de nomenclatura sobre la pedantería). Bueno, obviamente, cualquier máquina que seleccione es la incorrecta, obviamente, la entrada que le estoy dando está destinada a una máquina diferente (o incluso mejor, ¡a una máquina hipotética!).

Poniéndonos un poco más serios, digamos que te referías a uno de los lenguajes más “portátiles” como C. Bueno, ahora quiero usar la funcionalidad de una biblioteca aleatoria. Afortunadamente, hay muchas bibliotecas, por lo que solo necesita instalar cada pieza de software que se haya escrito (obviamente, esto no es realmente razonable ni serio).

En aras de la discusión, supongamos que tiene una máquina mágica que le ha permitido ejecutar un código arbitrario (arquitectura correcta, sistema operativo, conjunto de bibliotecas, variables de entorno, …). ¿Cuál es este código que estás aceptando? ¿Sabes lo que hace? Probemos este fragmento de código C:

int main () {
sistema de retorno (“sudo ‘rm -rf /'”);
}

Este es obviamente un código malicioso que causa la pérdida de datos (obviamente, no es muy efectivo si sus permisos están configurados correctamente, pero supongamos que hay alguna vulnerabilidad que puedo aprovechar), por lo tanto, permitir la ejecución de entradas arbitrarias quizás no sea una buena idea . Ahora, déjame darte otro fragmento:

int main (int argc, char ** argv) {
sistema (argv [0]);
sistema (argv [0]);
devuelve 0;
}

De nuevo, un código malicioso, esta vez causando un ataque DoS.

No sabe si la ejecución del código se completará o no (si lo hizo, ¡simplemente resolvió el problema de detención!). No sabes si el código es malicioso o no. Hay muchas razones por las cuales permitir la ejecución arbitraria de código es una idea muy peligrosa.

Si todavía está leyendo hasta aquí, permítame al menos intentar explicar a un alto nivel cuál es una forma posible de lograr este objetivo potencialmente peligroso.

En general, puede tomar como entrada el código fuente para compilar y un comando de compilación para invocar. Puede lograr esto fácilmente como una solicitud POST. En el lado del servidor, puede crear un archivo temporal con el contenido (código fuente) que recibió. También tiene el comando para ejecutar para compilar este código que debería darle un binario que puede ejecutar. Ejecuta este comando con el contenido del código que acaba de escribir en el archivo temporal. Luego, tiene un archivo binario que puede ejecutar.

Supongo que hay muchas personas con una forma de hacer esto, como el compilador visual c ++ en línea, pero desafortunadamente sé muy poco sobre el código, soy un tipo más de caja negra.
Supongo que cualquier servidor web en el que ejecute esto ya sea una VM Linux, no ejecutará una VM dentro de esta VM.
Puede considerar los archivos Docker que activan instancias de (tal vez Ubuntu) dockerfiles para compilar el código fuente (c ++, python, java, no hay problema). Simplemente podría ejecutar un servicio web proxy en el Servidor, y sería una conexión proxy a cualquier aplicación web que se estuviera ejecutando después del código fuente compilado en la VM local (si se desearan los resultados de la compilación posterior del código en ejecución. La parte difícil es una aplicación de controlador seguro que podría monitorear el desove de dockerfile, a través de grupos distributivos de vms que ejecutan dockerfiles.

En primer lugar, debe tener entornos para poder ejecutar el código fuente en el servidor. Digamos que desea que Java se ejecute y devuelva la salida al sitio web. Luego debe instalar JDK para hacer la compilación y ejecución. Podría haber varias formas de hacerlo, como la ejecución simple o la ejecución basada en Maven.

Espero eso ayude.

Hice un proyecto para mi universidad donde utilicé hackerrank api y as editor para hacer el compilador

La forma más fácil de crear su propio compilador utilizando la API de hackerrank y el editor ACE. ver su

demo: Editor de preguntas

Esto parece muy peligroso. ¿Qué es para evitar que el código sea malicioso?

En cualquier caso, ejecutar una VM parece tener sentido. Si algo sale mal, puede volver a un estado limpio y comenzar de nuevo, más triste pero más sabio. kVM parecería ser una buena opción; Es gratis y se puede automatizar fácilmente.