導航:首頁 > 源碼編譯 > v8最小編譯

v8最小編譯

發布時間:2022-05-29 12:13:43

android編譯版本,最小版本,目標版本都有什麼區別

② 什麼編程語言編譯出來的程序最小

匯編語言編譯後程序代碼最小,其次應該是C,再次是其他面向對象的一些語言。

③ 為什麼用c++寫的v8引擎可以編譯js

c++是底層語言系統,可以寫出瀏覽器解析內核

④ 在armv8下編譯的時候使用了O3優化,相關計算就會自動使用neon嗎

對的。GCC可以通過自動向量化產生NEON指令

⑤ android jni程序(c++)如何編譯適用於arm-v8指令集的32位程序

可以看到Android上層的Application和ApplicationFramework都是使用java編寫,

底層包括系統和使用眾多的LIiraries都是C/C++編寫的。

所以上層Java要調用底層的C/C++函數庫必須通過Java的JNI來實現。

下面將學習Android是如何通過Jni來實現Java對C/C++函數的調用。以HelloWorld程序為例:

第一步:

使用Java編寫HelloWorld 的Android應用程序:

package com.lucyfyr;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class HelloWorld extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.v("fresne", printJNI("I am HelloWorld Activity"));
}
static
{
//載入庫文件
System.loadLibrary("HelloWorldJni");
}
//聲明原生函數 參數為String類型 返回類型為String
private native String printJNI(String inputStr);
}

這一步我們可以使用eclipse來生成一個App;

因為eclipse會自動為我們編譯此Java文件,後面要是用到。

第二步:

生成共享庫的頭文件:

進入到eclipse生成的Android Project中 :/HelloWorld/bin/classes/com/lucyfyr/
下:

可以看到裡面後很多後綴為.class的文件,就是eclipse為我們自動編譯好了的java文件,其中就有:

HelloWorld.class文件。

退回到classes一級目錄:/HelloWorld/bin/classes/

執行如下命令

javah com.lucyfyr.HelloWorld

生成文件:com_lucyfyr_HelloWorld.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_lucyfyr_HelloWorld */
#ifndef _Included_com_lucyfyr_HelloWorld
#define _Included_com_lucyfyr_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_lucyfyr_HelloWorld
* Method: printJNI
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_lucyfyr_HelloWorld_printJNI
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif

可以看到自動生成對應的函數:Java_com_lucyfyr_HelloWorld_printJNI

Java_ + 包名(com.lucyfyr) + 類名(HelloWorld) + 介面名(printJNI):必須要按此JNI規范來操作;

java虛擬機就可以在com.simon.HelloWorld類調用printJNI介面的時候自動找到這個C實現的Native函數調用。

當然函數名太長,可以在.c文件中通過函數名映射表來實現簡化。

第三步:

實現JNI原生函數源文件:

新建com_lucyfyr_HelloWorld.c文件:

#include <jni.h>
#define LOG_TAG "HelloWorld"
#include <utils/Log.h>
/* Native interface, it will be call in java code */
JNIEXPORT jstring JNICALL Java_com_lucyfyr_HelloWorld_printJNI(JNIEnv *env, jobject obj,jstring inputStr)
{
LOGI("fresne Hello World From libhelloworld.so!");
// 從 instring 字元串取得指向字元串 UTF 編碼的指針
const char *str =
(const char *)(*env)->GetStringUTFChars( env,inputStr, JNI_FALSE );
LOGI("fresne--->%s",(const char *)str);
// 通知虛擬機本地代碼不再需要通過 str 訪問 Java 字元串。
(*env)->ReleaseStringUTFChars(env, inputStr, (const char *)str );
return (*env)->NewStringUTF(env, "Hello World! I am Native interface");
}
/* This function will be call when the library first be load.
* You can do some init in the libray. return which version jni it support.
*/
jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
void *venv;
LOGI("fresne----->JNI_OnLoad!");
if ((*vm)->GetEnv(vm, (void**)&venv, JNI_VERSION_1_4) != JNI_OK) {
LOGE("fresne--->ERROR: GetEnv failed");
return -1;
}
return JNI_VERSION_1_4;
}

OnLoadJava_com_lucyfyr_HelloWorld_printJNI

函數裡面做一些log輸出 注意JNI中的log輸出的不同。

JNI_OnLoad函數JNI規范定義的,當共享庫第一次被載入的時候會被回調,

這個函數裡面可以進行一些初始化工作,比如注冊函數映射表,緩存一些變數等,

最後返回當前環境所支持的JNI環境。本例只是簡單的返回當前JNI環境。

http://www.cnblogs.com/bastard/archive/2012/05/19/2508913.html

⑥ V8引擎示例中如下的編譯選項什麼意思

V8和V10指的是引擎里的氣缸數缸數汽車發動機常用缸數有3、4、5、6、8、10、12缸。排量1升以下的發動機常用三缸,1-2.5升一般為四缸發動機,3升左右的發動機一般為6缸,4升左右為8缸,5.5升以上用12缸發動機。一般來說,在同等缸徑下,缸數越多,排量越大,功率越高;在同等排量下,缸數越多,缸徑越小,轉速可以提高,從而獲得較大的提升功率。6-12缸發動機一般採用V型排列,其中V10發動機主要裝在賽車上。V型發動機長度和高度尺寸小,布置起來非常方便,而且一般認為V型發動機是比較高級的發動機,也成為轎車級別的標志之一。V8發動機結構非常復雜,製造成本很高,所以使用的較少,V12發動機過大過重,只有極個別的高級轎車採用。2006賽季F1賽車引擎由3.0升V10變為2.4升V8,目的是為了降低各車隊的引擎研發等開支,同時提高比賽安全性。此項規則改動將導致引擎輸出功率相比2005賽季(900馬力左右)降低約200馬力。對於無法在2006賽季開始時獲得新規則規定的V8引擎的車隊,也允許其在限制引擎轉速的情況下,使用符合2005賽季技術規則的V10引擎。

⑦ v8是什麼軟體

  1. Lars Bak是這個項目的組長,目前該JavaScript引擎已用於其它項目的開發。第一個版本隨著第一個版本的Chrome於2008年9月2日發布。

  2. V8使用C++開發,並在谷歌瀏覽器中使用。在運行JavaScript之前,相比其它的JavaScript的引擎轉換成位元組碼或解釋執行,V8將其編譯成原生機器碼(IA-32,x86-64,ARM, orMIPSCPUs),並且使用了如內聯緩存(inline caching)等方法來提高性能。有了這些功能,JavaScript程序在V8引擎下的運行速度媲美二進製程序。

  3. V8中實現的ECMAScript中指定 ECMA - 262 ,第3版 運行在Windows XP和Vista,Mac OS X的10.5(雪豹和Linux系統使用IA - 32或ARM處理器。

  4. V8可以獨立運行,也可以 嵌入 到任何C++應用程序。項目託管在Google Code上,基於BSD協議,任何組織或個人可以將其源碼用於自己的項目中。

⑧ 請問841nv8編譯OP固件,用哪個路由器型號

選擇TP-LINK TL-WR841N/ND,會編譯所有的841,然後選擇自己想要的即可。v8用的是這個文件mach-tl-wr841n-v8.c

⑨ 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未被使用。

⑩ [討論]CPython能否用V8的方式優化性能

我的磚拋得實在是太值了!!!!!
還有一些疑問,請教一下:引用1、純編譯。直接從抽象語法樹生成機器碼,不使用其它中間表示;盡可能多的把對代碼的操作壓縮在一趟內;使用簡單的寄存器分配演算法。這使得編譯速度很快,但生成出來的代碼指令不會很好;編譯是lazy的JIT方式觸發,只有真的被調用過的函數的內容才會被編譯;
這樣的設計是不是還是處於對啟動速度和編譯代價的考慮?反正V8現在已經在JS解析方法相對競爭對手屬於領先,就不需要做更多優化方法。
引用2、使用隱藏類來彌補JavaScript沒有類帶來的效率損失;
我第一次看到隱藏類的時候就想到了CPython中的PyTypeObject,
通過解析器把類型信息傳送到運行時中實現動態類型的目的。不知道兩者是不是基於同一思想?引用3、使用tagged pointer來實現小整數,顯著提高小整數的運算效率,並減輕GC壓力(小整數不需要在堆上創建對象);
我所知道的tagged pointer,是指針的一部分用於類型編碼,比如
我規定bit1表示只讀,那麼指針0x3421表示指向0x3420的只讀指針。
引用相比之下,CPython是:
1、純解釋。不採用編譯,而採用解釋方式實現;解釋器中,中間表示是基於棧的位元組碼;
2、Python語言有類,不需要用隱藏類的技巧;
3、沒有用tagged pointer,連整數運算都涉及對堆上對象的操作;
4、沒有使用inline caching;不過要用的話,當前的位元組碼設計可能也不太合適。

閱讀全文

與v8最小編譯相關的資料

熱點內容
javaoa開發 瀏覽:875
單片機的用途和使用方法 瀏覽:944
程序員在新公司上班 瀏覽:430
發信如何設置伺服器 瀏覽:77
源代碼查詢加密數字 瀏覽:605
附帶編譯 瀏覽:108
海康螢石雲app怎麼回放 瀏覽:404
寫一個編譯器怎麼寫 瀏覽:285
單片機蜂鳴器發聲原理 瀏覽:137
程序員那麼可愛陸離跳水是哪集 瀏覽:17
如何製作cdn伺服器 瀏覽:111
寫java加密程序 瀏覽:659
菜鳥數據分析pdf 瀏覽:291
單片機做實用東西 瀏覽:651
我的世界最強斗羅伺服器怎麼覺醒武魂 瀏覽:931
密友圈app怎麼切換用戶登錄 瀏覽:217
我把程序員當愛豆追 瀏覽:978
android判斷電話接通 瀏覽:646
大孔文件夾 瀏覽:785
反詐騙app在哪裡下載 瀏覽:527