码农视角看世界之奇妙的DNA
21世纪是信息的世纪,21世纪是生物(生信)的世纪。前一个预言已经被大家认同了。但是后一个预言正在实现中。其实IT信息和生物信息有很多共同之处,本文我们就以码农的视角来学习下DNA和生信的一些知识。
源代码
和计算机程序一样,人体也有源代码,人的源代码就是基因,即DNA,人的所有基因构成了人体基因组。人体基因组大约3KMB长,最大可压缩到750MB字节,人体基因组的源码可以从相关网站上下载。
DNA的源码不像C语言等编程语言,而是更像以'核苷酸'为虚拟机的字节码编译代码。字节编译是源于何处,可能是“女娲”,“上帝”神授,亦或其他,不得而知。
DNA源码本质上是数字的,但不像是计算机的二进制的。二进制编码由0和1来构成,DNA则是有4位的:T,C,G和A。
数字的字节Byte通常是8位二进制数字,而DNA的字节(称为'密码子')是3个字符。每个数字位可以具有4个值,与具有256(2^8)个二进制字节相比,DNA密码子有64个可能构成。
DNA密码子的一个典型例子'GCC',表示丙氨酸。三位DNA数字组成氨基酸,再由这些氨基酸再组成更大的结构'多肽'或'蛋白质'。而蛋白质是组成生物的基本物质之一,具有化学活性。
位置无关编码
在计算机世界中动态链接库(在Unix下是.so,在Windows上是.dll)内部不能使用静态物理内存地址,因为在不同情况下代码可能出现在内存的不同位置。DNA也有类似的机制,即'转码':
人类基因组有近一半是由转码子和跳跃DNA组成。在上世纪40年代Barbara.McClintock博士首先在印度玉米的颜色中发现了独特的遗传模式,目前该模式得到了广泛认可。DNA跳跃即某些DNA片段是不稳定的,可以'换位'的,他们可以在染色体上和染色体之间移动。
条件编译
现在共识是在于人类基因组中共有2w~3w个基因,其中大多数细胞仅使用了基因表达的很小一部分,比如肝细胞就不需要构成神经元的DNA编码。
但是几乎所有的细胞都会携带基因组的完整副本('分布'),因此需要一种系统来#ifdef清除不需要的东西。这就是基因表达的工作原理,遗传密码中充满大量的#if/#endif处理语句。
这就是为什么'干细胞'研究炙手可热的原因。这些细胞具备表达分化为一切功能细胞的能力。只不过是其中的大部分代码还没有被#ifdeffed出来而已。
准确地说,干细胞并没有一次表达分化成各种各样的功能态,肝细胞和神经元只不过其中之二。将细胞比作是从干细胞开始的状态机,在细胞的整个生命周期中,它可能会被多次克隆('fork()'),每个物种都可以视为在基因树中选择了一个分支。
每个细胞都可以做出(或被诱使做出)关于其未来功能的分化的决策,从而使其分化为更加专业的功能。该决策相对于使用转录因子进行克隆和通过修改DNA在空间上的存储方式('空间效应')而言是恒定的(天或者说是基因注定的)。
肝细胞虽然携带了皮肤细胞的基因,但通常不能分化成皮肤细胞。目前有迹象表明,有可能将细胞'向上'繁殖到层次结构中,从而使其具多能性。
遗传学特征和烙印:运行时二进制修补
尽管有机体DNA的实际相关变化不会发生在一代之内,但通过激活或失活基因组的有些部分,可以对其进行大量修补,而无需去更改实际基因代码。
将DNA与Linux内核进行类比,Linux在启动时会发现其运行在哪个CPU上,而且会禁用其二进制代码的某些部分,以防万一在单个CPU系统上运行。这超出了诸如if(numcpus>1)之类的限制,实际上是锁定退出。而且,这种中断是发生在内存中的,而不是在基于磁盘的镜像上。
同样,随着胚胎在母体子宫内发育,其DNA会被大量编辑以降低其生长速度和胎盘大小。这样,父体('强壮的大孩子')和母体('幸存的怀孕')的利益竞争就达到了平衡。这种'烙印'只在母体内部发生,而父体的基因组对母体的大小一无所知。
最近,研究表明父母的代谢状况会影响其孙辈的长寿,癌症和糖尿病得病几率。这在进化论中可以解释为由于食物匮乏的环境中生存可能需要与食物充足的环境下有不同的代谢策略。
表观遗传学和印迹的机制表现为'甲基化',它使甲基附着在DNA上以'转录'其激活状态,还有组蛋白修饰,它可以使DNA卷曲,从而不被激活。
这些DNA编辑中的某些是可遗传的,并传给子代,其他则可能仅影响其本体。
这个领域研究进展很快,可能DNA比最初想象的要动态得多。
死代码,膨胀,注释——垃圾DNA
基因组中充斥着大量旧的基因副本,而这些可能是进化过程的某次实验中发生了错误,比如,最近一百万年里的进化。代码都还存在,但是已经无效,他们被称为'伪基因'。
此外,人类基因组中的DNA中有97%都被注释掉了。DNA是线性的,从头到尾读取,不被解码的部分标记得很清楚,和编程代码中的注释一样。直接被表达的3%形成所谓的'外显子'。介于'中间'的注释称为'内含子'。
基因的注释本身也引人入胜。像C注释一样,它们会有一个开始标记(如/*)和一个停止标记(如*/),但是支持更多的形式。DNA就像磁带一样,注释只能从物理上删除,基因注释的开头几乎总是由字母'GT'表示,可以将其对应为/*,结尾由'AG'表示,就像是*/。
由于剪裁,需要一些胶水将注释之前的代码连接到后面的代码,这样注释更像是html注释,但要长得多:' <!-'表示开始,'->'表示结束。
因此,带有外显子和内含子实际DNA片段看起来可能如下:
注释的开头很明显,其后是许多非编码的DNA。在注释结尾之前的某个地方,有一个'分支点',用来表示该注释很快会结束。然后是更多注释,最后是注释的结尾。
注释的实际剪切是在将DNA转录为RNA后进行的,方法是遍历注释并将实际代码片段连接在一起。然后,在注释结尾附近的'分支位置'处剪切RNA,之后,将'供体'(注释开始)和'受体'(注释结束)连接。
当比较不同的物种时,目前知道一些内含子显示的编码变化会显著地少于邻近的外显子。这表明注释也在起着重要作用。
大量的非编码DNA有很多可能的解释表达,最吸引人的部分与'折叠倾向'有关。DNA需要以高度卷曲的形式存储,但是并非所有的DNA代码都可以很好地做得到。
这就像是RLL或MFM编码。在硬盘上,通过极性转换或缺少极性来对位进行编码。编码会将0编码为'无过渡',将1编码为'过渡'。编码000000很容易,只需将磁相保持几微米不变即可。但是,在解码时,不确定性会大大增加。读取多少微米,对应于6个零还是5个+1个?
为避免这种问题,需要对数据进行处理,让这些长时间的无过渡不会实际发生。
如果在磁盘上看到'无过渡,无过渡,过渡,过渡',则可以确定它对应于' 0011'。读取过程则非常不确定,它可能对应于' 00011'或' 00111'。因此,需要对其插入垫片以防止过渡太少。这在磁性介质上称为'行程限制'。
需要注意的是,有时需要插入转换以确保可以可靠地存储数据。内含子可以通过确保正确编码结果代码来做很多事情。
fork()和fork炸弹——'肿瘤'
与Unix一样,细胞不是凭空产生的,而是fork来的。所有细胞都从卵子开始,卵子要被fork很多次。就像程序进程一样,fork()的两部分在开始时是相同的,但是从一开始也就注定了它们可能会被表达为不同的功能基因。
和Unix一样,当细胞不断fork时会出现问题,导致资源迅速耗尽,甚至会导致死亡,这就是癌症。细胞中有大量的 'ulimits'和'watchdogs'机制以防止发生这种情况。例如,分裂的数量受到端粒缩短的限制。
除非满足非常严格的条件('默认安全'配置),否则细胞是无法克隆的。仅当这些防护措施失败时,才会长成癌细胞。和信息安全性一样,很难在安全性('没有细胞可以分裂')和可用性之间取得平衡。将其与著名的“暂停问题”进行比较,问题首先由计算机科学的创始人艾伦·图灵(Alan Turing)提出:我们无法预测一个程序是否会完成,就像无法创建一个不会患癌症的功能基因组一样。
镜像——故障转移
每个DNA螺旋本身都是多余的,可以将基因组看作是一个扭曲的梯子,其中每个梯条都包含两个碱基,因此称为'碱基对'。如果少了某个碱基,则可以通过另一侧的碱基校对出来:T总是与A配对,而C总连着G。因此,可以说基因组镜像在螺旋内具'RAID-1'。
此外,每个染色体都有两个副本:每个父母都有一个副本,但Y染色体例外,其仅存在于男性中。实际中的细节很复杂,但大多数基因都有两份,万一一个损坏或突变失败,另一个独立副本仍然存在,对比计算机,称之为'故障转移'。
混乱的API,依赖地狱
当蛋白质在细胞中相互作用时,彼此依赖。许多于其他蛋白质相互作用的蛋白质无法进化,或者至少只能以非常缓慢的速度进化。
由于内部依赖性很大,抑制了蛋白质'合约'的变化。还要注意的是,虽然确实发生了进化,但是进化非常缓慢,因为依赖的两个部分都需要互相兼容,然后才能共进化。
病毒,蠕虫
最近有人在讨论中提出,砍掉基因组并对其进行折衷,插入代码将其自身复制到其他基因组,这是非常酷的事情,使用宿主为载体。
马上,他就意识到生物病毒数百万年来一直在做这样的事情,他们擅长于此。这些病毒中有许多已成为进化为我们基因组的固定部分,与我们所有人都息息相关。
中心法则:.c->.o->a.out/.exe
当科学家们不断寻找遗传学的基础知识时,会面临许多不同的化学物质,但相关性还没有弄清楚。但有一个中心法则,已经很清晰的呈现了出来。
总体上来说就是DNA用于制造RNA,而RNA用于制造蛋白质,类比计算机就像是.c文件总会编译成一个.o目标文件,该文件最终会被编译成可执行文件(a.out/exe),这是信息流动的唯一顺序。
基因也是如此,就像是一个具有十亿年历史的编码项目一样,有大量黑客活动正在进行中,有时信息会以其他方式流动。有时RNA会修补DNA,而其他时候,DNA会被较早产生的蛋白质修饰。
但总体而言,依赖性非常明显,中心法则仍然其决定性作用。
二进制修补——基因疗法
有些公司可以发送带有DNA字符的ASCII文件,并将为合成相应的'输出'。还能将DNA拼接到发育中的动植物中。
正如任何程序员知道的'修补正在运行的可执行文件'要困难得多。基因组也一样,要更修正在运行的副本('人类'),需要编辑要修补基因的每个相关副本。
多年以来,医学界一直在尝试用SCID或'严重综合免疫缺陷'给人打补丁,它是一种非常讨厌的疾病,实际上会使免疫系统失去作用,导致重病患者。很长一段时间以来,人们已经很清楚需要修复DNA中的哪些字符才能治疗这总病。
可以尝试使用病毒将新的DNA插入活生物体的,这方面也有大量的研究和尝试,但实践证明这非常困难。最近研究者发现了合适的病毒,该病毒能够破坏基因组的保护并修复损坏的基因。
错误回归
修复计算机程序中的错误时,通常也会引入新的错误。基因组里也有类似的情况。许多非裔美国人对疟疾具有免疫力,但却患有镰状细胞性贫血。在世界上寄生虫传播的疾病疟疾盛行的热带地区,只有一个特定基因突变的人才具有生存优势。继承突变的一个副本可带来好处,而如果继承两个副本则是大有害处。出生时有两个基因突变的孩子会患有镰状细胞性贫血,这是一种影响红细胞的痛苦疾病。
像计算机存储一样,DNA(及其中间的'RNA')可能会损坏。为了防止常见的'Byte错误',从单个DNA字母到蛋白质的编码都要进行简并。有4个RNA字符,U,C,G和A。换句话说,字节是2位长。三个字符对应一个氨基酸。
总共可以映射到64个氨基酸,但是实际中被编码的只有20个。比如,UCU,UCC,UCA和UCG都编码为'Serine',而只有UGG才会被映射为'色氨酸'。事实证明,编码中某些可能的'typos'(UCU-> UCC)都表达相同的氨基酸。
神圣代码:——/*勿动!!!*/
有些代码是神圣的。我们可能不记得是谁写的,或者为什么要这样写,只知道它很有效。清楚这代码的人可能已经离开了公司,该代码不可修改!
DNA知道分子钟的概念。基因组的某些部分会积极变化,而某些部分则是神圣不变的。比如组蛋白基因H3和H4。这些基因是基因组实际存储的基础,因此至关重要。他们中的任何错误都会很快导致机体失灵。
事实证明,H3和H4基因在人类中的有效突变率为零。而且这些基因片段在所有的物种基因组中都是存在,从鸡到草或霉菌都不例外。
基于化石证据,每千亿年间人类和啮齿类蛋白质编码基因的位点取代率分别为8000万年:
现在看来,基因组可以通过两种方式确保代码不会突变。上面描述了第一种方法:使用高度简并的氨基酸,并确保确实发生的错别字产生相同的输出。
此外,基因可以在细胞繁殖过程中更早或更晚地被复制,从而导致或多或少的有利复制条件,这种条件更多。H3和H4编写得很仔细,它们实际上确实有很多同义词更改,但通过上述巧妙的技巧,它们的表达结果不会发生变化。
帧错误——起始位和终止位
...0 0000 0001 0000 0010 0000 0011 0...
上面很清楚地描述了8位值1、2和3。添加的空格使一个字节的开始和停止位置清晰可见。许多串行设备使用停止位和开始位对开始读取的位置进行编码。如果稍微改变一下这个顺序:
...00 0000 0010 000 00100 000 00110 ...
就会读成2、4、6!为了防止这种情况在DNA序列中发生,精心设计的信号机制会指导细胞从哪里开始读取。有趣的是,有些基因组片段可以从多个起点读取,并且可以通过任何一种方式都能产生有用的结果。
可以读取DNA链的每种方式称为开放阅读框,通常每种方式有6、3种。
大规模多处理——每个单元都是一个宇宙
在这方面,DNA不像计算机编程语言很有不同。但是有一些惊人的类比。可以将每个细胞视为运行自己内核的CPU。每个细胞都有整个内核的副本,但是选择仅激活相关部分。可以说它加载了哪些模块或驱动程序。
如果细胞需要做某事(称为'功能'),它会指出基因组的正确部分并将其转录为RNA。然后将RNA翻译成一系列氨基酸,这些氨基酸共同构成了DNA编码的蛋白质。
蛋白标有目标地址。这是一个由几个氨基酸组成的标记,可以告诉细胞的其余部分该蛋白需要流向何处。有一些器官可以按照这些指令操作,并传递可能在细胞外部的蛋白质。
然后剥离交货说明,执行几个后处理步骤,可能会激活蛋白质。这样就保证了不会将活性蛋白质转运到不应起作用的地方。
自举和引导
如果要销毁这个星球上所有现有的C编译器,而只留下一份源代码,那么可能会有很大的麻烦。虽然我们有C编译器的源码,但是我们需要C编译器来对其进行编译。(蛋鸡问题?)这就是编程语言的自举性。
实际上,第一个C编译器是通过使用其他可用的语言编写来解决语言和编译器的蛋鸡问题。
基因组也是如此。要创建标本的新'二进制'文件,需要一个活体副本。基因组需要精巧的工具链才能提供生物。这个工具链就是'你父母'。
将DNA转译为蛋白质的过程中也需要一个中间代码RNA,来实现基因编译器的引导。
Makefile
生物通常以单个细胞开始,如前所述,细胞包含基因组的两个完整副本。可以这么说,大的tarfile和所有文件都已被提取出来,可以开始使用。
输入同源异型基因(HOX)。每个细胞必须复制并分配一个用途。同源异型框基因通过放置一个'从上到下'的依赖关系开始,该依赖关系显示为'从头开始'。为了实现这一点,将创建一个化学梯度,通过该梯度,细胞可以感知它们的位置,并决定是否需要做一些对构建头部或原始脊索有用的事情。
同源异型(HOX)基因在1983年被发现,现在是一个非常令人兴奋的研究领域。有趣的是,像Makefile一样,'HOX'基因仅会触发其他基因中的事务,而不会实质性地构建事务。
所以可以说源异型基因的'语法'是非常'神圣'的。如果将小鼠HOX基因的'腿选择器'部分复制粘贴到果蝇Homeobox中会发生什么呢:
'实际上,当将小鼠Hox-B6基因插入果蝇中时,它可以代替触角虫并产生代替触角的腿'
果蝇和人类基因组不是在数百万年前就分支,而是在数亿年前就分支了。然后,复制Makefile的粘贴部分(遗传语言中的'选择器'),仍然有效。请注意,果蝇中的'建腿'例程与小鼠中的例程有根本不同,但是'选择器'还是触发了正确的指令。
插件——质粒
所有活生物体都有DNA,有的会组织成多个染色体,有的只有一个。一个染色体的情况下通常是环状的,比如大多数细菌。在该主要基因组旁边,细菌经常还会携带'质粒'——具有特定功能的微小DNA圈。
这样的质粒在种间是可移植的,并且通过多种机制它们可以做到水平转移。通过这种方式,即使是不同的细菌也可以彼此'学习'抗生素抗性。
与编程世界相比,质粒是非自愿的,就像LD_PRELOADing .so或其他平台上的等效物一样。实际上,经常出于研究目的注射质粒,它们可以被轻松注入到各种细菌中,并会立即起作用。
质粒独立于主要染色体复制自身,是细菌的永久固定装置。为此,质粒具有一个宏伟的'复制起点'基因,当细胞想要分裂时就会触发该基因。