《程式設計師的自我修煉》學習筆記(二)

2022-10-08 21:33:19 字數 2097 閱讀 8113

1. 概述

本質:軟體執行背後的機理及支撐軟體執行的各種平台和工具

2. 編譯過程分解

2.1 預編譯

主要處理源**檔案中以「#」開始的預編譯指令,如「#include」,「#define」

gcc -e hello.c -o hello.i

處理規則如下

1)將所有的「#define」刪除,並且展開所有巨集定義

2)處理所有條件預編譯指令,如「#if」,「#ifdef」,「elif」,「#else」,「#endif」

3)處理「#include」預編譯指令,將被包含的檔案插入到該預編譯指令的位置(該過程是遞迴的)

4)刪除所有的注釋「//」,「/**/」

5)新增行號和檔名標識,如#2 「hello.c」 2,以便於編譯時編譯器產生除錯用的行號資訊及用於編譯時產生編譯錯誤或告警時顯示行號

6)保留所有的#pragma編譯器指令,因為編譯器需要使用

2.2 編譯

對預編譯完的檔案進行詞法分析、語法分析、語義分析、優化,生成彙編**檔案

gcc -s hello.i -o hello.s

或gcc -s hello.c -o hello.s

2.3 彙編

將彙編**轉換為機器可以執行的指令,每個彙編語句都對應一條機器指令。

as hello.s -o hello.o

或gcc -c hello.s -o hello.o

或gcc -c hello.c -o hello.o

2.4 鏈結

ld3. 編譯器

編譯過程包含:掃瞄、語法分析、語義分析、源**優化、**生成、目標**優化

3.1 詞法分析(scanner)

源**程式輸入到掃瞄器,將源**的字串行分割成一系列的記號。

記號分類:關鍵字、識別符號、字面量(數字、字串)、特殊符號。

將識別符號存放到符號表,將數字、字串常量存放到文字表。

3.2 語法分析(grammer parser)

對掃瞄器產生的記號進行語法分析,採用上下文無關語法,產生語法樹(以表示式為節點的樹)。

符號和數字是最小的表示式。

3.3 語義分析

語法分析只是完成對表示式的語法層面的分析,並不了解這個語句是否真正有意義。

編譯器所能分析的語義是靜態語義,即在編譯期可以確定的語義。

靜態語義包含宣告和型別的匹配、型別的轉換。

經過語義分析後,語法樹上的表示式都被標識了型別。

3.4 中間語言生成

原始碼級優化器將整個語法樹轉換為中間**,一般跟目標機器和執行時環境無關。

中間**採用三位址碼或p-**。

中間**將編譯器分為前端和後端,前端負責產生機器無關的中間**,後端將中間**轉換為目標機器**。

針對跨平台的編譯器,可以採用同乙個前端和針對不同機器平台的多個後端。

3.5 目標**優化

編譯器後端包含**生成器和目標**優化器。

**生成器將中間**轉換為目標機器**,該過程依賴目標機器,因為不同機器的字長、暫存器、整數資料型別和浮點資料型別不同。

目標**優化器對目標**進行優化

4. 鏈結器

c:最小的單位是變數和函式;若干個變數和函式組成模組;

j**a:每個類是乙個模組;若干個類模組組成包;若干個包組成程式;

最常見的庫:執行時庫

《程式設計師的自我修煉》學習筆記(一)

1.硬體架構 最為關鍵的三個部件 cpu,記憶體,i o控制晶元。i o裝置相比於cpu和記憶體的速度很慢,為了協調i o裝置和匯流排之間的速度,每個裝置都會有乙個i o控制器 由於cpu核心頻率的提公升,導致記憶體跟不上cpu的速度,於是產生了和記憶體頻率一致的系統匯流排,而cpu採用倍頻的方式與...

程式設計師修煉之道閱讀筆記(二)

注重實效的途徑 在這裡便我學到了如何來完善自己所寫的源 1.系統中的每一項知識都必須具有單 一 無歧義 權威的表示。在常的 敲寫中我們用最簡單的語句表達最複雜的內容及其功能,將不必要的囉嗦的部分去掉,來減少 的二重性,來避免出現歧義,提高 的健壯性。書中也提到了一些方法來規避重複沒遵循dry原則,例...

程式設計師修煉之道 二

最近被乙個詭異的問題糾纏了兩三天 當然現在已經解決了,其實原因一點都不複雜,在技術方面可借鑑的地方不多,所以我就打算強調解決這個問題的整個過程,以及通過該過程自己總結出的方 qa和策劃對程式說 我這發現了 的問題,麻煩你查一下。程式對程式說 我這發現了 的問題,要不你看看你那會不會有這問題,有的話你...