我有一个执行有用任务的程序。现在,除了执行原始任务之外,我还希望在编译的可执行文件运行时生成纯文本源代码。这不是一个quine,但可能是相关的。
此功能通常很有用,但我的特定程序是用Fortran 90编写的,并使用Mako模板。编译时,它可以访问原始源代码文件,但我希望能够确保在用户运行可执行文件时存在源。
这有可能实现吗?
这是一个简单的Fortran 90的例子,它执行一项简单的任务。
program exampl
implicit none
write(*,*) 'this is my useful output'
end program exampl
是否可以修改此程序,使其执行相同的任务(在编译时输出字符串)并输出包含源的Fortran 90文本文件?
提前致谢
答案 0 :(得分:1)
我已经触及Fortran(我从未处理过Fortran 90)已经很久了,我不确定,但只要语言支持代码中的字符串文字,我就会看到一个基本的方法。
将整个程序包含在一个文字块中。显然你不能在其中包含文字,而是需要某种令牌来告诉你的程序包含文字块。
显然这意味着你有两个源副本,一个在另一个副本内。由于这很丑陋,我不会这样做,而是将源包含在其中的include_me标记,并在编译之前通过构建嵌套文件的程序运行它。请注意,此程序将与从文字块重新创建代码的例程共享相当数量的代码。如果你要走这条路,我也会让程序吐出这个程序的源代码,这样无论谁试图修改文件都不需要处理这两个副本。
答案 1 :(得分: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脚本会生成可执行文件。运行可执行文件时,它会执行原始任务并打印源代码。