双编译
A. V8编译生成的机器码究竟是什么
实际上V8的JIT编译器是直接在内存中生成机器码的,并不会先生成文本形式的汇编然后再使用汇编器去转换为机器码。“动态生成机器码”听起来可能有点玄乎,其实根本没啥,就是往内存里写字节,这些字节正好是某些机器码的意思,然后把这块内存当作函数去调用就是了。由于代码自身就是动态生成的,在生成的代码里直接嵌入resolve好的各种值其实就相当于传统编译流程里的“动态链接”的效果。顺手放俩我以前博客的传送门:V8实际上自带一个用C++实现的“汇编器库”用来动态生成机器码。它并不把文本形式的汇编转换为机器码,而是提供一组C++ API,调用这个API的函数就可以在内存里生成机器码来。有兴趣的同学可能会知道,V8的MacroAssembler库源自Animorphic的Strongtalk VM,而Strongtalk VM也是HotSpot JVM的前辈。V8 Design Elements文档里所描述的是最初期的V8的状态。当时的V8只有一个JIT编译器,一个javaScript函数通常只会被JIT编译一次。这个JIT编译器做的优化也不是很多。后来V8演化为拥有两个JIT编译器,一个初级编译器(baseline compiler,名字叫做Full Code Generator,简称FullCodeGen),和一个优化编译器(optimizing compiler,名字叫做Crankshaft),两个编译器结合在一次构成双层编译。JavaScript函数通常会先被FullCodeGen编译,然后如果还继续执行很多次的话则会再被Crankshaft重新编译一遍,生成更优化的代码。在这个架构中,FullCodeGen里生成的代码还是跟V8 Design Elements的相似,会通过inline cache来实现property access;而这些inline cache不但用于实现fast property access,更重要的是它们会被用于收集profile,然后等到Crankshaft编译的时候,它就可以看先前收集的profile来做profile-guided optimization。以这个 function foo(p) { return p.x } 为例,参数p没有任何特别的地方,所以JavaScript引擎也无法知道p到底可能有怎样的值。但通过FullCodeGen生成的代码所收集到的profile信息,Crankshaft再去编译 foo() 的时候就可以知道p之前通常指向一个Map(hidden class)为0x2c97ccb179d1的类型的对象。这个类型的constructor为Point、[[Prototype]] 为Point.prototype、对象里有足够空间容纳10个内嵌的字段(in-object property),并且其中2个slot被用于存储Smi类型,剩余的8个slot未被使用。
B. 有什么办法可以加速make的编译耗时,以利用到底层的多核硬件
在使用 makefile 工具对多个源程序进行编译、连接时,首先必须要确保你需要编译的程序都是正确的,然后将编译各个源程序按照一定的先后顺序写入到一个 makefile 文件中(缺省名称叫 makefile,但是也可以使用别的文件名),在此编译过程中,到底哪一个源程序是只编译、不连接;
哪一个源程序是需要等别的源程序都编译好了之后,再进行最后的连接,这些都必须写清楚。
C. 请问c语言程序编译过程中,单编译和双编译有什么联系和区别
不是双编译,生成应用程序要经过两步:编译,链接。
第一步编译:编译器将每个.c文件编译为对应的.obj文件,这个过程主要是做预处理,语法分析
第二步链接:将所有.obj综合处理,生成二进制执行码,即一个.exe应用程序
可以选择仅编译,只生成.obj文件,若有语法错误,则停止编译,并报告错误
也可以选择编链,若编译期出错,则停止编译,若没有出错,则继续生成.exe,一步到位
D. 新手在学习c语言并编译程序时编译错误怎么办
1、确定出错的行号
如果是一个比较好的集成编译环境的话,一般双击编译错误,鼠标都会自动跳转到该行并高亮显示。
没有这个功能也没关系,编译错误里面也都会有说明某某.c,某某行出的问题
1>e:\visual studio 2005\projects\airplane\airplane\airplane.cpp(52) : error C2065: 'abc' : undeclared identifier
这个就是说明在airplane.cpp的52行有错误
2、多个错误的话,一般只处理第一个错误
如果一次打出很多错误的话,不需要每一个都处理,只处理第一个编译错误,然后再次编译。大部分的时候,都是由于第一个错误产生了后续很多错误,第一个错误解决之后,其他错误也就迎刃而解。
3、对错误的更改
一般就是看错误的编号和后续的英文说明,如上面的错误,错误编号是C2065,错误的解释是'abc' : undeclared identifier,未定义的标示符,将abc定义即可。
错误的种类很多,一般看英文就可以解决,如果解决不了的话,推荐根据错误编号上网搜索一下解决方法就OK拉。
E. 杭电ACM1002 不知道哪里出了问题 双编译是有错还看不懂 求大神解答
#include<iostream>
using namespace std;
#include<cstring>
const int N=1010;
int main(){
int sum[N];//存两数之和
char a[N],b[N];//输入的两数以字符形式存储其中
int h;//求和次数
int c,d;//输入的每一个字符
int x,y;//每位字符转成数字计算;
int k=0,w=0;//记录两数组的大小
cin>>h;
for (int i=1;i<=h;i++) {
/*
while(c=getchar(),c){
a[k]=c;
k++;
}
while(d=getchar(),d){
b[w]=d;
w++;
}*/
cin >> a >> b;
k = strlen(a);
w = strlen(b);
if(i>1)
cout << endl;
cout<<"Case "<<i<<":"<<endl;
for (int ai=0;ai<k;ai++)
cout<<a[ai];
cout<<" + ";
for (int bi=0;bi<w;bi++)
cout<<b[bi];
cout<<" = ";
int n;
if (w>k){
//n=w;
//for (k;k<n;k++) a[k+1]='0';
for(n=w-1;n>=w-k;n--) a[n] = a[n-w+k];
for(n=w-k-1;n>=0;n--) a[n] = '0';
n=w;
}
else {
//n=k;
//for (w;w<n;w++) a[w+1]='0';
for(n=k-1;n>=k-w;n--) b[n] = b[n-k+w];
for(n=k-w-1;n>=0;n--) b[n] = '0';
n=k;
}
for (int q=0;q<=n+1;q++)
sum[q]=0;
for (int s=n;s>0;s--) {
int x=a[s-1]-48,y=b[s-1]-48;
sum[s]+=x+y;
if(sum[s]>9&&s>0){
sum[s]%=10;
sum[s-1]+=1;
}
}
if(sum[0]>0)
cout<<sum[0];
for (int sm=1;sm<=n;sm++)
cout<<sum[sm];
cout<<endl;
}
return 0;
}
F. java怎么编译成可以双击打开的可执行文件
Java代码无法打包成exe程序.
但你可以做个C程序,调用Java打成的jar包,然后把C写的程序编译成exe
步骤:
1,把Java程序打成jar包,包含manifext配置文件.
2,写个C程序System("jar包调用语句");
3,我在Linux下编译的时候用g++在终端编译..因为不会用windows平台写C,请自寻方式解决.
然后在桌面上双击编译好的由C语言得来的exe文件就可以运行了...
貌似Eclipse就是这样的执行的.
G. c语言编程软件如何变中文模式
1、直接在微软官网上下载最新的vc,vs中文版,就可以得到中文模式的C语言编辑器。
2、如果是学C语言,建议使用TC,或者MyTC。原因很简单,集成的IDE会造成很多依赖,养成很多不良的编程习惯,对于新手来说,TC已经很足够了。另外,使用什么IDE,跟支持不支持中文没关系。编程的时候最好尽量不要使用中文来命名。学纯C语言,还是使用TC吧,VC集成了太多VC方面的东东,会很困惑,看不清楚真正的C语言。
H. 天堂1双开编译器怎么用
用LX不就好了- -