2012-01-23 53 views
1

我有一個程序,執行一項有用的任務。現在我想在編譯的可執行文件運行時生成純文本源代碼,除了執行原始任務。這不是一個奎因,但可能是相關的。程序重現自己,並有用 - 不是一個奎因

該功能在一般情況下會很有用,但我的特定程序是用Fortran 90編寫的,並使用Mako模板。編譯時,它可以訪問原始源代碼文件,但我希望能夠確保在用戶運行可執行文件時存在源代碼。

這可能實現嗎?

下面是一個簡單的Fortran 90的例子,它執行簡單的任務。

program exampl 
    implicit none 
    write(*,*) 'this is my useful output' 
end program exampl 

這一程序被修改,使得它執行相同的任務(輸出一個字符串時編譯),並輸出包含該源的Fortran 90的文本文件?

在此先感謝

+0

這不是一個奎因的原因是因爲「奎因是一個計算機程序,它不接受任何輸入並生成它自己的源代碼的副本作爲其唯一的輸出。」 [引文](http://en.wikipedia.org/wiki/Quine_(computing)) – Ben

回答

0

這是這麼長時間,因爲我有所觸動的Fortran(我從來沒有處理Fortran 90的),我不能肯定,但我看到這麼久,應該工作的基本方法語言支持代碼中的字符串文字。

將您的整個程序包含在文字塊中。顯然你不能在這個文字中包含文字,相反你需要某種標記來告訴你的程序包含文字塊。

顯然這意味着你有兩個源的副本,一個在另一個裏面。因爲這很醜陋,我不會這樣做,而是將include_me標記存放在源代碼中,並在編譯之前通過構建嵌套文件的程序來運行它。請注意,該程序將與程序共享相當數量的代碼,從文字塊中重新創建代碼。如果你要走這條路線,我也會讓程序吐出這個程序的源代碼,所以無論誰試圖修改這些文件都不需要處理這兩個副本。

+0

如果我理解正確,我應該寫一個單獨的程序(稱爲X),它作用於普通的F90源代碼(Y)在'write(*,*)「代碼Y'here'內寫入另一個包含普通F90(Y)的F90源(Z)。如果這是正確的,那麼生成F90源代碼Y的編譯版本將不會有X. – Ben

+0

@ user1164295:您當然可以使它也生成X的源代碼。 –

+0

我認爲我公佈的答案實現了您的建議(使用Python腳本和F90中的include語句。感謝您的指導。 – Ben

0

我原來的程序(見問題)編輯:添加一個包含語句

調用這個文件「exampl.f90」

program exampl 
    implicit none 
    write(*,*) "this is my useful output" 
    open(unit=2,file="exampl_out.f90") 
    include "exampl_source.f90" 
    close(2) 
end program exampl 

然後另一個程序(在這種情況下,用Python寫的)讀取來源

import os 
f=open('exampl.f90') # read in exampl.f90 
g=open('exampl_source.f90','w') # and replace each line with write(*,*) 'line' 
for line in f: 
    #print 'write(2,*) \''+line.rstrip()+'\'\n', 
    g.write('write(2,*) \''+line.rstrip()+'\'\n') 
f.close 
g.close 
# then complie exampl.f90 (which includes exampl_source.f90) 
os.system('gfortran exampl.f90') 
os.system('/bin/rm exampl_source.f90') 

運行這個python腳本產生一個可執行文件。當可執行文件運行時,它執行原始任務並打印源代碼。

相關問題