Эта неделя была немного разочаровывающей. У меня была куча работы, и я не добился такого прогресса, как надеялся 😒. На этой неделе я работал над первыми двумя третями компилятора CadBerry GIL.

Как сделать компилятор

Компилятор состоит из трех основных частей: лексера, синтаксического анализатора и генератора целевого кода. Лексер берет что-то вроде этого примера GIL-кода:

#Target S.Cerevisiae
operation TestOp
{
    AAAAATTTTTCCCCGGGGG
    $InnerCode
    @MMCTQQQP
    LX@
}
sequence TestSeq
{
    TTTTTTTTTTTTTTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCC
}
TestFSeq => TestSeq
.Begin
{
    .TestOp
    {
        TestFSeq
    }
}

И он преобразует его в список токенов, которые сообщают компилятору, что делает каждая часть кода. Например, лексер GIL преобразует этот пример кода в список токенов:

set target, #Target
unknown token, #Target
ident, S.Cerevisiae
define operation, operation
ident, TestOp
begin,
    newline,
    dna, AAAAATTTTTCCCCGGGGG
    innercode, $InnerCode
    aminos, MMCTQQQPLX
    newline,
end,
newline,
newline,
define sequence, sequence
ident, TestSeq
begin,
    newline,
    dna, TTTTTTTTTTTTTTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCC
end,
newline,
newline,
ident, TestFSeq
forward,
ident, TestSeq
newline,
call operation, Begin
begin,
    newline,
    call operation, TestOp
    begin,
        newline,
        ident, TestFSeq
    end,
    newline,
end,

В GIL синтаксический анализатор затем берет выходные токены и преобразует их в объект Project в памяти. Точка входа в файл GIL будет преобразована в последовательность с недопустимым символом в начале (что-то вроде «\nMain»), чтобы пользователь не мог случайно запутаться с точкой входа. Избавившись от всего этого технического жаргона, давайте перейдем к некоторым различиям между компилятором C# GIL, который я написал во время карантина, и версией C++, над которой я сейчас работаю.

Чем отличается эта версия

Моя цель в GIL с самого начала состояла в том, чтобы упростить синтетическую биологию. К сожалению, версия C# GIL (далее GIL#) содержала множество сложных функций, реализованных по-разному. В версии C++ (GIL++) я вырезал все функции, кроме самых важных, и переработал оставшиеся. Например, знаете ли вы, что в GIL# есть два разных способа указания аминокислот, один из которых совершенно бесполезен? И тот, который был полезен, тоже был отстойным. Если вы хотите добавить последовательность аминокислот, GIL# заставит вас сделать это:

AminoSequence
{
    Some amino acid sequence
}

В GIL++ я переработал это, чтобы оно выглядело лучше, быстрее компилировалось и занимало меньше оперативной памяти:

@Some amino acid sequence@

Я мог бы целый день говорить об улучшениях производительности в GIL++ (например, об избавлении от лексера на основе регулярных выражений), но эта статья не для этого. На данный момент все, что мне осталось сделать, это закончить генератор кода, добавить пару настроек и перестать откладывать отладку пары надоедливых ошибок. Я чувствую, что эта статья была немного более бессвязной, чем обычно, но это потому, что прогресс на этой неделе настраивает вещи на следующую неделю, когда я (надеюсь 🤞) смогу выпустить супер раннюю версию для разработчиков на GitHub. Как я уже говорил ранее, CadBerry будет выпущен под той же лицензией с открытым исходным кодом GPL v3, что и GIL. В основном это означает, что вы можете делать с ним практически все, что захотите, если любые изменения, которые вы вносите, выпускаются под той же лицензией (кстати, не юридическая консультация). Мне не терпится увидеть, куда это пойдет, особенно с некоторыми моими идеями по интеграции биологических вычислений и даже, возможно, CRISPR в конечном итоге. С учетом сказанного, увидимся на следующей неделе 😃