程式設計師調程式碼訪談:Marc-André Cournoyer

湯曉發表於2014-12-29

『程式設計師調程式碼訪談』是 Karim Hamidou 發起的一個程式設計師訪談系列,受訪者分享他們遇到的最難/最有意思的Bug,以及如何解決。

本文的受訪者是 Marc-André Cournoyer。


你是誰?

我是一名軟體開發者兼企業家。我來自加拿大的魁北克。我建立了OSS(譯註:一個 Ruby Web 伺服器),寫了一本書,出售了一些業務。現在我主要編寫程式碼,在Coded教學。

你遇到最困難/有趣的bug是什麼,你是如何解決?

最近,我為我的程式碼俱樂部編寫了一個虛擬機器,但不明白它為什麼不能工作。

虛擬機器的工作原理和CPU一樣。它有一個指標指向當前正在執行指令。通常該指標被稱為程式計數器(pc)。

虛擬機器工作原理是執行一條指令並跳轉到下一條。我就是那樣編寫的。指令的執行在一個很大的switch-case迴圈中完成。然後,增加程式計數器的值跳轉到下一條指令(指令長度為2個位元組,所以pc+=2)。

當然,有些指令也可以調整程式計數器值。特別是用於控制流的實現(比如if)。這些指令能夠將程式計數器的值設定成記憶體中的某個地址。如果條件為真,程式指標將會指向記憶體中對應程式碼塊的地址。這是CPU實現所有控制流結構的方式。

這裡有個bug。記得之前說過,執行完一條指令,我就增加程式計數器的值。那意味著每當執行一條if語句,虛擬機器都將跳轉到對應記憶體地址+2的位置。多移動了兩個位元組。

解決方案是在執行指令之前增加程式計數器的值。

有什麼要補充的?

以下是我用偽機器程式碼解決bug的過程。

1.遇到bug受阻。
2.用頭撞擊鍵盤。
3.停止編碼,離開電腦。
4.回到電腦前,嘗試些新的改動。
5.如果bug解決,跳轉到第7步。
6.跳轉到第2步。
7.喝酒慶祝。

每當發現bug,我努力地想要忽略它,保持自信,但都是徒勞。

相關文章