gccでtccのようなrun
tccは高速なCコンパイラで、あまりにコンパイルが高速なので、まるでインタプリタのように*.cを起動できるという-runオプションがある。確か、コンパイルしたものをファイルに送らずにメモリ上に置いて、そのままmainのアドレスを呼び出していたような気がする。tccもx86_64に対応してくれて、使いやすくなった。
最近はCPUも速くなったので、gccで一時ファイルを使っても、そう大差ない使用感になるだろう。シェルスクリプトでも書けるけど、Pythonで書いてみた。
- tgcc.py
- python tgcc.py program.c othersrc.c – arguments
#! /usr/bin/python
import os,sys
import subprocess
import tempfile
def usage():
print "Usage: %s files... [-- args...]" %(sys.argv[0])
exit(0)
def main():
args=sys.argv[1:]
try:
sp=args.index("--")
files, arg=args[:sp],args[sp+1:]
except ValueError,detail:
files=args
arg=[]
if len(files)==0:
usage()
f=tempfile.mktemp()
r=subprocess.call(["gcc", "-o", f]+files)
if r==0:
r=subprocess.call(["temp"]+arg, executable=f)
os.unlink(f)
exit(r)
if __name__=="__main__":
main()
例えば、
- echo -e “#include <stdio.h>\nint main(){printf("hello,world\\n");}” > /tmp/hw.c
- python tgcc.py /tmp/hw.c
で、hello,worldが表示されますね。-Wall等のオプションも有効です。
gcc関係では、もう少しだけ面白い遊びを考えてます。もうかなり長いこと温めていて、まだ温めているってだけですが。