Hacker News 中文摘要

RSS订阅

我用一年时间用D语言打造了一个ASN.1编译器 -- I spent a year of my life making an ASN.1 compiler in D

文章摘要

作者用D语言开发了一款名为dasn1的ASN.1编译器,虽然耗时一年但仍未完成。文章主要讨论了ASN.1的复杂性、编译器实现细节及工具输出,而非完整介绍该工具本身。内容较为零散,读者可以从任意部分开始阅读。

文章总结

用D语言开发ASN.1编译器的一年历程

项目背景
作者花费一年时间使用D语言开发名为dasn1的ASN.1编译器,目前仍处于未完成状态。该项目源于开发Juptune异步I/O框架时对TLS协议实现的兴趣,需处理x.509证书及其底层ASN.1 DER编码。

ASN.1技术解析

  1. 核心概念
    ASN.1(抽象语法标记)是一种数据规范语言,包含:

    • 标记语法(由x.680-x.683规范定义)
    • 编码规则(如BER、DER、PER等)
  2. 复杂特性

    • 约束系统:支持类型和字段的数值范围、大小等限制(如INTEGER (0..255)
    • 版本控制:通过OBJECT IDENTIFIER实现模块的强版本标识
    • 扩展规范:x.681信息对象类、x.682表约束等高级功能(实现难度较高)
  3. 编码示例
    DER编码因确定性特点被广泛用于密码学领域,而XER和JER分别支持XML/JSON格式。

D语言的优势

  1. 代码生成友好

    • 静态导入(static import)避免命名冲突
    • 模块级符号查找(.Type语法)
    • typeof()简化类型处理
    • 灵活的尾随逗号支持
  2. 元编程应用
    利用模板和version(unittest)等特性,实现:

    • AST节点的混入模板(mixin template)
    • 编译时API校验
    • 测试代码的简化封装

开发挑战

  1. 规范复杂性

    • x.680历史语法废弃导致兼容性问题
    • 规范文档学术化表述难以理解
    • 约束需在类型检查、语义验证、运行时三次实现
  2. 技术痛点

    • 值序列语法的多义性解析
    • ANY DEFINED BY已废弃特性的替代方案
    • 不可变IR节点的理想与现实差距
    • 规范信息分散导致的实现困难

项目现状
目前编译器已能解析部分x.509证书,并启动TLS 1.3的D语言实现。作者坦言ASN.1的复杂性远超预期,但这段经历显著提升了其编译器开发能力。

"现代生活竟如此依赖这些90年代过度设计的古老规范,而大多数人甚至从未听说过ASN.1。" —— 作者感慨道

尽管项目实用性存疑,这段探索过程本身已成为宝贵的技能积累。正如作者自嘲:"或许某天这能写进简历,虽然招聘官可能更关心Ansible经验"。

评论总结

这篇评论总结围绕ASN.1标准、D语言和编译器展开,主要观点如下:

  1. 关于ASN.1的讨论
  • 历史地位:有评论认为ASN.1作为IDL和序列化格式历史悠久,但质疑其在当今是否仍是最佳选择(评论2:"If it were today, would it be the same or would we end up with protobuf or thrift or similar?")
  • 开发体验:多位开发者吐槽ASN.1的复杂性(评论4:"i shiver every time something needs attention in there";评论7:"it's written in the most convoluted way possible")
  1. 关于D语言的评价
  • 开发优势:用户赞赏D语言的单元测试、枚举和契约编程等特性(评论5:"unit tests anywhere...enums, unions, asserts, contract programming are all great")
  • 学习曲线:有开发者表示D语言文档完善,学习门槛低(评论5:"I didn't have to learn D much...there would always be a very nice way to do things")
  1. 关于编译器的实践
  • 工具创新:开发者分享通过JSON AST转换简化ASN.1解析的经验(评论3:"using the Heimdal JSON compiler, which can transform ASN.1 into a much more parseable JSON AST")
  • 标准争议:有尖锐批评认为复杂标准是厂商锁定手段(评论7:"The only goal of such ridiculous standards is to act as a form of vendor lock-in")
  1. 博客内容评价
  • 写作自谦:作者自评内容松散(评论1:"threw a bunch of semi-related ramblings together")
  • 知识价值:读者肯定博客的科普意义(评论6:"was nice to learn a little more by reading this blog post")