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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です