2

chers tous, je suis nouveau en Java et à présent, je suis en train de développer une application en Java pour faire de telles ces choses: hypothèse: il y a un fichier contient le code source en Java. Supposons que le fichier contienne une classe principale (et sa méthode principale avec plusieurs méthodes supplémentaires) et quelques classes internes qui seront utilisées pendant l'exécution de la classe principale.auto-compilation, l'exécution automatique, automatique comparer les résultats à Java

processus:

  1. l'application que je veux développer (appeler comme ASIN), va essayer de compiler le code source, nous avons supposé ci-dessus.
  2. après la fin de la phase de compilation. Je veux que l'ASIN alloue un espace mémoire de 32 Mo (par exemple), et donne un temps de fonctionnement maximum de 2 secondes (par exemple).
  3. Après avoir alloué la mémoire et la limite de temps maximale pour l'exécution, ASIN essaiera d'exécuter le code java en utilisant la ressource allouée (mémoire 32 Mo) avec un temps maximum donné. Ensuite, ASIN enregistrera/capturera le résultat. Si le code d'octet en cours d'exécution utilise plus de mémoire allouée, ou dépasse la limite de temps donnée, ASIN forcera à arrêter l'exécution. Ainsi, le cas normal est lorsque l'exécution est terminée avant la limite de temps maximale et utilise moins de mémoire allouée.

peut java faire chose ci-dessus? une suggestion que devrais-je faire?

salutations,

+1

Whoa! Qu'est-ce que c'est ASIN? On dirait que vous êtes prêt à écrire une JVM vous-même. – adarshr

+1

@adarshr: Je parie que c'est plus modeste: un système de notation pour un concours de programmation ou un cours universitaire :-) –

+0

@Aasmund Eldhuset - Très possible :) – adarshr

Répondre

1

Est-ce censé être un système de classement pour un concours de programmation ou pour les exercices dans un cours universitaire? Il existe peut-être des systèmes open source pour cela, donc google le premier si vous ne l'avez pas déjà fait. Si vous devez en faire un vous-même, je ne suis pas sûr que Java vous permette de limiter le temps passé par un programme (mais vous pourriez, bien sûr, simplement tuer le programme après avoir attendu un certain temps), mais limite de mémoire d'un programme Java peut être spécifié avec par exemple -Xmx32m lors du démarrage du programme avec la commande java. Si c'est sur un système Unix, la solution la plus simple sera probablement d'utiliser ulimit pour limiter à la fois l'utilisation de la mémoire et le temps d'exécution.

Dans les deux cas, je pense que vous devrez utiliser Runtime.exec() pour lancer le compilateur et le programme. Cela vous permettra également de nourrir l'entrée dans le processus et lire la sortie du processus (bien que la redirection d'E/S peut également être effectué à/à partir de fichiers si vous lancez le programme avec par exemple

Runtime.getRuntime().exec("java -Xmx32m Program.class <input.txt> output.txt"); 

En ce qui concerne la comparaison: sauf si vous avez besoin d'une correspondance exacte (même en blanc), la solution la plus simple est probablement de rediriger la sortie vers un fichier et d'appeler ou -w, et --ignore-blank-lines si le code retour est 0, la sortie est égale à d'autre part, si vous avez besoin d'un classement interactif (le programme est supposé "converser" avec le niveleur) ou si la sortie peut être formée de différentes manières de sorte qu'il n'y ait pas de réponse correcte unique, vous ne pouvez pas utiliser diff; le classeur doit lire le flux de sortie du processus à la place.

0

Je le ferais en script shell plutôt qu'en Java. Serait-ce une option?

Vous pouvez effectuer la limitation de la mémoire et du temps en utilisant ulimit.Si vous écrivez un petit script shell qui fait cela:

set -e 
ulimit -v 32768 # ulimit -v works in 1 kB blocks, so this is 32 MB 
ulimit -t 2 # ulimit -t works in seconds 
java ProgramUnderTest >output 

Ensuite, lorsque vous exécutez, il va se donner la mémoire et les limites de temps et java de lancement en tant que sous-processus. Si le programme se termine à temps (notez que la limite est sur l'heure du processeur, pas en temps réel), il se terminera avec le statut de sortie 0; sinon, il aura un statut de sortie différent de zéro.

Si vous voulez enregistrer combien de temps réel a été utilisé dans la limite, exécutez java sous time:

time java ProgramUnderTest >output 

qui imprimera le montant total du temps utilisé après la sortie.

Compiler le code à partir d'un script est également simple, bien sûr - il suffit de lancer javac. N'oubliez pas de vérifier le statut de sortie pour voir si le code a été compilé correctement.

Questions connexes