cppsC++腳本的(偽)解釋器
cpps 是 C++ 腳本的(偽)解釋器
思路很簡單,背后調(diào)用gcc來編譯,然后運(yùn)行生成的可執(zhí)行文件。
* 不會弄臟你的目錄
* 支持多個(gè).cpp文件
* 可以鏈接庫
* 支持預(yù)編譯頭文件
* 支持shebang
* 支持gcc支持的全部c++語法(必須的)
交互式執(zhí)行地沒有,畢竟是偽的。
需要用到
gcc 4.9.1
boost 1.57.0 (只用到了filesystem、program_options兩個(gè)子庫)
為什么說是(偽)解釋器?
因?yàn)樗⒉皇莻鹘y(tǒng)意義上的解釋器,而是背后調(diào)用gcc先對源代碼進(jìn)行編譯,然后再執(zhí)行產(chǎn)生的exe程序的。
C++代碼本身就不適合解釋執(zhí)行,
而我想要的不過是腳本的好處(而非解釋器的):
就地編寫,就地運(yùn)行
不用創(chuàng)建復(fù)雜的工程
從edit->build->run的循環(huán)中刪掉build的環(huán)節(jié)
因?yàn)镃++代碼編譯的時(shí)間也不短,所以cpps會緩存第一次運(yùn)行所產(chǎn)生的exe文件(放心,不會弄臟你的目錄)。
另外,cpps還內(nèi)建了一個(gè)全透明的build system,當(dāng)你第一次運(yùn)行腳本之后,如果你對代碼又做了修改,再次運(yùn)行腳本時(shí),只有變動的部分才會被重新編譯。
當(dāng)然,前提是你的腳本由多個(gè).cpp文件組成。
編譯安裝
mkdir build-cpps cd build-cpps cmake ../cpps make make test
如果沒有問題的話
sudo make install
特別注意:
我自己編譯時(shí)用的是
gcc 4.9.1
boost 1.57.0 (只用到了filesystem、program_options兩個(gè)子庫)
如果腳本由一個(gè).cpp文件組成
比如hello.cpp
那你執(zhí)行下面這行即可:
cpps hello.cpp
如果腳本由多個(gè).cpp文件組成
比如你的c++代碼位于目錄~/work/hello下,共有三個(gè)文件:
hello.cpp
foo.cpp
foo.h
如果你在hello.cpp中調(diào)用了foo.cpp中的某個(gè)函數(shù),那么
在編譯環(huán)境下
你需要在hello.cpp中寫
#include "foo.h"
然后將foo.cpp也加進(jìn)你的Makefile中。
在解釋環(huán)境下
你只需要給上面這行#include添加一條注釋即可
#include "foo.h" // using foo.cpp
這就相當(dāng)于python的import
不需要什么Makefile
然后執(zhí)行下邊這行即可
cpps hello.cpp
如果你在hello.cpp中使用了某個(gè)庫
比如pthread
在編譯環(huán)境下
你需要在命令行寫-lpthread才能將該庫鏈接進(jìn)來
在解釋環(huán)境
你只要在任何一個(gè).cpp文件中加上這樣的注釋即可:
// linklib pthread
預(yù)編譯頭文件
你還可以通過預(yù)編譯頭文件來加速
比如你打算將std.h搞成預(yù)編譯頭文件
那么只要在某個(gè).cpp文件中加上這樣的注釋
#include "std.h" // precompile std.h
還支持shebang
在你的hello.cpp文件第一行寫上:
#!/usr/bin/env cpps
然后執(zhí)行
chmod +x hello.cpp ./hello.cpp
感覺是不是很爽?
只可惜,這一行并不是合法的C++代碼
cpps認(rèn)它,別的編譯器卻不認(rèn)它。
更好的做法是:不要在.cpp文件中直接添加shebang,而是新建一個(gè)擴(kuò)展名為.cpps的文件,比如:
hello.cpps
然后在這個(gè)文件中的第一行寫shebang,第二行給出.cpp腳本的路徑(絕對路徑、相對路徑都可以),如下:
#!/usr/bin/env cpps hello.cpp
然后將這個(gè).cpps文件設(shè)置成可執(zhí)行的
chmod +x hello.cpps ./hello.cpps
咦? 好像在個(gè)shell腳本中調(diào)用cpps hello.cpp即可
干干凈凈運(yùn)行
cpps --clear hello.cpp 相當(dāng)于先clear all,再build,然后運(yùn)行。
如果你用新版本的cpps運(yùn)行以前運(yùn)行過的C++程序時(shí)遇到問題,可以這樣試一下。
