1

我有一个执行有用任务的程序。现在,除了执行原始任务之外,我还想在编译的可执行文件运行时生成纯文本源代码。这不是quine,但可能是相关的。

此功能通常很有用,但我的特定程序是用 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)以来已经很久了,我不确定,但我看到了一种基本方法,只要该语言在代码中支持字符串文字就应该有效。

将整个程序包含在一个文字块中。显然,您不能在其中包含文字,而是需要某种标记来告诉您的程序包含文字块。

显然,这意味着您有两个源副本,一个在另一个内部。由于这很难看,我不会那样做,而是将源代码与 include_me 标记一起存储在其中,并在编译之前通过构建嵌套文件的程序运行它。请注意,该程序将与从文字块重新创建代码的例程共享大量代码。如果你要走这条路,我也会让程序吐出这个程序的源代码,这样任何试图修改文件的人都不需要处理这两个副本。

于 2012-01-23T05:30:35.023 回答
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')

Running this python script produces an executable. When the executable is run, it performs the original task AND prints the source code.

于 2012-01-23T20:43:18.000 回答