【问题标题】:Javascript-friendly preprocessor dilemmaJavascript友好的预处理器困境
【发布时间】:2011-01-05 13:47:39
【问题描述】:

我从事一个(即将完成的)Javascript 项目已有 14 个多月了。该项目一开始是一个我希望一夜之间完成的 hack,但随着时间的推移,Javascript 部分已经增长到 68 个单独的文件和 10,314 个非空行,遗憾的是目前依赖于 C 预处理器进行构建。

很难解释我是如何最终将 cpp 用于 Javascript 的:这只是一个 hack,我需要一些东西来给我宏扩展、ifdef、define 和包含而不需要太多的努力。经过大约 3 秒的考虑,我意识到 cpp 非常适合这项任务:

  • 提供一个在发布模式下消失的 LOG() 宏。
  • 提供在发布模式下消失的 ASSERT() 宏,并生成带有原始文件和行号标记的异常。
  • 将 LOG() 和 ASSERT() 实现交换为允许生成“已检查”构建的代码,该构建以紧凑形式记录发生的事件,并在发生崩溃时将其报告回服务器。
  • 根据与 Python 后端共享的配置文件,将 PROJECT_SOME_CONFIG_VAR_NAME 替换为“1”。

像所有真正的 hack 一样,这个 hack 现在被硬编码到项目中,以至于我真的不想考虑需要做哪些工作来替换它。我的项目正处于我想将代码库移动到它自己的专用测试服务器(而不是我的笔记本电脑)的阶段,但是在设置 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会崩溃?它不应该。
  • @Stefano,这不是像分段错误那样的真正崩溃。解析器变得混乱,因为 Javascript 的一组词位和语法明显不同于 C。GCC 4.2+ 似乎有更严格的解析器。
  • 出于好奇:哪个 JS 构造混淆了 C PP?
  • 也许您可以修改另一个类似 CPP(例如 haskell.org/cpphs)以更好地满足您的需求。或者用 JavaScript 编写一个 JavaScript 预处理器,因为你现在已经熟悉这种语言了 ;-)
  • @Christoph,至少是单引号字符串:'David' 是有效的 Javascript,而它是无效的 C。在 4.2 之前,GCC 似乎传递了无效的令牌,但这不再是真的。 @ephemient 很可能 :) 实际上任务应该更简单,因为我不需要 C 预处理器的全部通用性和规则。

标签: javascript preprocessor c-preprocessor


【解决方案1】:

您是否已经尝试过mcpp?它是一个“便携式 C 预处理器”

如果失败,您可以尝试使用通用宏处理器(如 gema)并在其上构建足够的 cpp。

【讨论】:

  • 感谢 mcpp 的链接:它在“-@old”模式下已经走得很远,但似乎失败了,因为我使用单引号字符作为字符串(C 中的字符文字)。立即调查 gema。
  • 授予您这个问题的答案,因为它是最有用的。最后,我决定硬着头皮将整个代码库转换为 Google Closure,因为它几乎具有我在纯 Javascript 中需要的所有功能,并且编译器在“部署”时提供了相同的好处(将它们链接在一起并删除调试代码)。
【解决方案2】:

我根据对类似问题的回答查看了 cpp 和其他一些竞争者。然后找到了我认为迄今为止最好的答案 - PHP。考虑:

1) PHP 确实是一个预处理器(它的首字母缩写)。

2) PHP 已准备好在大多数服务器上运行。您所要做的就是将文件扩展名从“.js”更改为“.php”或“.js.php”,或者(我的偏好)对服务器配置文件进行简单的编辑(您可以在其他地方找到详细信息)。

3) 许多 JavaScript 开发人员已经熟悉或精通 PHP。

4) 与许多其他预处理器不同,PHP 是图灵完备的。

5) 你只需要基本的 PHP 知识就能受益匪浅。

6) PHP 的文档/教程/论坛比其他预处理器多得多。

但大多数情况下,它很奇怪很酷。感谢给我这个想法的人 - 我现在找不到他们的帖子。

【讨论】:

  • 为什么 PHP 会比任何其他编程语言更好?你能举一些例子吗?例如,您将如何做一个在发布模式下消失的 LOG() 宏用“1”替换 PROJECT_SOME_CONFIG_VAR_NAME 以一种很好的方式?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-24
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
相关资源
最近更新 更多