從程序員的角度來看DNA

最近看了一篇老外的文章:DNA seen through the eyes of a coder,覺得寫得挺有意思的,DNA和程序的種種相似的地方,百度GOOGLE了下,好象沒有翻譯的,我就試着翻譯了一下,各位如果覺得有興趣的就來了解下這個地球上最偉大的軟件工程吧,呵呵。

  原文:http://ds9a.nl/amazing-dna/,裏面講生物方面講得挺多,有些地方太專業了翻譯得不是很好,另外刪掉了一些無關緊要的東西,有些地方如果文不達意還請各位海涵了。

  譯文:

  這只是一個計算機程序員關於DNA的雜想,我並不是一個分子遺傳學專家。

 

       源代碼

這裏,這不是在開玩笑。這些源代碼可以通過一個叫做‘Ensembl’的perl腳本查看。

       DNA並不像C的代碼,更像在虛擬機上編譯的代碼,我們叫它‘核’。這讓人懷疑到底有沒有源代碼來進行這些編譯,或者說,這就是這樣的。

       DNA的代碼語言是數字形式的,但不是二進制的。二進制是0和1兩種數字組成的編碼,但是DNA有4種:T,C,G和A。

       我們常用的1個字節有8位,而DNA的1個字節(稱爲‘編碼子’)有3位,每一位有可以有4個值,而不是2個值(0和1)。所以一個基因編碼子有64個可能的值。

       DNA編碼子的一個典型的例子是‘GCC’,氨基酸丙氨酸由它編碼而成。大量的這些氨基酸的聚合體成爲‘多肽'’或者‘蛋白’,而這些就是在生命誕生過程中的不可缺少的化學活性物質

 

       位置獨立的代碼

       動態鏈接庫(大家應該都用過吧),在DNA裏也有類似的,被稱爲‘置換代碼’:

       將近一半的人類基因組是由一些可以換位的片段或者一些跳躍基因組成,這是20世紀40年代Dr. Barbara McClintock在研究一種在印度玉米上發現的有關顏色奇特遺傳方式時首次發現的,跳躍基因是指DNA的某些片段不是很穩定並且會‘換位’,例如,他們會在染色體的前後移動。(作者的意思大概是指這些‘置換代碼’,也就是動態鏈接庫,會被加載到染色體代碼的前面或者後面)

 

       條件編譯

       一般認爲大概有20000到30000個基因在人類基因組裏,大部分細胞只使用了很小一部分基因的功能,這是有道理的,1個肝細胞只需要整個DNA代碼的很小一部分來完成它的功能:作用於神經元。

       但是幾乎所有的細胞都攜帶着一個基因組的完整拷貝,所以這整套基因代碼裏必須有 #ifdef這樣的條件語句來指定哪些代碼是不需要的,那麼這些細胞是如何工作的就說得通了。基因代碼裏充滿了大量的 #if/#endif 這樣的語句。

       這就是爲什麼現在‘幹細胞’這麼火,這些細胞具有分化成其他任何一種細胞的能力。可以這麼說:這些代碼還沒有被加上 #ifdef 。

       說得更準確些,幹細胞並不是同時把自身的一切都轉化----他們不能立即變成肝細胞和神經元細胞。細胞可以被當做是一個狀態機,最開始,它是一個幹細胞,在這個細胞的生命週期內,它可以克隆很多次,每次它都在向一個特殊的方向分化。每次向一個特殊的方向分化都可以視爲在一根大枝幹上選擇一根小枝幹(N叉樹?)。

       每個細胞都可以決定(或者說是被誘導到)自己的未來,每次它的決定都會導致它更加特殊化。這些選擇帶來的改變都具有持久性,因爲在克隆過程中是使用轉錄因子修改DNA來存儲選擇帶來的改變(‘立體效應’)。

       肝細胞,雖然它攜帶的基因讓它做肝細胞該做的事,而且一般不會起到一個皮膚細胞的作用。有跡象表明有可能‘培育’細胞讓它沿着分化體系‘前進’,(有點類似於C++裏的派生?)進而使他們具有其他的各種功能。

       垃圾代碼

       基因組裏遍佈一些基因的舊副本,這是在大概50萬年前到現在之間的某段時期裏,出了問題的一些實驗性質的基因。這些代碼存在但是沒有被激活。他們被稱爲‘僞基因’。

       此外,你的DNA裏面有97%的代碼是被註釋掉的。DNA可以像捋一根線一樣的從頭讀到尾,而那些沒有被解碼過的部分則顯示得很清楚,就像C裏的註釋。那些在3%裏直接被使用的基因被成爲‘外顯子’,而其餘那些註釋,被稱爲‘內含子’。

       這些註釋,他們表現出的一些特性很讓人着迷。像C裏面的註釋一樣,他們也有一個起始符,就像 /*,並且他們也有一個結束符,就像 */。不過他們有着更多的結構。DNA更像是一卷磁帶,那些註釋必須要用物理的方式給剪切掉!註釋的開頭幾乎總是顯示成‘GT’,與 /* 對應,結尾則顯示成‘AG’,對應 */。

       但是由於剪斷了DNA,則需要一些‘膠水’把在註釋之前的代碼和註釋之後的代碼粘起來,這些更像是HTML的註釋,以‘<!--'’標誌着開始,‘-->’則是結束。

 

       一段有着外顯子和內含子的基因片段看起來就像如下所示:

ACTUAL CODE<!-- blah blah blah blah ---- blah -->ACTUAL CODE
  |         |            |           |        |        |
外顯子1  註釋開頭    內含子 1     分支   註釋結尾  外顯子 2
 

       註釋的開頭是很清晰的,接下是許多沒有編碼的DNA。在很接近註釋結尾的某處有一個‘分支’(符號),表明註釋很快就要結束,‘分支’後面還有一小段註釋,最後就是結尾。

       在DNA轉錄成RNA之後,就開始註釋的剪切,首先循環遍歷註釋段並把一段段代碼合在一起,然後RNA會在接近註釋結尾的‘分支’處被切斷,在這之後註釋開頭和註釋結尾會連接起來。

       那麼,這些註釋到底有什麼用呢?關於這個的討論可以同VI和EMACS之爭相媲美。當比較不同的物種時,我們發現一些內含子比鄰近的外顯子表現出了更少的代碼改動,這表明這些註釋起着一些重要的作用。

       Fork() 分裂炸彈(‘腫瘤’)

       與UNIX一樣,細胞不是孵化的,而是分裂出來的。所有的細胞都是從最開始的卵細胞分裂多次而來。就像進程一樣,執行fork()(fork()是UNIX裏的一個函數,可以啓動一個子線程,子線程是父進程的拷貝)的2部分(幾乎)是相同的初始狀態,之後就由他們所執行的功能來決定他們的不同

       與UNIX一樣,當細胞不斷分裂時會出現大麻煩。他們很快就用盡了資源,有時甚至導致死亡。這就是腫瘤。細胞裏充斥着’ulimits’ and ‘watchdogs’(ulimit是UNIX裏一個改善系統性能的命令,watchdogs是UNIX裏一個計時用的函數)來阻止這種事情的發生。分裂的數量由端粒縮短來限制,例如:

       一個細胞一般情況下不能克隆,除非滿足非常嚴格的條件---一個‘默認的安全體系’的配置。只有這些安全體系失效時腫瘤纔會發生。就像計算機的安全體系,很難在安全與可用性之間取得平衡。

       與此相比的是著名的Halting Problem,計算機科學的創始人,Alan Turing首先提出的。也許創造一個不會得癌症的基因組,就像預言一個程序是否結束那樣是不可能的。

       鏡像,失效轉移

      每條DNA螺旋本身是多餘的,你可以看見,基因組像一個扭曲的梯子,每個階梯上都有2個鹼---這就是‘鹼基’這個詞的由來。如果其中一個鹼丟失了,它可以從另外一邊的鹼那裏複製過來。T總是和A綁定,C對應G。所以,我們可以說,基因是螺旋結構形成的鏡像。‘RAID-1’就是如此。

       此外,每一個染色體都是成對存在的,除了那個衆所周知的只存在於男性中的Y染色體。這其中的細節比較複雜,不過大部分基因都有備份。在某種情況下其中一個損壞或者不幸變異了,就能通過與備份的對照很快糾正錯誤,並進行修補。這就是我們通常所說的‘失效轉移’。

       混亂的API,見鬼的依存關係

       蛋白質在細胞內的互相作用,依賴於他們彼此的特性。不久前才發現的一個事實是,那些與大量其他蛋白質互相作用的蛋白質不會產生進化,或者至少,這樣的比率非常小。

       他們解釋這是因爲有非常多的內部依存關係在抑制着這些蛋白質之間‘合作關係’的變化。他們同時指出,進化確定在發生,但是非常緩慢,因爲依存關係的雙方需要在同一時間以合適的方式一起進化。

       病毒,蠕蟲

       最近有人在一個討論中提到,如果能破解基因組,讓它向我們開放權限,那麼我們就可以插入一段代碼進去,使它可以把其他基因組複製成他本身,並用它的宿主作爲載體,這辦法真是酷斃了。‘就像尼姆達病毒’。

       然後他馬上意識到這不就是生物病毒在這幾百萬中中所作的嗎,的確他們非常擅長這個。

       許多病毒都成爲了我們基因組的一個固定部分,並藉此在我們之間傳播。要做到這些,他們必須隱藏自身避免被那些病毒掃描系統發現,這些病毒掃描系統會檢測一些外來的代碼並阻止他們進入到DNA裏去。

       中心法則:.c -> .o -> a.out/.exe

       當科學家們在探索遺傳學的本質時,他們碰到了數量巨大的相互作用還不是很清楚的化合物。總有一天,當一切都搞明白的時候,他們會欣喜若狂,並稱呼這爲‘中心法則’。

       這個法則告訴我們DNA被用來生成RNA,RNA被用來生成蛋白質,這是不是跟:.c文件生成.o文件,並生成一個可執行文件(a.out/exe)這個過程很相象呢。這是信息傳遞的唯一順序。

       但是這個中心法則最近被發現有一些污點。就像那些存在了幾億年的古老軟件項目,其中被插入了許多病毒代碼,並且有時候信息傳遞會走另外一條道。有時候RNA會修補DNA,而在某些時候,DNA在蛋白質生成之前就被修改了。

       不過總的來說,這些依存關係是很明確的,所以中心法則仍然是很重要的。

       二進制補丁,又名‘基因療法’

       我們可以儘可能的改動DNA。有一些公司就做這個,你可以把一個由DNA字符組成的ASCII文件發給他們,然後他們會把這個綜合成一個對應的‘輸出’給你。我們同樣可以通過動植物的遺傳把DNA接入到動物或者植物體內。

       但是更難的是‘爲運行中的程序打補丁’,許多程序員都爲這個犯難。這就如同基因組。要改變一個運行中的拷貝(‘一個人類’),如果你要爲他的基因組打上補丁,你就必須修改每一個與基因組相關的拷貝。

       許多年以來,醫學家們試圖對患有‘聯合免疫缺陷病’的病人的DNA進行修復。‘聯合免疫缺陷病’是一種棘手的病症,它會讓你的免疫系統失效,進而讓你患上一些重症。我們需要找出並修補那段被插入了惡意代碼的DNA片段才能治癒這些人。

       他們做了許多嘗試去修復這些‘正在運行’的‘人類系統’,包括使用病毒來插入新的DNA片段到保持活力的有機體組織中,不過這都被證明是非常困難的。基因體的防禦無懈可擊,即使是最簡單的方式也沒有任何作用----細胞們在保護他們的代碼這方面做得比微軟好多了。

       不過,最近發現了一種特殊的病毒,它可以衝破基因們的防線,並且修復被損壞的字節,讓患者們重回健康。

       修補BUG

       當修復一個電腦程序的BUG時,我們總是又帶來了另外一個BUG。基因組裏也充斥着此類事情。許多非洲裔美國人對瘧疾免疫,但是同時又患有鐮狀細胞性貧血。

       裏德-索羅門碼:‘前向糾錯’

       就像電腦存儲一樣,DNA(以及它的中間物‘RNA’)也會出錯。爲了防止‘single bit errors’,從單獨的DNA字節到一個蛋白質的編碼過程是可退化的。有4種RNA符號,U,C,G和A,即一個‘位’相當於我們通常的2個比特。3個RNA字符組成一個氨基酸。6個比特可以組合成64種氨基酸,但是隻有20種有用。舉個例子,UCU,UCC,UCA和UCG編碼成‘絲氨酸’,但是UGG卻只對應‘色氨酸’。

       現在,事實證明,一些相似的‘錯誤’(UCU –)UCC)在編碼過程中會形成相同的氨基酸,這令人費解。

       上帝碼:/* you are not expected to understand this */

       有些代碼很神祕。我們不知道是誰寫的,爲什麼而寫----我們只知道它有用。或許寫這些代碼的人已經離開了公司,因爲這些代碼從未被修改過。

       DNA似乎知道‘分子鐘‘的概念。基因組的有些部分正在積極的發生變化而有些則顯得神聖而不可侵犯。後者的一個很好的例子就是H3和H4蛋白基因。

       這些基因對整個基因組來說至關重要,它的重要性是最高等級的。如果這段代碼出了錯,就會產生一個沒有任何功能的有機體。

       這些代碼從未被修改過,H3和H4基因在人類進化過程中的變異率爲零。但還遠遠不止如此,這些代碼也同樣存在於其他物種的DNA內,像雞,草,黴菌之類。

       現在,我們可以確定有2種方式保證基因代碼不發生變異。第一種在前面已經說過了。

       此外,在細胞的複製過程中,基因的複製可早可晚,取決於複製條件的好壞。

       這樣看來H3和H4是被非常小心的編寫出來的,因爲他們有太多的‘synonymous changes’,這些正是通過前面所說的的技術保證結果不會被改變。

       楨錯誤:啓動和停止位

       ...0 0000 0001   0000 0010  0000 0011 0...

       這些清楚的描述了8位值:1,2和3。我添加的這些空格清楚的表明了一個字節的開始和停止。許多串行設備採用啓動和停止位來標記你該從哪讀起。如果我們稍微改變一下這個順序:

       ...00 0000 0010   000 00100  000 00110 ...

       它突然讀到了2,4,6!爲了阻止這樣的錯誤在DNA裏發生,有一些特殊的標記來告訴細胞該從哪開始。有趣的是,有一些基因片段可以從不同的起始位置開始進行讀取,並且每種方式都產生有用的(但是不同)的結果。我稱這爲‘cool hack’。

       海量多線程:每個細胞都是一個宇宙

       DNA跟電腦編程語言不一樣。實際上它也並不是。但是有一些驚人的相似之處。我們可以把每個細胞看做是一個CPU,運行着自己的內核。每個細胞都有整個內核的拷貝,不過只選擇激活那些跟自己有關的部分。可以這麼說,它有選擇性的加載對自己有用的驅動或者模塊。

       如果一個細胞想做某件事(調用一個函數),它會激活基因組的某個片段並轉錄成RNA。RNA馬上轉化成一系列的氨基酸,然後這些氨基酸組合成蛋白質。

       這些蛋白質被標記上了運送地址。這是一個由許多氨基酸組合而成的標記,這個標記告訴細胞這個蛋白質要去的位置。然後依照這些指示細胞運用一些機械方法將蛋白質運送出去,這時候蛋白質可能在細胞外的某個位置。

       然後這個運送指令會被卸除,其他一些運行步驟被相繼被傳達過來,也許是激活這個蛋白----這很好,因爲運送途中活性蛋白會發揮它應有的作用。

       自託管和引導

       如果我們銷燬這個星球上所有的C編譯器,並且只留下某個編譯器的源代碼,我們將會有很大的麻煩。是的,我們有能編譯出編譯器的C代碼,卻缺少一個C編譯器來編譯它。

       事實上,要解決這個,不是用C寫一個C編譯器,而是需要一個已經支持編譯的語言:B。

       這同樣適用於基因組。要創建一個新的‘二進制’樣品,需要一個‘活着的’拷貝。基因組需要一個複雜的工具鏈來傳遞活性物質。代碼自身是無能爲力的。這個工具鏈被稱爲‘your parents’

       這樣看來,RNA,一個介於DNA和蛋白質之間的中間碼,將是DNA所需要的‘B語言’。有趣的是外星物質經常包含有氨基酸。

       The Makefile

       有機體的形成通常從一個單細胞開始,如同我們前面說的包含有整個基因組的2個拷貝。就像整個壓縮包,已經準備要解壓出所有的文件。然後呢?

       我們來看看同源盒基因(是一段在果蠅中發現的編碼60個氨基酸的DNA序列),細胞開始被複制並且被賦予了一個未來的走向,這時同源盒基因開始運作,首先會形成一個‘從上至下’的‘建造’關係,這個‘建造’關係從‘頭部發育’開始。爲了讓這一切發生,需要創造一個化學梯度,這樣細胞可以感應到他們在哪裏,才能決定是否要做些對頭部發育有用的事情,或者生成一個原生脊索。

       自從在1983年被發現,同源盒基因的研究到現在爲止都是一個激動人心的研究領域。有趣的是,就像一個MakeFile,‘HOX’基因只起到激活其他基因的作用,它本身並不參與發育過程。

       同源盒基因的‘語法’在上面提到的過程裏似乎是很‘神聖’的。如果你把一隻老鼠的‘HOX’基因裏的‘腿的selector’的這一段複製並粘貼到一隻果蠅的同源盒基因裏,那樣會發生什麼呢:

       ‘事實上,當一隻老鼠的Hox-B6基因插入到果蠅裏時,它會代替掉Antennapedia(一段基因片段),並且會在原來長出觸鬚的地方長出腿來’

       果蠅和人類的基因組並不是在數百萬年產生的分支,而是在數百個百萬年前。你複製並粘貼Makefile的某個部分(用基因的語言來說就是‘Selector’)以後它仍舊可以接合起來。請注意,‘長出一條腿’這個在果蠅裏的例行程序跟老鼠的是完全不一樣的,但是‘Selector’準確的觸發了正確的指示。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章