程序来重现自己并且有用 - 而不是quine

时间:2012-01-23 04:29:19

标签: quine computability

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

此功能通常很有用,但我的特定程序是用Fortran 90编写的,并使用Mako模板。编译时,它可以访问原始源代码文件,但我希望能够确保在用户运行可执行文件时存在源。

这有可能实现吗?

这是一个简单的Fortran 90的例子,它执行一项简单的任务。

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

是否可以修改此程序,使其执行相同的任务(在编译时输出字符串)并输出包含源的Fortran 90文本文件?

提前致谢

2 个答案:

答案 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脚本会生成可执行文件。运行可执行文件时,它会执行原始任务并打印源代码。