當前位置:首頁 » 編程軟體 » 編譯器移植的難度

編譯器移植的難度

發布時間: 2022-05-27 15:11:23

『壹』 匯編語言編程幾乎不能移植,而C/C++等就容易移植 有點搞不明白

匯編語言,和機器語言一樣,是直接控制硬體的。
每種CPU,都有自己的機器語言,所以匯編不能移植。
c語言,並不直接控制硬體。
在不同的機器上,有相應的編譯軟體,可以把C,編譯成自己系統的機器語言。
容易移植的關鍵:C語言是不直接控制硬體的。

『貳』 開發一個 C++ 編譯器的難度有多大,難點又在哪裡

C++的前端是出了名的復雜度和可靠性要求並駕齊驅的軟體。

(這兩點都比它高一個數量級的大概就只有OS了)

對於這種系統,唯一的辦法就是燒錢。

燒錢的作用主要包括:
1.留人;
2.填坑;
3.買買買。

先說留人:復雜度一般是「細節」的代名詞。現實中的編譯器大多數以遞歸下降為主,自底向上的歸納推導為輔。這兩樣在教科書上也就是幾頁紙的事情。但是現實總是很殘酷的,人們總想讓語言更加「易用」,這就意味著各種上下文相關的情況都會出現。

對於C++來說,你要判斷一個符號是類型或者變數(比如這個符號被用在模板參數中),要看前面的聲明/定義。這就是一個上下文相關的推導。然後你就會寫大量的if else switch case之類的代碼來解決各種各樣的可能分支。寫它的人當然知道它是做什麼的,但是如果這個人離職了,新來一個人,就呆掉了,這寫的都是什麼煞筆玩意兒。因為它不知道現實中怎樣的需求會導致奇形怪狀的邏輯。所以人員的穩定,對於這種長周期迭代、邏輯復雜的項目是很重要的。但是人的水平要求高嗎?不算高也不算低。總結來說就是:有邏輯,知好歹。技術什麼都可以培養,但是態度和基本智商是比較難培養起來的。

至於怎麼保證人員穩定?很簡單:加薪。

再說填坑:編譯器是對正確性要求很高的基礎軟體。這里的正確性既包括產生的代碼的正確性,也包括編譯器自身對於各種問題的容忍度和足夠豐富的錯誤提示。容錯和錯誤提示本身也是代碼,也有很大的出錯幾率。所以這些軟體,bug少不了。但是作為基礎軟體,你又不能隨便就2+3搞成了2*3,這樣還怎麼讓別人相信愛情。所以要燒很多錢來養一幫debugger。

再說買買買:古人日:我們不用很麻煩很辛苦也可以成佛。既然這么費神我們自己做干什麼,不如買別人的吧。於是MS就乾脆不自己做了,直接去EDG整了個前端,這樣就可以少了不少人年。這就是傳統土豪和水果這種新暴發戶想的不一樣的地方。

傳統土豪想的是:我們有這么多錢為什麼還要自己解決問題呢?買買買!
水果新貴則是:啊呀,不小心有了這么多錢,我們要不要給自己製造點問題好把這些錢花出去?

『叄』 編譯器 可移植性問題

你用tc編的程序,在windows下面可以運行,tc把它編譯成二進制了

只要是windows系統,都能識別該二進制,換了其他的windows系統的電腦,以都能運行的

也就是說,對於windows系統來說,無論你用什麼語言,如pascal,delphi,c++,java,只要你編譯後生成了可執行文件

把它放到其他windows系統的電腦上,也都可以運行的

但是,就算是同一台電腦,如果你既安裝了windows,又安裝了linux
你在windows下編譯出來的可執行文件,切換到linux系統下,就不能運行了

當然了,如果放在其他的系統上,如手機的symbian系統上,也是不能運行的

補充回答:
生成的二進制文件的移植性,是由操作系統,如windows,linux保證的

而我們說的c語言的移植性,是指c語言源碼能否在其他系統上編譯
比如我在windows環境下,寫了一段c代碼,放到linux下,仍然可以編譯,這就說明它的移植性很好

所以,要提供c語言的移植性,必須使用標準的c的代碼
如果你調用了windows的api,那麼在linux下,是無法編譯通過的

『肆』 操作系統內核和編譯器哪個難度更大

整體而言,是同級別的難,但難點各有側重。
若論演算法,編譯器更難,而且難不止一個級別。操作系統的演算法難度只能算一般水平。
但是操作系統涉及的東西更多,本身結構更復雜,硬體處理也更加復雜。

『伍』 關於代碼移植的問題

你可以這么考慮:
VC中的代碼是基於WIN的,移植後的代碼是基於XX的。
都會有一個封裝層來屏蔽硬體的細節。
對於上層應用來講,會基於一些良好的API來編程。而這些API都會是相似的名字。比如兩個平台都會有內存操作的函數,也許都有memcpy這樣的關鍵字。方便使用和記憶。
從這個角度講,可能不同平台的編譯器連接器造成的代碼差異要大於硬體細節的差異。

當然了,如果是做內存管理這樣需要和硬體細節打交道的模塊。這個模塊流程,設計上的差異就很明顯了。這樣的部分,一般都稱為移植層。這個層變動是最大的。這個層也就是前面說的「封裝層」。

『陸』 為什麼高級語言程序比匯編語言程序更容易從一種計算機移植到另一種計算機上

高級語言使用了編譯器的不可移植性來實現了語言的可移植性,意思就是他們公司為每個操作系統寫了個編譯器,編譯過後形成該系統中可以運行的東西,當然可以運行了。而製作匯編那公司如果沒有別的編譯器來適應不同的操作系統,就不能編譯。

『柒』 C語言編譯器移植問題

樓主既要使用C語言編譯器,又想使用C++編譯器的話,編碼風格要使用標准C語言的風格,這樣C++同時可以兼容。


VC6編譯報錯可能是如下原因:

1、局部變數的定義和初始化必須在函數的最開始,不能放在函數的中間部分

2、scanf_s函數的使用,scanf_s並不是標準的庫函數,有些編譯器並沒有該函數,推薦使用scanf函數,雖然不太安全


VS2013運行錯誤可能是如下原因:

1、很多帶「_s」後綴的函數是為了讓原版函數更安全,傳入一個和參數有關的大小值,避免引用到不存在的元素,有時hacker可以利用原版的不安全性黑掉系統。比如:char d[20];寫成scanf_s("%s",d,20);才是正確的,有這個參數20使准確性提高。既然使用了scanf_s函數,就不能單純的寫scanf_s(" %s [%d][%d]", s, &m, &n);,就需要對%s制定可以輸入的最大字元才行


intm,n;//局部變數放在函數的最開始
chars[6];
intsize=4;
void*p;
int*q;
inti,j;

printf("請定義一個二維數組,格式如下:int[3][4] ");
printf("數組類型只限於int,char,float,int*,char* ");
printf("請只在聲明數據類型和數據之間輸入空格! ");
printf("本程序容錯性很差,請按照要求謹慎操作! ");

scanf_s("%s[%d][%d]",s,5,&m,&n);//s,5,指明s最多接收5個字元

p=malloc(size*m*n);
q=(int*)p;
memset(p,1,size*m*n);

『捌』 如何給CPU移植編譯器

如果連GCC都不支持你的CPU的話,我勸你不要在上面花功夫了,不是一般人做得出來的,也不是一天兩天做得出來的,相當於你要從頭實現一次GCC中的匯編處理和連接處理,而首先要了解相關CPU的指令集,機器碼,然後再談別的。

所謂交叉編譯環境都是指在GCC所支持的CPU的情況下,才能建立。

一個編譯器有編譯程序的時候,大概要經歷預處理,語法,詞法分析,優化,產生中間代碼,編譯,連接等過程,如果是一套GCC都不支持的CPU,預處理,語法,詞法分析,優化過程可以跟與它差不多的CPU共享同樣的過程,但產生中間代碼,編譯連接與具體的CPU有很大的相關性

我們現在舉一個例子來說明:比如我們建立一個支持ARM的交叉編譯環境
這個例子你與所說的要求還有一定區別(因為GCC支持ARM),不過通過這個例子可以引申出你需要做的事情,第一件要做的事情用在PC機上的GCC來編譯一套用於ARM的編譯工具,就是所謂的bilutils工具,包括用於ARM晶元的as,ld等程序,第二件事情就是用第一步中所產生的那套工具來編譯GCC(用於ARM的),第三件事是用第二步所產生的工具來編譯GLIBC庫,當然,你也許還需要它對C++的支持,那麼就得再編譯對C++的支持,比如G++,STL庫等

而LZ現在要做的工作除了上述要求之外,還有最重要的工作要做,就是在GCC中加入產生as,ld等工具的代碼,很顯然,這個工作量巨大,而且很難,比如你寫一個最簡單的C文件,裡面僅聲明一個整型變數,此時你自巳的編譯器在前期處理階段與x86沒什麼區別,可以照抄,那麼如何讓它變成機器碼呢?這就是你需要做的工作,我沒有做過類似的工作,在這里僅是建議,你需要去深入理解GCC源碼,然後再加入你自己的實現,我想你加入的部分比起整個GCC來說,應該是非常少的,因為你可以共享很多與體系無法的代碼。

『玖』 把應用程序移植到PowerLinux容易嗎

:難易取決於應用程序的特點,但通常來說移植很簡單容易。移植後,真正的工作可能是優化那些性能敏感的程序,特別包含了編譯器和不可移植,平台依賴的代碼,這兩種特性增加移植時間。

看更特殊的,作為答案,我們可以把應用程序分組和深入描述它們移植的可能性,如下:

· Java和開源結構的程序可以「直接運行」在PowerLinux上。

o 不論用Java還是腳本語言比如PHP或者Perl寫的程序可以「直接運行「在PowerLinux上。Java調試指南已經發布用於給這些程序有效地運行在Power系統上提供幫助。

o RedHat和SUSE為Power發布的版本中最流行的開源應用程序如Apache,Tomcat,MySQL,Squid,Postfix,等,可「直接運行」於PowerLinux。

· 用GNU工具編譯的客戶程序(C/C++等)通常需要在PowerLinux伺服器上簡單地從新編譯一下。如果這些程序避免含有特殊代碼比如匯編語言,那麼它們同樣可以「直接運行」

o 我們最新的Eclipse基於PowerLinux 軟體開發工具包 (SDK) 提供給X86 Linux開發者一個非常熟悉的環境。很多用戶報告重新編譯非常快,也就幾分鍾。源於IBM花費數年來研發開發工具。

o SDK也提供移植工具(比如IBM的Chiphopper program)來幫助移植過程和性能調優工具用於移植後工作。

o 另外,SDK也提供最新和最快的GNU工具和庫文件套裝,稱為PowerLinux高級工具鏈

o Porting to Linux on Power wiki網頁是開始這個過程的最佳地方。

· IBM SWG可用於PowerLinux的應用程序每月都在增加。這些程序可以用於多平台和操作系統,包括PowerLinux.

o SWG維護下面的網站,以提供SWG平台支持的產品的最新列表。比如如何搜索Power上的RHEL或者SUSE版本和在軟體產品兼容報告網站上生成能支持的應用程序的PDF列表

o 使用軟體產品兼容報告的更多細節請參閱PowerLinux定位程序 wiki網頁。

· PowerLinux第三方ISV程序集每月也在增加,主要圍繞跟大數據量程序,工業程序和開源結構有關的ISV。

o 這些程序在合作夥伴全球解決方案目錄鏈接中維護更新。更多使用全球解決方案目錄的細節可為PowerLinux定位程序 wiki網頁找到。

o 如果應用程序不可用於PowerLinux,IBM有一些程序幫助ISV遷移他們的程序,包括:

§ 有銷售前景的快速移植

§ Chiphopper提供免費科技協助和X86 Linux到PowerLinux的移植工具

§ 為遠程訪問PowerLinux伺服器的虛擬租賃程序( Virtual Loaner Program),移植工具和技術支持資源

§ IBM為本地,在線訪問上述資源的創新中心

『拾』 既然大部分語言都具有移植性,為什麼現在的應用程序依然有很大的平台局限性

比較上層的語言(通常是腳本語言)不太受系統環境的影響,這也就是為什麼同一款瀏覽器插件可以在不同系統的瀏覽器上運行的原因。

相反,比較底層的語言(C,匯編語言等)受制於硬體介面,如果你認真學習過硬體方面的知識的話你就會知道不同的系統對同一個硬體IO的命令是不一樣的,而這個不一樣不只是二進制機器語言上的不同,而是源代碼就有很大的區別。例如UNIX環境下網路編程使用套接字通常調用<sys/socket.h>下的函數,而windows環境下根本沒有這個頭文件。 如果一款底層編寫的程序不需要任何處理就可以移植到另一個平台上,那麼說明它幾乎沒有怎麼使用高級硬體IO,也就是說它基本沒什麼用。。。。

熱點內容
南通哪裡有賣密碼鎖的 發布:2024-05-03 11:22:01 瀏覽:522
除法指演算法 發布:2024-05-03 11:21:23 瀏覽:844
h265壓縮 發布:2024-05-03 11:20:27 瀏覽:490
手機相機自拍時怎麼看是否存儲 發布:2024-05-03 11:08:49 瀏覽:544
安卓手機怎麼登蘋果手機上的號 發布:2024-05-03 10:48:54 瀏覽:694
壓縮求極限 發布:2024-05-03 10:43:54 瀏覽:950
有向圖遍歷演算法 發布:2024-05-03 10:43:06 瀏覽:961
收縮資料庫的影響 發布:2024-05-03 10:27:24 瀏覽:743
python同步文件 發布:2024-05-03 10:27:19 瀏覽:782
磁碟不能存儲 發布:2024-05-03 10:27:14 瀏覽:52