Compilador on-line

elkaoD

Hola amigos de ForoDEV.
Estoy trabajando en un compilador on-line, para esas veces que queremos compilar algo y no tenemos a mano GCC (Aunque la verdad, es porque simplemente quería aprender xD) Usa GCC (De momento sólo GCC, ya incorporaré más compiladores) sobre mi máquina Linux y te descargue automáticamente el binario. Ya llevo bastante hecho, y estoy bastante orgulloso porque es uno de los pocos proyectos que no dejo a medias xD

El compilador lo tenéis funcionando en:
http://kaod.no-ip.org/compiler/ (http://80.36.134.184/compiler/)
Estoy desarrollando de continuo así que puede petar a veces.

Y tenéis el código fuente actualizado al segundo (Es un enlace blando al .php), con licencia GPL en:
http://kaod.no-ip.org/compiler/src/ (http://80.36.134.184/compiler/src/)
Como véis debajo del disclaimer de la licencia está la lista de cosas por hacer, aunque lo transcribo aquí:

[TO DO]
Alta prioridad:

  • Poner nice al GCC.
  • Limitar tiempo de ejecución del archivo (Acorde con lo que le quede al usuario.)
  • Si hay Warnings, hacer que el archivo se baje igualmente. (¿Comprobar con el valor de retorno? ¿Usar _blank?)

Baja prioridad:

  • Hacer bonito el interfaz. Mejorar el HTML.
  • Comprobación de errores en PHP.

Comprobar:

  • Limitador de tiempo de ejecución.

Configuración:

  • ¿Cuál sería un valor decente para el nice del GCC?

Podéis ayudar de diversas formas. Intentad buscar bugs o exploitarme (Sin joderme el PC, claro. Si vais a hacer algo que tenga probabilidades altas de provocar explosiones o algún otro desperfecto, avisad.) Tenéis hasta el código fuente, así que si sabéis PHP, sabéis como ayudar :)

r2d2rigo

Tu posteando por aqui perrah... :P

Pues la unica idea que se me ocurre es esa, ficheros temporales. Es mas, no creo que se pueda otra cosa no? A no ser que te hagas un CGI o algo parecido y le pipees stderr y stdout, mostrandote cada uno en un popup distinto... pero vamos, con lo comodos que son los archivos temporales, y asi te los puedes bajar tu y tenerlos :P

elkaoD

Lurkeo pero posteo poco :) Estoy entre las sombras.

EDIT: Milestone pasada

A

La idea me parece genial.
De hecho, siempre quise hacer un multicompilador online, como proyecto de prueba personal. (Gcc, Ocaml, Lisp...)

Mucha suerte. Si el proyecto avanza no olvides decir la página. : -)

elkaoD

EDIT: Incorporado al post principal.

LOc0

Nas. Me devuelve lo siguiente cada vez que le mando compilar:
http://pastebin.es/1647

¿Y si pruebas a mandar el binario al usuario así?

header("Content-type: application/octet-stream");
header("Content-Length: " . filesize($ruta_fichero));
header("Content-Disposition: attachment; filename=\"".basename($nombre_fichero)."\"\n");
@readfile($ruta_fichero);

¡Suerte, la idea mola!

Salu2 ;)

elkaoD

Joder, arreglé ese bug pero antes de irme debí volverlo a poner, me pongo a ello :)

Lo de no devolverlo con readfile era por probar como pasar de stdout directamente a PHP (Para hacerlo sin archivos de por medio) pero gracias, si no lo logro hacer como quiero lo haré así.

EDIT: Arreglado y ya funciona como yo quiero. Esto va viento en popa.

shortyStyle

Es una muy buena idea! Me gusta :D

elkaoD

#8 gracias :)

Si queréis ayudar ya sabéis, sólo tenéis que buscar bugs, y si os apetece, como tenéis el código disponible, podéis hasta arreglar los bugs o implementar nuevas features :)

javithelong

No he mirado el código ni creo que tenga tiempo para ello, pero la idea me parece bastante buena.

Si pones código interpretado (véase lisp o similar) y como veo que está en tu pc... ten mucho ojito con el tema de permisos y tal, no venga algún listo y te vaya a hacer un descalabro.

Na más, el tema de hacerlo con bash es buena idea, será algo más lento, pero sencillo de implementar.

Si puedo aportar algo, lo intentaré.

Edit: ReEdit: Gilipollez ;)

elkaoD

#10 al final no he necesitado bash para nada, mira en #1 el código fuente si quieres, lo tengo todo hecho con PHP y va de sobra. De hecho me parece más elegante porque no ando con archivos temporales (Excepto si quieres guardar los sources y los binarios.)

No voy a poner nada de código interpretado precisamente para evitarme listillos, sólo compilar y bajar el binario :)

El tema de limitar el tiempo de ejecución sería para PHP. Sé que se puede limitar en el php.ini para TODOS, pero quiero limitarlo individualmente a este, y concretamente límite por IP.

javithelong

Al final me acabo liando... pssss

No controlo mucho de php, pero para lo del timeout he encontrado esto http://uk2.php.net/function.set-time-limit , parece que si pones el exec en script de php diferente, puedes hacer algo parecido...

Bueno, que me voy a dormir, que mañana curro, suerte con esto, mañana entro a ver cómo va.

javithelong

Creo que lo que he contestado no te vale para eso (no pensé que era para eso ^^)

Cuenta el tiempo que va ejecutando cada ip al día, y con sql una miniBd vas guardando ip - tiempo_usado, y cada día nuevo la borras (o no, eso es cosa tuya :P)

Puto kaod, que haces, F5 cada 10 segundos? XDDD

ME VOY A DORMIRRR

elkaoD

Muchas gracias, es justo lo que necesitaba :) ¿Cuál sería un valor razonable de uso por IP al día? ¿10 minutos?

Si #13, eso es lo que voy a hacer, pero necesito que si alguien poner su primer archivo a compilar que tarde 50 minutos no se tire los 50 ahí dale que te pego, sino que le corte a los 10 o lo que sea.

Y sí, F5, estoy malo y tengo que estudiar, por lo que mi cuerpo necesita entretenimiento para no hacerlo xD

r2d2rigo

Siempre puedes obtener la PID del proceso compilador y programar un KILL en 10 minutos... :P

elhamo

kill 'em all -9!

LOc0

Juer, pues a mi me sigue mandando lo mismo que antes cuando le doy a compilar :(... ¿Qué hago mal?

Salu2 ;)

elkaoD

Es porque no te compila, "1193727579-helloworld.c:(.text+0x1e): undefined reference to `getch'"

Creo que getch() no es ansic, y es exclusivo de Windows. Prueba con getchar.

shortyStyle

He compilado un helloworld y sin problemas, pero ahora bien tengo por aquí un programita de un pequeño tres en raya y al compilarlo me crea un ejecutable vacio, un archivo que no tiene nada :S

Aquí os dejo el código del tres en raya por si tiene algo irregular por lo que no compila, pero a mi desde consola de linux me compila con gcc perfectamente :\

http://pastebin.es/1649

elkaoD

En el log de apache tengo esto:
source/1193730566-tresenraya_entero.c:241: error: nested redefinition of 'enum e_jugador'
source/1193730566-tresenraya_entero.c:241: error: redeclaration of 'enum e_jugador'
source/1193730566-tresenraya_entero.c:241: error: redeclaration of enumerator 'jugador1'
source/1193730566-tresenraya_entero.c:10: error: previous definition of 'jugador1' was here
source/1193730566-tresenraya_entero.c:241: error: redeclaration of enumerator 'jugador2'
etc. etc. etc.

A ver si hago ya que muestre errores por pantalla que es algo crucial xD

EDIT: Ya muestra los errores :)

Usuarios habituales

  • elkaoD
  • shortyStyle
  • LOc0
  • elhamo
  • r2d2rigo
  • javithelong
  • Archville