2012-01-23 2 views
1

У меня есть программа, которая выполняет полезную задачу. Теперь я хочу создать исходный код с открытым текстом, когда выполняется скомпилированный исполняемый файл, в дополнение к выполнению исходной задачи. Это не quine, но, вероятно, связано.программа для воспроизведения себя и быть полезной - не quine

Эта возможность была бы полезной в целом, но моя конкретная программа написана на Fortran 90 и использует шаблоны Mako. При компиляции он имеет доступ к исходным файлам исходного кода, но я хочу, чтобы убедиться, что источник существует, когда пользователь запускает исполняемый файл.

Можно ли выполнить?

Вот пример простого Fortran 90, который выполняет простую задачу.

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

Может эта программа может быть модифицирован так, что он выполняет ту же задачу (выводит строку при компиляции) и выводит текстовый файл Fortran 90, содержащий источник?

Заранее спасибо

+0

Причина, по которой это не является вопросом, заключается в том, что «Quine - это компьютерная программа, которая не принимает входных данных и производит копию своего исходного кода в качестве единственного выхода». [citation] (http://en.wikipedia.org/wiki/Quine_ (вычисления)) – Ben

ответ

0

Это было так давно я прикоснулся Fortran (и я никогда не имел дело с Fortran 90), что я не уверен, но я вижу основной подход, который должен работать до тех пор, как язык поддерживает строковые литералы в коде.

Включите всю свою программу внутри себя в блок литералов. Очевидно, вы не можете включать литералы в это, вместо этого вам нужен какой-то токен, который говорит вашей программе о включении блока литералов.

Очевидно, это означает, что у вас есть две копии источника, одна внутри другой. Поскольку это уродливо, я бы так не сделал, а сохранил ваш источник с токеном include_me и запускал его через программу, которая строит вложенные файлы перед их компиляцией. Обратите внимание, что эта программа будет делиться достойным количеством кода с программой, которая воссоздает код из блока литералов. Если вы собираетесь пойти по этому маршруту, я бы также сделал программу, которая выплевывает источник для этой программы, поэтому любой, кто пытается изменить файлы, не должен иметь дело с двумя копиями.

+0

Если я правильно вас понимаю, я должен написать отдельную программу (назовите ее X), которая действует на простой исходный код F90 (Y) для записи другого источника F90 (Z), который включает в себя простой F90 (Y) внутри 'write (*, *)« код Y здесь ». Если это правильно, скомпилированная версия Z, которая создает источник Y F90, не будет иметь X. – Ben

+0

@ user1164295: вы, конечно же, могли бы сделать это также источником источника для X. –

+0

Я думаю, что ответ, который я опубликовал, реализует ваше предложение (используя Скрипт Python и оператор include в F90. Спасибо за ваше руководство. – 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 создает исполняемый файл. Когда исполняемый файл запускается, он выполняет оригинальную задачу AND печатает исходный код.

 Смежные вопросы

  • Нет связанных вопросов^_^