|零基础开发 nginx 模块( 七 )
有时候想 , Nginx 为什么不使用更高级的开发语言 (比如 C++) 编写 , 或者至少可以复用 Apache 基础库 APR 吧 ?其实又何止 Apache 基础库 ,Apache HTTP 服务器应该有很多组件都可以复用 。 但如果这样的话 , Nginx 又怎么能叫 Nginx 呢 ? 大概只能是一个特殊版本的 Apache HTTP 服务器 , 影响力和竞争力都很难超越官方正版(就像许多 Nginx 修改版很难超越 Nginx 一样)。 不止是 3 方基础库 , Nginx 连 C 语言标准库都试图避免直接使用 , 比如自己开发了 ngx_snprintf() (但 Nginx 也不是全都自己来 , 比如合理使用了 pcre, zlib, openssl 等 3 方库)。 很多 C 语言项目其实都在使用自己特殊定制版的 C 语言 (又一个典型缺点)。 这让我想起《黑客与画家》文集上提到的迎难而生 的问题 (值得另外开贴讨论), 如果一个问题太容易 , 谁都可以复制 (抄袭) , 那么它的核心竞争力在哪里?
Nginx 及其模块开发本身是有一定门槛的 , 甚至 Nginx 本身建议不要滥用模块开发 (而尽量用 nginx 配置或内置的 perl/njs 脚本)。
有 nodejs 粉说用 nodejs 几条语句就可以写出一个高性能 HTTP 服务器 , 如果 nginx 这样写成 , 结果会怎样 ?在大家都在喊着 nodejs/python/php/golang/kotlin 天下第一的时候 , 老态龙钟的 C 语言荣获 TIOBE 编程语言排行榜 2019 年度语言 , 最近 (2020 年 5 月) 又重夺排行榜第一 。 我不是针对谁 , 我是说 javascript/php/golang 等都是垃圾语言 (python 和 kotlin 还算能用?) 。 我也不推荐 C 语言 , C 语言显然有很多缺点 (过于底层) , 如果能够加上一些 C++ 特性 (特别是类和 RAII) 那肯定会好很多 。 但是 C++ 特性太多 , 简直是一团浆糊 , 所以许多团队和项目不得不精心控制一些边界 , 设计一个定制版的 C++ 语言 (与 C 语言类似) 。 这导致 C++ 语言分裂 , 是个不好的信号 , 也是这个原因导致许多声称解决这些问题的新语言不断出现 。
结论: 贴近系统和硬件编程 , C/C++ 是不错的选择 , 高级语言首选 Java, 其他一些快速粗糙 (quick and dirty) 的场景可适当选用其他语言 。 但一定要小心避免垃圾语言 (不再一一点名了) 和所谓的领域专用语言 (DSL)。
代码风格
首选吐槽一下 。 Nginx 只使用 C 风格的注释 /* */ (不使用 C++ 的双斜杠 // 注释)。 使用 4 个空格缩进 (而不是 tab)。 变量名常常太短 (导致含义不直观)。 单行源码不超过 80 个字符 (可能也是导致变量名过短的原因) 。 这几点个人不太喜欢 。
听说 nginx 作者有代码洁癖 , 要求字段名 (变量名) 排版对齐 。 我也有代码洁癖 , 我反对这种对齐 , 表面上视觉整齐了 , 实际上维护跟踪很麻烦 (特别是没有工具支持的情况下)。 再看 nginx 代码 , 不仅要求对齐 , 而且是抛开修饰符后的单词对齐 (嗯 , 奇怪的排版)。 如 struct ngx_command_s 定义如下 。
struct ngx_command_s { ngx_str_tname; ngx_uint_ttype; char*(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); ngx_uint_tconf; ngx_uint_toffset; void*post; };nginx 代码是很吝惜注释的 , 但并非没有注释 , 恰当的时候会有注释 , 而更多的时候让代码自己说话 。 如 ngx_http_core_generic_phase() 函数的这段代码 , 结合注释可知这里已经考虑枚举了 rc 的所有可能取值 。 这点我是比较赞赏的 , 不过个人建议可以适当添加更多注释 (特别是逻辑复杂的地方)。
if (rc == NGX_DECLINED) { r->phase_handler++; return NGX_AGAIN; } if (rc == NGX_AGAIN || rc == NGX_DONE) { return NGX_OK; } /* rc == NGX_ERROR || rc == NGX_HTTP_...*/ ngx_http_finalize_request(r, rc); return NGX_OK;另外 , nginx 代码鼓励用空行分割语义块 (哪怕只有一行), 如 ngx_conf_handler() 函数包含如下代码块:
推荐阅读
- |万向肖风:区块链的商业突破不是从 C 端开始,而是从开发者开始
- 华为开发者联盟|华为课堂|华为帐号如何保护您的帐号安全?
- 品谷农产品|专业的软件开发流程,应该是怎样的呢?
- AI人工智能|“眼健康黑科技” AI智能眼科检测仪来了!展锐虎贲T710开发板等你来盘!
- 智慧医疗|“眼健康黑科技” AI智能眼科检测仪来了!展锐虎贲T710开发板等你来盘!
- 智能电视|苹果正在开发带有A12x和A14x芯片的Apple TV
- IBM|百年IBM再度迎来历史性变革 拆分基础设施服务部门全力押宝云计算
- 互联网分析师于斌|鸿蒙搜索和EMUI11!华为开发者大会回顾
- cnBeta|前苹果工程师/自动修正创造者开发首款App:名为Up Spell的文字游戏
- 化学奖|女科学家获2020年诺贝尔化学奖,她们开发了“基因剪刀”
