Re: [問卦] 寫編譯器的人是不是很屌?已回收
先講 編譯器不是除錯器 差很多
編譯器與除錯器有套招規範 要同規範方可正常運行
但理論上只要用相同規範 編譯器與除錯器都是可換掉的
好比在windows上, 輝達NVCC編譯器對CPU部份並無提供除錯器
而直接套用微軟Windbg
intel雖有提供除錯器 但若用intel編譯器但不爽用他給的除錯器
而回頭用微軟 也是可正常運作
那除錯是怎達成的?
編譯器在將高階編程語文轉為機械語文時
對代碼進行一對行對一行轉換 並付上原本代碼及行號
這樣使用者在設定中段點後 除錯器就可知是對應到是哪一行 哪一變量
所以除錯中毋得改代碼 若改開發環境會警告 然後除錯開始錯亂
例:
原句為 C = A*B;
C += 4;
假設 A在 EBP - 4, B 在 EBP - 8, C在 EBP - 12
這時就組語會是
C = A*B;
--
MOV EAX, [EBP - 4]; 把A抓在甲手上
MOV ECX, [EBP - 8]; 把B抓在丙手上
MUL ECX ; 把甲手上的東西與丙手相乘 結果在甲手上
MOV EBP - 12, EAX; 把甲手的東西放回C
------
C += 4;
MOV EAX, [EBP - 12]; 把C抓到甲手上
ADD EAX, 4; 甲手上的東西加四
MOV EBP - 12, EAX; 把甲手的東西放回C
很明顯 中間兩行是多餘的 可以砍掉而不影響結果
但為了除錯需要 必需一行對一行 不得跳
不然若人家定 C += 4 這行 想看前面C是多少 那不就看不到了
所以 在除錯時 為何不能開優化 就是這原因
若開了優化會發現常定不著 或定著後值不對
那除錯器具體怎定著?
CPU有個中斷 叫陷阱中斷 可以強迫中斷當前活動跳到它處 並可完美恢復
所以 當你設斷點, 除錯器就跑去那行前面 插入中斷命令
到那行時 CPU看到這標誌 就會跳轉到除錯器本體部
然後除錯器就給你看值了
所以定著程式這功能 是除錯器與用了CPU特殊功能而製成
實務上純軟體做不到 ( 硬幹可以 那就是做CPU彷真器 慢到翻)
回頭講 編譯器要怎學
以下這兩個編譯器都很適合學習 完全無用別庫或工具而實現完整C編譯器
簡單講就是純手工做出來的編譯器
https://bellard.org/tcc/ ffmpeg 項目發起人
http://ucc.sourceforge.net/ 小米前首席架構師
不過真正在實用的編譯器..
都是用了一堆工具/庫
若用那工具 要搞出自己的編譯器 難度其實也不算高
參考資料:
用windows接口做個簡單的除錯器
Software Exorcism:
A Handbook for Debugging and Optimizing Legacy Code
https://goo.gl/iSxT1r
不靠工具 如何做出個不支持浮點功能之C編譯器
自己动手写编译器、链接器 https://book.douban.com/subject/26339438/
用工具快速做出個編譯器
自制编译器 https://book.douban.com/subject/26806041/
※ 引述《paupauGO (ouo)》之銘言:
: 就是阿
: 寫程式的時候都需要編譯器
: 可以code出各種東西
: 但本魯很好奇的是
: 編譯器到底是怎麼寫出來der
: 內建各種方法,可以除錯跟設中斷點
: 這麼屌的東西要開發應該hen辛苦ㄅ
: 能寫出這麼厲害的工具的人是不是很猛?
: -----
: Sent from JPTT on my Asus ASUS_Z017DA.
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 24.7.55.66
※ 文章網址: https://www.ptt.cc/bbs/Gossiping/M.1548882147.A.A55.html
推
01/31 05:03,
7年前
, 1F
01/31 05:03, 1F
推
01/31 05:04,
7年前
, 2F
01/31 05:04, 2F
推
01/31 05:07,
7年前
, 3F
01/31 05:07, 3F
推
01/31 05:09,
7年前
, 4F
01/31 05:09, 4F
推
01/31 05:10,
7年前
, 5F
01/31 05:10, 5F
※ 編輯: KILLE (24.7.55.66), 01/31/2019 05:16:09
推
01/31 05:16,
7年前
, 6F
01/31 05:16, 6F
→
01/31 05:18,
7年前
, 7F
01/31 05:18, 7F
推
01/31 05:52,
7年前
, 8F
01/31 05:52, 8F
→
01/31 05:54,
7年前
, 9F
01/31 05:54, 9F
→
01/31 05:55,
7年前
, 10F
01/31 05:55, 10F
推
01/31 06:19,
7年前
, 11F
01/31 06:19, 11F
→
01/31 06:31,
7年前
, 12F
01/31 06:31, 12F
推
01/31 06:45,
7年前
, 13F
01/31 06:45, 13F
討論串 (同標題文章)