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関係では、もう少しだけ面白い遊びを考えてます。もうかなり長いこと温めていて、まだ温めているってだけですが。