❶ 如何閱讀luajit的代碼
為什麼要看luajit的源碼
作為目前最快的腳本語言之一,luajit確實是一個傑作,但相比原生lua僅僅幾萬行的代碼而言,luajit卻可以說是巨無霸。更要命的是,luajit之所以快,是因為大量使用了機器碼相關的技術,無論是它的機器碼編譯部分,還是位元組碼執行部分,讀起來都非常麻煩。
網上這方面的資料非常少,即使是lua社區的雲風大大也主要以分析原生lua為主,跟luajit有很多不同。萬一遇到了性能坑,或者其他難以解決的問題,需要找到原因,又不能閱讀源碼的話,就只能依賴網上其他人的結論,否則完全無從下手。
調試luajit
萬事的開頭,從能夠自己調試代碼開始
一個能調試的代碼,閱讀起來會遠遠比眼看要清晰得多。
而如果能利用visual studio進行調試,那麼對讀luajit而言還是非常有幫助的,畢竟藉助visual assist的代碼查找,能夠非常快的幫你找到你想了解的東西
luajit下面提供了一個msvcbuild.bat用於編譯luajit,但如果你需要調試的話,可以進行以下幾個步驟:
1.將luajit解壓,比如解壓到LuaJIT-2.1.0-beta2_msvc目錄
2.如果要得到精確的棧,修改LuaJIT-2.1.0-beta2_msvc\src\msvcbuild.bat,搜索/O2,將/O2改為/Od
3.在win64版本的visual studio命令行,執行一次msvcbuild.bat debug,這時會生成luajit.exe,測試一下exe是否正常。
4.用visual studio建立一個命令行工程,例如工程保存在LuaJIT-2.1.0-beta2_msvc\luajitcmd
5.把LuaJIT-2.1.0-beta2_msvc\src下所有.h和.c代碼加入工程
6.把工程的調試路徑設置為
命令:$(ProjectDir)..\..\src\luajit.exe
工作目錄:$(ProjectDir)..\..\src\
7.此時你可以正常按f5下斷點調試了
至於可以調試什麼呢?
最簡單就是寫一個lua文件,require之,執行裡面的代碼,下斷點觀察luajit的行為。
這里必須說明,luajit的執行過程中有兩大部分是沒有.c對應的:
1.有一部分代碼是通過dasm工具生成的,這部分直接通過匯編生成,沒有.c,所以沒有辦法在visual studio調試(其實也可以,但是只能匯編調試)。這些主要是lua虛擬機的代碼(是的,為了快,作者hand tune匯編的方式來寫lua虛擬機)
2.luajit會通過jit模塊編譯一部分代碼變為高度優化的機器碼,這些也是臨時生成的可執行機器碼,你只能在.c看到他們是如何生成的,但執行階段當然是沒有.c對應的。
除此以外,幾乎所有東西都可以直接vs調試:所有的編譯過程、所有的lua標准庫和api、luatable等常規數據結構、profiler,等等
下一步我們會簡單說一下代碼結構,以及結果luajit一些基本原理來說說怎麼閱讀
尤其是luajit的原理,如果對此毫無了解的情況下,閱讀其源碼是十分困難的,因為luajit從編譯到執行的過程,走了很多步,跨越了多個模塊,涉及了三種不同形式的編碼(bytecode, SSA IR, 機器碼),可見其復雜程度。
❷ 如何閱讀luajit的代碼
ajit下面提供了一個msvcbuild.bat用於編譯luajit,但如果你需要調試的話,可以進行以下幾個步驟:
1.將luajit解壓,比如解壓到LuaJIT-2.1.0-beta2_msvc目錄
2.如果要得到精確的棧,修改LuaJIT-2.1.0-beta2_msvc\src\msvcbuild.bat,搜索/O2,將/O2改為/Od
3.在win64版本的visual studio命令行,執行一次msvcbuild.bat debug,這時會生成luajit.exe,測試一下exe是否正常。
4.用visual studio建立一個命令行工程,例如工程保存在LuaJIT-2.1.0-beta2_msvc\luajitcmd
5.把LuaJIT-2.1.0-beta2_msvc\src下所有.h和.c代碼加入工程
6.把工程的調試路徑設置為
命令:$(ProjectDir)..\..\src\luajit.exe
工作目錄:$(ProjectDir)..\..\src\
7.此時你可以正常按f5下斷點調試了
❸ c#程序設計的微軟開發語言
微軟c#語言定義主要是從C和C++繼承而來的,而且語言中的許多元素也反映了這一點.C#在設計者從C++繼承的可選選項方面比Java要廣泛一些(比如說struts),它還增加了自己新的特點(比方說源代碼版本定義).但它還太不成熟,不可能擠垮Java.C#還需要進化成一種開發者能夠接受和採用的語言.而微軟當前為它的這種新語言大造聲勢也是值得注意的.目前大家的反應是:這是對Java的反擊.
C#更像Java一些,雖然微軟在這個問題上保持沉默.這也是意料中的事情,我覺得,因為Java近來很成功而使用Java的公司都報告說它們在生產效率上比C++獲得了提高。 中間代碼
微軟在用戶選擇何時MSIL應該編譯成機器碼的時候是留了很大的餘地.微軟公司很小心的聲稱MSIL不是解釋性的,而是被編譯成了機器碼.它也明白許多--如果不是大多數的話--程序員認為Java程序要不可避免的比C編寫的任何東西都要慢.而這種實現方式決定了基於MSIL的程序(指的是用C#,Visual Basic,Managed C++--C++的一個符合CLS的版本--等語言編寫的程序)將在性能上超過解釋性的Java代碼.當然,這一點還需要得到事實證明,因為C#和其他生成MSIL的編譯器還沒有發布.但是Java JIT編譯器的普遍存在使得Java和C#在性能上相對相同.像C#是編譯語言而Java是解釋性的,之類的聲明只是商業技巧.Java的中間代碼和MSIL都是中間的匯編形式的語言,它們在運行時或其它的時候被編譯成機器代碼.
命名空間中的申明
當你創建一個程序的時候,你在一個命名空間里創建了一個或多個類.同在這個命名空間里(在類的外面)你還有可能聲明介面,枚舉類型和結構體.必須使用using關鍵字來引用其他命名空間的內容.
基本的數據類型
C#擁有比C,C++或者Java更廣泛的數據類型.這些類型是bool, byte, ubyte, short, ushort, int, uint, long, ulong, float, double,和decimal.像Java一樣,所有這些類型都有一個固定的大小.又像C和C++一樣,每個數據類型都有有符號和無符號兩種類型.與Java相同的是,一個字元變數包含的是一個16位的Unicode字元.C#新的數據類型是decimal數據類型,對於貨幣數據,它能存放28位10進制數字.
兩個基本類
一個名叫object的類是所有其他類的基類.而一個名叫string的類也像object一樣是這個語言的一部分.作為語言的一部分存在意味著編譯器有可能使用它--無論何時你在程序中寫入一句帶引號的字元串,編譯器會創建一個string對象來保存它.
參數傳遞
方法可以被聲明接受可變數目的參數.預設的參數傳遞方法是對基本數據類型進行值傳遞.ref關鍵字可以用來強迫一個變數通過引用傳遞,這使得一個變數可以接受一個返回值.out關鍵字也能聲明引用傳遞過程,與ref不同的地方是,它指明這個參數並不需要初始值.
與COM的集成
C#對Windows程序最大的賣點可能就是它與COM的無縫集成了,COM就是微軟的Win32組件技術.實際上,最終有可能在任何.NET語言里編寫COM客戶和伺服器端.C#編寫的類可以子類化一個以存在的COM組件;生成的類也能被作為一個COM組件使用,然後又能使用,比方說,JScript語言子類化它從而得到第三個COM組件.這種現象的結果是導致了一個運行環境的產生,在這個環境里的組件是網路服務,可以用任何.NET語言子類化.
索引下標
一個索引與屬性除了不使用屬性名來引用類成員而是用一個方括弧中的數字來匿名引用(就像用數組下標一樣)以外是相似的.
public class ListBox: Control
{
private string[] items;
public string this[int index]
{
get
{
return items[index];
}
set
{
items[index] = value;
Repaint();
}
}
}
可以用一個循環器來匿名引用字元串內部數組成員,就像下面這樣:
ListBox listBox = ...;
listBox[0] = hello;
Console.WriteLine(listBox[0]);
代理和反饋
一個代理對象包括了訪問一個特定對象的特定方法所需的信息.只要把它當成一個聰明的方法指針就行了.代理對象可以被移動到另一個地方,然後可以通過訪問它來對已存在的方法進行類型安全的調用.一個反饋方法是代理的特例.event關鍵字用在將在事件發生的時候被當成代理調用的方法聲明. C#(讀做 C sharp)是微軟公司在去年六月發布的一種新的編程語言,並定於在微軟職業開發者論壇(PDC)上登台亮相.C#是微軟公司研究員Anders Hejlsberg的最新成果.C#看起來與Java有著驚人的相似;它包括了諸如單一繼承,界面,與Java幾乎同樣的語法,和編譯成中間代碼再運行的過程.但是C#與Java有著明顯的不同,它借鑒了Delphi的一個特點,與COM(組件對象模型)是直接集成的,而且它是微軟公司.NET windows網路框架的主角.
微軟c#語言定義主要是從C和C++繼承而來的,而且語言中的許多元素也反映了這一點.C#在設計者從C++繼承的可選選項方面比Java要廣泛一些(比如說structs),它還增加了自己新的特點(比方說源代碼版本定義).但它還太不成熟,不可能擠垮Java.C#還需要進化成一種開發者能夠接受和採用的語言.而微軟當前為它的這種新語言大造聲勢也是值得注意的.目前大家的反應是:這是對Java的反擊.
C++,這個詞在中國大陸的程序員圈子中通常被讀做「C加加」,而西方的程序員通常讀做「C plus plus」,它是一種使用非常廣泛的計算機編程語言。C++是一種靜態數據類型檢查的,支持多重編程範式的通用程序設計語言。它支持過程序程序設計、數據抽象、面向對象程序設計、泛型程序設計等多種程序設計風格。
貝爾實驗室的本賈尼·斯特勞斯特盧普(w:en:Bjarne Stroustrup)博士在20世紀80年代發明並實現了C++(最初這種語言被稱作「C with Classes」)。一開始C++是作為C語言的增強版出現的,從給C語言增加類開始,不斷的增加新特性。虛函數(virtual function)、運算符重載(operator overloading)、多重繼承(multiple inheritance)、模板(template)、異常(exception)、RTTI、名字空間(name space)逐漸被加入標准。1998年國際標准組織(ISO)頒布了C++程序設計語言的國際標准ISO/IEC 14882-1998。遺憾的是,由於C++語言過於復雜,以及他經歷了長年的演變,直到現在(2004年)只有少數幾個編譯器完全符合這個標准。
另外,就目前學習C++而言,可以認為他是一門獨立的語言;他並不依賴C語言,我們可以完全不學C語言,而直接學習C++。根據《C++編程思想》(Thinking in C++)一書所評述的,C++與C的效率往往相差在正負5%之間。所以有人認為在大多數場合C++ 完全可以取代C語言。
C++語言發展大概可以分為三個階段:第一階段從80年代到1995年。這一階段C++語言基本上是傳統類型上的面向對象語言,並且憑借著接近C語言的效率,在工業界使用的開發語言中占據了相當大份額;第二階段從1995年到2000年,這一階段由於標准模板庫(STL)和後來的Boost等程序庫的出現,泛型程序設計在C++中占據了越來越多的比重性。當然,同時由於Java、C#等語言的出現和硬體價格的大規模下降,C++受到了一定的沖擊;第三階段從2000年至今,由於以Loki、MPL等程序庫為代表的產生式編程和模板元編程的出現,C++出現了發展歷史上又一個新的高峰,這些新技術的出現以及和原有技術的融合,使C++已經成為當今主流程序設計語言中最復雜的一員。 這世界上沒有什麼比編程工具更加牽動程序員的心。VC、VB、DELPHI、JAVA……這些耀眼的名字不僅占據了程序員的生活,而且似乎已經成為了某種信仰。可是,伴隨著新世紀的腳步,這些信仰又一次遭遇了重大的挑戰。微軟,這頭被法官和黑客們折騰得既疲憊又惱怒的獅子,發誓要保住它頭上的王冠,拼盡全力,拿出了看家的本事——.NET戰略。作為 .NET的核心開發語言,C# 順理成章地浮出了水面。程序員們也就不得不做出一個痛苦的選擇,跟在誰的後面?要找出答案就不得不作一番比較和預測。筆者作為一個資深的程序員,斗膽在此狂言,權作拋磚引玉。
如果拋開一切非技術方面的因素,C# 無疑是這個星球上有史以來最好的編程語言,它幾乎集中了所有關於軟體開發和軟體工程研究的最新成果。面向對象、類型安全、組件技術、自動內存管理、跨平台異常處理、版本控制、代碼安全管理……你不可能在另外的一種語言中找到所有這些特性。盡管像很多人注意到的一樣,當我羅列上述特性時,總是讓人想到JAVA,然而C# 確實走得更遠。但現實的情況是,非技術的因素往往更能決定一個產品的未來,尤其在計算機軟體的歷史上,技術卓越的產品,如OS/2、Mac OS、UNIX等,都敗在了Windows那漂亮的臉蛋兒下。而這一次,微軟的角色好像從一個赤手空拳的革命者變成了仗勢欺人的老地主,如果真是要變天,那C# 這孩子豈不是投錯了胎?可能情形並非如此糟糕,畢竟瘦死的駱駝比馬大,而且C# 已經提交給了一個標准化組織,一旦成了國際標准,說不準真有哪個手癢的大俠(也有可能是微軟自己)給移植到Linux 和別的平台上。那樣的話,JAVA可就慘了。因為JAVA的用戶主要是網路服務的開發者和嵌入式設備軟體的開發者,嵌入式設備軟體不是C# 的用武之地,而在網路服務方面,C# 的即時編譯和本地代碼Cache方案比JAVA虛擬機具有絕對的性能優勢。何況C# 一旦成為一個像C++ 一樣的公共的標准,軟體開發商既可以省去JAVA的許可證費用,也不必擔心成為微軟的奴隸,那些反微軟的人士和主張廠商獨立的人士可能也不會有什麼意見。這可能正是微軟所期待的。
如果把C# 和 JAVA 在網路服務領域的爭奪比作未來制空權的爭奪的話,那麼C# 和傳統通用快速開發工具——VB、DELPHI等的較量將是地地道道的白刃戰。可能最慘的程序員就是VB程序員,在微軟,VB就像離任的柯林頓,不但失去了所有的光輝,而且亂事纏身。想想吧,VB6寫的項目必須用轉換工具轉換成基於.NET的代碼才能在VB7中調入,幾乎面目全非。由於VB7遵循為迎合.NET而建立的通用語言規范(CLS),幾乎把所有原來只在C++、JAVA等語言中可以運用的特性統統加了進來,只是語法和原來兼容。如果你是第一次在VB7中看到自己的舊VB6項目轉換之後的代碼,一定要當心你的心臟!所以,努力吧,別告訴我你將就此退休。DELPHI的狀況也好不到哪裡去,原來的看家本領是做起應用來又快又好,可現在看看最新的Beta 1, 你會感到如此熟悉,眾多的屬性列表、組件……誰讓你窮呢,連總設計師都養不住。
其實在編程語言中真正的霸主多年來一直是C++,所有的操作系統和絕大多數的商品軟體都是用C++作為主要開發語言的。JAVA的程序員絕大多數也是C++的愛好者,PHP的成功裡面也有類似C++的語法的功勞。在操作系統、設備驅動程序、視頻游戲等領域,C++在很長的時間內仍將占據主要地位,而在數量最大的應用軟體的開發上,C# 很可能取代C++的位置。首先,C# 和JAVA一樣,簡直就是照搬了C++的部分語法,因此,對於數量眾多的C++程序員學習起來很容易上手,另外,對於新手來說,比C++要簡單一些。其次,Windows是目前占壟斷地位的平台,而開發Windows應用,當然微軟的聲音是不能忽略的。最重要的是,相對於C++,用C# 開發應用軟體可以大大縮短開發周期,同時可以利用原來除用戶界面代碼之外的C++代碼。
但是,C# 也有弱點。首先,在一些版本較舊的Windows平台上,C# 的程序還不能運行,因為C# 程序需要 .NET運行庫作為基礎,而 .NET運行庫作為現在的的Windows(XP及以後版本)的一部分發行, Windows Me 和 Windows 2000用戶只能以Service Pack的形式安裝使用。其次,C# 能夠使用的組件或庫還只有 .NET 運行庫等很少的選擇,沒有豐富的第三方軟體庫可用,這需要有一個過程,同時各軟體開發商的支持也很重要。第三,JAVA的成功因素里有一些是反微軟陣營的吹捧,雖然「只寫一次,到處運行」只是一句口號,但畢竟已經是一種成熟的技術。而C# 的鼓吹者目前只有名聲不佳的微軟,且只能運行在Windows上。實際上這兩種語言都不是不可替代的,理智的說,對軟體開發商而言,什麼用的最熟什麼就是最好的工具。尤其對C++的使用者,C# 沒有帶來任何新東西,因為.NET運行庫在C++中也可以使用,沒有要換的絕對的理由。
綜上所述,我個人認為,近幾年,C# 將不可避免地崛起,在Windows平台上成為主角,而JAVA將在UNIX、Linux等平台上成為霸主,C++ 將繼續在系統軟體領域大展拳腳。非常有意思的是,這些語言的語法極其接近,因為JAVA和C# 都是由C++發展而來的。其他的開發工具當然還會在相當長的時間里繼續他們的旅程,不過在市場份額上,將不可避免地受到沖擊。
❹ 安卓7.1有哪些新功能 安卓7.1系統新功能介紹
ndroid 7.1屬於Android N平台的一個版本
產品性能
Android N主要在運行時和圖形處理上做了更新。運行時間上,Android N對編譯器進行了優化,軟體的運行時間提升了3-6倍。引入了一個全新的JIT編譯器,使得App安裝速度快了75%,編譯代碼的規模減少了50%。
圖形處理方面,N加入了一個新的圖形工具Vulkan,可以幫助游戲的視覺體驗更加出色,並減少對CPU的要求。
Android N支持Vulkan API,包括其全部特性,尤其是能夠降低CPU系統開銷,提升描繪指令,應用編譯與安裝方面,Android N不會一股腦地全部進行AOT預先編譯,而是結合JIT實時編譯、混合編譯,都針對每個應用進行優化,可大大提升應用安裝速度、性能、存儲和能效,號稱安裝速度比現在快最多75%。
產品安全
Android N現在支持全新的文件加密模式,可以對單獨的文件進行加密,而不是一個應用或者是一個壓縮包。同時加密在Android啟動時就開始了,保證了「盲點」時間的安全。
新的Android N在升級時會實現無縫的下載固件、自動升級,系統在後台主動下載升級固件,並在用戶下一次重啟手機時自動升級系統,沒有了煩人的提升和強制升級,尷尬症不會再犯了。
產品功能
功能方面,Android N更多的是在用戶操作的便捷性上做了一些提升,加入了全新的原生分屏多任務功能,並且加入了多任務快速切換功能,幫助用戶解決在兩個任務之間頻繁切換的問題。
新的 Android N 系統將增加一個「清除所有」的按鍵來幫助用戶快速退出所有已經打開的應用程序。對於用戶較長時間未使用的應用程序,Android N 將會自動關閉。
總來說更新的東西不多,基本和安卓6.X也就是Andrid M差別不大 估計設備審計率不會太高