假設你正在爲一種叫做Foo的新語言設計和編寫一個編譯器,其中的優點是它對於實現編譯器特別有用。一個經典的方法是用C語言編寫第一個版本的編譯器,然後用它編寫Foo中的第二個版本,然後變成自編譯的。引導一個跨平臺的編譯器
這意味着您必須小心保留二進制文件的備份副本(與大多數只需保留源備份副本的程序相反);一旦語言從第一版本發展而來,如果你丟失了二進制文件的所有副本,那麼你就沒有能力編譯當前版本。就這樣吧。
但假設它旨在同時支持Linux和Windows。只要它實際上在兩個平臺上運行,它都可以在每個平臺上自行編譯,沒有問題。假設你在一個平臺上丟失了二進制文件(或者有理由懷疑它已經被攻擊者入侵);現在有一個問題。對於每個支持的平臺,必須保護二進制文件至少還有一個比我感到滿意的失敗點。
一個解決方案是使其成爲一個交叉編譯器,這樣任一平臺上的二進制文件都可以定位到兩個平臺。
這聽起來並不簡單 - 儘管選擇二進制輸出格式沒有問題,但每個平臺都提供了C頭文件形式的系統API,這些頭文件通常只存在於其本地平臺上,例如,即使編譯爲Linux二進制格式,也不能保證在Windows上編譯的代碼能夠在Linux上運行。
也許這個問題可以通過將Linux頭文件下載到Windows機器上並使用Windows二進制文件交叉編譯Linux二進制文件來解決。
有沒有我缺少的解決方案的任何警告?
另一種解決方案可能是在Python中維護一個單獨的最小引導編譯器,將Foo編譯爲可移植的C,只接受主Foo編譯器所需的語言子集,並執行最小錯誤檢查並且不進行優化,意圖存在引導編譯器將因此保持簡單,以便在後續語言版本中維護它不會花費太多。
再一次,有沒有解決方案我想念的任何警告?
以前有什麼方法讓人們用來解決這個問題?
這真的是個問題嗎?當然,解決方案是「僅使用版本控制來維護原始源代碼」。 –
爲什麼要擔心丟失二進制文件?你還有原始的來源嗎?而且您仍然需要分發原始的C源代碼,以便能夠在尚未擁有Foo編譯器的系統上引導編譯器。 –
因爲隨着時間的推移,語言將會以這樣一種方式發展,即原始的C版本的編譯器將不再能夠理解它。 – rwallace