大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE稳定放心使用
介绍
SpiderMonkey是Firefox使用的脚本引擎,V8是Google Chrome使用的脚本引擎。这篇文章介绍了怎样在自己的C++程序中嵌入这两种脚本引擎,以及简单做了一些横向的对比。
编译
SpiderMonkey
SpiderMonkey支持1.0~1.8版本的JavaScript语法,包括ECMAScript,ECMA 263-3,以及Mozilla扩展,可选支持E4X
由于SpiderMonkey的makefile只支持GNU Make。为了便于编译,建议使用MSYS,请先准备好MSYS(http://www.mingw.org)
下载SpiderMonkey源代码(https://developer.mozilla.org/En/SpiderMonkey/1.8)
解压…
- 从“VC命令提示”进入控制台,然后进入到MSYS中,这样做的目的是为了让MSYS能使用VC的编译器。
- 在MSYS里,用cd命令进入到SpiderMonkey源代码目录中
- 输入make -f makefile.ref BUILD_OPT=1
这样就编译完成了,还算简单吧。
BUILD_OPT=1参数的作用是把SpiderMonkey编译成Release版本。
另外,默认是使用VC的运行库的(即使用-MD编译参数),如果不喜欢,可以修改src/confg目录下的*.mk文件(比如把-MD改成-MT)
对于MinGW用户,请参考这里http://jargon.ca/spidermonkey/编译
V8
不知道Google为什么把他们的脚本引擎称为V8,其宣称V8的速度远远超过SpiderMonkey,同样支持支持ECMAScript、ECMA-262-3。
下载V8源代码,需要安装SVN,命令是svn checkout http://v8.googlecode.com/svn/trunk/ v8
下载后解压…
可以在tools/visual_studio里找到工程文件,直接打开工程文件就可以编译了。
如果编译成功,可以无视下面这段。如果没搞定,请静下心来继续…
命令行编译方法
需要Python2.4以上版本(http://www.python.org )
安装scons(http://www.scons.org ),这是一个python的编译脚本软件,可以把它看作是“高级”一点的make。
- 进入“VC命令提示”
- 进入V8目录
- 设置Python路径 set path=c:/Python25;c:/Python25/Scripts;%path%
官方文档说到这一步输入scons就可以开始编译了
不过例外总是有的,比如我的VC2005就不行,一会儿说找不到cl命令,一会儿又找不到头文件-_-
我们得告诉它环境变量的值,这样写就可以了:
scons env=”PATH:%path%,INCLUDE:%include%,LIB:%lib%”
默认是静态链接,静态VC库,可以这样修改编译参数
scons library=shared msvcrt=shared env=…
输入scons –help能看到更多编译参数
想在MinGW里编译,要到这里下个补丁才行:http://codereview.chromium.org/18309
注意:如果编译成动态库,使用时包含头文件v8.h之前应该先来一句 #define USING_V8_SHARED 1
对比
只是简单地比较一下脚本运行速度、脚本与宿主程序之间通信速度以及编程的简易程度。我想这也是C++编程人员关心的主要问题。
比较用的脚本:
这是一个从网上找来的计算Pi的JS脚本:
- mess=“”;
- //10^11 seems to be the maximum
- //too high a figure for the base introduces errors
- Base=Math.pow(10,11);
- //num digits in each array item
- cellSize=Math.floor(Math.log(Base)/Math.LN10);
- //below is not used in this script
- a=Number.MAX_VALUE;
- MaxDiv=Math.floor(Math.sqrt(a));
- function makeArray (n, aX, Integer) {
- var i=0;
- for (i=1; i<n; i++)
- aX[i] = null;
- aX[0] = Integer;
- }
- function isEmpty (aX) {
- var empty=true
- for (i=0; i<aX.length; i++)
- if (aX[i])
- {
- empty= false;
- break;
- }
- return empty;
- }
- //junior school math
- function Add (n, aX,aY) {
- carry=0
- for (i=n-1; i>=0; i–) {
- aX[i] += Number(aY[i])+Number(carry);
- if (aX[i]<Base)
- carry = 0;
- else {
- carry = 1;
- aX[i] =Number(aX[i])- Number(Base);
- }
- }
- }
- //subtract
- function Sub (n, aX,aY) {
- for (i=n-1; i>=0; i–) {
- aX[i] -= aY[i];
- if (aX[i]<0) {
- if (i>0) {
- aX[i] += Base;
- aX[i-1]–;
- }
- }
- }
- }
- //multiply big number by “small” number
- function Mul (n, aX, iMult) {
- carry=0;
- for (i=n-1; i>=0; i–) {
- prod = (aX[i])*iMult;
- prod += carry;
- if (prod>=Base) {
- carry = Math.floor(prod/Base);
- prod -= (carry*Base);
- }
- else
- carry = 0;
- aX[i] = prod;
- }
- }
- //divide big number by “small” number
- function Div (n, aX, iDiv,aY) {
- carry=0;
- for (i=0; i<n; i++) {
- //add any previous carry
- currVal = Number(aX[i])+Number(carry*Base);
- //divide
- theDiv =Math.floor(currVal/iDiv);
- //find next carry
- carry = currVal-theDiv*iDiv;
- //put the result of division in the current slot
- aY[i] = theDiv;
- }
- }
- //compute arctan
- function arctan (iAng, n, aX) {
- iAng_squared=iAng*iAng;
- k=3; //k is the coefficient in the series 2n-1, 3,5..
- sign=0;
- makeArray (n, aX, 0); //aX is aArctan
- makeArray (n, aAngle, 1);
- Div (n, aAngle, iAng, aAngle); //aAngle = 1/iAng, eg 1/5
- Add (n, aX, aAngle); // aX = aAngle or long angle
- while (!isEmpty(aAngle)) {
- Div (n, aAngle, iAng_squared, aAngle); //aAngle=aAngle/iAng_squared, iAng_squared is iAng*iAng
- Div (n, aAngle, k, aDivK); /* aDivK = aAngle/k */
- if (sign)
- Add (n, aX, aDivK); /* aX = aX+aDivK */
- else Sub (n, aX, aDivK); /* aX = aX-aDivK */
- k+=2;
- sign = 1-sign;
- }
- mess+=“aArctan=”+aArctan+“<br>”;
- }
- // Calculate pi
- function calcPI (numDec) {
- var ans=“”;
- t1=new Date();
- numDec=Number(numDec)+5;
- iAng=new Array(10);
- coeff=new Array(10);
- arrayLength=Math.ceil(1+numDec/cellSize);
- aPI = new Array(arrayLength);
- aArctan = new Array(arrayLength);
- aAngle=new Array(arrayLength);
- aDivK=new Array(arrayLength);
- //Pi/4 = 4*arctan(1/5)-arctan(1/239)
- //coeff is an array of the coefficients
- //the last item is 0!
- coeff[0] = 4;
- coeff[1] = -1;
- coeff[2] = 0;
- //iAng holds the angles, 5 for 1/5, etc
- iAng[0] = 5;
- iAng[1] = 239;
- iAng[2] = 0;
- makeArray (arrayLength, aPI, 0);
- //Machin: Pi/4 = 4*arctan(1/5)-arctan(1/239)
- makeArray(arrayLength,aAngle,0);
- makeArray(arrayLength,aDivK,0);
- for (var i=0; coeff[i]!=0; i++) {
- arctan(iAng[i], arrayLength, aArctan);
- //multiply by coefficients of arctan
- Mul (arrayLength, aArctan, Math.abs(coeff[i]));
- if (coeff[i]>0)
- Add (arrayLength, aPI, aArctan);
- else
- Sub (arrayLength, aPI, aArctan);
- }
- //we have calculated pi/4, so need to finally multiply
- Mul (arrayLength, aPI, 4);
- //we have now calculated PI, and need to format the answer
- //to print it out
- sPI=“”;
- tempPI=“”;
- //put the figures in the array into the string tempPI
- for (i=0;i<aPI.length;i++)
- {
- aPI[i]=String(aPI[i]);
- //ensure there are enough digits in each cell
- //if not, pad with leading zeros
- if (aPI[i].length<cellSize&&i!=0)
- {
- while (aPI[i].length<cellSize)
- aPI[i]=“0”+aPI[i];
- }
- tempPI+=aPI[i];
- }
- //now put the characters into the string sPI
- for (i=0;i<=numDec;i++)
- {
- //put the 3 on a different line, and add a decimal point
- if (i==0)
- sPI+=tempPI.charAt(i)+“. “;
- else
- {
- if ((i)%50==0&&i!=0)
- sPI+=tempPI.charAt(i)+” “;
- else
- sPI+=tempPI.charAt(i);
- }//i not zero
- }
- //now put the print-out together
- //print our pi
- ans+=(“PI (“+numDec+“)=”+sPI+” “);
- //Window’s calculator Pi (for confirmation);
- ans+=(“Win PI= 3.1415926535897932384626433832795 “);
- t2=new Date();
- timeTaken=(t2.getTime()-t1.getTime())/1000;
- ans+=“It took: “+timeTaken+” seconds”;
- return ans;
- }
- myprint(calcPI(1000));
脚本与宿主程序之间通信速度测试脚本
- // MyClass是宿主提供给JS的类(一个queue的直接包装)
- var c = new MyClass();
- t1=new Date();
- //10万次push和pop,测试JS调用宿主代码的速度
- for(i=0; i<100000; i++)
- {
- c.push(i);
- c.pop();
- }
- t2=new Date();
- timeTaken=(t2.getTime()-t1.getTime())/1000;
- //myprint也是宿主提供的全局函数,用于显示结果
- myprint(“It took:”,timeTaken,“seconds”);
(未完待续)
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/181210.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...