1

便利なタスクを実行するプログラムがあります。ここで、元のタスクの実行に加えて、コンパイルされた実行可能ファイルの実行時にプレーンテキストのソース コードを生成したいと考えています。これはクワインではありませんが、おそらく関連しています。

この機能は一般的には便利ですが、私の特定のプログラムは Fortran 90 で書かれており、Mako テンプレートを使用しています。コンパイルすると、元のソース コード ファイルにアクセスできますが、ユーザーが実行可能ファイルを実行するときにソースが存在することを確認できるようにしたいと考えています。

これを達成することは可能ですか?

以下は、単純なタスクを実行する単純な Fortran 90 の例です。

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

このプログラムを変更して、同じタスクを実行し (コンパイル時に文字列を出力する)、ソースを含む Fortran 90 テキスト ファイルを出力することはできますか?

前もって感謝します

4

2 に答える 2

1

Fortran に触れてから (そして Fortran 90 を扱ったことがない) 長い間、確かなことはわかりませんが、言語がコード内の文字列リテラルをサポートしている限り、基本的なアプローチは機能するはずです。

プログラム全体をリテラルのブロック内に含めます。明らかに、これにリテラルを含めることはできません。代わりに、プログラムにリテラルのブロックを含めるように指示する何らかのトークンが必要です。

明らかに、これはソースの 2 つのコピーがあり、一方が他方の中にあることを意味します。これは醜いので、私はそのようにはしませんが、ソースを include_me トークンとともに保存し、コンパイルする前にネストされたファイルを構築するプログラムを実行します。このプログラムは、リテラルのブロックからコードを再作成するルーチンとかなりの量のコードを共有することに注意してください。あなたがこのルートに行くつもりなら、私はプログラムにこのプログラムのソースを吐き出させて、ファイルを変更しようとしている人が2つのコピーを処理する必要がないようにします.

于 2012-01-23T05:30:35.023 に答える
0

元のプログラム (質問を参照) が編集されました: include ステートメントを追加します

このファイルを「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 スクリプトを実行すると、実行可能ファイルが生成されます。実行可能ファイルが実行されると、元のタスクが実行され、ソース コードが出力されます。

于 2012-01-23T20:43:18.000 に答える