Исходный код
Можно взять тут. Это не шутка. Правда, придётся поразмыслить по поводу его лицензии. Исходники можно смотреть при помощи чудесного набора perl-скриптов «Ensembl». Размер человеческого генома составляет примерно 3 гигабазы, умещающиеся в 750 Мб. Да, тяжело признать, что это всего 2,8 браузера Mozilla.
ДНК не похожа на исходник на языке С, а больше напоминает откомпилированный байт-код виртуальной машины под названием «ядро [клетки]». Сомневаюсь, что для этой компиляции где-то есть исходные коды – что видите, то и получаете.
Язык ДНК цифровой, но не двоичный. В двоичном коде есть 0 и 1, а у ДНК есть четыре позиции — T, C, G и A.
В цифровом байте обычно содержится 8 двоичных бит, а в «байте» ДНК — кодоне — три цифры. Поскольку у каждой цифры может быть 4 значения, а не два, кодон ДНК может содержать 64 разных значения, по сравнению с 256 значениями двоичного байта.
Типичный пример кодона ДНК — «GCC», кодирующий аминокислоту аланин. Большое количество собранных месте аминокислот называется полипептидом, или белком [белками называют не все полипептиды / прим. перев.], и это химически активные вещества, составляющие живое существо.
Позиционно-независимый код
Динамически подключаемые библиотеки (.so в Unix, .dll у Microsoft) не могут использовать внутри себя статические адреса, поскольку код в разных случаях может появиться в разных местах памяти. У ДНК тоже есть такая особенность, она называется «транспозонами«.
Почти половина человеческого генома состоит из транспозонов, или «прыгающих генов». Впервые их открыла Барбара Макклинток в 1940-х годах, изучая странные закономерности наследования, просматриваемые в цветах индийской кукурузы. Прыгающие гены – это некоторые отрезки ДНК, которые ведут себя нестабильно и способны перемещаться, как по хромосоме, так и между ними.
Условное компилирование
На сегодня считается, что в человеческом геноме содержится от 20 000 до 30 000 генов, но большая часть клеток осуществляет экспрессию очень малой их части – и в этом есть смысл, ибо клетке печени не нужен ДНК-код, производящий нейроны.
Однако почти у всех клеток есть полная версия генома («дистрибутив«), поэтому им требуется система, которая исключает по #ifdef ненужные части. И это именно так и работает. Генетический код забит операторами #if/#endif.
Поэтому все так всполошились по поводу «стволовых клеток» – у них есть способность превращаться во что угодно. Их код, так сказать, ещё не исключался по #ifdef.
Точнее говоря, в стволовых клетках не включено всё сразу – они не являются одновременно и клетками печени и нейронами. Клетки можно приравнять к конечным автоматам, которые начинают работу в виде стволовых клеток. За время жизни клетки, во время которого она может клонировать себя (fork()) множество раз, она приобретает специализацию. К каждой специализации можно относиться, как к выбору развилки на дереве.
Каждая клетка может принимать решения (или её можно заставить их принимать) по поводу своего будущего, и с каждым принятым решением всё больше специализируется. Эти решения сохраняются при клонировании при помощи факторов транскрипции и изменения пространственного хранения ДНК (стерический эффект).
Клетка печени, хотя в ней и есть нужные гены, обычно не сможет работать клеткой кожи. Есть некоторые признаки того, что клетки можно «разводить», продвигая их «вверх» по иерархии и превращая их в плюрипотентные.
Эпигенетика и импринтинг: правка двоичного кода во время выполнения
Хотя существенные изменения в ДНК организма редко происходят в пределах поколения, довольно серьёзные изменения происходят при активации и деактивации частей нашего генома, без исправления самого кода.
Это можно сравнить с ядром Linux, которое при загрузке определяет ЦП, на котором оно работает, и отключает части своего двоичного кода, допустим, к примеру, если оно запустилось на одноядерной системе. И это не просто какие-то операции типа if(numcpus > 1), это отключение частей кода через NOP. И этот процесс, что важно, происходит в памяти, а не в копии системы, хранящейся на диске.
Сходным образом, в процессе развития эмбриона в утробе, его ДНК подвергается серьёзному редактированию для уменьшения скорости его роста и размера плаценты. Таким образом достигается баланс требований отца (крупные сильные дети) и матери (выжить при родах). Такой «импринтинг» может происходить только в матери, поскольку геному отца не известно ничего по поводу размера матери.
В последнее время становится понятно, что особенности метаболизма [metabolic status] родителей влияет на длину жизни, вероятность появления рака и диабета у их внуков. Это тоже обосновано, поскольку для выживания в климате, бедном едой, может потребоваться иная метаболическая стратегия, чем там, где еды в достатке.
За эпигенетику и импринтинг отвечает метилирование ДНК, присоединяющее метиловые группы к ДНК, чтобы «переключить» статус их активации, а также гистоны, способные так скрутить ДНК, что она не будет активирована. Некоторые подобные модификации ДНК передаются по наследству детям, иные могут влиять только на один организм. Эта область всё ещё очень быстро развивается, и может оказаться, что ДНК – структура более динамичная, чем казалось ранее.
Дохлый код, раздутие кода, комментарии («мусорная ДНК«)
Геном забит старыми копиями генов и экспериментами, которые пошли не так когда-то в недавнем прошлом – допустим, за последние полмиллиона лет. Код есть, но не работает. Это называется «псевдогены«.
Кроме того, 97% вашего ДНК закомментировано. ДНК линейная и читается с начала до конца. Те части, которые не нужно декодировать, очень чётко отмечаются, прямо как комментарии в С. 3% генов, используемых напрямую, называются «экзонами«. Комментарии, вставляемые посередине генов, называются «интронами«.
Эти комментарии примечательны сами по себе. Как у комментариев в С, у них есть отметка начала, что-то вроде /*, и отметка конца, */. Но у них есть ещё структура. Помните, что ДНК похожа на плёнку – комментарии необходимо физически вырезать! Начало комментария почти всегда отмечено буквами «GT», соответствующими /*, а конец определяется, как «AG» – своеобразный */.
Поскольку происходит вырезание, требуется клей для соединения кода до комментария и кода после, из-за чего комментарии больше похожи на комментарии в HTML, подлиннее: «» – конец.
Так что реальный отрезок ДНК с экзонами и интронами может выглядеть так:
РЕАЛЬНЫЙ КОД РЕАЛЬНЫЙ КОД | | | | | | экзон 1 донор интрон 1 ветка акцептор экзон 2 (начало комментария) (конец комментария)
Начало комментария понятно, а за ним следует кучка некодирующего ДНК. Где-то в самом конце комментария «точка ветвления», указывающая на скорое окончание комментария. Затем идёт ещё немного комментария, и потом уже непосредственно отметка его окончания.
Само вырезание комментариев происходит после транскрипции ДНК в РНК, и осуществляется через сворачивание комментария в петлю и сближение кусков кода. Затем РНК отрезается в точке ветвления вблизи окончания комментария, после чего «донор» (начало комментария) и «акцептор» (конец) оказываются соединёнными.
Зачем же нужны эти комментарии? Этот вопрос вызвал священную войну, по силе приближающейся к спору vi/emacs. Сравнивая разные виды, мы узнали, что у некоторых интронов код меняется меньше, чем у соседних экзонов. Это говорит о том, что комментарии выполняют какую-то важную задачу.
Существует множество вероятных объяснений огромного объёма некодирующего ДНК – и одно из самых правдоподобных (для кодера) связано с «предрасположенностью к скручиванию». ДНК нужно хранить в скрученной форме, но не все коды ДНК хорошо это переносят.
Это может напомнить вам о кодировании RLL или MFM. На жёстком диске биты кодируются сменой полярности или её отсутствием. Наивный подход был бы при использовании 0 для «нет смены» и 1 для «смены».
Закодировать 000000 легко – просто не меняйте магнитную фазу несколько микрометров. Однако при декодировании может возникнуть неопределённость – сколько микрометров мы прочли? Соответствует ли это 6 нулям или 5? Для предотвращения этого с данными поступают так, чтобы такие длинные последовательности без смены полярности не встречались.
Если мы встречаем «нет смены, нет смены, смена, смена» на диске, можно быть уверенным, что это соответствует «0011» – чрезвычайно маловероятно, что наш процесс чтения окажется настолько неточным, чтобы это соответствовало «00011» или «00111». Поэтому нам надо вставлять промежутки, чтобы слишком малого количества смен тоже не встречалось. На магнитных накопителях это называется ограничением длины последовательностей [Run Length Limiting].
Суть в том, что иногда необходимо вставлять смены, чтобы данные хранились надёжно. Интроны могут служить именно для этого – гарантировать, что итоговый код правильно свернётся.
Однако эта область молекулярной биологии – настоящее минное поле! Жаркие споры разражаются по поводу вариантов с такими громкими названиями, как «ранние интроны» и «поздние интроны» и массивными словосочетаниями типа «предрасположенности к скручиванию» и «шпильковый потенциал». Думаю, стоит дать этой дискуссии продолжаться пока без нас
fork() и fork-бомбы («опухоли»)
Клетки, как процессы в unix – не порождаются, а форкаются. Все клетки начались с яйцеклетки, которая раздвоилась с тех пор множество раз. Как и у процессов, обе половины fork() с начала практически идентичны, но затем они могут решить заниматься разными вещами.
Как и в unix, с постоянным раздвоением у клеток могут возникнуть проблемы. Они быстро расходуют ресурсы, что иногда ведёт к смерти. Это называется опухолью. Клетки снабжены ограничениями типа ulimit и сторожевыми таймерами [watchdog] для предотвращения такого исхода. Количество делений ограничивается, к примеру, при помощи укорачивания теломер.
Клетка не будет клонирована, если не удовлетворит строгим требованиям – конфигурация «безопасность по умолчанию«. Опухоли растут, только когда эти меры безопасности отказывают. Как и в компьютерной безопасности, тяжело найти баланс между безопасностью («никакие клетки не могут делиться») и удобством использования.
Сравните это с известной «проблемой остановки«, впервые описанная основателем информатики, Аланом Тьюрингом. Возможно, предсказать, закончит ли работу программа, так же невозможно, как создать рабочий геном, который никогда не заболеет раком?
Зеркалирование, аварийное переключение [mirroring, failover]
Каждая спираль ДНК кодирована с избыточностью – геном выглядит как скрученная лестница, каждая ступенька которой содержит два основания – отсюда и «пара оснований». Если одной пары не хватает, её можно вывести из другой. T всегда связывается с A, C всегда связывается с G. Поэтому можно сказать, что геном имеет зеркальную копию в спирали – так сказать, «RAID-1«.
Более того, у каждой хромосомы есть две копии – одна от каждого родителя, за исключением Y-хромосомы, присутствующей только у самцов. Конкретные детали довольно сложны – но большая часть генов имеется в двух экземплярах. Если одна сломалась или небезопасно мутировала, всегда есть вторая, независимая копия. Это мы можем назвать «аварийным переключением».
Беспорядочные API и ад зависимостей
Взаимодействуя в рамках клетки, белки полагаются на характеристики друг друга. Было показано, что белки, взаимодействующие с большим количеством других белков, эволюционировать не могут, или, по крайней мере, эволюционируют очень медленно (Nature, 28 June 2001, and M. Kimura, T. Ohta, Science, 26 April 2002).
Предполагается, что это происходит из-за большого количества внутренних зависимостей, сдерживающих изменение «контракта» с белком. Также отмечается, что эволюция всё же идёт, но очень медленно, поскольку обеим частям зависимости необходимо эволюционировать совместимым образом одновременно.
Вирусы и черви
Кем-то было внесено предложение, что было бы круто взломать геном и так его скомпрометировать, чтобы вставить в него код, который копировал бы себя в другие геномы, используя гостевые тела как переносчики. «Прямо как червь nimda!» Впоследствии он быстро понял, что биологические вирусы занимаются именно этим уже миллионы лет. И у них это прекрасно получается.
Многие из них встроились в наш геном и ездят автостопом вместе со всеми нами. Для этого им нужно было спрятаться от антивируса, пытающегося обнаружить чужеродный код и предотвратить его проникновение в ДНК.
Центральная догма молекулярной биологии: .c -> .o -> a.out/.exe
Когда учёные всё ещё открывали основы генетики, они столкнулись со множеством различных химических соединений, корреляция между которыми им была неясна. Когда стало понятно, что из чего происходит, это посчитали величайшим триумфом и назвали «центральной догмой молекулярной биологии«.
Догма утверждает, что ДНК используется для создания РНК, а РНК для создания белков – это как если бы мы сказали, что из файла a.c получается объектный файл a.o, который можно скомпилировать в исполняемый (a.out/exe). Также это говорит о том, что это единственное направление течения информации.
Но сейчас центральная догма немного потускнела. Как и в любом программном проекте возрастом в миллиард лет, в нём было сделано множество хаков, а иногда информация перетекала в другую сторону. Иногда РНК вносила изменения в ДНК, а иногда ДНК изменяли ранее созданные белки.
Но в целом зависимость понятна, поэтому Центральная догма остаётся важной идеей.
Патчим бинарники, или «генная терапия»
С ДНК можно достаточно легко играться. Существуют компании, которым можно отправить ASCII-файл с ДНК-символами и получить от них синтезированный «выход». А ещё можно заняться сплайсингом ДНК, вставляя отрезки в развивающиеся организмы животных и растений.
«Пропатчить работающую исполняемую программу» гораздо сложнее – с этим согласится любой программист. Чтобы изменить рабочую копию (человека), придётся отредактировать каждую значимую копию гена, который необходимо изменить.
Годами медицина пыталась патчить людей, страдающих от «тяжёлого комбинированного иммунодефицита«, неприятного заболевания, отключающего иммунную систему, из-за чего люди сильно болеют. Довольно долго было известно, какие буквы в ДНК необходимо изменить, чтобы их вылечить.
Было сделано много попыток пропатчить «работающих» людей при помощи вирусов, вставляющих ДНК в живые организмы, но оказалось, что это очень сложно. Геном слишком хорошо охраняется для того, чтобы такие простые подходы могли сработать – клетки охраняют свой код ревностнее Microsoft!
Однако недавно был найден нужный вирус, способный проникать через защиту генома и исправлять сломанные символы, в результате чего люди, судя по всему, выздоравливали.
Регрессионный баг
Исправляя баг в программе мы часто вносим в неё новые баги. Для генома это обычное дело. Множество негров имеют иммунитет к малярии, но страдают от серповидноклеточной анемии.
В тропических регионах мира, где распространена малярия, переносящаяся паразитами, у людей с одной копией определённой генетической мутации есть преимущество для выживания.
Наследуя одну копию мутации, человек получает преимущество, а наследуя их две – уже трагедию. Дети, родившиеся с двумя копиями мутации, страдают от серповидноклеточной анемии, болезненного недуга, влияющего на работу красных кровяных телец.
И таких примеров довольно много.
Код Рида-Соломона: прямая коррекция ошибок
Как и компьютерная система хранения данных, ДНК (и её посредник РНК) может нарушиться. Чтобы защититься от распространённых «ошибок в одном бите» кодирование отдельных букв ДНК в белки избыточное. В РНК есть четыре символа, U, C, G и A – иначе говоря, байт имеет длину в 2 бита. Три символа соответствуют аминокислоте.
6 битами можно разметить до 64 аминокислот, но их используется всего 20. К примеру, каждая из комбинаций UCU, UCC, UCA и UCG кодирует один серин, а триптофан кодирует только одна комбинация, UGG. Получается, что некоторые «опечатки» (UCU -> UCC) в кодировании приводят к экспрессированию идентичных аминокислот.
Святой код (никто не ожидает, что вы поймёте эту главу)
В программировании бывает священный код. Мы не помним, кто его написал или почему – мы знаем, что он работает. Товарищ, который его выдумал, может быть уже уволился из компании. С таким кодом играться нельзя.
В ДНК есть концепция «молекулярных часов«. Некоторые части генома постоянно меняются, а некоторые остаются неприкосновенными. Хороший пример последнего – гены гистонов H3 и H4. Они являются основой непосредственного хранения генома, поэтому имеют первостепенную важность. Любые отказы этого кода быстро приводят к неработающему организму.
Поэтому ожидается, что с этим кодом играться не будут, и так оно и есть на самом деле. У человеческих генов H3 и H4 нулевое количество эффективных мутаций. Но и это ещё не всё. Практически такой же код присутствует у всех – от людей и куриц до травы и плесени. И нулевое количество мутаций отслеживается за последний миллиард лет.
Судя по всему, у генома есть два способа гарантировать отсутствие мутаций в коде. Первый описан выше – использовать аминокислоты с высокой степенью избыточности и гарантировать, чтобы даже при наличии опечаток выход оставался одним и тем же.
Кроме того, в процессе репродукции клеток гены могут копироваться раньше или позже, что приводит к более или менее предпочтительным условиям копирования. И таких условий может быть много.
Создаётся такое впечатление, что H3 и H4 были тщательно разработаны, поскольку они обладают множеством «синонимичных изменений», которые, благодаря описанным выше хитроумным техникам, не приводят к изменениям на выходе.
Мутация сдвига рамки считывания: биты старта и останова
…0 0000 0001 0000 0010 0000 0011 0…
Это очевидное описание 8-битных значений 1, 2 и 3. Добавленные мною пробелы позволяют чётко видеть начало и конец байтов. Множество последовательно работающих устройств используют биты старта и останова, чтобы отмечать, с какого места начинать читать. Если немного сдвинуть эту последовательность:
…00 0000 0010 000 00100 000 00110…
Она внезапно превратится в 2, 4, 6! Чтобы такого не происходило, в ДНК есть сложные сигналы, сообщающие клетке, откуда начинать чтение. Что интересно, существуют части генома, которые можно начинать считывать с нескольких позиций и получить разные, но в каждом случае полезные результаты. Вот это я называю крутым хаком!
Каждый из способов, которым можно прочесть ДНК, называется открытой рамкой считывания, и их обычно 6 – по 3 в каждую сторону.
Массивная многопроцессорность: каждая клетка – отдельная вселенная
ДНК не похожа на компьютерный язык программирования. Совсем. Но бывают весьма удивительные аналогии. Каждую клетку можно рассматривать как ЦП, на котором выполняется своё ядро. У каждой клетки есть копия всего ядра, но она активирует только нужные его части. Так сказать, какие модули и драйвера загружать.
Если клетке нужно что-то сделать (вызов функции), она выдёргивает нужный кусок генома и транксрибирует его в РНК. РНК транслируется в последовательность аминокислот, создающих закодированный в ДНК белок. А теперь самое клёвое.
Протеин помечен адресом доставки. Этот маркер состоит из нескольких аминокислот, сообщающих клетке, куда этот белок должен попасть. Существует механизм, работающий по этим инструкциям и осуществляющий доставку протеина – возможно, и за пределы клетки.
Затем инструкция по доставке отделяется, после чего, возможно, выполняются ещё несколько последующих этапов обработки, которые, возможно, активируют белок – потому что иногда белок нужно передавать через такие места, где он не должен работать.
Самостоятельный хостинг и самозагрузка
Если мы уничтожим все существующие на планете компиляторы C на планете, и у нас останется только исходный код этого компилятора, мы попадём в большую беду. Да, у нас будет С код для компилятора С, но нам нужен будет компилятор С, чтобы его откомпилировать!
Для решения такой проблемы в реальности первый компилятор С был написан не на С, а на уже имевшемся языке: B.
То же верно и для генома. Чтобы создать новый «бинарник» представителя вида, требуется живая его копия. Геному нужна сложная цепочка инструментов, чтобы создать живое существо. Сам по себе код ничего не может. Часто такую цепочку называют «твои родители».
Правда, в последнее время учёные смогли создать жизнь через «самозагрузку» [bootstrapping], использовав совсем немного живого материала. Изречение «каждая клетка происходит из клетки» становится не такой уж догмой – смотрите, к примеру, Mycoplasma laboratorium.
Судя по всему, РНК, промежуточный код между ДНК и белком, могла быть «языком B» для ДНК. Благодаря чему возникает вопрос – откуда взялась РНК. Интересно отметить, что внеземные объекты часто содержат аминокислоты.
Makefile
Обычно организм начинается с одной клетки, которая, как я уже упоминал, содержит две копии генома. Так сказать, большой tarfile, с распакованными файлами и готовый к использованию. И что дальше?
Входят гены гомеобокса. Клетки нужно скопировать и назначить новой цель. Гены гомеобокса начинают с разложения зависимостей «сверху вниз», где написано «начинаем с головы». Для этого создаётся химический градиент, благодаря которому клетки способны чувствовать, где они находятся, и решать, нужно ли им делать вещи, полезные для создания головы, или для появления базовой хорды.
Гены гомеобокса, открытые только в 1983 году – чрезвычайно захватывающая область исследований. Интересно отметить, что HOX-гены, как и Makefile, активируют только другие гены, и сами по себе ничего не строят.
Синтаксис гомеобокса, судя по всему, «священен» в описанном ранее смысле. Что будет, если скопировать часть «селектора ног» мыши HOX в гомеобокс плодовой мушки?
Когда ген мыши Hox-B6 был вставлен в дрозофилу, он заменил Antennapedia и вместо антенн у мухи развились ноги.
Геномы плодовой мушки и человека разошлись не просто миллионы лет назад, а сотни миллионов лет назад. И всё равно можно копировать части («селекторы» на генетическом языке) Makefile, и он будет работать. Отмечу, что процедура «создать ногу» у плодовой мушки, естественно, радикально отличается от такой процедуры для мыши, но сам селектор правильно включает нужные инструкции.
Плагины: плазмиды
У всех живых организмов имеется ДНК, которая иногда организуется в виде множества хромосом («библиотеки»), иногда в виде одной – и в этом случае она обычно кольцевая. Такое происходит у большинства бактерий. А в дополнение к этому большому, основному геному, такие бактерии обычно содержат «плазмиды» – крохотные колечки ДНК с особыми функциями.
Такие плазмиды в какой-то мере можно передавать между разными видами и через различные механизмы они действительно передаются горизонтально. Таким образом даже неидентичные бактерии способны «научиться» друг от друга, например, сопротивлению антибиотикам.
Если сравнивать это с программированием, то плазмид – дело не добровольное, а нечто вроде LD_PRELOAD загрузки библиотеки .so. И плазмидов действительно иногда вводят с исследовательскими целями. Их легко ввести во все виды бактерий и они сразу же начинают работать.
Плазмиды копируют сами себя независимо от основной хромосомы, и поэтому становятся постоянным инструментом бактерии. Для этого у плазмида есть ген с громким названием «точка начала репликации«, активирующийся, когда клетка хочет поделиться.
Что почитать
- Мэтт Ридли, «Геном«
- Human Molecular Genetics, Tom Strachan, Andrew P. Read
- Ричард Докинз, «Эгоистичный ген«
- Ричард Докинз, «Слепой часовщик«
- Metamagical Themas by Douglas Hofstadter
Источник