1.程序設計語言基本概念
1.1 低級語言與高級語言
低級語言:機器語言和匯編語言稱為低級語言
? ? ? ? 機器語言指0.,1組成的機器指令序列
? ? ? ? 匯編語言指用符號表示指令的語言,如MOV AX,2
?高級語言:從人類的邏輯角度出發,不依賴具體的機器硬件
?1.2 表達式
? ? ? ? 前綴表達式:也被稱之為波蘭表達式,其特點是將操作符放于操作數之前,如:-x+3456
? ? ? ? 中綴表達式:即我們常用的表示方法,(3+4)*5-6
? ? ? ? 后綴表達式:又被稱作逆波蘭法,其特定是將操作符置于操作樹之后,3 4 +5 * 6 -
前綴表達式:
? ? ? ? 從右至左掃描表達式,遇到數字時,將數字壓入棧堆,遇到運算符時,彈出棧頂的兩個數,用運算符堆他們做運算,并將結果入棧;重復上述操作直到表達式最左端,最后運算得出的值即為表達式的結果
中綴表達式:
? ? ? ? 按照平常時的習慣去計算即可
后綴表達式:
? ? ? ? 與前綴表達式類似,但是掃描順序是從左到右
1.3?操作符的優先級
? ? ? ? 指針最優,單目運算優于雙目運算,如正負號
? ? ? ? 先乘除(模),后加減
? ? ? ? 先算數運算,后移位運算,最后位運算:1《 3+2 & 7 相當于 (1<<(3+2)) & 7
? ? ? ? 邏輯運算最后運算
?1.4?過程控制????????
? ? ? ? 參數傳遞方式:
? ? ? ? 傳值調用,數據傳送是單向的
? ? ? ? 引用調用(又稱之為地址調用),數據傳送是雙向的
2.匯編、編譯、解釋系統
?2.1 編譯程序和解釋程序
高級語言和匯編語言編寫的程序稱為源程序,源程序不能直接在計算機上執行
? ? ? ? 如果源程序是匯編語言寫的,則需要一個稱為匯報程序的翻譯程序將其翻譯為目標程序,然后才能執行
? ? ? ? 如果源程序是為高級語言時,這個翻譯程序稱為編譯程序(編譯器)
? ? ? ? 按源程序中語句的執行順序,逐條翻譯并立即執行相關功能的處理程序,稱為解釋程序
? ? ? ? 編譯方式生成邏輯上與源程序等價的目標程序,解釋方式不生成;編譯程序不參與用戶程序的運行控制,而解釋程序需要參加;編譯方式下在機器上運行的目標程序完全獨立與源程序
? ? ? ? 將高級語言翻譯程目標程序的是編譯程序
????????匯編程序先將源程序中的偽代碼翻譯成機器代碼,然后再翻譯指令語句
? ? ? ? 使用匯編語言編寫的程序需要匯編程序翻譯程機器語言,匯編輸入的是用匯編語言書寫的源程序,輸出的是用機器語言表示的目標程序
2.2 程序的執行方式
1.編譯執行
? ? ? ?按編譯方式在計算機上執行高級語言編寫的程序,需經過兩個階段--編譯階段(把源程序翻譯為目標程序)和運行階段(真正執行此目標程序)
? ? ? ? 優點:執行效率低,占用資源小
? ? ? ? 缺點:兼容性差
? ? ? ? 編譯過程中為變量分配存儲單元所用的地址是邏輯地址,程序運行時再映射為物理地址
2.解釋執行
? ? ? ? 源程序的每個語句一經解釋就立即執行?
? ? ? ? 優點:可移植性較好、開發速度快、與用戶通訊方便
? ? ? ? 缺點:效率低
2.3?編譯程序工作過程?
? ? ? ? ?編譯程序的工作過程包括:詞法分析、語法分析、語義分析、中間代碼生成、代碼優化、目標代碼生成 (必須按順序)
? ? ? ?解釋方式包含詞法分析、語法分析、語義分析
? ? ? ?中間代碼生成和代碼優化不是每個編譯器都必須要有的
? ? ? 詞法分析階段:
????????輸入源程序,對構成源程序的字符串進行掃描和分解,識別出一個個單詞,刪掉無用的信息,報告分析時的錯誤
? ? ? ? 一個程序語言的基本語法符號分為五類:關鍵字、標識符、常量、運算符、界符等
? ? ? ? 詞法分析器所輸出的單詞符號常常表示為如下二元式:(單詞種別,單詞符號的屬性值),由于屬性值長度不固定,所以我們這邊主要放的是指針
? ? ? ? 描述詞法規則常用:正則式和有限自動機?? ? ? ??
? ? ? ? 語法分析階段:
? ? ? ? 詞法分析以單詞符號作為少數。分析單詞符號是否形成符號語法規則的語法單位,如表達式、賦值、循環等,判斷程序語句的形式是否正確
? ? ? ? 輸入:記號流
? ? ? ? 按語法規則分析每條語句是否有正確的邏輯結構
? ? ? ? 語法分析的方法:自上而下分析法、自下而上分析法?
? ? ? ? 編譯正確的程序必然不包括語法錯誤,如果出錯就叫編譯錯誤。
? ? ? ? 語義分析階段:
? ? ? ? 檢查源代碼是否存在語義錯誤,并收集類型信息以供后面的代碼生成階段使用,只有語法和語義都正確的源程序才能翻譯成正確的目標代碼
? ? ? ? 語義分析的主要工作是進行各類型分析和檢查。賦值語句的右端和左端的類型不匹配。表達式的除法為0等?????????
? ? ? ? 語義分析階段不可以發現程序中所有的語義錯誤;程序運行過程中陷入死循環,則可能的原因是程序中存在動態的語義錯誤
? ? ? ? 中間代碼生成階段:
? ? ? ? 中間代碼的生成階段的工作是根據語義分析的輸出生成中間代碼
? ? ? ? 中間代碼是一種簡單且有明確含義的記號系統,可以有若干個形式,常見的有逆波蘭記號(后綴式)、四元式、三元式和樹
? ? ? ? 他們的共同特征是代碼的方式與具體的機器無關,不需在指令結構上保存一致,可以提高移植性?
? ? ? ? 代碼優化階段:
? ? ? ? 代碼優化階段是對前階段產生的中間代碼進行變換或進行改造,目的是使生成的目標代碼更加高級,即省時間和省空間?
? ? ? ? 目標代碼生成階段:
? ? ? ? 是把中間代碼變換成特定機器上的絕對指令代碼或可重定位的指令代碼或匯編指令代碼。這是編譯的最后階段,它的工作與硬件系統的結構和指令的含義有關?
? ? ? ? 分配寄存器的工作在此階段,因為在這一階段中間代碼變換成特定機器上的絕對指令代碼、可重定位的指令代碼或匯編指令代碼
2.4 詞法分析階段
? ? ? ? (狀態轉換圖與正規表達式和正規集 )
狀態轉換圖:
? ? ? ? 功能:用于識別一定字符串
? ? ? ? 要求:狀態(即節點)個數有限,至少一個初始狀態若干個終止狀態,每條邊上一定要有字符
正規表達式與正規集(定義和運算):
? ? ? ? 狀態轉換圖可以構造詞法分析程序,但是屬于非形式化描述,正規表達式(簡稱正規式)是詞法分析的形式化表示方法。所謂形式化的方法,是指用一套帶有嚴格規定的符號體系來描述問題的方法
? ? ? ? 優點:更加清晰和準確
練習:
2.5?NFA
2.6 符號表
? ? ? ? 在高級語言程序進行編譯或者解釋處理的時候(編譯程序工作中),需要不斷收集、記錄和使用源程序中一些相關符號的類型和特征等信息,并將其存入符號表中????????
? ? ? ? 編譯過程中,對高級程序語句的翻譯主要考慮聲明語句和可執行語句。對聲明語句,主要是將所需要的信息正確地填入合理組織的符號表中,對可執行語句,則是翻譯成中間代碼或目標代碼
2.7 反編譯
? ? ? ? 編譯是將高級語言程序翻譯成機器語言程序(匯編形式或機器代碼形式),反編譯是編譯的逆過程。反編譯不能把可執行文件還原程高級語言代碼,只能轉換程功能上等價的匯編程序?
2.8 程序設計語言
? ? ? ? 程序設計語言基本成分:數據、運算、控制和傳輸等
? ? ? ? 程序設計語言控制成分:順序、選擇、循環
? ? ? ? 程序設計語言的語義:靜態語義(分析方法:語法制導翻譯;基本思想:將語言結構的語義以屬性的形式賦予代表此結構的文法符號,而屬性的計算以語義規則的形式賦予文法的產生式)和動態語義
2.9 計算機程序語言
? ? ? ? ?LISP是一種函數式編程語言(是第一個聲名系內函數式程序設計語言),是一種通用高級計算機程序語言,長期以來壟斷人工智能領域的應用。
? ? ? ? 系內過程式:C、Fortran
? ? ? ? 面向對象:java、C#、
? ? ? ? 弱類型語言(動態類型語言)
2.10 語言?
? ? ? ? 解釋型程序設計語言:JAVA、PYTHON、JAVASCRIPT
? ? ? ? 腳本語言(“擴建的語言”、動態語言):PYTHON、JAVASCRIPT
? ? ? ? 編譯型程序設計語言:C/C++(常用于進行系統級軟件的開發,現行操作系統都是均由C/C++開發的)
? ? ? ? 腳本語言是為了縮短編寫-編譯-鏈接-運行過程創建的計算機編程語言,用來控制軟件應用程序。腳本通常以文本如ASCII保存,只在被調用的時候進行解釋或編譯。腳本語言常用于描述格式化和鏈接,編程效率不如編譯型語言。腳本語言采用解釋方式實現。腳本語言一般運行在解釋器或虛擬機中,一般通過腳本引擎解釋執行,不產生獨立保存的目標程序。用以編寫獨立程序和快速腳本的語言.屬于動態語言,其程序結構可以在運行中改變.腳本語言一般是面向字符的(缺點:不方便調試,命名不規范會讀不懂/
? ? ? ? C語言是處于匯編語言和高級語言之間的一種中間型程序設計語言,常被稱為中級語言,既有高級語言的基本特點,也有匯編語言面向硬件和系統可以直接訪問硬件的功能,其屬于靜態語言,其所有成分可以在編譯時確定
? ? ? ? 腳本語言都是動態語言,而動態語言都是解釋型語言,不管他們是否面向對象的語言
2.11?HTML
?關于樣式表:? ? ?
????????? <!-- -->是注釋,不能定義CSS樣式表
? ? ? ? 用@import引入樣式表文件
? ? ? ? 在<head>標簽內定義CSS樣式
? ? ? ? <link>用來鏈接網上可訪問的CSS樣式文件
????????<align>對齊方式
? ? ? ? <mailto>可以定義一個指向電子郵件地址的超鏈接,通過該鏈接可以在internet發送電子郵件
? ? ? ? <HR>分割線
? ? ? ? <I>斜體
? ? ? ? <vlink>顯示鏈接被點擊之后的顏色
? ? ? ? <alink>表示正在被點擊的鏈接的顏色
? ? ? ? background用于設置背景圖片的URL
? ? ? ? bgcolor用以設置文檔整體背景顏色
? ? ? ? tr表示行
? ? ? ? col表示列
? ? ? ? td是單元格
2.12 標記語言
? ? ? ? HTML:超文本標記語言,用于互聯網的信息展示。用HTML編寫的財務部稱為HTML文檔,它能獨立于各種操作系統平臺。HTML是純文本文檔,可以使用記事本,寫字板等編輯工具來編寫HTML,他們需要通過WWW瀏覽器解釋并顯示效果
? ? ? ? XML是可拓展的標記語言。1.0標準發布后被認為是繼HTML和JAVA編程語言之后的又一個INTERNET技術。XML豐富了HTML的描述功能,可以描述非常復雜 web頁面,如復雜的數學表達式、化學方程式等,XML的特點是結構化、自描述、可拓展瀏覽器自適應等
? ? ? ? WML是用于WAP的標記語言,其語法與XML一樣,是XML的子集
XML語法規范:
? ? ? ? 文檔第一行必須聲明該文件是XML文件以及它所使用的XML規范版本,在文件前面不能夠有其他元素或注釋
? ? ? ? 所有XML文檔必須有一個根元素(且只能有一個),XML文檔的第一個元素就是根元素
? ? ? ? 所有XML文檔都必須包含一個單獨的標記來定義,所有其他元素必須成對在根元素中嵌套
? ? ? ? 所有的元素都可以有子元素,子元素必須正確的嵌套在父元素之間
2.13?傳值傳遞傳與引用
傳值傳遞:
? ? ? ? 傳遞方向:單方向
? ? ? ? 傳遞內容:實參的值(可以是變量,函數調用,也可以是常量和表達式
????????
引用傳遞:
? ? ? ? 傳遞方向:雙方向
????????傳遞內容:實參的地址(要求實參一定要有地址)
2.14?其他
? ? ? ? 程序中常量的值在運行的時候不能改變,變量可以;變量具有相應的存儲單元,常量沒有;可以對常量賦值,不能對常量賦值
? ? ? ? C語言中全局變量的存儲空間在靜態數據區分配,變量是內存空間的抽象
? ? ? ? 變量常量都具有類型屬性? ??
? ? ? ? 程序運行時用戶內存空間一般劃分為代碼區、靜態數據區、動態數據區(棧區和堆區)
? ? ? ? 對鏈表進行定義和運算時,數據空間必須采用堆存儲分配策略
????????
? ? ? ? 函數體為空時,在運行時會出現動態語義錯誤
? ? ? ? 強/弱類型指的是語言類型的類型檢查的嚴格程度
? ? ? ? 動態類型和靜態類型是指變量與類型的綁定方法
? ? ? ? 弱類型相對于強類型來說類型檢查不嚴格,比如運行變量類型的隱式轉換,運行強制類型轉換等
? ? ? ? 靜態類型指編譯源程序期間執行檢查,動態類型指編譯器(虛擬機)在重新運行時執行類型檢查。簡單來說,在聲名一個變量之后,不能改變其類型的語言,是靜態類型,能隨時改變其類型的語言,就是動態類型