文章摘要
作者用D语言开发了一款名为dasn1的ASN.1编译器,虽然耗时一年但仍未完成。文章主要讨论了ASN.1的复杂性、编译器实现细节及工具输出,而非完整介绍该工具本身。内容较为零散,读者可以从任意部分开始阅读。
文章总结
用D语言开发ASN.1编译器的一年历程
项目背景
作者花费一年时间使用D语言开发名为dasn1的ASN.1编译器,目前仍处于未完成状态。该项目源于开发Juptune异步I/O框架时对TLS协议实现的兴趣,需处理x.509证书及其底层ASN.1 DER编码。
ASN.1技术解析
核心概念
ASN.1(抽象语法标记)是一种数据规范语言,包含:- 标记语法(由x.680-x.683规范定义)
- 编码规则(如BER、DER、PER等)
复杂特性
- 约束系统:支持类型和字段的数值范围、大小等限制(如
INTEGER (0..255)) - 版本控制:通过
OBJECT IDENTIFIER实现模块的强版本标识 - 扩展规范:x.681信息对象类、x.682表约束等高级功能(实现难度较高)
- 约束系统:支持类型和字段的数值范围、大小等限制(如
编码示例
DER编码因确定性特点被广泛用于密码学领域,而XER和JER分别支持XML/JSON格式。
D语言的优势
代码生成友好
- 静态导入(
static import)避免命名冲突 - 模块级符号查找(
.Type语法) typeof()简化类型处理- 灵活的尾随逗号支持
- 静态导入(
元编程应用
利用模板和version(unittest)等特性,实现:- AST节点的混入模板(mixin template)
- 编译时API校验
- 测试代码的简化封装
开发挑战
规范复杂性
- x.680历史语法废弃导致兼容性问题
- 规范文档学术化表述难以理解
- 约束需在类型检查、语义验证、运行时三次实现
技术痛点
- 值序列语法的多义性解析
ANY DEFINED BY已废弃特性的替代方案- 不可变IR节点的理想与现实差距
- 规范信息分散导致的实现困难
项目现状
目前编译器已能解析部分x.509证书,并启动TLS 1.3的D语言实现。作者坦言ASN.1的复杂性远超预期,但这段经历显著提升了其编译器开发能力。
"现代生活竟如此依赖这些90年代过度设计的古老规范,而大多数人甚至从未听说过ASN.1。" —— 作者感慨道
尽管项目实用性存疑,这段探索过程本身已成为宝贵的技能积累。正如作者自嘲:"或许某天这能写进简历,虽然招聘官可能更关心Ansible经验"。
评论总结
这篇评论总结围绕ASN.1标准、D语言和编译器展开,主要观点如下:
- 关于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")
- 关于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")
- 关于编译器的实践
- 工具创新:开发者分享通过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:"threw a bunch of semi-related ramblings together")
- 知识价值:读者肯定博客的科普意义(评论6:"was nice to learn a little more by reading this blog post")