2

親愛的, 我在Java中是新的,在此,我想開發Java下的應用程序做這樣這些事情: 假設: 有一個文件包含Java中的源代碼。 我們假設文件包含一個主類(以及其它幾個方法的主要方法)以及一些將在主類運行時使用的內部類。自動編譯,自動運行,自動比較造成的Java

過程:

  1. 我想開發(稱其爲ASIN),將嘗試編譯我們上面假設的源代碼的應用程序。
  2. 編譯階段結束後。我希望ASIN將分配一些32 MB的內存空間(例如),並給出最大運行時間2秒(例如)。
  3. 在分配內存和運行的最大時間限制之後,ASIN將嘗試通過使用分配的資源(內存32 Mb)以給定的最大時間運行java字節碼。然後ASIN將記錄/捕獲結果。如果正在運行的字節代碼使用多於分配的內存,或超過給定的時間限制,ASIN將強制停止執行。所以,正常情況下,執行時間在最大時間限制之前完成,並使用少於分配的內存。

可以用java做上面的事情嗎? 任何建議我該怎麼辦?

問候,

+1

哇!這是什麼ASIN?看起來你準備自己寫一個JVM。 – adarshr 2011-03-14 16:53:48

+1

@adarshr:我敢打賭,這是一個更謙虛:編程比賽或大學課程的分級系統:-) – 2011-03-14 17:02:04

+0

@Aasmund Eldhuset - 非常可能:) – adarshr 2011-03-14 17:15:25

回答

1

難道這是一個程序設計競賽或爲大學課程演習分級制度?有可能存在開源系統,所以如果你還沒有,那就先google吧。如果你必須/想要自己創建一個,我不確定Java是否允許您限制程序花費的時間(但當然,您可以在等待一段時間後簡單地終止程序),但是Java程序的內存限制可以用例如-Xmx32m使用java命令啓動程序時。如果這是在unix系統上,最簡單的解決方案可能是使用ulimit來限制內存使用和運行時間。

在這兩種情況下,我認爲你必須使用Runtime.exec()來啓動編譯器和程序。這也將讓你喂投入的過程和讀取過程中的輸出(雖然I/O重定向也可以從文件中,如果你用如

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

至於比較啓動程序執行/:除非需要完全匹配(即使是空格),最簡單的解決方案可能是將輸出重定向到一個文件並使用-b-w以及可能的--ignore-blank-lines調用diff;如果返回碼爲0,則輸出等於解決方案(除了空白區別)另一方面,如果您需要交互式評分(程序應該與評分者「交談」),或者輸出可能以不同的方式形成,以至於沒有唯一的正確答案,你不能使用diff;分級員必須改爲讀取流程的輸出流。

0

我會在shell腳本而不是java中執行此操作。這是一個選擇嗎?

您可以使用ulimit進行內存和時間限制。如果你寫一個小的shell腳本,這是否:

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 

然後,當你運行它,它會給自己的內存和時間的限制,作爲一個子進程啓動Java。如果程序及時完成(注意限制是CPU時間,而不是實時),它將以退出狀態0結束;否則,它將有一些非零退出狀態。

如果你想記錄多少實際的時間限制內使用,time下運行java:

time java ProgramUnderTest >output 

,將打印的時間輸出後使用的總量。

從腳本編譯代碼也很容易 - 只需運行javac。請記住檢查退出狀態以查看代碼是否正確編譯。