纯文本配置还是注册表

纯文本配置还是注册表

我们知道Unix/Linux下的程序配置文件从来都是纯文本的,你可以自由地修改和查看,他们也没有什么什么XML之类的玩意(参看XML的这两篇文章:),这个最重要的Unix文化(参看Unix传奇下篇)40多年来就这么沿续下来了。我很佩服Microsoft的创新能力,一会儿用INI,一会儿用注册表,一会又是用XML,这就是Windows的编程中那“强大”的创新。在网上又看到有人在争论为什么用注册表而不是纯文本,所以,写下这篇文章。

引入注册表所谓的原因

首先,让我们来看一下为什么微软觉得要使用注册表而不是ini文件,下面是一些其列出来的ini方面的毛病:

  • ini文件不支持Unicode
  • ini文件的安全权限不够
  • ini文件在多进程下存取会有问题
  • 如果一个进程锁上了这个文件,另一个进程就无法获得,只能出错。
  • ini文件只能包含字符串,无法使用二进制
  • 解析ini文件相对来说性能比较慢,第一次读写都需要把整个文件读入内存,然后再写回去。
  • ini文件最大只有32K
  • ini文件的默认目录在Windows系统目录下,只能这个目录只能Windows管理员才能访问
  • ini只能包含了两层,对于多层不支持。
  • 把ini文件放在中央服务器上管理很困难。

而微软说,注册表可以完美地解决这些问题。居然微软只说到了ini文件,但我觉得不单单是ini,所有的以纯文本方式保存配置文件的方法都会出现上述这样的问题。

我的观点

那么,当你在看到这些言论时,你是怎么想的?你有没有经过自己的独立思考?还是你觉得注册表完美地解决了所有的一切?下面是我的一些观点:

  • 首先,我们要知道没有任何一件事是完美的,凡事必然有好的一面,也有不好的一面。
  • 其次,当我们在改进一个东西时,不单单要解决其不好的东西,还要把其好的东西给传承下来。

所以,当你看到一些只说好或是只说坏的东西时,这往往意味着“宗教”或“洗脑”,这正是需要你独立思考的时候。

纯文本配置文件的好处

下面,是我觉得纯文本配置文件的好处(我用Unix下的纯文本配置文件来举例):

  • 很容易进行版本管理(配置文件和程序代码一样都需要版本控制)
  • 很容易移植到别的平台
  • 很容易自定义文本文件的格式和语法,已也有相关的库支持(ini只支持ANSI字符,只有32K,只支持两级,那是ini的问题,解决这些问题不需要引入注册表)
  • 可以在配置文本中写注释信息
  • 你要很容易的使用grep,awk,sed等等以及来和脚本集成。
  • 你可以很容易地拆分配置文件把其放到conf.d中,这样一来,你就非常灵活
    • 你就不用整个文件都读入内存,
    • 你也可以分别设置上不同的存取权限,
    • 同样可以减小多个进程同时存取的问题
    • 同样可以引用别的二进制配置的文件
  • 你可以很容易地产生备份或是在不同的配置中来回地切换配置文件以进行调试。
  • 你可以很容易地使用rsync来向中央服务器同步你的配置文件。或者使用NFS/NIS直接就把配置放在中央服务器上。

真正的原因

可见,Windows 的注册表并没有把纯文本配置文件的这些好处都带过来,所以,经过这样的独立思考,我们可以知道,微软引入注册表的真正原因是——

  • 让你的程序不具移植性,让你的软件永远运行在Windows上。
  • 增加你编程的复杂度和你维护配置文件的复杂度,让你在痛苦之后,苦苦哀求微软再发布下一个“创新”。

各位程序员——Windows是很危险的,你们还是回火星去吧。

全文完,转载时请注明作者和出处

(转载本站文章请注明作者和出处 酷 壳 – CoolShell ,请勿用于任何商业用途)

好烂啊有点差凑合看看还不错很精彩 (25 人打了分,平均分: 3.68 )
Loading...

纯文本配置还是注册表》的相关评论

  1. 太偏激了。无论如何,注册表和INI都是经典的设计。欲加之罪,何患无辞?有谁能说Windows的设计就不是经典?毕竟这是有史以来最成功的OS。

  2. 深有同感,纯文本配置文件的便利是注册表远远无法比的,通常纯文本配置文件里面都有大量的注释,通俗易懂,按照上面的注释就可以自由修改了,而注册表……不买本注册表大全或者去google,有几个人会改呢?很多常用软件的配置文件(比如vim)我都是保存到dropbox里,重装软件的时候直接把配置文件复制一份就行了,非常方便。

  3. 注册表效率高,实时生效,也可导出xxx.reg,reg文件也能注释一下,虽说应用软件的移植是问题,很多软件也有保存设置为xxx.conf, (xxx.ini)…或使用注册表的选项,config\SYSTEM可备份,config\SOFTWARE可备份也可移植别的同版win机器,FAT类的文件系统有权限的悲剧,注册表勉强弥补一下。windows是商业公司,面向个人用户,不另类一点,怎么能显示自己的牛逼。

  4. “很容易自定义文本文件的格式和语法,已也有相关的库支持”

    麻烦介绍一下相关的库,学习学习

  5. 大坑。。。

    这个只能说OS的文化不同,纯文本配置文件的那些优点在UNIX下很好, 但WINDOWS里几乎没什么用,MS也不太鸟这些,他们尽可能的将所有东西封装起来,从对开发者易用性上讲确实无可厚非,只是我们看着别扭而已。

    UNIX里也有XML,比如fontconfig,用XML做配置文件除非绝对必要,否则很BT,解析个配置文件还得依赖个expat,慢吞吞的。

  6. ini只支持ANSI字符,只有32K——早就不是这样的了

    只支持两级?——我就一直用ini替代xml,如果只支持两级,可能嘛?

    效率——分析ini的效率比xml、注册表高很多!

  7. @lxu4net
    app.config? 其实我认为 SQLite 最合适……不对,应该是类似 BSON 那种,可以序列化也可以压缩存储的那种。注册表有个好处是强类型和结构化,conf文件做到比较困难(但仍然可能)。

  8. 看了之后,你逻辑有问题:
    0.M$自己使用注册表,你爱用不用
    1.M$并没有强制你使用注册表,你爱移植不移植

  9. 对不起,我想再重申一下其中的一个观点——如果我们要用某个新的东西来取代旧的东西,我们不单单要解决老的东西出现的问题,还要注意把老的东西中好的方面传承下来。我认为,注册表并没有传承ini中好的东西。

  10. 注册表的悲剧是所有的关键配置都放在一两个大文件中,一坏全坏。曾有一天我的硬盘出现了坏道,正好是在那两个数据库文件上,于是Windows就悲剧的启动不起来了。我是双系统,用Linux启动把重要文件拷出来了。。
    而且注册表的配置是相当神秘的。。一般来说使用配置文件的程序只需要读读现有配置就知道怎么改了。。对于注册表,就很困难了。一般来说,Windows程序也主要是针对傻瓜化的应用,因此它的配置主要还是通过程序自己提供一些傻瓜化的菜单或选项来做,而不是允许用户直接修改注册表。因此注册表内的数据只要程序自己懂就行了,用户没必要懂。思路和Unix的是不一样的。

  11. 各位程序员——Windows是很危险的,你们还是回火星去吧。 这句话很爽啊!支持…虽然一开始我就直接接触LINUX的编程,没试过WIN。

  12. @wetwoo

    看了之后,你逻辑(您确定这和逻辑有关??)有问题:
    0.观点不同,你爱看不看
    1.没有强制你同意,你爱同意不同意

  13. @陈皓
    呵呵,有些事情单纯从技术的角度分析有时候很奇怪,就像电子的阅读方式与传统的纸质阅读方式,前者不一定会替代(至少相当长的一段时间内)后者,前者也没有很好的“传承”后者的东西。

  14. @fe
    实际上,注册表的效率很是个问题,曾经在邮件列表见过因为效率问题改用配置文件的。还有一个问题就是注册表不具备正交性,非常容易出问题。

  15. 总觉得preference和config还是有区别的。
    我理解,preference多用于桌面程序,存储“单个用户的偏好”,“我喜欢和我不喜欢”。config反而有点像需要长期维护的某些东西,比如服务器,有“正确和不正确”,“这部分是系统默认的而那些由用户覆盖”或者“曾经为了什么原因要那样配置而现在情况变了”的区别。说.bashrc是config,似乎也行,毕竟是文本文件。我觉得.bashrc本质上也是preference。

    – 我不会把“记事本使用的字体、字号”版本控制。(就是看旧的字体不顺眼才换字体的)
    + 服务器或者系统的配置倒是有版本控制的价值。

    – 像桌面程序,移植图形界面的代价远远高于配置文件的格式吧。

    + 定义自己的格式总是好的。毕竟不是所有的数据都是字符串。
    * 用有类型的数据格式如何?比如json和yaml,数据是分number, string, boolean, array, object类型的。xml的element-name, attribute-value, text都是文本,没有类型。ini也是。

    + 注释对config更重要,起码让下一个改配置的人知道你为什么要这样做。
    – 对于preference,注释顶多是“宋体太细了,看不见;还是黑体好”,没有别人会读它。

    + 拆分很有用。
    – 不过对于preference来说,都是“用户”喜欢程序怎么样。所有的数据都针对当前用户最好了。甚至配置文件存放在什么地方都不应该让用户关心(比如固定在$HOME/.vimrc,或者固定在注册表里)。甚至程序也不用知道配置文件在什么地方,用一个函数,类似ReadAnIntegerFromTheRegistry(“/com/example/myprogram/fontsize”, &myInt)就能读出来,完全不理会文件位置。

    * gconf还可以在程序运行的时候告知它“配置xxx变化了”,让它刷新。

    + 调试的话,文本格式方便一些。注册表的话,除非给个环境变量USE_REGISTRY=$HOME/junk/my_temp_registry.reg。

    + 如果用户知道什么是rsync,他自然是在配置什么重要的东西。

    总之,我觉得各有所长。至于Windows,似乎从来就不是为服务器设计的。

  16. @meiosis
    感觉很搞笑注册表还算是经典设计,当你的机器被庞大臃肿的注册表拖慢脚步时说说,当打开注册表无从下手不知如何的时候看看。

    最少在linux/unix下不用担心这些,所有的配置当你进/etc的时候就知道在哪里,就算修改错了也不怕会给其他的东西带来影响。看到注释或者配置实例就能够修改注册表你行吗。

    我只能说注册表是我见过的最差最笨的方式。

  17. 居然还有人会挺注册表的设计,很明显的一个紧耦合的经典实例。。。。

  18. 只听说过注册表减肥,但没有在linux上听说过有配置文件减肥一说,各位评论一下这是怎么回事?

  19. 只听说过注册表减肥,但没有在linux上听说过有配置文件减肥一说,大家来讨论一下?

  20. 我认为注册表这个东西是微软自己用的,Windows那么多的团队,统一一下配置规范什么的挺好。不知怎么MS外围的开发者都往这里塞东西,图省事?

  21. 其实没看到结论的时候我还是很赞同的。

    让你的程序不具移植性,让你的软件永远运行在Windows上。

    我可以请问作者是怎么得出这个结论的么?你是对微软有多痛恨啊,我可以同意你关于MS和windows是垃圾的观点,但这个论据是不是有点牵强呢,盖茨没有规定windows上配置文件一定要在注册表里不能是文本文件吧……往注册表里放东西的软件,恐怕首先是他自己不想要移植不是么

  22. @be5invis
    我想问你三点
    第一,当你想通过注册表修改某种软件的配置比如office那么你能否找到对应的所以配置。
    第二,当你看到某个配置值你能否知道你该如何进行修改。
    第三,你能否保证对这个配置的修改不会对其它的应用产生不良影响。

    实事上如果连这些最基本的要求都不能满足的话本身就不会是一种好的解决方案。

    可能会有windows fans说客户是不需要知道注册表的,哦我忘了难怪大家都不用windows做服务器的,除了菜鸟。

    不过这可苦了我们程序员,除了了解程序怎么写,还要知道神奇神秘的注册表怎么写。如果是维护别人写的代码那更好了修改基本靠猜,不要跟我说文档你见过几个不断变化的项目文档还是很完整的,有些可能根本就没有。

    碰到这种情况你很难保证你的程序不会跟其它的发生冲突,实事上这也是windows挂掉的两大原因,注册表,dll地狱。
    解决的办法也很简单,少用或者不用注册表。自己维护一个小规模的配置文件

  23. 注册表就是win自带的小型数据库,win95那个年代就设计进去了,本文把文件跟数据库比,立论都错了。
    最近常看到喷子,以攻击MS为找到优越感的手段,这是很可笑的。这些都是SDE们的工具而已,什么情况用什么工具。把微软技术或者非微软技术或者视为唯一的神祗的人都逃离不了头顶码农的光环。

  24. M$遭人恨啊 :
    其实没看到结论的时候我还是很赞同的。
    让你的程序不具移植性,让你的软件永远运行在Windows上。
    我可以请问作者是怎么得出这个结论的么?你是对微软有多痛恨啊,我可以同意你关于MS和windows是垃圾的观点,但这个论据是不是有点牵强呢,盖茨没有规定windows上配置文件一定要在注册表里不能是文本文件吧……往注册表里放东西的软件,恐怕首先是他自己不想要移植不是么

    作者的意思是你使用完M$注册表后不具移植性,只能永远运行在Windows上,谁说不让你做的可移植了,很多软件不都是可移植的嘛

  25. 这样的讨论似乎低级了些。各有优缺点吧,不必喷!MS的东西有很多是不错的,不用这么抵触。Linux、Unix也不完全是好的,客观评价比较好。

  26. 最近一直在看博主的文章,觉得写得很好。但此篇文章不也有洗脑之嫌,且很有偏见。增加一个抽象层就可以去除平台依赖性,看看QT就知道。我认为注册表的目的是方便Windows自身实现配置管理,提供数据仓库,供不同组件通信。COM就是一个典型的例子。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注