精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
近期研究rime的源代码,里面用了yaml-cpp,所以想写个文章,主要写yaml-cpp的代码剖析方面,随手写了一些,欢迎指正。
在rime里,yaml-cpp处理的文件有配置信息和码表文件,比如下面就是一个配置文件:
# Rime default settings # encoding: utf-8 config_version: '0.40' schema_list: - schema: luna_pinyin - schema: luna_pinyin_simp - schema: luna_pinyin_fluency - schema: bopomofo - schema: bopomofo_tw - schema: cangjie5 - schema: stroke - schema: terra_pinyin
上面#是注释,config_version是个字符串变量,schema_list是个数组变量,下面行的-是数组的标志。
下面是码表行:
〇 ling ㄓ zhi ㄔ chi
码表行有几万行,最开始觉得yaml-cpp加载几万行,效率真够可以,后来发现yaml-cpp里的加载并不能实现这个功能,是另外的方式实现高效加载码表。在rime里,yaml文件和码表是可以放一起的,比较神奇。
yaml,从名称上有ml,这和html和xml都是一脉相承,文本标记,组织信息,只不过组织方式比json更简化,行文有点像python风格,书写比json少,所以更流行,一般新项目可以选用,旧项目从json升级到yaml也意义不大。
yaml对数据类型支持全面,比如数组和复合数组也都支持,所以在标准制订上有严格要求,所以json-cpp的代码也不像一般人想的那么简单,锐英源下载了yaml-cpp源代码后,发现源代码里任务量比较大,最大的文件emitter.cpp有24K,是比较大型的代码文件了,主要处理了节点组织和内容输出,是最重要的工作。emitterutils.cpp是emitter配套工具代码,节点和输出需要的依赖工具多,所以emitterutils.cpp是第二大文件,其它明显的文件有:scantoken.cpp,管理符号,emitterstate.cpp输出状态。
锐英源研究过读取ini的C++代码,300行就可以解决,但是yaml-cpp为什么有这么多源代码文件呢?基本上有数据类型、数组、节点管理、正则、状态机和文件IO的这类复杂标准的处理,代码都少不了,从多个方面构建处理模型是很复杂的任务,所以初学者想真正吃透C++,学习yaml-cpp有效果,如果想学yaml-cpp源代码,锐英源有开源服务,学精典开源代码,比死读书效果好太多了。