1.什么是ASCII碼?
- ASCII碼即美國信息交換標準代碼,是基于拉丁字母的電腦編碼系統,用于顯示現代英語和部分西歐語言。其7位編碼范圍0-127,8位擴展到0-255。
- 字符集含控制字符(0-31、127,用于控制設備或表示通信信息,如換行、回車符)和可打印字符(32-126,包括英文字母、數字、標點和常用符號,如“A”是65,“0”是48)。
- 它在早期計算機系統、編程、網絡通信中應用廣泛,處理純英文文本方便,但無法滿足多語言字符表示需求。
2.什么是Unicode碼?
- Unicode是一種字符編碼標準,旨在為世界上幾乎所有的字符提供統一編碼。
- 它涵蓋多種語言文字、象形符號、特殊符號等超百萬字符。
- 編碼方式有UTF-8、UTF-16、UTF-32等,其中UTF-8可變長,ASCII字符占1字節,其他字符2-4字節;UTF-16基本多文種平面字符常占2字節,輔助平面字符占4字節;UTF-32固定每個字符占4字節。
- 它考慮了與ASCII碼的兼容,能在同一系統處理多語言文本,提升了多語言環境下的兼容性與互操作性。
3.ASCII碼和Unicode的區別?
ASCII碼和Unicode都是字符編碼標準,區別如下:
1. 編碼范圍:ASCII碼用7位或8位二進制數,范圍0-127(7位)或0-255(8位擴展);
??????????????????????Unicode編碼范圍廣,使用多種編碼方式,能表示超百萬字符。
2. 字符集涵蓋:ASCII碼主要是英語字符和常用控制字符;
? ? ? ? ? ? ? ? ? ? ? ? ?Unicode涵蓋世界多種語言字符、象形文字、特殊符號等。
3. 存儲方式:ASCII碼一般1個字節存一個字符;Unicode存儲依編碼方案,UTF-8可變長,ASCII字符1字節,其他2-4字節,UTF-16基本多文種平面字符常2字節,輔助平面4字節,UTF-32固定4字節。
4. 兼容性:ASCII碼處理純英文文本兼容性好,多語言處理受限;Unicode考慮與ASCII碼兼容,如UTF-8,且能處理多語言文本,多語言環境兼容性和互操作性強。 ?
4.語言分為什么?
語言分為 自然語言 和計算機語言。
5.什么是計算機語言?
計算機語言是人與計算機之間進行信息交流、溝通和指令傳達的工具,是一種能夠被計算機識別、理解并執行的指令集合,用于編寫各種程序以實現特定的功能和任務。
計算機語言有:
- 機器語言:由二進制代碼(0 和 1)組成,是計算機唯一能直接理解和執行的語言。不同類型的計算機硬件(如 CPU)有不同的機器語言指令集。機器語言執行效率高,但編寫和閱讀困難,開發成本高。
- 匯編語言:使用助記符(如 ADD 表示加法,MOV 表示數據傳送等)來代替機器語言中的二進制指令,比機器語言更易理解和編寫。但它仍然依賴于計算機硬件,屬于低級語言,需要通過匯編器將其翻譯成機器語言才能被計算機執行。
- 高級語言:更接近人類自然語言和數學表達式的編程語言,如 Python、Java、C++、C# 等。高級語言具有較好的可讀性、可維護性和可移植性,程序員可以更專注于程序的邏輯和功能實現,而無需過多關注底層硬件細節。高級語言編寫的程序需要通過編譯器或解釋器轉換為機器語言才能在計算機上運行。
簡單來說,匯編語言就是計算機符號形式的指令系統。?
6.什么是翻譯?
在編譯原理里,翻譯指的是把一種語言編寫的源程序轉化為另一種具有相同語義的目標程序的過程,通常是將高級編程語言編寫的源程序轉換為機器語言或匯編語言的目標程序。下面從翻譯的基本概念、主要階段、翻譯的實現方式幾個方面為你詳細介紹:
基本概念
- 源語言與源程序:源語言是程序員用來編寫程序的高級語言,像 Python、Java、C++ 等;用源語言編寫的程序就是源程序。
- 目標語言與目標程序:目標語言是源程序經過翻譯后所生成的程序的語言,常見的有機器語言、匯編語言;生成的程序就是目標程序。
- 翻譯的本質:翻譯過程其實是對源程序進行語義和語法分析,然后根據目標語言的規則和要求,把源程序的語義用目標語言重新表達出來。
詞法分析
- 定義:詞法分析器按從左到右的順序對源程序的字符流進行掃描,依據詞法規則將其識別為一個個單詞(token)。
- 示例:對于源程序語句
int num = 10;
,詞法分析器會將其識別為int
(關鍵字)、num
(標識符)、=
(運算符)、10
(常量)、;
(界符)等單詞。
語法分析
- 定義:語法分析器以詞法分析得到的單詞序列作為輸入,依據語法規則來分析,構建出對應的語法樹。
- 示例:對于上述語句,語法分析器會判斷它是否符合該語言的語法規則,若符合就構建出一棵表示該語句語法結構的語法樹。
語義分析
- 定義:語義分析器對語法樹進行靜態語義檢查,比如類型檢查、作用域分析等,確保源程序在語義上是正確的。
- 示例:在
int num = "hello";
語句中,語義分析器會發現將字符串賦值給整型變量存在類型不匹配的問題。
中間代碼生成
- 定義:對語義分析后的語法樹進行處理,將源程序轉換為一種中間表示形式,中間代碼與具體的機器無關,便于進行優化和生成目標代碼。
- 示例:三地址碼就是一種常見的中間代碼形式,如
x = y + z
可表示為t1 = y + z; x = t1;
。
代碼優化
- 定義:對中間代碼進行優化,在不改變程序語義的前提下,提升目標代碼的運行效率、減少代碼占用空間。
- 示例:對代碼中的常量折疊、死代碼刪除、公共子表達式消除等操作。
目標代碼生成
- 定義:把優化后的中間代碼轉換為目標機器的機器語言或匯編語言代碼。
- 示例:根據目標機器的指令集,將中間代碼
x = y + z
轉換為具體的機器指令。
翻譯的實現方式
- 編譯方式:在編譯方式下,編譯器會對整個源程序進行一次性處理,生成目標程序。之后目標程序可以獨立于編譯器運行。像 C、C++ 等語言通常采用編譯方式。
- 解釋方式:解釋器逐行讀取源程序,邊解釋邊執行,不會生成獨立的目標程序。Python、Ruby 等語言常采用解釋方式。
- 編譯 - 解釋混合方式:結合了編譯和解釋的特點,先將源程序編譯成一種中間表示形式,然后再由解釋器對中間表示進行解釋執行,Java 就采用這種方式,先將 Java 源程序編譯成字節碼,再由 Java 虛擬機(JVM)對字節碼進行解釋執行。
7.什么是文法??
你可以把文法想象成是一種 “語言制造說明書”,它能告訴我們怎么造出符合語法規則的句子。無論是我們日常說的自然語言,還是計算機使用的編程語言,都可以用文法來描述它的語法結構。
文法主要由四個部分組成:
- 非終結符:就像是一些 “半成品零件”,它們本身不是最終的句子組成部分,但可以用來進一步 “組裝” 句子。比如在描述一個算術表達式的文法里,“表達式” 這個概念就是一個非終結符,因為它還可以繼續分解成其他部分,像 “數字 + 數字”。你可以把非終結符理解成是一個 “標簽”,用來表示可以繼續變化、組合的語法概念。
- 終結符:這就是最終構成句子的 “小零件”,不能再被拆分了。比如在算術表達式里,具體的數字(像 5、10 這些)、運算符(比如 “+”“-”“*”“/”),它們是構成表達式的基本元素,不能再按照文法規則進一步分解了。
- 產生式:它就像是 “組裝說明書” 里的具體步驟,告訴我們怎么把非終結符變成其他的符號組合。比如 “表達式 → 數字 + 表達式” 這個產生式,意思就是一個 “表達式” 可以由一個 “數字” 加上另一個 “表達式” 組成。通過不斷使用這些產生式,我們就能從一個非終結符開始,逐步構造出一個完整的句子。
- 開始符號:這是我們 “組裝” 句子的起點,就像搭積木時,我們先拿出的第一塊特定的積木。從這個開始符號出發,按照產生式的規則一步步推導,最終就能得到符合文法的句子。
8.什么是語法短語?
?語法短語是在語法分析過程中,與某個非終結符相關聯的子串。它基于語法規則,是源程序中符合一定語法結構的連續字符序列。簡單來說,就是在句子里能根據語法規則被看成一個整體的部分。
9.什么是語法樹??
語法樹是一種直觀表示句子語法結構的樹形圖。樹的根節點是文法的開始符號,內部節點是非終結符,葉子節點是終結符。它清晰展示了句子是如何按照文法規則逐步推導出來的,體現了句子的層次結構和語法關系。
10.什么是巴科斯范式?
巴科斯范式是一種用于表示上下文無關文法的元語言,它提供了簡潔、準確描述文法規則的方法。用巴科斯范式可以清晰定義編程語言的語法結構,便于程序員和編譯器開發者理解和實現。?
規則示例:
<expression> ::= <expression> + <term>| <expression> - <term>| <term>
<term> ::= <term> * <factor>| <term> / <factor>| <factor>
<factor> ::= ( <expression> )| number
?11.符號表中為什么要設計字符串表這樣一種數據結構?
- 標識符記錄:編程語言里標識符(變量、函數名等)是字符串形式,符號表需以字符串存其名,便于后續找類型、作用域等信息。
- 字面常量存儲:字符串字面常量常見,符號表記錄它們,利于編譯優化時如合并重復常量。
- 作用域管理:符號表處理不同作用域、命名空間的標識符,用字符串可記清所屬信息,區分同名標識符。
- 錯誤診斷:編譯出錯時,符號表中字符串形式的標識符信息,便于生成準確易懂的錯誤提示。
- 與源程序映射:源程序代碼元素多為文本(字符串),符號表用字符串可更好映射,利各編譯階段處理信息。