12

我已经在一个(即将完成的)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 版本,并将这些二进制文件存储在项目的存储库中。

帮助!

4

2 回答 2

3

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

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

于 2010-01-15T16:00:30.460 回答
0

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

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

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

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

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

5)您只需要基本的PHP知识即可受益匪浅。

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

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

于 2017-11-18T07:00:43.470 回答