我一直在做一個(近完成)的Javascript項目超過14個月了。這個項目最初只是我希望在一夜之間完成的一個黑客,但隨着時間的推移,Javascript部分已經成長爲68個獨立文件和10,314個非空行,可悲的是目前依賴於C預處理器進行構建。Javascript友好的預處理器難題
很難解釋我是如何最終爲Javascript使用cpp的:這只是一個破解,我需要的東西給了我宏觀擴展,ifdef,定義和包括沒有太多的努力。經過約3秒的考慮,我意識到cpp對於任務來說是「完美的」:
- 提供一個在發佈模式下消失的LOG()宏。
- 提供在發佈模式下消失的ASSERT()宏,並生成標有原始文件和行號的例外。
- 代碼的交換LOG()和ASSERT()實現允許生成一個「checked」構建,它在事件發生時以緊湊的形式記錄事件,並在發生崩潰時向服務器報告。
- 根據與Python後端共享的配置文件,用「1」代替PROJECT_SOME_CONFIG_VAR_NAME。
像所有真正的黑客一樣,這種黑客現在已經被硬編碼到項目中,我真的不想考慮替換它的工作。我的項目到了我想要將代碼庫移動到它自己的專用測試服務器(而不是我的筆記本電腦)的階段,但是在設置Linux實例時,我發現4.1之後的GNU cpp版本不再預處理Javascript隨着錯誤崩潰。
與其將GCC的特定版本添加到構建要求列表中,現在我認爲將是一個真正解決這個混亂的好時機。但我的問題是,我找不到與cpp具有相同功能和特性的替換預處理器!我已經考慮過m4,但m4本身就是一個痛苦的世界。我發現其他JavaScript特定的預處理器缺乏所有我目前根據功能,如:
__FILE__
&__LINE__
- 複雜的宏
- 包括警衛
- 令牌串聯
- 條件編譯
我正在認真考慮實現了一個全新的預處理器,僅用於Javascript,它完全借用了C預處理器的語法,因爲它工作得很好。我只是想知道在這樣做之前是否有更好的選擇。 :)也許已經有一個類似cpp的通用預處理器可以交換?在這68個文件中替換所有預處理器語法所需的工作接近簡單地重新實現預處理器所需的工作量。
我很驚訝我曾經依靠C預處理器做到了這一點;在這項任務中,心智理解能力比健康更有效。對我開放的另一個選項是爲Linux,Darwin-i386,Win32靜態構建cpp-4.1版本,並將這些二進制文件存儲在項目的存儲庫中。
幫助!
好的,我很同情。你做了一個真正的混亂,但爲什麼CPP崩潰?它不應該。 – 2010-01-15 15:45:02
@Stefano,它不是像分段錯誤那樣的真正崩潰。解析器變得混亂,因爲Javascript的詞法和語法明顯不同於C語言。GCC 4.2+似乎有更嚴格的解析器。 – dmw 2010-01-15 15:48:47
出於好奇:哪個JS構造混淆了C PP? – Christoph 2010-01-15 16:22:51