導航:首頁 > 源碼編譯 > ada程序如何編譯

ada程序如何編譯

發布時間:2022-06-15 17:49:56

A. Ada語言的簡介

Ada的出現,標志著軟體工程成功地進入了國家和國際的規模。在一定意義上說,Ada還刺破了「馮.諾依曼思維模式」 (Von Newman Mind-set) 的桎梏,連同Ada的 支持環境(APSE)一起,形成了新一派的所謂 Ada文化。它是迄今為止 最復雜,最完備的軟體工具。 Ada語言是 美國國防部指定的 唯一的一種可用於 軍用系統開發的語言,我國軍方也將Ada做為軍內開發標准(GJB 1383《程序設計語言Ada》)。
-------------------------------------------------------------------------------- 美國國防部之所以把這種語言取名為Ada,是為了紀念奧古斯特. 艾達.洛夫萊斯伯爵夫人 (Augusta Ada Lovlace 1815-1852),她是英格蘭詩人拜倫(Byron)勛爵的女兒,曾對現代計算機技術之父查爾斯.巴貝奇(Charles Babage)的筆記,手稿進行了整理和修正。從某種意義上說,她是世界上第一位計算機程序員
-------------------------------------------------------------------------------- 在明白這個問題之前,需要了解 Ada 的一系列特性。Ada 最初設計就是一門大型語言,因此在很多編程的重要問題上都有所考慮,以下文字摘自《 Ada Reference Manual》:
Ada最初設計時關注於 3 個最重要的問題:程序的穩定性和可維護性,程序設計和人的行為接近,並且高效。這份語言的修訂版是為了提供更大的靈活性和擴展性,存儲管理的額外控制和同步,以及標准化的程序包以支持重要的應用程序領域,同時保留原來的重點:穩定性,可維護性,和高效。對於程序設計語言促進可靠性和簡化維護難度的需求已被確立。因此程序可讀性的重要性高於輕松地寫代碼。例如,語言規則要求程序變數應當明確聲明並指定它們的類型。由於變數的數據類型是不變的,編譯器可以確保對於變數的操作適用於該類型的對象。另外,有錯誤傾向的符號已經避免,並且語言語法避免了編碼形式的使用,使更傾向於英語的結構。最後,Ada 語言提供了程序單元單獨編譯的功能,使程序開發和維護簡便,同樣也提供了在一個單元內多個單元之間的檢測。考慮人類程序員的問題也在設計時被強調。總而言之,在繼續避免過多復雜句型的缺陷的同時,嘗試以一致系統的方式保持相對較少的底層概念。
------------------------------------------------------------------------------ Ada語言最早是針對嵌入式和實時系統設計的,並且在今天依然在這方面使用廣泛。Ada95版,是由INTERMETR ICS公司的塔克。塔夫特於92到95年間設計的,當時主要是希望改進對於系統,數字,財務軟體編程的支持。
Ada語言的重要特徵就是其嵌入式風格,模塊化設計,編譯檢查,平行處理,異常處理及泛型編程。Ada在95年加入了對面向對象設計的支持,包括動態分配等。
Ada的編譯檢查主要是針對沒有分配的內存讀寫的保護,堆棧溢出錯誤,單個錯誤空閑,隊列讀寫錯誤以及其他可以避免的小問題。這些檢查可以在為增加效率的情況下被取消,但是在編譯的時候他們卻能帶來很高的效率。同樣它也包括對程序的嚴正的設置。因為這些原因,它被廣泛應用於一些非常重要的系統中,例如航空電子學,武器及航天飛行器的操作系統中。同樣它支持很多的編譯時間檢查,這些檢查被用來避免一些錯誤的發生。這種錯誤往往是在其他語言中在運行以前都不能被察覺到的,需要在源碼中加入特殊的檢查設置才能被發現。
Ada的動態內存管理非常安全和高規格,它類似於java語言卻不同於C語言的。這種特殊功能並不需要特殊的運行設置。盡管這種語言的語意結構允許對於不能讀寫的目標進行自動的碎片搜集,但是大多數運行都不支持它。A da卻支持有限形式基於區域的存儲管理。無效的讀寫常在運行時候被檢查出來(除非這種檢測被人為關閉)並且有時候在編譯時候就被發現。
Ada語言的定義同國際標准化組織(ISO)的標准有很大不同,因為他是一個自由內容形式的。這種做法的後果是被廣大程序員只能從它的標准化文檔(普遍認為是Ada的參考使用手冊(ARM))尋找細節性的技術問題,但是普遍情況是一本標准教科書卻可以在其他不同語言上使用。 Ada語言由嚴格的巴斯特範式定義,但是不適合一般人閱讀.它是第一種同時擁有IEC/ISO/美國軍用標准認證的語言. 其編譯器經過嚴格的審查,以確保同樣的代碼在任一編譯器上產生同樣的可執行效果.並且保證並行性在代碼級可以在無操作系統下同樣運行.
Ada語言最初設計是為了構建長周期的、高度可靠的軟體系統。它提供了一系列功能來定義相關的數據類型(type) 、對象(object)和操作(operation)的程序包(package)。程序包可以被參數化,數據類型可以被擴展以支持可重用庫的構建。操作既可以使用方便的順序控制結構,通過子程序(subprogram)來實現,也可以通過包含並發線程同步控制的入口(entry)來實現。
Ada也支持單獨編譯(separate compilation),在物理層上支持模塊性。 Ada包含了很復雜的功能以支持實時(real-time),並發程序設計(concurrent programming)。錯誤可以作為異常(exception)來標示,並可以被明確地處理。
Ada也覆蓋了系統編程(system programming);這需要對數據表示和系統特性訪問的精確控制。最後,提供了預定義的標准程序包,包括輸入輸出、字元串處理、數值計算的基本函數和隨機數生成來。

B. 編程編程編程

太多啦,每種語言用途可能不一樣啊,有什麼好比的
還不讓抄連接,我給你寫到天亮啊

C. 為什麼開發出了這么多的編程語言

一個簡單的解釋:不同的領域有不同的需求!於是為了適應不同的應用場景,一個一個的編程語言誕生了。
對於科學和工程計算領域,要大量的處理數據的計算,如矩陣的計算,於是FORTRAN語言,就很好的適應了這一點;
對於數據需要能夠很好的查詢、修改等操作,可能SQL語言就是一個不錯的語言;
對於一些底層操作的需求,c和c++可能就很好的能夠適應這一點……

【譯文】程序語言簡史(偽)http://www.soimort.org/posts/160/
1801 - Joseph Marie Jacquard用打孔卡為一台織布機編寫指令,在掛毯上織出了「hello, world」字樣。當時的reddit網友對這項工作的反響並不熱烈,因為它既缺少尾遞歸調用,又不支持並發,而且甚至都沒有注意在拼寫時恰當地區分大小寫。

Jacquard織布機是第一台可進行程序控制的織布機。用打孔卡進行編程的概念,直到電子計算機被發明出來之後仍然被廣泛運用。
最早的Hello World程序(出自K&R C)列印的是全小寫的字元串:"hello, world"。
在許多英文技術社區里,不正確地使用大小寫發貼會被視作是小白的行為。(如把「python」拼作「python」,把「FreeBSD」拼作「freebsd」,把「Qt」拼作「QT」)
reddit / Hacker News的月經帖標題:「.*: a new .*-based .* programming language」。底下常見的回帖形式:「它支持並發嗎?」「沒有尾調用優化果斷差評。」「現在的編程語言已經足夠多了,為什麼我們還需要更多的語言?」……
1842 - Ada Lovelace寫了世界上第一個程序。她的努力只遇到了一點點小小的麻煩,那就是:實際上並沒有任何計算機能夠用來運行她的程序。後來的企業架構師們重新吸收了她的這個技能,用來學習如何更好地使用UML進行編程。

Ada Lovelace為Charles Babbage的分析機寫了一個計算伯努利數的演算法實現,因此被後世公認為是世界上第一個程序員。實際上,分析機由於其設計思想過於先進,在當時根本沒有被製造出來。(Babbage的分析機一般被認為是現代電子通用計算機的先驅)
諷刺現在的某些「軟體架構師」頂多隻會紙上談兵地畫畫UML。
1936 - Alan Turing發明了世間一切程序語言的最終形態,但很快他就被英國軍情六處「請」去當007了,以至於他根本來不及為這些語言申請專利。

與通用圖靈機(Universal Turing machine)等價的語言被稱為圖靈完備的(Turing completeness),它定義了「什麼樣的語言可以被稱作是程序語言」。
二戰期間Turing曾秘密地為英國軍方工作,破解德軍的Enigma密碼機,並在戰後被授予大英帝國勛章。但這項事實直到多年以後才向公眾公開。
1936 - Alonzo Church同時也發明了世間一切程序語言的最終形態,甚至做得更好。但他的λ演算被絕大部分人忽視了,因為它與C語言「不夠像」。盡管存在著這樣的批評,但事實上,C在當時還沒有被發明出來。

Church是Turing在Princeton的博士生導師,他在λ演算方面的工作先於Turing指出了不存在一個對可判定性問題的通用解法,這後來證明和Turing針對停機問題提出的圖靈機模型是等價的。即著名的Church-Turing論題。
說Church「甚至做得更好」,因為λ演算為後世所有的函數式語言提供了理論基礎。
現在一種常見的關於函數式編程的批評就是:「它們與C語言不夠像」。
1940年代 - 一些直接採用布線和開關來進行程序控制的「計算機」出現了。工程師們當時這么做,據說是為了避開「用空格還是用製表符縮進」這樣的論戰。

據說當時負責設計ENIAC的工程師中間曾經發生過這樣的爭論:
空格比製表符好。
製表符比空格好。
4個空格比8個空格好。
什麼?用2個空格的統統燒死。
關於這台具有里程碑意義的人類史上第一台電子計算機ENIAC上應該預裝何種編輯器,工程師們還發生過這樣的爭吵:
Vim比Emacs好!
Emacs比Vim好!
強烈推薦Sublime Text。
你丫用編輯器的都是找虐,IDE才是王道。
沒錯,要用就用世界上最好的公司微軟開發出來的世界上最好的IDE:Visual Studio。
我早就看透了無謂的編輯器論戰什麼的了,我要告訴樓上吵架的,你們全都是傻逼!
最後,工程師們一致決定使用布線和開關來為他們即將發明的計算機進行編程,機智地避開了所有這些無謂的爭吵,最終齊心協力創造出了人類歷史上第一台電子計算機:ENIAC。(鼓掌

(圖:兩位ENIAC程序員在運用敏捷開發方法進行愉快的結對編程。「自從拋棄伴隨我多年的Emacs和HHKB Pro、改用布線和開關進行編程之後,我的左手小指麻痹奇跡般地痊癒了。」其中一位接受采訪時如是說。另一位則表示:「新的編程方式讓曾經專注頸椎病20年的我得到了徹底的康復,不用再整天盯著顯示屏,身心同時得到了極大的放鬆,值得大力推廣!」)
1957 - John Backus和IBM發明了FORTRAN語言。關於IBM或FORTRAN並沒有什麼特別好笑的地方。除了,寫FORTRAN程序的時候不系藍領帶將被編譯器視作是一個syntax error。

藍領帶、白襯衫、深色西裝似乎是IBM公司20世紀經典的dress code。
早期FORTRAN(FORTRAN 77)對程序書寫格式的要求那是相當嚴格。(例如,蛋疼的固定格式縮進)
1958 - John McCarthy和Paul Graham發明了LISP。由於冷戰期間的戰略括弧資源儲備所造成的巨大成本,LISP從未流行過。盡管欠缺足夠的流行度,LISP(現在叫做「Lisp」,有時叫「Arc」)仍然被視作一門有影響力的語言,在關鍵的演算法思想諸如遞歸(recursion)和提升逼格(condescension)上尤為典範。
(原文的腳註:

幸運的是對於計算機科學來說,花括弧和尖括弧的供應尚充足。

「關鍵的演算法思想」這一說法來自於Verity Stob的Catch as catch can。)

戰略括弧儲備:據信是因為克格勃對於他們費盡千辛萬苦搜集到的程序片段全都是括弧感到極端憤怒,於是封鎖了世界各地的括弧礦產資源,導致白宮方面不得不加強戰略濃縮括弧的儲備。(誤
LISP發明的那一年Paul Graham其實還沒有出生。據說是因為某本叫做《Haste and Waste》的偽程裝黑聖典實在太有名了,以至於許多編程小白們把寫這本書的傳奇人物同Lisp之間畫上了等號。
提升逼格確實是一種與遞歸調用同樣關鍵的演算法思想。嗯,你懂的。
1959 - 在輸掉了和L. Ron Hubbard之間的一場打賭之後,Grace Hopper和其他幾個抖S發明了所謂的「面向Boilerplate的全大寫化語言(Capitalization Of Boilerplate Oriented Language,COBOL)」。多年以後,由於一些被誤導的、性別歧視主義者對Adm. Hopper關於COBOL的工作的報復,在Ruby技術會議上不時會看到一些厭女主義乃至仇視女性的材料出現。

L. Ron Hubbard是山達基教(Scientology)的創始人,二戰期間曾與Grace Hopper同樣供職於美國海軍。(尚不清楚這兩人之間有無其他聯系)
COBOL語言以代碼極其冗長和通篇大寫字母的書寫風格而聞名。
Adm. Hopper:Grace Murray Hopper女士的軍銜是Rear Admiral Lower Half,即美國海軍准將。
Ruby技術會議與性別歧視:在09年的GoGaRuCo會議上,有人做了一場題為「CouchDB perform like a pr0n star」的報告,幻燈片演示中使用了大量色情材料,引起了在場的少數女性觀眾的極大不適(「This was a national conference, not a gathering of teenager boys in a smelly upstairs bedroom!」)。會後,DHH(Ruby on Rails的作者)發推表示「it's "absolutely" appropriate to use porn in a business presentation」。關於其他更多技術會議上出現的性別歧視事件,參見這里。
1964 - John Kemeny和Thomas Kurtz創造了BASIC,一個為非計算機科學家設計的非結構化的程序語言。
1965 - Kemeny和Kurtz兩人goto到了1964。

調侃BASIC語言對行號和goto的無節制濫用。
1970 - Guy Steele和Gerald Sussman創造了Scheme。他們的工作導致了一系列以《Lambda之究極(Lambda the Ultimate)……》為標題開頭的論文發表,並在《Lambda之究極廚房神器》這一篇中達到了最高潮。以這篇論文為基礎,開始了一個長年累月的、收視率究極失敗的晚間電視購物節目。Lambda們因為其概念相對難以理解而被大眾所忽視,直到未來的某一天,Java語言終於讓它們變得有名了起來。通過不包含它們這件事情。

Lambda之究極神器系列:(Lambda之究極命令式編程、Lambda之究極宣告式編程、Lambda之究極GOTO語句、Lambda之究極Opcode)
Guy Lewis Steele, Jr. and Gerald Jay Sussman. "Lambda: The Ultimate Imperative"). MIT AI Lab. AI Lab Memo AIM-353. March 1976.
Guy Lewis Steele, Jr.. "Lambda: The Ultimate Declarative". MIT AI Lab. AI Lab Memo AIM-379. November 1976.
Guy Lewis Steele, Jr.. "Debunking the 'Expensive Procere Call' Myth, or, Procere Call Implementations Considered Harmful, or, Lambda: The Ultimate GOTO". MIT AI Lab. AI Lab Memo AIM-443. October 1977.
Guy Lewis Steele, Jr. and Gerald Jay Sussman. "Design of LISP-based Processors, or SCHEME: A Dielectric LISP, or Finite Memories Considered Harmful, or LAMBDA: The Ultimate Opcode". MIT AI Lab. AI Lab Memo AIM-514. March 1979.
後來大概有人覺得每次都投一篇正式的paper太麻煩了,於是乾脆專門開了一個博客,名字就叫做Lambda the Ultimate。這樣他們將來要發《Lambda之究極割草機》《Lambda之究極廁所皮拔子》這樣的營銷廣告就更加方便了。
長年累月的收視率究極失敗的晚間電視購物節目:也許是在暗諷MIT專注用SICP作為教給CS學生的第一門編程課20餘年。
眾Java程序員:聽說Java 8要開始支持lambda了,想來Java真是極先進的……等一下,我先看看lambda是個啥玩意?
於是lambda這個「新鮮貨」就一下子在主流業界變得流行起來了。
1970 - Niklaus Wirth創造了Pascal,一個過程式的語言。很快就有人開始聲討Pascal,因為它使用了類似「x := x + y」這樣的語法,而不是更為人熟知的類C語法「x = x + y」。盡管存在著這樣的批評,而事實上當時C還沒有被發明出來。
1972 - Dennis Ritchie發明了一把射擊時能同時向前和向後兩個方向發射子彈的絕世好槍。但他對此發明造成的致死和終身殘疾數量感到還不夠滿意,所以他又發明了C語言和Unix。

翻譯君:……
1972 - Alain Colmerauer設計了邏輯編程語言Prolog。他的目標是創造一個具有兩歲小孩智商的程序語言。為了證明他成功達到了這個目標,他展示了一個Prolog程序,它對於每條查詢都會機智地給出相同的回答:「No」。
Ask me anything!
?-
1973 - Robin Milner創造了ML,一個建立在M&M類型理論基礎上的語言。由ML衍生而來的SML加上了一套形式語義的規范。當被要求給這個形式語義本身書寫一套形式語義時,Milner的腦子爆掉了。其他ML家族的著名語言還包括OCaml,F#,和,Visual Basic。

SML的形式語義規范事實上被寫成了這樣一本書(SML'97):《The Definition Of Standard ML》。
ML明顯是建立在H-M(Hindley–Milner)類型推斷的基礎上的,不太清楚原文所說的M&M類型理論是在吐槽神馬……

Visual Basic近年來吸收了函數式編程里的不少東西(不知道是不是因為受到了F#影響的緣故)。最典型的是它具備和ML相似的類型推斷。
1980 - Alan Kay創造了Smalltalk並發明了「面向對象」這個詞。當被問到它的含義時,他回答道:「Smalltalk程序本身就是對象。」當被問到對象是由什麼組成時,他回答到:「對象。」當再一次被問到這個問題時,他說「看,它從里到外都是對象。直到你抽出一隻烏龜。」

Smalltalk的設計從很大程度上受到了Logo的影響。
1983 - 為了紀念偉大的先輩程序員Ada Lovelace那能夠寫出永遠也無法被執行的代碼的彪悍技能,Jean Ichbiah和美國國防部創造了Ada語言。盡管缺乏證據顯示有任何重要的Ada程序曾經被完成過,歷史學家仍然確信Ada是個成功的公益項目,它讓數以千計的國防承包商免於淪落為與黑幫為伍。

Ada曾經是美國國防部指定的嵌入式計算機系統唯一開發語言,在其研發上耗資巨大。(國防承包商們於是不用靠販賣軍火給黑幫來維持生計了)
雖然有充分的證據顯示Ada的整型範圍溢出檢查失敗導致弄壞了歐空局的一枚Ariane 5運載火箭,不過美國國防部發言人對此表示:關我P事。
1983 - Bjarne Stroustrup把他所聽說過的一切都試圖嫁接到C上,創造出了C++。最後得到的語言是如此地復雜,以至於程序必須被送到未來去讓「天網」人工智慧進行編譯。編譯時間難以容忍。天網開展這項服務的動機仍然不為人知,但來自未來的發言人說道:「沒什麼好擔心的,寶貝。」帶著一口奧地利腔的機械口音。有一些來自坊間的推測,所謂的天網只不過是個自命不凡的緩沖區溢出而已。

這篇文章寫出來的時候,一個被稱作C++0x的新標准還遙遙無期。許多編譯器對它的支持似乎永遠停留在「partial」階段。
請自行腦補終結者里的T-800……
無論什麼都改變不了C/C++是個經典的「緩沖區溢出語言」的事實。
1986 - Brad Cox和Tom Love創造了Objective-C,宣稱「該語言完美地結合了C的內存安全性與Smalltalk的神奇效率」。現在的歷史學家懷疑這兩人其實是誦讀障礙症患者。

「C的內存安全性十分好」。
Smalltalk編譯出來的程序以低效緩慢著稱。
1987 - Larry Wall在電腦前打了個盹,Larry Wall的腦門子壓到了鍵盤上。醒來之後,Larry Wall深信 ,在Larry Wall的顯示器上出現的神秘字元串並非是隨機的,那是某種編程語言之程序樣例的神諭。那必是上帝要他的先知,Larry Wall,去設計的。Perl語言就此誕生了。
1990 - 一個由Simon Peyton-Jones、Paul Hudak、Philip Wadler、Ashton Kutcher和善待動物組織(PETA)組成的委員會創造了Haskell,一種純函數式的、非嚴求值的語言。Haskell由於使用了Monad這種較費解的概念來控制副作用而遭到了一些批評意見。Wadler試圖平息這些質疑,他解釋說:「一個單子(Monad)說白了不過就是自函子范疇上的一個幺半群而已,這有什麼難以理解的?」

素食主義鼓吹者:為了獲取食物而不必要地殺死動物是邪惡的;「純函數式編程」鼓吹者:為了編程而引入不必要的副作用是邪惡的。
(科普帖)自函子說穿了就是把一個范疇映射到自身的函子,自函子范疇說穿了就是從小范疇映射到自身的函子所構成的以自函子為對象以自然變換為態射的范疇,幺半群說穿了就是只有單個對象的范疇,給定了一個幺半群則可構造出一個僅有單個對象的小范疇使其態射由幺半群的元素給出而合成由幺半群的運算給出,而單子說穿了就是自函子范疇上的這樣一個幺半群。(這都不理解么親連這種最基本的概念都不理解還學什麼編程!)

又:「A monad is a monoid in the category of endofunctors(一個單子是自函子范疇上的一個幺半群)」這句話的原出處據信是Mac Lane的這本書:

1991 - 荷蘭程序員Guido van Rossum為了一次神秘的手術而進行了一次阿根廷之旅。回來後他帶著一個巨大的顱疤,發明了Python,而被數以軍團計的追隨者們加冕為「終生大獨裁者」,並向全世界宣布「要辦到一件事情,只可有唯一的一種方法!」。整個波蘭陷入了恐慌。

BDFL(Benevolent Dictator for Life):開源社區一種流行的說法,「仁慈的」終生大獨裁者。這個說法最早指的就是Guido van Rossum。
希特勒在提出建立「純正的雅利安人國家」「統一的大德意志帝國」並實現了德奧合並之後,翌年便入侵了波蘭,引發了第二次世界大戰。「我一個人征服了整個歐洲!」(感覺好棒好棒的)
1995 - 在家門口附近的一個義大利飯館用餐時,Rasmus Lerdorf意識到他吃的那盤意麵正好是一個用來理解WWW萬維網的極好模型,而所有的Web應用都應該仿照它們的媒介那樣去做。在他的餐巾的背後,他設計出了著名的「可編程超鏈接Pasta(Programmable Hyperlinked Pasta,PHP)」語言。PHP的文檔至今仍然保留在那片餐巾上。

PHP最顯著的特點就是:代碼是可以直接嵌在HTML文檔中的。
1995 - 松本「Mad Matz」行弘創造出了Ruby語言,用來辟謠一些意味不明的、有關澳洲將會變成一片由莫霍克族戰士和Tina Turner統治的荒漠的末世預言。該語言後來被它的真正發明者David Heinemeier Hansson重新命名為Ruby on Rails。(關於某個叫松本行弘的人發明了一種叫做Ruby的語言這件事情從未發生過,最好在這篇文章的下一個版本中刪掉。 - DHH表示)

最早關於Ruby的國際會議不是RubyConf,而是每年在澳大利亞舉辦的OSDConf。
這里應該是在吐槽Ruby的殺手級應用Ruby on Rails實在太有名了,以至於超越了原來的Ruby語言本身。
Matz並沒有為「Ruby」這個名字注冊商標——本著開源的黑客精神。
而DHH(RoR的作者)卻把「Ruby on Rails」這個(包含了「Ruby」字樣的)名稱注冊成了商標,並且阻止別人未經授權使用「Rails」這個名字。
(雖然搶注商標對開源來說未必是一件壞事情——Python基金會今年在歐洲還捲入了一場商標之爭了不是)
假如你從來沒聽說過的話,莫霍克族戰士據說是像這個樣子的:

而Tina Turner看起來是這個樣子的:

1995 - Brendan Eich讀完了歷史上所有在程序語言設計中曾經出現過的錯誤,自己又發明了一些更多的錯誤,然後用它們創造出了LiveScript。之後,為了緊跟Java語言的時髦潮流,它被重新命名為JavaScript。再然後,為了追隨一種皮膚病的時髦潮流,這語言又被命名為ECMAScript。

WAT!Wat — Destroy All Software Talks
JavaScript和Java語言沒有任何實質上的聯系;就像ECMAScript和Eczema(濕疹)沒有任何實質上的聯系一樣。(Brendan Eich曾表示:「ECMAScript was always an unwanted trade name that sounds like a skin disease.」)
但很多人覺得其實JavaScript設計中包含的錯誤還不夠多,本著為程序語言的設計貢獻更多錯誤這樣的目的,他們群策群力創造出了更多的、JavaScript中未曾成功涵蓋的錯誤。這兒有一個五花八門的列表,以供有志於為程序語言設計的謬誤史添磚加瓦的人們參考。
1996 - James Gosling發明了Java。Java是一個相對繁冗的、帶垃圾收集的、基於類的、靜態類型的、單分派的面向對象語言,擁有單實現繼承和多介面繼承。Sun不遺餘力地宣傳著Java的獨一無二不同凡響之處。
2001 - Anders Hejlsberg發明了C#。C#是一個相對繁冗的、帶垃圾收集的、基於類的、靜態類型的、單分派的面向對象語言,擁有單實現繼承和多介面繼承。微軟不遺餘力地宣傳著C#的獨一無二不同凡響之處。
2003 - 一個叫Martin Odersky的醉漢看見了好時瑞森花生醬杯的廣告,展示了某個人的花生醬倒入另一個人的巧克力的場景,他忽然有了個點子。他創造了Scala,一種結合了面向對象和函數式編程的語言。這同時激怒了兩個陣營的忠實信徒,他們立刻宣布要發動聖戰燒死異教徒。

D. Ada語言的特點

專業人員往往要讀很多程序,因此要避免像 APL 那種以過於簡單的符號編程的語言,雖然它們的編程速度快,但基本上是不可讀的。因此目前有種說法是:讀一個程序比寫類似的程序還要費時,這也是有一定道理的;特別是 C/C++ 的風格比較鬆散,很多語法都在濫用,使程序可讀性相當低,由於 Ada 的語法接近人的語言,即使是初學者,也不會感到很難讀懂。
強類型---保證了每個對象有明確定義的值域,並防止了不同概念的邏輯混淆。許多錯誤可以被編譯器發現,而對於其它語言來說,則可能導致一個不正確的程序。 將數據描述的細節同基於該類型數據的操作相分離,以提高可移植性和可靠性。
多任務---使程序變成一系類的並發活動,而不是單一的順序活動;這在很多領域,特別是對於伺服器程序來說有重要意義,這比調用操作系統提供的功能更有易可移植性和可靠性。 很多情況下,程序的某邏輯部份與運行時值的類型無關。因此,需要提供一種機制,從一個樣板中產生多個相應的程序段,以提高代碼的可重用性。
大型編譯---封裝機制,單獨編譯及程序包的分層機制等對於編寫大規模的程序來說是必不可少的。
Ada語言的"Hello,world!" 示常式序
一個Ada語言編寫的"你好世界"Hello world program程序:
withAda.Text_IO;
procereHello isbegin
Ada.Text_IO.Put_Line("Hello, world!");
end Hello;
在Ada.Text_IO.Put_Line處有一些快捷圖標,不需要很多的文字輸入,但是對於這里的理解來講並沒有多大意義。
細節性的問題請參考Ada Programming/Basic。

E. 和C++相比,用ADA編程是怎樣的體驗

Ada語言是美國國防部指定的 唯一的一種可用於 軍用系統開發的語言。
Ada語言的重要特徵就是其嵌入式風格,模塊化設計,編譯檢查,平行處理,異常處理及泛型編程。
缺點:啰嗦;優點:強類型,高性能,自帶並發,面向對象,等等。
C++定義class,在Ada里要定義成Package,一樣的哪些函數/過程/數據結構要公開,哪些要隱藏。當然沒有類的繼承了。C++模仿了Ada的類屬,成為了所謂的模版template,還從Ada模仿了異常處理。用Ada語言主要還是為了它內建的多任務並發

F. 如何用GCC編譯(在UNIX或Linux環境下)Ada和Java文件

ada使用gnat命令
java使用gcj命令
c用gcc
c++用g++

這些都是gcc...........

G. C語言文件的編譯與執行的四個階段並分別描述

開發C程序有四個步驟:編輯、編譯、連接和運行。

任何一個體系結構處理器上都可以使用C語言程序,只要該體系結構處理器有相應的C語言編譯器和庫,那麼C源代碼就可以編譯並連接到目標二進制文件上運行。

1、預處理:導入源程序並保存(C文件)。

2、編譯:將源程序轉換為目標文件(Obj文件)。

3、鏈接:將目標文件生成為可執行文件(EXE文件)。

4、運行:執行,獲取運行結果的EXE文件。

(7)ada程序如何編譯擴展閱讀:

將C語言代碼分為程序的幾個階段:

1、首先,源代碼文件測試。以及相關的頭文件,比如stdio。H、由預處理器CPP預處理為.I文件。預編譯的。文件不包含任何宏定義,因為所有宏都已展開,並且包含的文件已插入。我歸檔。

2、編譯過程是對預處理文件進行詞法分析、語法分析、語義分析和優化,生成相應的匯編代碼文件。這個過程往往是整個程序的核心部分,也是最復雜的部分之一。

3、匯編程序不直接輸出可執行文件,而是輸出目標文件。匯編程序可以調用LD來生成可以運行的可執行程序。也就是說,您需要鏈接大量的文件才能獲得「a.out」,即最終的可執行文件。

4、在鏈接過程中,需要重新調整其他目標文件中定義的函數調用指令,而其他目標文件中定義的變數也存在同樣的問題。

H. 誰會ADA語言,高分請求

如果你用GNAT的話(我不相信你用其他的),就很簡單:
g++ -fmp-ada-spec -C xxx.h -DXLIB_ILLEGAL_ACCESS(最後這個參數可有可無,但這個參數可以保留更多有用的宏)
用-fmp-ada-spec生成的文件未必全部可以export過來。值得注意的是,雖然g++和gcc也可以這樣,但是用gcc生成會生成一些不兼容的東西,還是用g++吧,具體見http://gcc.gnu.org/onlinedocs/gcc-4.7.0/gnat_ugn_unw/Running-the-binding-generator.html#Running-the-binding-generator
我寫了一些例子:
header.h
class Test_t {
private:
int v;
public:
Test_t();
Test_t(int);
virtual void show() const;
int get() const;
~Test_t();
};

header.cpp
#include <iostream>
#include "header.h"
Test_t::Test_t() :v(1) { std::cout << "Default Constructor.\n"; }
Test_t::Test_t(int i) :v(i) { std::cout << "Param Constructor.\n"; }
void Test_t::show() const
{ std::cout << this << "\tv = " << this->v; }
int Test_t::get() const { return v; }

main.adb
with header_h;
with Ada.Text_IO;
with Interfaces.C;
use header_h.Class_Test_t;

procere Main is
package C_IO is new Ada.Text_IO.Integer_IO (Num => Interfaces.C.int);

Object_1 : aliased Test_t;
-- 調用默認構造函數
Object_2 : aliased Test_t := New_Test_t (7);
-- 調用以值傳遞、一個int類型參數的構造函數。
begin
C_IO.Put (Item => get (Object_1'Access), Width => 0);
Ada.Text_IO.New_Line;
show (Object_2'Access);
end Main;

g++ -fmp-ada-spec header.h -C -DXLIB_ILLEGAL_ACCESS
g++ -c header_h.ads -Ofast -s 最後兩個參數可有可無
g++ -c main.adb -Ofast -s 也可有可無
gnatbind -x main
gnatlink main.ali header.o --LINK=g++
生成的程序的執行結果是:
Default Constructor.
Param Constructor.
1
0x24efed8 v = 7

執行成功,像iostream這樣復打的頭文件也可以成功,在輸出(export)不是很困難的情況下,應該都是會成功

I. 什麼是ADA

Ada是一種表現能力很強的通用程序設計語言,它是美國國防部為克服軟體開發危機,耗費巨資,歷時近20年研製成功的。它被譽為第四代計算機語言的成功代表。與其他流行的程序設計語言不同,它不僅體現了許多現代軟體的開發原理,而且將這些原理付諸實現。因此,Ada語言的使用可大大改善軟體系統的 清晰性, 可靠性, 有效性, 可維護性。
Ada的出現,標志著軟體工程成功地進入了國家和國際的規模。在一定意義上說,Ada還刺破了「馮.偌依曼思維模式」 (Von Newman Mind-set) 的桎梏,連同Ada的 支持環境(APSE)一起,形成了新一派的所謂 Ada文化。它是迄今為止 最復雜,最完備的軟體工具。 Ada語言是 美國國防部指定的 唯一的一種可用於 軍用系統開發的語言,我國軍方也將Ada做為軍內開發標准(GJB 1383《程序設計語言Ada》)。
--------------------------------------------------------------------------------
-- 為什麼稱作 Ada --
美國國防部之所以把這種語言取名為Ada,是為了紀念奧左斯特. 艾達.洛夫萊斯伯爵夫人 (Augusta Ada Lovlace 1815-1852),她是英格蘭詩人拜倫(Byron)勛爵的女兒,曾對現代計算機技術之父查爾斯.巴貝奇(Charles Babage)的筆記,手稿進行了整理和修正。從某種意義上說,她是世界上第一位計算機程序員。
--------------------------------------------------------------------------------
-- 為什麼使用 Ada? --
在明白這個問題之前,需要了解 Ada 的一系列特性。Ada 最初設計就是一門大型語言,因此在很多編程的重要問題上都有所考慮,以下文字摘自《 Ada Reference Manual》:
Ada最初設計時關注於 3 個最重要的問題:程序的穩定性和可維護性,程序設計和人的行為接近,並且高效。這份語言的修訂版是為了提供更大的靈活性和擴展性,存儲管理的額外控制和同步,以及標准化的程序包以支持重要的應用程序領域,同時保留原來的重點:穩定性,可維護性,和高效。對於程序設計語言促進可靠性和簡化維護難度的需求已被確立。因此程序可讀性的重要性高於輕松地寫代碼。例如,語言規則要求程序變數應當明確聲明並指定它們的類型。由於變數的數據類型是不變的,編譯器可以確保對於變數的操作適用於該類型的對象。另外,有錯誤傾向的符號已經避免,並且語言語法避免了編碼形式的使用,使更傾向於英語的結構。最後,Ada 語言提供了程序單元單獨編譯的功能,使程序開發和維護簡便,同樣也提供了在一個單元內多個單元之間的檢測。考慮人類程序員的問題也在設計時被強調。總而言之,在繼續避免過多復雜句型的缺陷的同時,嘗試以一致系統的方式保持相對較少的底層概念。
------------------------------------------------------------------------------
ada的特性:
易讀性---專業人員往往要讀很多程序,因此要避免像 APL 那種以過於簡單的符號編程的語言,雖然它們的編程速度快,但基本上是不可讀的。因此目前有種說法是:讀一個程序比寫類似的程序還要費時,這也是有一定道理的;特別是 C/C++ 的風格比較鬆散,很多語法都在濫用,使程序可讀性相當低,由於 Ada 的語法接近人的語言,即使是初學者,也不會感到很難讀懂。
強類型---保證了每個對象有明確定義的值域,並防止了不同概念的邏輯混淆。許多錯誤可以被編譯器發現,而對於其它語言來說,則可能導致一個不正確的程序。
異常處理---實際中,一個程序不可能保證它的正確性;因此,通過異常機制及分塊結構,將錯誤發生的影響控制在某一特定領域。
抽象數據類型---將數據描述的細節同基於該類型數據的操作相分離,以提高可移植性和可靠性。
多任務---使程序變成一系類的並發活動,而不是單一的順序活動;這在很多領域,特別是對於伺服器程序來說有重要意義,這比調用操作系統提供的功能更有易可移植性和可靠性。
類屬單元---很多情況下,程序的某邏輯部份與運行時值的類型無關。因此,需要提供一種機制,從一個樣板中產生多個相應的程序段,以提高代碼的可重用性。
大型編譯---封裝機制,單獨編譯及程序包的分層機制等對於編寫大規模的程序來說是必不可少的。
Ada語言的"世界,你好!" 示常式序
一個Ada語言編寫的"你好世界"Hello world program程序:
with Ada.Text_IO; procere Hello isbegin Ada.Text_IO.Put_Line("Hello, world!");end Hello;
在Ada.Text_IO.Put_Line處有一些快捷圖標,不需要很多的文字輸入,但是對於這里的理解來講並沒有多大意義。細節性的問題請參考Ada Programming/Basic。

J. Ada語言的宏語言

Ada語言自身並不支持宏。但是強大的GCC卻同樣的可以為Ada語言提供宏支持。我們可以使用GCC預處理程序CPP來先進行對包含宏的源文件進行處理,輸出到文件,然後將該輸出文件讀取並除去以#開頭的行即獲得了標準的Ada代碼。
CPP命令:
CPP SOURCE_FILE RECORD_FILE
接著需要自己寫一個處理程序來去除CPP輸出文件中的#開頭的行。
--文件讀取函數:
type LPSTR is access all string;
-- Load a file by file-name into memory,return pointer
function Load(fn:in string) return LPSTR is
use ada.streams;
use ada.streams.stream_io;
type LPSEA is access all STREAM_ELEMENT_ARRAY;
PRAGMA WARNINGS(OFF);
function UC is new ada.unchecked_conversion(LPSEA,LPSTR);
PRAGMA WARNINGS(ON);
FILE:FILE_TYPE;
SIZE:COUNT;
DATA:LPSEA:=NULL;
begin
open(FILE,IN_FILE,fn);
SIZE:=STREAM_IO.SIZE(FILE);
DATA:=NEW STREAM_ELEMENT_ARRAY(1..STREAM_ELEMENT_OFFSET(SIZE));
READ(FILE,DATA.ALL,STREAM_ELEMENT_OFFSET(SIZE));
CLOSE(FILE);
RETURN UC(DATA);
exception when NAME_ERROR=>
GNAT.IO.PUT_LINE("Error : Can not find the file: "&fn);
return null;
end Load;
_____________________________________________________________
--去除#行函數:函數將指定文件名文件讀出,除去#行並輸出到指定文件名。
-- with ada.streams.stream_io; use ada.streams.stream_io;
-- with ada.unchecked_deallocation;
procere clear(input_file:in string;output_file:in string) is
src:lpstr:=load(input_file);
procere Free is new ada.unchecked_deallocation(string,LPSTR);
file:ada.streams.stream_io.file_type;
stream:ada.streams.stream_io.stream_access;
i:integer:=0;
begin
if src/=null then
loop
i:=i+1;
if src(i)='#' then
loop
src(i):=' '
i:=i+1;
exit when i>src'last or src(i)=ASCII.LF;
end loop;
end if;
exit when i>=src'last;
end loop;
create(file,out_file,output_file);
stream:=ada.streams.stream_io.stream(file);
string'write(stream,SRC.all);
close(file);
Free(SRC);
end if;
end clear;
___________________________________________________________
在經過除去#行獲得最終處理過的文件後即可交由GNAT編譯了。

閱讀全文

與ada程序如何編譯相關的資料

熱點內容
知網程序員 瀏覽:702
怎麼把電子版投標報價加密 瀏覽:29
電腦安全編譯器 瀏覽:364
在伺服器里如何調創造 瀏覽:835
知雲登錄為什麼找不到伺服器 瀏覽:815
python切片位置 瀏覽:375
平板加密視頻怎麼播放 瀏覽:377
程序員上下班不帶電腦 瀏覽:835
androidrsa文件 瀏覽:64
linuxlvds 瀏覽:103
程序員選擇職場 瀏覽:345
累加C語言演算法 瀏覽:948
足浴店用什麼app招人 瀏覽:191
php調用thrift 瀏覽:191
java精度丟失 瀏覽:903
地梁承台相交處箍筋加密 瀏覽:95
程序員繪本 瀏覽:647
php線程安全版 瀏覽:407
lilolinux 瀏覽:111
proteus51編譯工具 瀏覽:309