我正在嘗試構建我的第一個C語言編程語言,可能是一個解釋器,我剛剛完成了第一步,即詞法分析器。語言lexing:一次或單獨使用一個字符串可以獲得更好的性能?
我想過通過簡單地將整個源代碼流整合到一個文件中,然後讓解析器處理數據。
我注意到許多其他編譯器和解釋器只在解析時解析器模塊要求另一個標記時出現lex。
從程序的代碼性能來看,它是否更快速地將源代碼一次全部解析出來,然後分別解析得到的令牌或lex和解析令牌?
我正在嘗試構建我的第一個C語言編程語言,可能是一個解釋器,我剛剛完成了第一步,即詞法分析器。語言lexing:一次或單獨使用一個字符串可以獲得更好的性能?
我想過通過簡單地將整個源代碼流整合到一個文件中,然後讓解析器處理數據。
我注意到許多其他編譯器和解釋器只在解析時解析器模塊要求另一個標記時出現lex。
從程序的代碼性能來看,它是否更快速地將源代碼一次全部解析出來,然後分別解析得到的令牌或lex和解析令牌?
「更快」是一個模糊的詞。有不同類型的速度(延遲,絕對開始到結束的持續時間,編譯速度,執行速度),並取決於你如何實現你的語言的前端和後端,任何一種方法都可以更快。
另外,速度並不總是更好。如果你的解析器在技術上更快,但是使用太多的內存,它可能會崩潰,或者至少最終會交換,這會再次減慢它的速度。如果您的解析器閃電般快速,但生成的代碼效率低下,您的用戶將支付更快的開發速度。你必須編寫實際的代碼並在分析器中運行,以便能夠分辨出真正的更好,並且提出哪些標準對你很重要。
在開始時一次令牌化/勒緊所有東西意味着您可能能夠優化內存分配,從而縮短令牌列表等的調整時間,但這也意味着整個文件必須在它甚至可能被部分解析。
OTOH如果根據需要進行分析,則可能需要更頻繁地以小步驟追加到陣列中,因此您將支付一定的內存損失,但在例如像JavaScript這樣的解釋型語言,你可能只需要解析實際用於本次運行的部分。
所以它的很大一部分取決於你的語言的細節和你期望運行的硬件。在嵌入式系統中只有很少的內存和交換空間,你可能別無選擇,只能漸進地執行lex,因爲整個程序源代碼可能不適合內存。如果您的語言的語法需要大量的預測,您可能看不到任何好處,因爲您正在閱讀所有內容......
哦,你的問題可能會略有關係http://stackoverflow.com/questions/24306893/what-is-the-difference-between-compilation-and-interpretation/24308305#24308305 – uliwitness
我應該說我的目標硬件會可能適用於嵌入式和大型系統。我的語言並不完全是一種「一刀切」的語言,但我肯定會更喜歡它具有低級特性和速度,以至於可以使用該語言編寫OS內核。 – Nergal
請注意,您的開發環境將與您的部署平臺有什麼區別。在大多數情況下,如果您的編譯器只能交叉編譯到嵌入式系統,那很好,但例如,如果您的部署平臺是Web服務器,並且您的語言旨在將CGI作爲解釋腳本實現,則它必須在任何服務器硬件上運行。儘管如此,即使很少有人嘗試在實際的嵌入式硬件上運行這樣的服務器。除非您現在急需,否則我會優化您的解釋器以適應版本2.0。 – uliwitness
按需快速查詢。否則,你會增加一個巨大的延遲:在lexing完成之前,甚至不能開始解析。 – EJP
但爲什麼更快呢?我試圖理解這個理論。 – Nergal
總的來說,我認爲這是一個很好的問題,但它對於StackOverflow來說是不合適的。 StackOverflow期待具體的問題,這是一個非常廣泛的問題,試圖涵蓋所有可能發生的問題。因此我投票結束。 –