導航:首頁 > 源碼編譯 > 編譯的底層是什麼

編譯的底層是什麼

發布時間:2022-07-23 22:35:23

❶ 軟體編寫的底層是C++與應該用層用java是什麼意思啊求解釋,什麼叫做底層和應用層

底層就是後台運行的部分
應用層就是前台界面,我們能看到,能操作的部分。

比如一個人員管理系統:
底層訪問資料庫啊,邏輯判斷啊,都用C++完成,這樣速度快
應用層呢,用Java實現,這樣控制項豐富,界面漂亮。

編譯和操作系統哪個更底層

操作系統就是C語言編譯出來的,你問的這兩個東西其實是一個東西。

❸ 請問編程中的 上層 和 底層 是什麼意思 比如有人說 "游戲用JAVA或c#做上層,用匯編或c/

上層(或者是表層)、中間層和底層沒有嚴格意義上的定義,在不同的項目中需要結合具體需求來具體分析。

一般來說,表層就是指展現給用戶看的部分;而底層就是系統的最核心的部分。一般我們認為,越接接硬體的編程就越底層。

比如,一個在線通訊軟體(QQ這種),表層就是窗口啊、菜單啊、按鈕啊這些玩意兒;中間層是業務邏輯部分,就是你點擊這些按鈕會產生相應的什麼事件,進行了什麼操作;底層就是Socket網路通信了。當然,我這里這三層是大致劃分的,實際開發中比這個要更具體詳細。

再比如,拿題主說的游戲舉例子,表層就是各種游戲的界面了;底層就是游戲引擎了。底層幹嘛?接收你的滑鼠鍵盤響應信號、操作顯卡在顯示器指定位置生成各種二維的三維的圖像、控制音效卡輸出音頻等等等等。

至於編程語言問題,這就牽扯到低級語言和高級語言的問題了。一般來講低級語言和高級語言區別在於:

越低級的語言,形式上越接近機器指令(匯編語言就是與機器指令一一對應的)。而越高級的語言,一條語句對應的指令數越多,其中原因就是高級語言對底層操作進行了抽象和封裝,使編寫程序的過程更符合人類的思維習慣,並且極大了簡化了人力勞動。也就是說你用高級語言寫一句,會被轉換成許多底層操作,大部分的工作交給了負責轉換的機器(即編譯器),從而人力得到了解放。因為機器就是用來為人類提供便利的,所以說高級語言的出現是計算機發展的必然結果。(參考:http://blog.csdn.net/guoxiaoqian8028/article/details/9103151)這就產生了執行效率的問題。

所以說用 C/C++ 這類語言更適合寫游戲引擎。游戲嘛,必定是要求響應速度極高的,總不能按完鍵盤了等100毫秒才響應,生成個三維地圖電腦卡半天。但一般不會游戲的所有部分都用 C/C++ 來完成,為什麼?上面說了,可維護性差、可移植性差。這時候就需要用面向對象這種「高級語言」出馬了。

至於題主提到的「不同語言之間的互通」,建議題主理解一下「介面」(不是面向對象里的「介面類型」)的概念。

泛泛而談,希望對題主有所幫助。

❹ C/C++最底層是怎麼實現的

許多同學可能在學習C++的時候,都會感到一定的困惑,繼承到底是怎樣分配空間的,多態到底是如何完成的,許許多多的問題,必須挖掘到C++底層處理機制,才能搞明白。有許多C程序員也並不認同C++,他們認為C++龐大又遲緩,其更重要的原因是,他們認為「C++是在你的背後做事情」。的確,C++編譯器背著程序員做了太多的事情,所以讓很多不了解其底層機制的人感到困惑。想成為一個優秀的程序員,那麼這樣的困惑就不應該存在,只有了解了底層實現模型,才能寫出效率較高的代碼,自信心也比較高。
我們先從一個簡單但有趣的例子談起。有如下的4個類:
class X {};
class Y : public virtual X {};
class Z : public virtual X {};
class A : public Y, public Z {};
上面的4個類中,沒有任何一個類里含明顯的數據,之間只是表示了繼承關系,那麼如果我們用sizeof 來測量它們的大小,將會得到什麼結果呢?
你可能會認為,既然沒有任何數據和方法,大小當然為0,而結果肯定會出乎你的意料,即使是class X 的大小也不為0。
在不同的編譯器上,將會得到不同的結果,而在我們現在最常用的VC++編譯器上,將得到如下的結果:
sizeof X 的結果是 1 。
sizeof Y 的結果是 4 。
sizeof Z 的結果是 4 。
sizeof A 的結果是 8 。
驚訝嗎?那麼為什麼會得到這樣的結果?讓我們一個一個來分析。
對於一個空的class,事實上並不是空的,它有一個隱晦的1 byte ,那是被編譯器安插進去的一個char 。這使得這個class 的兩個對象得以在內存中配置獨一無二的地址,這就是為什麼 sizeof X 的結果是 1。
那麼Y和Z呢,怎麼會佔用 4 byte ?其實它們的大小受到三個因素的影響:
1. 語言本身所造成的額外負擔:當語言支持多態時,就會導致一些額外負擔。在派生類中,這個額外負擔表現在一個指針上,它是用來指向一個被稱作「虛函數列表」的表格。而在VC++編譯器上,指針的大小正好是 4 byte 。
2. 編譯器對於特殊情況所提供的優化處理:在class Y 和 class Z 中,也將帶上它們因為繼承class X 而帶來的 1 byte ,傳統上它被放在派生類的固定部分的尾端。而某些編譯器(正如我們現在所討論的VC++編譯器)會對空的基類提供特殊的處理,在這個策略下,一個空的基類被視為派生類對象最開頭的一部分,也就是說它並沒有花費任何額外空間(因為既然有了成員,就不需要原本為了空類而安插一個char了),這樣也就節省了這 1 byte 的空間。事實上,如果某個編譯器沒有提供這種優化處理,你將發現class Y 和 class Z 的大小將是8 byte ,而不僅僅是5 byte 了,原因正如下面第3點所講。
3. 「對齊」(Alignment)機制:在大多數機器上,群聚的結構體大小都會受到alignment的限制,使它們能夠更有效率地在內存中被存取。Alignment 就是將數值調整到某數的整數倍。在32位計算機上,通常alignment 為 4 byte(32位),以使匯流排達到最大的「吞吐量」,在這種情況下,如上面所說,如果 class Y 和class Z 的大小為 5 byte ,那麼它們必須填補 3 byte ,最終得到的結果將是 8 byte 。是不是開始感謝VC++編譯器幸好有這樣的優化機制,使得我們節約了不少內存空間。
最後,我們再來看看 class A ,它的大小為什麼是 8 byte ?顯而易見,它繼承了class Y 和class Z ,那麼它的大小直接就把 class Y 和class Z 的大小加起來就夠了。真有這么簡單嗎?實際上這只是一個巧合而已,這是因為之前編譯器的優化機制掩蓋這里的一些事實。對於沒有優化的 class Y 和class Z 來說,他們的大小都是8 byte ,那麼繼承了它們兩個的 class A 將是多大呢?16 byte?如果你有這樣的編譯器試一下的話,你會發現答案是12 byte 。怎麼會是12 byte 呢?記住,一個虛擬繼承的基類只會在派生類中存在一份實體,不管它在 class 繼承體系中出現了多少次!class A的大小由下面幾部分決定:

l 被大家共享的唯一一個 class X的實體,大小為1 byte。
l 基類class Y 的大小,減去因虛擬繼承的基類class X而配置的大小,也就是4 byte 。基類class Z的演算法相同,它們加起來就是8 byte 。
l class A自己的大小,0 byte 。
l class A 的alignment的大小(如果有的話)。前述三項的總和是9 byte ,那麼調整到4 byte的整數倍,也就是12 byte 。
我們前面討論的VC++編譯器得出的結果之所以是8 byte ,是因為 class X 實體的那1 byte被拿掉了,於是額外的3 byte也同樣不必了,因此就直接把class Y 和class Z的大小加起來,得到8 byte 。
這個例子看懂了嗎?是不是對C++的底層機制開始感興趣了?那麼我們再來舉一個同樣有趣的例子。
有這樣一個類:
class A {
private:
int a;
char b;
char c;
char d;
};
它的大小是多少呢?
如果你有記得我之前提到的alignment機制的話,你應該會猜到它的大小是8 byte 。的確如此,int a佔用4 byte ,char b , char c 和char d各佔1 byte ,加起來是7 byte ,再加上alignment額外帶來的1 byte ,總共是8 byte 。
瞧,就是這么簡單,那麼現在我們把裡面的成員變數換換位置,如下:
class A {
private:
char d;
int a;
char b;
char c;
};
我們將char d拿到第一個位子,放在int a之前。那麼現在你能告訴我class A的大小是多少呢?你肯定不會再猜8 byte了,因為你會覺得這與上面似乎有些不同,但你不能肯定到底是多大。不敢確定的時候就去試試吧,原來是12 byte ,這又是怎麼回事呢?同樣的類,只是改變了成員變數的位子,怎麼就會多出4 byte的存儲空間?其實這一切又是由變數的存儲規則造成的。對於一個類來說,它裡面的成員變數(這里單指非靜態的成員變數)是按聲明的順序存儲在內存空間中的。在第一種的情況中,它們緊緊的排列在一起,除了由於alignment所浪費的1 byte空間外,它們幾乎用了最小的存儲空間;而在第二種情況中,它們則不是排列得那麼緊密了,錯誤就在於char d ,它一個人就佔用了4 byte 。為什麼它會佔用4 byte呢,其實責任也不全在它,後面的int a也有不可推卸的責任。Int 型數據在VC++編譯器中正好是佔用4 byte的,等於一個alignment量,而這4 byte一定是密不可分的。當char d佔用了1 byte後,其後空出了3 byte(對於一個alignment量來說),而一個int型數據不能被拆成3 byte +1byte來存儲,那樣編譯器將無法識別,因此int a只有向後推到下一個alignment的開始,這樣char d就獨佔了4 byte ,中間有3 byte浪費掉了。而後面的char b和char c依舊緊密排列,最後又由於alignment調整2 byte ,整個類的大小就變為了12 byte 。
看了這個例子,是不是該反省以前隨意定義成員變數了?如果你要定義一個含3個int型數據和4個char型數據的類,本來最優化的方法只需要16 byte ,而你卻隨意的定義成如下的樣子:
class F{
private:
char c1;
int i1;
char c2;
int i2;
char c3;
int i3;
char c4;
};
看看結果是什麼,這個類竟然要佔據28 byte的空間,比剛才整整大了12 byte!
再來看看繼承的時候,成員變數是怎樣存放的。我們將第2個例子中的class A 改成三層的繼承模式,或許我們在做項目中,真的會遇到這樣的情況。
class A1{
private:
int a;
char b;
};
class A2: public A1{
private:
char c;
};
class A3:public A2{
private:
char d;
};
現在我們來預測一下class A3 的大小,是8 byte嗎?不,結果竟是16 byte ,竟然整整多了1倍。這是為什麼呢?按照成員變數的排列順序,int a,char b,char c,char d應該緊密的排列在一起,8 byte沒錯。但事實並非如此,這些都是因為繼承而造成的。知道「在繼承關系中,基類子對象在派生類中會保持原樣性」嗎?或許這樣專業的一句話,你並不能明白是什麼意思,那麼聽我下面的分析。在為派生類分配內存空間的時候,都是先為基類分配一塊內存空間,而所謂的「原樣性」是指基類原本在內存空間中是什麼樣子,那麼它在派生類里分配的時候就是什麼樣子。拿這個例子來說,class A1占據了8 byte的空間,其中int a佔4 byte ,char b佔1 byte ,因alignment而填補3 byte 。對於class A1來說,占據8 byte空間沒什麼好抱怨的,但是class A2呢?輕率的程序員會認為,class A2隻在class A1的基礎上增加了唯一一個char c ,那麼它應該會和char b綁在一起,佔用原本用來填補空間的1 byte ,於是class A2的大小是8 byte,其中2 byte用於填補空間。然而事實上,char c是被放在填補空間所用的3 byte之後,因為在class A2中分配的class A1應該完全保持原樣,於是class A2的大小變成12 byte ,而不是8 byte了,其中有6 byte浪費在填補空間上。相同的道理使得class A3 的大小是16 byte ,其中9 byte用於填補空間。
那麼也許你會問,既然「原樣性」會造成這樣多的空間浪費,那麼編譯器為什麼還要這樣做呢?其實這樣做是有它的必要的。我們考慮下面這種情況:
A1* pA1=new A1();
A1* pA2=new A2();
*pA1=*pA2;
我們定義了兩個A1型指針,一個指向A1對象,一個指向A2對象。現在我們執行一個默認的復制操作(復制一個個的成員變數),那麼這樣一個操作應該是把pA2所指的對象的A1那部分完全復制到pA1所指的對象里。假設編譯器不遵循「原樣性」,而是將派生類的成員和基類的成員捆綁在一起存放,去填補空間,那麼這樣的操作變會產生問題了。A1和A2都佔8 byte ,pA2會將其所指的8 byte空間里的內容全部復制給pA1所指的對象,那麼pA1所指的對象本來只有2個數據,3 byte的填補空間,而復制後卻變成了3個數據,2 byte的填補空間了,對於char c ,我們並不想把它復制過來的。這樣完全破壞了原語意,而這樣引起的bug幾乎是無法察覺的。

❺ 計算機系統層次結構中最底層的是什麼

計算機系統層次結構中最底層的是機器語言層,也有說是計算機硬體系統、機器硬體。計算機系統層次結構,指的是計算機系統由硬體和軟體兩大部分所構成,而如果按功能再細分,可分為7層。其中最底層的是硬聯邏輯級。第零級是硬聯邏輯級,這是計算機的內核,由門,觸發器等邏輯電路組成。

計算機系統是由硬體和軟體組成的層次式結構,硬體系統是計算機層次結構的最內層,使用計算機系統的用戶是該層次結構中的最外層,用戶與硬體系統之間的軟體系統包括系統軟體,支援軟體和應用軟體三部分 。

把計算機系統按功能分為多級層次結構,就是有利於正確理解計算機系統的工作過程,明確軟體,硬體在計算機系統中的地位和作用。

(5)編譯的底層是什麼擴展閱讀:

計算機按功能細分為7層,從第0層到第6層分別是:

硬聯邏輯級

第零級是硬聯邏輯級,這是計算機的內核,由門,觸發器等邏輯電路組成。

微程序級

第一級是微程序級。這級的機器語言是微指令集,程序員用微指令編寫的微程序,一般是直接由硬體執行的。

傳統機器級

第二級是傳統機器級,這級的機器語言是該機的指令集,程序員用機器指令編寫的程序可以由微程序進行解釋。

操作系統級

第三級是操作系統級,從操作系統的基本功能來看,一方面它要直接管理傳統機器中的軟硬體資源,另一方面它又是傳統機器的延伸。

匯編語言級

第四級是匯編語言級,這級的機器語言是匯編語言,完成匯編語言翻譯的程序叫做匯編程序。

高級語言級

第五級是高級語言級,這級的機器語言就是各種高級語言,通常用編譯程序來完成高級語言翻譯的工作。

應用語言級

第六級是應用語言級,這一級是為了使計算機滿足某種用途而專門設計的,因此這一級語言就是各種面向問題的應用語言。

❻ 請教javascript、Java、C++、C的底層編程語言分別是什麼

javascript是腳本語言,在客戶端運行,有個解釋器,wscript,應該是microsoft vc++寫的.至於VC版本是多少應該是看你的計算機系統.java底層是C語言C的底層是匯編語言.其實都是由匯編語言寫的底層,然後逐層往上面翻譯。

❼ Java的底層是用什麼語言寫的

JVM 的話是 C++ 實現的。而c++則需要考慮效率,任何在windows下運行的程序,底層都是C/C++或者ASM,這是硬體指令系統決定的。
Java 類庫是 Java 實現的。java主要面向於實現。

❽ 什麼叫底層代碼

底層代碼是指被封裝好的代碼,底層代碼寫的就是比較原始,比較基礎的代碼。底層代碼編寫是非常接近機器的編程,使用底層開發語言(如C或匯編)。這與使用高級語言(例如Python,Java)的程序員進行編程不同。

對於java來說,底層代碼一般是指框架的實現代碼,這些代碼一般都是一些常用代碼或比較接近於原始的代碼,這些代碼封裝好,可以方便復用和調用。而對一些操作系統來說,底層代碼可能就是c或者匯編,寫底層代碼就是做底層開發。比如java的Map類,底層代碼實現:

(8)編譯的底層是什麼擴展閱讀

編寫底層代碼一般要比較深厚的功底,對程序設計,代碼涉及的各個方面,性能,耦合度,復用性都要很深的掌握和考慮,熟練掌握設計模式,良好的編程習慣,代碼優雅,數據結構,精通各種演算法。

很多java框架被淘汰,除了本身有致命的bug外,還有就是有性能更好,使用更方便的框架出現,而這些都是靠底層代碼實現來決定的。

❾ javascript、Java、C++、C的底層編程語言分別是什麼

javascript是腳本語言,在客戶端運行,有個解釋器,wscript,應該是microsoft vc++寫的.至於VC版本是多少應該是看你的計算機系統.java底層是C語言C的底層是匯編語言.其實都是由匯編語言寫的底層,然後逐層往上面翻譯。

閱讀全文

與編譯的底層是什麼相關的資料

熱點內容
鎖定伺服器是什麼意思 瀏覽:375
場景檢測演算法 瀏覽:607
解壓手機軟體觸屏 瀏覽:338
方舟pv怎麼轉伺服器 瀏覽:99
數據挖掘中誤差值演算法函數 瀏覽:118
php開發套件 瀏覽:190
伺服器的spi板是什麼 瀏覽:896
解壓縮全能王中文密碼是什麼 瀏覽:80
javaftp伺服器上傳文件 瀏覽:103
演算法設計中文版pdf 瀏覽:81
視頻壓縮形式怎麼改 瀏覽:368
perl程序員 瀏覽:789
電子表格對比命令 瀏覽:610
php循環輸出數組內容 瀏覽:750
電腦加密能不能強制關掉 瀏覽:616
趣味單人解壓桌游 瀏覽:212
oppo手機谷歌伺服器無法核實什麼 瀏覽:320
軟體怎麼加密華為 瀏覽:222
掃地機怎麼安裝app 瀏覽:319
考研結合特徵值計演算法 瀏覽:517