2010-01-15 43 views
12

我一直在做一個(近完成)的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版本,並將這些二進制文件存儲在項目的存儲庫中。

幫助!

+0

好的,我很同情。你做了一個真正的混亂,但爲什麼CPP崩潰?它不應該。 – 2010-01-15 15:45:02

+0

@Stefano,它不是像分段錯誤那樣的真正崩潰。解析器變得混亂,因爲Javascript的詞法和語法明顯不同於C語言。GCC 4.2+似乎有更嚴格的解析器。 – dmw 2010-01-15 15:48:47

+0

出於好奇:哪個JS構造混淆了C PP? – Christoph 2010-01-15 16:22:51

回答

3

你已經試過mcpp?這是一個「便攜式C預處理器」

如果失敗,您可以嘗試使用通用宏處理器(如gema)並在其上構建足夠的cpp。

+2

感謝鏈接到mcpp:它在「 - @ old」模式下得到了很大的幫助,但似乎失敗了,因爲我對字符串使用了單引號字符(C中的字符文字)。 短暫調查gema。 – dmw 2010-01-15 16:21:41

+1

授予你這個問題的答案,因爲它是最有用的。最後,我決定咬緊牙關並將整個代碼庫轉換爲Google Closure,因爲它幾乎包含了我在純Javascript中需要的所有功能,並且編譯器在「部署」時提供了相同的好處(將它們連接在一起併除去調試碼)。 – dmw 2010-02-16 21:19:44

0

根據對類似問題的回答,我查看了cpp和其他一些競爭者。然後找到我認爲是最好的答案 - PHP。考慮:

1)PHP確實是一個預處理器(它的首字母縮寫)。

2)PHP已準備好在大多數服務器上運行。您只需將文件擴展名從「.js」更改爲「.php」或「.js.php」,或者(我的首選項)對服務器配置文件進行簡單編輯(您可以在其他位置找到詳細信息)。 3)許多JavaScript開發人員已經熟悉PHP或熟練使用PHP。

4)與許多其他預處理器不同,PHP是圖靈完備的。

5)您只需要基本的PHP知識就可以獲益匪淺。

6)比其他預處理器有更多的PHP文檔/教程/論壇。

但主要是,它很奇怪,很酷。感謝誰給了我這個想法 - 我現在找不到他們的帖子。

+0

爲什麼PHP比任何其他編程語言都更好?你能舉一些例子嗎?例如,你會如何做一個在發佈模式下消失的_LOG()宏或者用一個很好的方式替換PROJECT_SOME_CONFIG_VAR_NAME爲「1」_? – 2018-01-14 18:13:21