導航:首頁 > 源碼編譯 > 巴科斯範式編譯工具

巴科斯範式編譯工具

發布時間:2023-03-19 19:31:06

❶ 模糊測試 對代碼質量影響深遠的技術

年 月 日

模糊測試(Fuzz testing )是一項對代碼質量有著深遠影響的簡單技術 在本文中 Elliotte Rusty Harold 故意將隨機的壞數據插入應用程序 以觀察發生的結果 他也解釋了如何使用如校驗和 XML 數據存儲及代碼驗證等防護性編碼技術 來加固您的程序以抵制隨機數據 他以一個練習進行總結 在練習中他以一個代碼破壞者的角度進行思考 —— 這是一種用於防護代碼的至關重要的技術

多年來 我驚嘆於有如此大量能夠使 Microsoft Word 崩潰的壞文件 少數位元組錯位 會使整個應用程序毀於一旦 在舊式的 無內存保護的操作系統中 整個計算機通常就這樣宕掉了 Word 為什麼不能意識到它接收到了壞的數據 並發出一條錯誤信息呢?為什麼它會僅僅因為少數位元組被損壞就破壞自己的棧 堆呢?當然 Word 並不是惟一一個面對畸形文件時表現得如此糟糕的程序

本文介紹了一種試圖避免這種災難的技術 在模糊測試中 用隨機壞數據(也稱做 fuzz)攻擊一個程序 然後等著觀察哪裡遭到了破壞 模糊測答行試的技巧在於 它是不符合邏輯的 自動模糊測試不去猜清滑嘩測哪個數據會導致破壞(就像人工測試員那樣) 而是將盡可能多的雜亂數據投入程序中 由這個測試驗證過的失敗模式通常對程序員來說是個徹底的震憾 因為任何按邏輯思考的人都不會想到這種失敗

模糊測試是一項簡單的技術 但它卻能揭示出程序中的重要 bug 它能夠驗證出現實世界中的錯誤模式並在您的軟體發貨前對潛在的應當被堵塞的攻擊渠道進行提示

模糊測試如何運行

模糊測試的實現是一個非常簡單的過程

    准備一份插入程序中的正確的文件 用隨機數據替換該文件的某些部分 用程序打開文件 觀察破壞了什麼

可以用任意多種方式改變該隨機數據 例如 可以將整個文件打亂 而不是僅替換其中的一部分 也可以將該文件限制為 ASCII 文本或非零位元組 不管用什麼方式進行分割 關鍵是將大量隨機數據放入應用程序並觀察出故障的是什麼

測試基於 C 的應用程序當字元串包含額外的零時 許多用 C 編寫的程序都會出問題 —— 這類問題太過頻繁以至於額外的零能夠徹底隱藏代碼中其他的問題 一旦驗證出程序存在零位元組問題 就可以移除它們 從而讓其他的問題浮現出來

可以手動進行初始化測試 但要想達到最佳的效果則確實需要採用自動化模糊測試 在這種情況下 當面臨破壞輸入時首先需要為應用程序定義適當的錯誤行為 (如果當輸入數據被破壞時 您發現程序正常運行 且未定義發生的事件 那麼這就是第一個 bug )隨後將隨機數據傳遞到程序中直到找到了一個文件 該文件不會觸發適當的錯誤對話框 消息 異常 等等 存儲並記錄該文件 這樣就能在稍後重現該問題 如此重復

盡管模糊測試通常需要一些手動編碼 但還有一些工具能提供幫助 例如 清單 顯示了一個簡單的 java&# ; 類 該類隨機更改文件的特定長度 我常願意在開始的幾個位元組後面啟動讓山模糊測試 因為程序似乎更可能注意到早期的錯誤而不是後面的錯誤 (您的目的是想找到程序未檢測到的錯誤 而不是尋找已經檢測到的 )

清單 用隨機數據替換文件部分的類

import java io *; import java security SecureRandom; import java util Random; public class Fuzzer { private Random random = new SecureRandom(); private int count = ; public File fuzz(File in int start int length) throws IOException { byte[] data = new byte[(int) in length()]; DataInputStream din = new DataInputStream(new FileInputStream(in)); din readFully(data); fuzz(data start length); String name = fuzz_ + count + _ + in getName(); File fout = new File(name); FileOutputStream out = new FileOutputStream(fout); out write(data); out close(); din close(); count++; return fout; } // Modifies byte array in place public void fuzz(byte[] in int start int length) { byte[] fuzz = new byte[length]; random nextBytes(fuzz); System array(fuzz in start fuzz length); } }

關於代碼我可以用很多種方式優化 清單 中的代碼 例如 有著 java nio 的內存映射文件是一個相當不錯的選擇 我也能夠改進這個錯誤處理及可配置性 因為不想讓這些細節混淆這里所要說明的觀點 所以我將代碼保持了原樣

模糊測試文件很簡單 將其傳至應用程序通常不那麼困難 如 AppleScript 或 Perl 腳本語言通常是編寫模糊測試的最佳選擇 對於 GUI 程序 最困難的部分是辨認出應用程序是否檢測出正確的故障模式 有時 最簡單的方法是讓一個人坐在程序前將每一個測試通過或失敗的結果都標記下來 一定要將所有生成的隨機測試用例單獨地命名並保存下來 這樣就能夠重現這個過程中檢測到的任何故障

防護性編碼

可靠的編碼遵循了這樣的基本原則 絕不會讓程序中插入未經過一致性及合理性驗證的外部數據

如果從文件中讀入一個數字並期望其為正數 那麼 在使用其進行進一步處理前對其先驗證一下 如果期望字元串只包含 ASCII 字母 請確定它確實是這樣 如果認為文件包含一個四位元組的整數倍的數據 請驗證一下 一定不要假設任何外部提供的數據中的字元都會如您所料

最常見的錯誤是做出這樣的假設 因為程序將該數據寫出 該程序就能不用驗證再一次將該數據讀回去 這是很危險的!因為該數據很可能已經被另一個程序在磁碟上復寫過了 它也可能已經被一個故障磁碟或壞的網路傳輸所破壞了或已經被另一個帶 bug 的程序更改過了 它甚至可能已經被故意更改過以破壞程序的安全性 所以不要假設任何事 要進行驗證

當然 錯誤處理及驗證十分令人生厭 也很不方便 並被全世界程序員們所輕視 計算機的誕生已進入了六十個年頭 我們仍舊沒有檢查基本的東西 如成功打開一個文件及內存分配是否成功 讓程序員們在閱讀一個文件時測試每一個位元組和每一個不變數似乎是無望的 —— 但不這樣做就會使程序易被模糊攻擊 幸運的是 可以尋求幫助 恰當使用現代工具和技術能夠顯著減輕加固應用程序的痛苦 特別是如下三種技術更為突出

校驗和 基於語法的格式 如 XML 驗證過的代碼如 Java

用校驗和進行的模糊試驗

能夠保護程序抵禦模糊攻擊的最簡單的方法是將一個檢驗和添加到數據中 例如 可以將文件中所有的位元組都累加起來 然後取其除以 的余數 將得到的值存儲到文件尾部的一個額外位元組中 然後 在輸入數據前 先驗證檢驗和是否匹配 這項簡單模式將未被發現的意外故障的風險降低到約 /

健壯的校驗和演算法如 MD 和 SHA 並不僅僅取其除以 的余數 它完成的要多得多 在 Java 語言中 java security DigestInputStream 和 java security DigestOutputStream 類為將一個校驗和附屬到數據中提供了便捷的方式 使用這些校驗和演算法中的一種可以將程序遭受意外破壞的機率降低到少於十億分之一(盡管故意攻擊仍有可能)

XML 存儲及驗證

將數據以 XML 形式存儲是一種避免數據損壞的好方法 XML 最初即著力於 Web 頁面 書籍 詩歌 文章及相似文檔 它幾乎在每個領域都獲取了巨大的成功 從金融數據到矢量圖形到序列化對象等等

不切實際的限定如果真想要破壞一個 XML 解析器 有幾種方法可以試試 例如 大多數 XML 解析器服從於特定的最大尺寸 如果一個元素名長度超過 億字元(Java String 的最大尺寸) SAX 解析器將會失敗 盡管如此 在實踐中這些極限值如此之高 以至於在達到之前內存就已經耗盡

使 XML 格式抵制模糊攻擊的關鍵特徵是一個對輸入不做任何 假設的解析器 這就是真正想在一個健壯的文件格式中所獲得的 設計 XML 解析器是為了讓任何輸入(格式良好的或無格式的 有效的或無效的)都以定義好的形式處理 XML 解析器能夠處理任何 位元組流 如果數據首先通過了 XML 解析器 則僅需要准備好接受解析器所能提供的東西 例如 不需要檢查數據是否包含空字元 因為 XML 解析器絕不會傳送一個空值 如果 XML 解析器在其輸入中看到一個空字元 它就會發出異常並停止處理 當然還需要處理這個異常 但編寫一個 catch 塊來處理檢測到的錯誤比起編寫代碼來檢測所有可能的錯誤來說要簡單得多

為使程序更加安全 可以用 DTD 和/或模式來驗證文檔 這不僅檢查了 XML 是否格式良好 而且至少與所預期更加接近 驗證並不會告知關於文檔所需了解的一切 但它卻使編寫大量簡單檢查變得很簡單 用 XML 很明顯能夠將所接受的文檔嚴格地限定為能夠處理的格式

盡管如此 還有多段代碼不能用 DTD 或模式進行驗證 例如 不能測試發票上商品的價格是否和資料庫中庫存商品的價格一致 當從客戶接收到一份包含價格的訂單文檔時 不論其是 XML 格式或是其他格式 在提交前通常都會檢查一下 以確保客戶並未修改價格 可以用定製代碼實現這些最後的檢查

基於語法的格式

使 XML 能夠對模糊攻擊具有如此的抵禦能力的是其使用巴科斯 諾爾範式(Backus Naur Form BNF)語法仔細且標准地定義的格式 許多解析器都是使用如 JavaCC 或 Bison 等解析器 生成器工具直接從此語法中構建的 這種工具的實質是閱讀一個任意的輸入流並確定其是否符合此語法

如果 XML 並不適合於您的文件格式 您仍可以從基於解析器的解決方案的健壯性中獲益 您必須為文件格式自行編寫語法 隨後開發自己的解析器來閱讀它 相比使用唾手可得的 XML 解析器 開發自己的解析器需要更多的工作 然而它是一個更為健壯的解決方案 而不是不根據語法正式地進行驗證就將數據簡單地裝載到內存中

Java 代碼驗證

由模糊測試導致的許多故障都是內存分配錯誤及緩沖器溢出的結果 用一種安全的垃圾收集語言(在如 Java 或 managed C# 等虛擬機上執行的)來編寫應用程序避免了許多潛在問題 即使用 C 或 C++ 來編寫代碼 還是需要使用一個可靠的垃圾收集庫 在 年 台式機程序員或伺服器程序員不應該還需要管理內存

Java 運行時對其自身的代碼起到了額外保護層的作用 在將一個 class 文件裝載到虛擬機之前 該文件要由一個位元組符驗證器或一個可選的 SecurityManager 進行驗證 Java 並不假設創建 class 文件的編譯器沒有 bug 且運轉正常 設計 Java 語言之初就是為了允許在一個安全沙箱中運行不信任的 潛在惡意的代碼 它甚至不信任其自身編譯過的代碼 畢竟 也許有人已經用十六進制編輯器手工修改了位元組符 試圖觸發緩沖器溢出 我們大家都應該對我們的程序也有對輸入這樣的偏執

以敵人的角度思考

之前介紹的每項技術都在阻止意外破壞方面造詣頗深 將它們綜合起來恰當地實現 會將未被發現的非蓄意破壞發生的可能性幾乎減少到零 (當然 並不會減少到零 但其發生的可能性就如同一束偏離軌道的宇宙射線將您 CPU 運算 + 的結果變為 的可能性一樣微乎其微 )但不是所有的數據損壞都是非蓄意的 如果有人故意引入壞數據來破壞程序的安全性又該如何呢?以一個攻擊者的角度進行思考是防護代碼的下一個步驟

轉回到一個攻擊者的角度進行思考 假設要攻擊的應用程序是用 Java 編程語言編寫的 使用非本地代碼且將所有額外數據都以 XML(在接受前經過徹底驗證)形式存儲 還能成功攻擊嗎?是的 能 但用隨機改變文件位元組的低級方法顯然不行 需要一種更為復雜的方法來說明程序自身的錯誤檢測機制及路徑

當測試一個抵禦模糊攻擊的應用程序時 不可能做純黑盒測試 但通過一些明顯的修改 基本的想法還是可以應用的 例如 考慮校驗和 如果文件格式包含一個校驗和 在將文件傳至應用程序前僅僅修改此校驗和就可以使其同隨機數據相匹配

對於 XML 試著模糊單獨的元素內容和屬性值 而不是從文檔中挑選一部分隨機的位元組進行替換 一定要用合法的 XML 字元替換數據 而不要用隨機位元組 因為即使一百位元組的隨機數據也一定是畸形的 也可以改變元素名稱和屬性名稱 只要細心地確保得到的文檔格式仍是正確的就可以了 如果該 XML 文檔是由一個限制非常嚴格的模式進行檢查的 還需要計算出該模式沒有 檢查什麼 以決定在哪裡進行有效的模糊

一個結合了對剩餘數據進行代碼級驗證的真正嚴格的模式也許不會留下可操縱的空間 這就是作為一個開發人員所需要追求的 應用程序應能夠處理所發送的任何有意義的位元組流 而不會因權利上( de jure ) 無效而拒絕

結束語

模糊測試能夠說明 bug 在程序中的出現 並不證明不存在這樣的 bug 而且 通過模糊測試會極大地提高您對應用程序的健壯性及抵禦意外輸入的安全性的自信心 如果您用 小時對程序進行模糊測試而其依然無事 那麼隨後同種類型的攻擊就不大可能再危及到它 (並不是不可能 提醒您 只是可能性很小 )如果模糊測試揭示出程序中的 bug 就應該進行修正 而不是當 bug 隨機出現時再對付它們 模糊測試通過明智地使用校驗和 XML 垃圾收集和/或基於語法的文件格式 更有效地從根本上加固了文件格式

模糊測試是一項用於驗證程序中真實錯誤的重要工具 也是所有意識到安全性問題且著力於程序健壯性的程序員們的工具箱中所必備的工具

關於作者

Elliotte Rusty Harold 來自新奧爾良 現在他還定期回老家喝一碗美味的秋葵湯 不過目前 他和妻子 Beth 定居在紐約臨近布魯克林的 Prospect Heights 同住的還有他的貓咪 Charm(取自誇克)和 Marjorie(取自他岳母的名字) 他是 Polytechnic 大學計算機科學的副教授 他在該校講授 Java 和面向對象編程 他的 Web 站點 Cafe au Lait 已經成為 Internet 上最流行的獨立 Java 站點之一 它的姊妹站點 Cafe con Leche 已經成為最流行的 XML 站點之一 他的書包括 Effective XML Processing XML with Java Java Neork Programming 和 The XML Bible 他目前在從事處理 XML 的 XOM API Jaxen XPath 引擎和 Jester 測試覆蓋率工具的開發工作

lishixin/Article/program/Java/JSP/201311/19417

❷ 在閱讀夏宇聞老師翻譯的一本verilog的書中,解釋一些語法用到下面圖片里的符號,求大神解釋。

這是表示元語法符號表示法的巴科斯範式(BNF),與語法本身(verilog)無關,只是為了說明特定的語法結構的。以下是網上引用的內容:
在雙引號中的字("word")代表著這些字元本身。而double_quote用來代表雙引號。羨者頌雹
在雙引號外的字(有可能有下劃線)代表著語法部分。
尖括弧( < > )內包含的為必選項。
方括弧( [ ] )內包含的為可選項。
大括弧( { } )內包含的為可重復0至無數次的項。
豎線( | )表示在其左右兩邊任選一項兄櫻薯,相當於"OR"的意思。
::= 是「被定義為」的意思。

具體信息可以參考維基網路的「巴科斯範式」與「擴展巴科斯範式」詞條

❸ BNF是什麼意思

BNF一般指巴科斯範式。巴科斯範式以美國人巴科斯(Backus)和丹晌拍麥人諾爾(Naur)的名字命名的一種形式化的語法表示方法,用來描述語法的一種形式體系,是一種典型的元語言。又稱巴科斯-諾爾形式(Backus-Naur form)。

它不僅能嚴格地表示語法規則,而且所描述的語法是與上下文無關的。它具有語法簡單,表示明確,便於語法分析和編譯的特點。BNF表示語法規則的方式為:

非終結符用蘆孫尖括弧括起。每條規則的左部是一個非終結符,右部是由非終結符和終結符組成的一個符號串,中間一般以「::=」分陪謹鏈開。具有相同左部的規則可以共用一個左部,各右部之間以直豎「|」隔開。

(3)巴科斯範式編譯工具擴展閱讀:

發展歷史:

約翰·巴科斯首次在ALGOL 58中實現巴科斯範式。彼得·諾爾在ALGOL 60之中,進一步發展它的概念並將它的符號加以簡化,稱其為巴科斯範式(Backus Normal Form)。

但高德納主張應稱為巴科斯-諾爾範式(Backus–Naur Form),因為它不算是一種正規形式(Normal form)。

❹ 編譯原理中BNF是什麼意思

一種用形式化符號描述語言的工具。

❺ PMD拜託各位了 3Q

PMD有很多種意思 具體如下 一、物理介質關聯層介面 萬兆乙太網的物理(PHY)層規范和所支持的光學部件部分在IEEE802.3ae中定義。在乙太網中銀標准中,光學部件部分被稱為「物理介質關聯層介面(PMD-Physical Media Dependent)」。 二、偏振模色散 偏振模色散 指單模光纖中偏振色散,簡稱PMD(=Polarization Mode Dispersion),是由光纖橫截面微小的不對稱性引起的色散。這種不對稱性引起兩個相互垂直的基本偏振模以不同的速度傳播。由於經歷了色散,即脈沖擴展,當接收器接收到這個合成的脈沖時要比發送端的脈沖寬。 起因於實際的單模光纖中基模含有兩個相互垂直的偏振模,沿光纖傳播過程中,由於光纖難免受到外部的作用,如溫度和壓力等因素變化或擾動,使得兩模式發生耦合,並且它們的傳播速度也不盡相同,從而導致光脈沖展寬,展寬量也不確定,便相當於隨機的色散。隨著傳輸速率的提高,該色散對通信系統的影響愈來愈明,而且越來越不可低估。有文獻給出由PMD限制的系扮培悔統最大距離按公式:L最大值=1000/(PMD.比特率)2,式中:L單位為(根號)km,PMD單位為PS/KM,以及比特率單位為Gb/s。國際上一些標准組織,如IEC、TIA和ITU考慮制定這種隨機性色散的統計特性和相應的測試方法。在數字傳輸系統中,PMD的主要影響是產生碼間干擾。 三、MikuMikuDance模型文件 MikuMikuDance是日本人樋口優所開發,將VOCALOID2的初音未來等角色製作3D模組的免費軟體。 簡稱為MMD。 所廳正用模型文件即為pmd格式 四 便攜多媒休辭典 PMD:portable multimedia dictionary 便攜多媒體辭典 目前市面流通的電子辭典。以2.4寸、2.8寸、3.5寸居多。TFT真彩色320*240分辨 五 北京金字塔藝術中心--PMD 北京金字塔藝術連鎖中心通過多年的努力與論證,2010年正式推出了《金字塔教學模式》,本教學模式是一套嚴格的4年課程(學生上課與練習時間較少需延長課程至8年以上),通過本模式正規培訓的學生均取得了優異的成績,北京金字塔藝術中心教學宗旨:「培養國內一流鼓手,發掘未來音樂大師,為國內打擊樂事業的發展壯大貢獻自己的力量」《金字塔教學模式》顧名思義:首先我們找到塔尖級世界一流鼓手需要具備哪些素質,其次我們論證他們的方法並且結合大量的理論依據與實踐數據,總結出可行最佳執行方案,最後我們把自己的學員從塔底開始,一步步塑造成未來的大師。讓每一個來中心學習的學員都得到最正規的培訓,少走彎路、早日成功。金字塔教學模式高級課程是總部投資的背景音樂,每首5000元以上,均為國內頂級音樂製作人中國最知名吉他大師汶麟先生親自用吉他錄制,本公司擁有背景音樂的版權。 六 架子鼓品牌-外置可調音量架子鼓 PMD-外置可調音量架子鼓解決了困擾多年的架子鼓擾民問題 七 飛機上的多媒體娛樂系統PMD PMD是擁有7英寸液晶屏、外觀優雅簡潔的手持式娛樂設備,操作簡單便捷,超大容量能容納30多部電影、2000多分鍾電視節目、500多首歌曲以及各類中外名著。南航航班上有配備。 八 軟體行業的JAVA代碼靜態分析工具 PMD是一種開源分析Java代碼錯誤的工具。與其他分析工具不同的是,PMD通過靜態分析獲知代碼錯誤。也就是說,在不運行Java程序的情況下報告錯誤。PMD附帶了許多可以直接使用的規則,利用這些規則可以找出Java源程序的許多問題。此外,用戶還可以自己定義規則,檢查Java代碼是否符合某些特定的編碼規范。 PMD的核心是JavaCC解析器生成器。PMD結合運用JavaCC和EBNF(擴展巴科斯-諾爾範式,Extended Backus-Naur Formal)語法,再加上JJTree,把Java源代碼解析成抽象語法樹(AST,Abstract Syntax Tree)。 PMD是一款採用BSD協議發布的Java程序代碼檢查工具。該工具可以做到檢查Java代碼中是否含有未使用的變數、是否含有空的抓取塊、是否含有不必要的對象等。該軟體功能強大,掃描效率高,是Java程序員debug的好幫手。 PMD支持的編輯器包括: JDeveloper、Eclipse、JEdit、JBuilder、BlueJ、CodeGuide、NetBeans/Sun Java Studio Enterprise/Creator、IntelliJ IDEA、TextPad、Maven、Ant,、Gel、JCreator和Emacs。 九PMD 產品組合決策 PMD(Proct Mix Decision),產品組合決策。是指在一定資源約束條件下,企業該如何安排產品組合,以實現一定時間內收益最大化的問題。

採納哦

❻ 計算機導論論文

大學計算機科學導論論文
計算機科學與技術這一門科學深深的吸引著我們這些同學們,原先不管是國內還是國外都喜歡把這個系分為計算機軟體理論、計算機系統、計算機技術與應用。後來又合到一起,變成了現在的計算機科學與技術。我一直認為計算機科學與技術這門專業,在本科階段是不可能切分成計算機科學和計算機技術的,因為計算機科學需要相當多的實踐,而實踐需要技術;每一個人(包括非計算機專業),掌握簡單的計算機技術行孝都很容易(包括原先Major們自以為得意的程序設計),但計算機專業的優勢是:我們掌握許多其他專業並不"深究"的東西,例如,演算法,體系結構,等等。非計算機專業的人可以很容易地做一個晶元,寫一段程序,但他們做不出計算機專業能夠做出來的大型系統。今天我想專門談一談計算機科學,並將重點放在計算理論上。

1)計算機語言
隨著20世紀40年代第一台存儲程序式通用電子計算機的研製成功,進入20世紀50年代後,計算機的發展步入了實用化的階段。然而,在最初的應用中,人們普遍感到使用機器指令編製程序不僅效率低下,而且十分別扭,也不利於交流和軟體維護,復雜程序查找錯誤尤其困難,因此,軟體開發急需一種高級的類似於自然語言那樣的程序設計語言。1952年,第一個程序設計語言Short Code出現。兩年後,Fortran問世。作為一種面向科學計算的高級程序設計語言,Fortran的最大功績在於牢固地樹立了高級語言的地位,並使之成為世界通用的程序設計語言。Algol60的誕生是計算機語言的研究成為一門科學的標志。該語言的文本中提出了一整套的新概念,如變數的類型說明和作用域規則、過程的遞歸性及參數傳遞機制等。而且,它是第一個用嚴格的語法規則——巴科斯範式(BNF)定義語言文法的高級語言。程序設計語言的研究與發展在產生了一批成功的高級語言之後,其進一步的發展開始受到程序設計思想、方法和技術的影響,也開始受到程序理論、軟體工程、人工智慧等許多方面特別是實用化方面的影響。在「軟體危機」的爭論日漸平息的同時,一些設計准則開始為大多數人所接受,並在後續出缺帶段現的各種高級語言中得到體現。例如,用於支持結構化程序設計的PASCAL語言,適合於軍隊各方面應用的大型通用程序設計語言ADA,支持並發程序設計的MODULA-2,支持邏輯程序設計的PROLOG語言,支持人工智慧程序設計的LISP語言,支持面積對象程序變換的SMALLTALK、C等。而且,伴隨著這些語言的出現和發展,產生了一大批為解決語言的編譯和應用中所出現的問題而發展的理論、方法和技術。有大量的學術論文可以證明,由高級語言的發展派生的各種思想、方法、理論和技術觸及到了計算機科學的大多數學科方向,但內容上仍相對集中在語言、計算模型和軟體開發方法學方面。

(2)計算機模型與軟體開發方法
20世紀80年代是計算機網路、分布式處理和多媒體大發展的時期。在各種高級程序設計語言中增加並發機構以支持分布式程序設計,在語言中通過擴展繪圖子程序以支持計算機圖形學程序設計成為當時程序設計語言的一種時尚。之後,在模數/數模轉換等介面技術和資料庫技術的支持下,通過擴展高級語言的程序庫又實現了多媒體程序設計的構想。進入20世紀90年代之後,並行計算機和分布式大規模異質計算機網路的發展又將並行程序設計語言、並行編譯程序、並行操作系統、並行與分布式資料庫系統等試行軟體的開發的關鍵技術依然與高級語言和計算模型密切相關,如各種並行、並發程序設計語言,進程代數,PETRI網等,它們正是軟體開發方法和技術的研究中支持不同階段軟體開發的程序設計語言和支持這些軟體開發方法和技術的理論基礎——計算模型。
(3)計算機應用

用計算機來代替人進行計算,就得首先研究計算方法和相應的計算機演算法,進而編制計算機程序。由於早期計算機的應用主要集中在科學計算領域,因此,數值計算方法就成為最早的應用數學分支與計算機應用建立了聯系。最初的時候,由於計算機的存儲器容量很小,速度也不快,為了計算一些稍稍大伏譽一點的題目,人們常常要挖空心思研究怎樣節省存儲單元,怎樣減少不需要的操作。為此,發展了像稀疏矩陣計算理論來進行方程組的求解;發展了雜湊函數來動態地存儲、訪問數據;發展了虛擬程序設計思想和程序覆蓋技術在內存較小的計算機上運行較大的程序;在子程序和程序包的概念提出之後,許多人開始將數學中的一些通用計算公式和計算方法寫成子程序,並進一步開發成程序包,通過簡潔的調用命令向用戶開放。子程序的提出是今日軟體重用思想的開端。

在計算機應用領域,科學計算是一個長久不衰的方向。該方向主要依賴於應用數學中的數值計算的發展,而數值計算的發展也受到來自計算機系統結構的影響。早期,科學計算主要在單機上進行,經歷了從小規模數值分析到中大規模數值分析的階段。隨著並行計算機和分布式並行計算機的出現,並行數值計算開始成為科學計算的熱點,處理的問題也從中大規模數值分析進入到中大規模復雜問題的計算。所謂中大規模復雜問題並不是由於數據的增大而使計算變得困難,使問題變得復雜,而主要是由於計算中考慮的因素太多,特別是一些因素具有不確定性而使計算變得困難,使問題變得復雜,其結果往往是在演算法的研究中精度與復雜性的矛盾難於克服。

幾何是數學的一個分支,它實現了人類思維方式中的數形結合。在計算機發明之後,人們自然很容易聯想到了用計算機來處理圖形的問題,由此產生了計算機圖形學。計算機圖形學是使用計算機輔助產生圖形並對圖形進行處理的科學。並由此推動了計算機輔助設計(CAD)、計算機輔助教學(CAI)、計算機輔助信息處理、計算機輔助測試(CAT)等方向的發展。

在各種實際應用系統的開發中,有一個重要的方向值得注意,即實時系統的開發。

利用計算機證明數學定理被認為是人工智慧的一個方向。人工智慧的另一個方向是研究一種不依賴於任何領域的通用解題程序或通用解題系統,稱為GPS。特別值得一提的是在專家系統的開發中發展了一批新的技術,如知識表示方法、不精確性推理技術等,積累了經驗,加深了對人工智慧的認識。20世紀70年代末期,一部分學者認識到了人工智慧過去研究工作基礎的薄弱,開始轉而重視人工智慧的邏輯基礎研究,試圖從總結和研究人類推理思維的一般規律出發去研究機器思維,並於1980年在《Artificial Intelligence》發表了一組非單調邏輯的研究論文。他們的工作立即得到一大批計算機科學家的響應,非單調邏輯的研究很快熱火朝天地開展起來,人工智慧的邏輯基礎成為人工智慧方向發展的主流。

資料庫技術、多媒體技術、圖形學技術等的發展產生了兩個新方向,即計算可視化技術與虛擬現實技術。
隨著計算機網路的發展,分布在全世界的各種計算機正在以驚人的速度相互連接起來。網路上每天都在進行著大量政治、經濟、軍事、外交、商貿、科學研究與藝術信息的交換與交流。網路上大量信息的頻繁交換,雖然縮短了地域之間的距離,然而同時也使各種上網的信息資源處在一種很難設防的狀態之中。於是,計算機信息安全受到各國政府的高度重視。除了下大力氣研究對付計算機病毒的軟硬體技術外,由於各種工作中保密的需要,計算機密碼學的研究更多地受到各國政府的重視。
實際上,在計算機科學中計算機模型和計算機理論與實現技術同樣重要。但現在許多學生往往只注重某些計算機操作技術,而忽略了基礎理論的學習,並因為自己是「操作高手」而沾沾自喜,這不僅限制了自己將研究工作不斷推向深入,而且有可能使自己在學科發展中處於被動地位。例如,在20世紀50年代和20世紀60年代,我國隨著計算機研製工作和軟體開發工作的發展,陸續培養了在計算機製造和維護中對計算機某一方面設備十分精通的專家,他們能准確地弄清楚磁芯存儲器、磁鼓、運算器、控制器,以及整機線路中哪一部分有問題並進行修理和故障排除,能夠編制出使用最少存儲單元而運算速度很快的程序,對機器代碼相當熟悉。但是,當容量小的磁芯存儲器、磁鼓、速度慢的運算器械、控制器很快被集成電路替代時,當程序設計和軟體開發廣泛使用高級語言、軟體開發工具和新型軟體開發方法後,這批技術精湛的專家,除少量具有堅實的數學基礎、在工作中已有針對性地將研究工作轉向其他方向的人之外,相當一部分專家伴隨著新技術的出現,在替代原有技術的發展過程中而被淘汰。因此,在計算機科學中,計算比實現計算的技術更重要。只有打下堅實的理論基礎,特別是數學基礎,學習計算機科學技術才能事半功倍,只有建立在高起點理論基礎之上的計算機科學技術,才有巨大的潛力和發展前景。

計算機理論的一個核心問題

我國計算機科學系裡的傳統是培養做學術研究,尤其是理論研究的人(方向不見得有多大的問題,但是做得不是那麼盡如人意)。而計算機的理論研究,說到底了,如網路安全學,圖形圖像學,視頻音頻處理,哪個方向都與數學有著很大的關系,雖然也許是正統數學家眼裡非主流的數學。這里我還想闡明我的一個觀點:我們都知道,數學是從實際生活當中抽象出來的理論,人們之所以要將實際抽象成理論,目的就在於想用抽象出來的理論去更好的指導實踐,有些數學研究工作者喜歡用一些現存的理論知識去推導若干條推論,殊不知其一:問題考慮不全很可能是個錯誤的推論,其二:他的推論在現實生活中找不到原型,不能指導實踐。嚴格的說,我並不是一個理想主義者,政治課上學的理論聯系實際一直是指導我學習科學文化知識的航標(至少我認為搞計算機科學與技術的應當本著這個方向)。
我個人的淺見是:計算機系的學生,對數學的要求固然跟數學系不同,跟物理類差別則更大。通常非數學專業的所?高等數學",無非是把數學分析中較困難的理論部分刪去,強調套用公式計算而已。而對計算機系來說,數學分析里用處最大的恰恰是被刪去的理論部分。記上一堆曲面積分的公式,難道就能算懂了數學?那倒不如現用現查,何必費事記呢?再不然直接用Mathematica或是Matlab好了。退一萬步。華羅庚在數學上的造詣不用我去多說,但是他這光輝的一生做得我認為對我們來說,最重要的幾件事情:首先是它籌建了中國科學院計算技術研究所,這是我們國家計算機科學的搖籃。在有就是他把很多的高等數學理論都交給了做工業生產的技術人員,推動了中國工業的進步。第三件就是他一生寫過很多書,但是對高校師生價值更大的就是他在病期間在病床上和他的愛徒王元寫了《高等數學引論》(王元與其說是他的愛徒不如說是他的同事,是中科院數學所的老一輩研究員,對歌德巴赫猜想的貢獻全世界僅次於陳景潤)這書在我們的圖書館里居然找得到,說實話,當時那個書上已經長了蟲子,別人走到那裡都會閃開,但我卻格外感興趣,上下兩冊看了個遍,我的最大收獲並不在於理論的闡述,而是在於他的理論完全的實例化,在生活中去找模型。這也是我為什麼比較喜歡具體數學的原因,正如我在上文中提到的,理論脫離了實踐就失去了它存在的意義。正因為理論是從實踐當中抽象出來的,所以理論的研究才能夠更好的指導實踐,不用於指導實踐的理論可以說是毫無價值的。

正如上面所論述的,計算機系的學生學習高等數學:知其然更要知其所以然。你學習的目的應該是:將抽象的理論再應用於實踐,不但要掌握題目的解題方法,更要掌握解題思想,對於定理的學習:不是簡單的應用,而是掌握證明過程即掌握定理的由來,訓練自己的推理能力。只有這樣才達到了學習這門科學的目的,同時也縮小了我們與數學系的同學之間思維上的差距。

關於計算機技術的學習我想是這樣的:學校開設的任何一門科學都有其滯後性,不要總認為自己掌握的某門技術就已經是天下無敵手了,雖然現在Java,VB,C,C++用的都很多,怎能保證沒有被淘汰的一天,我想.NET平台的誕生和X#語言的初見端倪完全可以說明問題。換言之,在我們掌握一門新技術的同時就又有更新的技術產生,身為當代的大學生應當有緊跟科學發展的素質。舉個例子,就像有些同學總說,我做網頁設計就喜歡直接寫html,不願意用什麼Frontpage,Dreamweaver。能用語言寫網頁固然很好,但有高效的手段你為什麼不使呢?僅僅是為了顯示自己的水平高,unique? 我看真正水平高的是能夠以最快的速度接受新事物的人。高級程序設計語言的發展日新月異,今後的程序設計就像人們在說話一樣,我想大家從xml中應是有所體會了。難道我們真就寫個什麼都要用匯編,以顯示自己的水平高,真是這樣倒不如直接用機器語言寫算了。反過來說,想要以最快的速度接受並利用新技術關鍵還是在於你對計算機科學地把握程度。

❼ 基礎正則表達式的BNF是怎樣的

括弧的意思:將(和)之間的表達式定義為「組」(group),並且將匹配這個表達式的字元保存到一個臨時區域(一個正則表達式中最多可以保存9個),它們可以用\1到\9的符號來引用。|的意思:將兩個匹配條件進行邏輯「或」(Or)運算。例如正則表達式(him|her)匹配"itbelongstohim"和"itbelongstoher",但是不能匹配"itbelongstothem."。*的意思:匹配0或多個正好在它之前的那個字元。例如正則表達式.*意味著能夠匹配任意數量的任何字元。所以你給的那個例子00(0|1)*可以用來匹配00或者001或者000或者0000或者0011,但是不能匹配011等等。具體定義還是要多參考一下下面的文章:正則表達式,RegularExpression(也稱為「regex」或「regexp」),是一種用來描述文本模式的特殊語法。一個正則表達式由普通字元(例如字元a到z)以及特殊字元(稱為元字元,如/、*、?等)組成。簡單地說,一個正則表達式就是你需要匹配的字元串。例如,正則表達式「A*B」匹配字元串「ACCCB」但是不匹配「ACCCC」。什麼是巴科斯範式?巴科斯範式(BNF:Backus-NaurForm的縮寫)是由JohnBackus和PeterNaur首先引入的用來描述計算機語言語法的符號集。現在,幾乎每一位新編程語言書籍的作者都使用巴科斯範式來定義編程語言的語法規則。巴科斯範式的內容在雙引號中的字("word")代表著這些字元本身。而double_quote用來代表雙引號。在雙引號外的字(有可能有下劃線)代表著語法部分。尖括弧()內包含的為必選項。方括弧([])內包含的為可選項。大括弧({})內包含的為可重復0至無數次的項。豎線(|)表示在其左右兩邊任選一項,相當於"OR"的意思。::=是「被定義為」的意思。巴科斯範式示例這是用BNF來定義的Java語言中的For語句的實例:FOR_STATEMENT::="for""("(variable_declaration|(expression";")|";")[expression]";"[expression]";"")"statement這是Oraclepackages的BNF定義:package_body::="package"package_name"is"package_obj_body{package_obj_body}["begin"seq_of_statements]"end"[package_name]";"package_obj_body::=variable_declaration|subtype_declaration|cursor_declaration|cursor_body|exception_declaration|record_declaration|plsql_table_declaration|procere_body|function_bodyprocere_body::="procere"procere_name["("argument{","argument}")"]"return"return_type"is"["declare"declare_spec";"{declare_spec";"}]"begin"seq_of_statements["exception"exception_handler{exception_handler}]"end"[procere_name]";"statement::=comment|assignment_statement|exit_statement|goto_statement|if_statement|loop_statement|null_statement|raise_statement|return_statement|sql_statement|plsql_block這是用BNF來定義的BNF本身的例子:syntax::={rule}rule::=identifier"::="expressionexpression::=term{"|"term}term::=factor{factor}factor::=identifier|quoted_symbol|"("expression")"|"["expression"]"|"{"expression"}"identifier::=letter{letter|digit}quoted_symbol::="""{any_character}"""擴展的巴科斯範式AugmentedBNFRFC2234定義了擴展的巴科斯範式(ABNF)。近年來在Internet的定義中ABNF被廣泛使用。ABNF做了的改進,比如說,在ABNF中,尖括弧不再需要。

❽ 模糊測試的基於語法的格式

使 XML 能夠對模糊攻擊具有如此的抵禦能力的是其使用巴科斯-諾爾範式虛運(Backus-Naur Form,BNF)語法仔細且標准地定義的格式。許多解析器都是使用如 JavaCC 或 Bison 等解析器-生成器工具直接從此語法中構建的。這種工具的實質是閱讀一個任意的輸入流並確定其是否符合此語法。
如果 XML 並不適合於您的文件格式,您仍可以升茄從基於解析器的解決方案的健壯性中獲益。您必須為文件格式自行編寫語法,隨後開發自己的解析器來閱讀它。相比使用唾手可得的 XML 解析器,開發自差笑梁己的解析器需要更多的工作。然而它是一個更為健壯的解決方案,而不是不根據語法正式地進行驗證就將數據簡單地裝載到內存中。

❾ BNF是什麼

巴科斯範式及其擴展
BNF & Augmented BNF
什麼是巴科斯範式?
巴科斯範式(BNF: Backus-Naur Form 的縮寫)是由 John Backus 和 Peter Naur 首次引入一種形式化符號來描述給定語言的語法(最早用於描述ALGOL 60 編程語言)。確切地說,早在UNESCO(聯合國教科文組織)關於ALGOL 58的會議上提出的一篇報告中,Backus就引入了大部分BNF符號。雖然沒有什麼人讀過這篇報告,但是在Peter Naur讀這篇報告時,他發現Backus對ALGOL 58的解釋方式和他的解釋方式有一些不同之處,這使他感到很驚奇。首次設計ALGOL的所有參與者都開始發現了他的解釋方式的一些弱點,所以他決定對於以後版本的ALGOL應該以一種類似的形式進行描述,以讓所有參與者明白他們在對什麼達成一致意見。他做了少量修改,使其幾乎可以通用,在設計ALGOL 60的會議上他為ALGOL 60草擬了自己的BNF。看你如何看待是誰發明了BNF了,或者認為是Backus在1959年發明的,或者認為是Naur在1960年中發明。(關於那個時期編程語言歷史的更多細節,參見1978年8月,《Communications of the ACM(美國計算機學會通訊)》,第21卷,第8期中介紹Backus獲圖靈獎的文章。這個注釋是由來自Los Alamos Natl.實驗室的William B. Clodius建議的)。
現在,幾乎每一位新編程語言書籍的作者都使用巴科斯範式來定義編程語言的語法規則。

閱讀全文

與巴科斯範式編譯工具相關的資料

熱點內容
如何查看伺服器系統版本信息 瀏覽:512
成都市土地出讓金演算法 瀏覽:697
鋼筋加密標記 瀏覽:567
ps中擴展功能在文件夾的什麼位置 瀏覽:903
雙極壓縮機為什麼要先高壓 瀏覽:527
蘋果手機伺服器填什麼 瀏覽:832
android移動動畫效果 瀏覽:691
電子和伺服器是什麼意思 瀏覽:691
phpurl中文亂碼問題 瀏覽:893
程序員那麼可愛大結局陸漓產子 瀏覽:538
java如何從雲伺服器讀取本地文件 瀏覽:923
壓縮空氣軟管製作方法 瀏覽:911
天河三號演算法 瀏覽:924
php隊列教程 瀏覽:632
洪水命令 瀏覽:529
安卓怎麼弄成蘋果在線 瀏覽:435
谷歌web伺服器地址 瀏覽:899
安卓鎖屏圖片如何刪除 瀏覽:719
python3多進程編程 瀏覽:714
證明代碼是程序員寫的 瀏覽:397