Re: [問卦] 寫編譯器的人是不是很屌?已回收

看板Gossiping作者 (啃)時間7年前 (2019/01/31 05:02), 7年前編輯推噓9(904)
留言13則, 11人參與, 7年前最新討論串3/4 (看更多)
先講 編譯器不是除錯器 差很多 編譯器與除錯器有套招規範 要同規範方可正常運行 但理論上只要用相同規範 編譯器與除錯器都是可換掉的 好比在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
我還以為是KEIL
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
想聽 dwarf v3 v4 的故事
01/31 05:16, 6F

01/31 05:18, 7年前 , 7F
跟我想的差不多
01/31 05:18, 7F

01/31 05:52, 7年前 , 8F
64位元程式的不用[EBP]了,全用register
01/31 05:52, 8F

01/31 05:54, 7年前 , 9F
[EBP]在32位元時就偶爾出錯了,同時執時多個同一程式時
01/31 05:54, 9F

01/31 05:55, 7年前 , 10F
會發生A程式指到B程式去
01/31 05:55, 10F

01/31 06:19, 7年前 , 11F
大(完)概(全)是(看)這(不)樣(懂)
01/31 06:19, 11F

01/31 06:31, 7年前 , 12F
這話題不是compiler怎麼變成debugger了,八竿子打不著
01/31 06:31, 12F

01/31 06:45, 7年前 , 13F
01/31 06:45, 13F
文章代碼(AID): #1SKX3ZfL (Gossiping)
討論串 (同標題文章)
文章代碼(AID): #1SKX3ZfL (Gossiping)