Внеземной Разум: эксперименты SETI сосредоточены на поиске сигналов


Сети программы SETI

«Мы знаем, что существуют сотни миллиардов планет, похожих на Землю. Нам также известно, в Галактике встречаются все виды сложных органических молекул. То есть там есть все, что, как нам представляется, необходимо для возникновения жизни.
Поэтому я думаю, что шансы на то, что где-то еще в пределах Галактики есть жизнь, довольно высоки» (Эндрю Симион, директор исследовательского центра SETI Университета Калифорнии в Беркли).

Где искать наших «братьев по разуму» на необъятных просторах Вселенной? Ответ на этот вопрос 55 лет назад попыталась дать уникальная программа «Поиск внеземного разума» SETI (Search for Extraterrestrial Intelligence).

Поиски родины маленьких зеленых человечков, о которых так много рассказывали уфологи, начался с проекта «Озма», запущенного в 1960 году астрофизиком Фрэнком Дрейком. Команда Дрейка стала прослушивать космос на 25-метровом радиотелескопе «Грин Бэнк» в направлении близлежащих солнцеподобных звезд: тау Кита и эпсилон Эридана.

Проект закончился без результата, но в 1971 году к поиску сигналов подключилось НАСА, предложив план «Циклоп». Он предусматривал использование полутора тысяч радиотелескопов и должен был обойтись чуть ли не в десятку миллиардов долларов. Два десятилетия напряженной работы не принесли никаких открытий, и в 1993 году проект был законсервирован.

Все последующие годы SETI существовал за счет скромных частных грантов и пожертвований. Неожиданно на 55-м году существования программы российский бизнесмен Юрий Мильнер объявил о выделении ста миллионов долларов на десятилетние поиски разумной жизни во Вселенной. Одним из научных консультантов проекта станет всемирно известный физик Стивен Хокинг.

ПО СЛЕДАМ «КЕПЛЕРА»

В 1988 году сильный ураган повалил радиотелескоп «Грин Бэнк», и через двенадцать лет на его месте возник крупнейший полноповоротный и сверхчувствительный радиотелескоп Национальной радиоастрономической обсерватории США.

Стометровая антенна 77-тысячетонного сооружения способна принимать до гигабайта данных в секунду. Радиоастрономы решили вести поиски на более широких частотах, стараясь принять большее количество сигналов. Каждые сутки будет сканироваться одна из 86 экзопланет, выбранных из 1 235 планетарных систем, открытых космическим телескопом НАСА «Кеплер».

«С помощью больших радио- и оптических телескопов мы будем искать электромагнитное или световое излучение, которое может исходить от техники, построенной неким высокоразвитым разумом, живущим на планете, которая вращается вокруг одной из звезд в Галактике», — заявил Эндрю Симион, директор исследовательского центра SETI Университета Калифорнии в Беркли.

Еще одним участником проекта SETI была радиоастрономическая обсерватория в Аресибо (Пуэрто-Рико).

В 1974 году с ее 305-метровой «тарелки», расположенной в жерле потухшего вулкана и подвешенной на трех 110-метровых башнях, была отправлена «межзвездная телеграмма» в направлении шарового звездного скопления М13.

Такой адресат на расстоянии 25 100 световых лет был выбран не случайно, ведь подобные скопления звезд являются старейшими в нашей Галактике, а значит, могут содержать высокоразвитые цивилизации.

«Послание Аресибо» содержало положение Солнечной системы, изображение человека и химические формулы. Правда, с учетом колоссального расстояния, ответ наши далекие потомки получат лишь через 52166 лет.

Ученые Аресибо отобрали планеты с температурой от 0 до 100 градусов Цельсия, лежащие в условном планетарном «поясе жизни».

Последующие наблюдения этого выдающегося тандема радиотелескопов не принесли ничего нового, показав глубокую условность планетарной области жизни. Ведь даже в нашей Солнечной системе в «зону Златовласки» (так называют «пояс жизни» западные астрономы) входят и Венера, и Марс, и Луна…

Тем не менее сам принцип предварительного отбора потенциальных объектов наблюдения с помощью космических телескопов породил новый виток исследований SETI.

ОНИ ОТВЕТЯТ… ДО 2025 ГОДА

Ровно 20 лет назад американские энтузиасты SETI, неудовлетворенные скудным финансированием со стороны Капитолия, НАСА и Пентагона, решили создать собственный исследовательский центр, существующий на частные пожертвования и гранты благотворительных фондов.

Так возник некоммерческий институт SETI в Маунтин-Вью (Калифорния). При этом бессменным директором исследовательского центра SETI на протяжении 35 лет (!) вплоть до 2012 года была известный астроном Джилл Тартер.

Тем, кто читал замечательный роман «Контакт» выдающегося астронома и популяризатора науки Карла Сагана, наверняка запомнилась астрофизик Элли Эрроуэй, посвятившая жизнь поиску разумных радиосигналов из космоса. В одноименном фильме ее самоотверженное служение науке блестяще воплотила Джоди Фостер.

Между тем за образом доктора Эрроуэй стояла именно доктор Тартер, которую хорошо знал Саган. Профессор Тартер считается крупнейшим астробиологом и в свое время была даже названа среди сотни самых влиятельных людей планеты по версии журнала «Таймс».

Уйдя в отставку, профессор Тартер всячески изыскивает минимальнейшие пару миллионов долларов на более-менее стабильную работу института и научного центра. По ее словам, прекращение госфинансирования SETI неминуемо приведет к потерям США в области технологий радиоастрономических исследований.

Именно Тартер стояла у истоков масштабного проекта «Феникс», включавшего исследование тысячи ближайших солнцеподобных светил в радиодиапазоне 1 200-3 000 МГц. В этом проекте использовались чрезвычайно чувствительные приборы, способные в принципе уловить излучение обычного аэродромного радиолокатора на расстоянии сотен световых лет.

За два десятилетия исследовательский центр SETI успел просканировать тысячи звезд, используя скромный для подобного учреждения ежегодный бюджет в 5 миллионов долларов.

В текущей работе и перспективных исследованиях новое руководство института SETI собирается сфокусироваться на кооперации с командой НАСА, обслуживающей телескоп «Кеплер». В то же время доктор Тартер считает, что громадный опыт сотрудников центра SETI поможет обнаружить «чужие сигналы» еще до того, как «Кеплер» и другие космические телескопы отыщут обитаемую планету в «зоне жизни».

Увы! Пока еще единственным и достаточно спорным результатом можно считать сигнал, полученный 5 января 2012 года по направлению от экзопланеты KOI 817.

РАБОЧИЙ ПРОЕКТ МИЛЛИОНОВ

В 1999 году в радиоастрономической лаборатории Университета Калифорнии в Беркли был запущен удивительный «проект миллионов пользователей Всемирной сети — [email protected]». В основе этой необычной миссии было привлечение к работе миллионов интернет-пользователей, желающих участвовать в поисках сигналов инопланетного разума.

Энтузиасты SETI должны скачать из Всемирной паутины специальные программы, работающие в режиме скринсейвера. Эти программы обрабатывают пакеты радиосигналов, принятых радиотелескопами в ходе текущей миссии SETI.

В настоящее время команда поисковиков зеленых человечков пополнилась уже несколькими миллионами пользователей из двухсот с лишним стран. Только электроэнергии они уже потратили более чем на миллиард долларов, хотя это и неощутимо для каждого участника проекта. На сегодня это самый грандиозный научный проект в истории Интернета!

И хотя проект [email protected] так и не обнаружил ни одного разумного сигнала, именно к нему хочет подключиться команда Мильнера, которую уже, кроме Стивена Хокинга, поддержали Джилл Тартер, радиофизик Дэн Вертаймер, возглавляющий проект в Аресибо, и ведущий астроном института SETI Сет Шостак.

Последний уверенно предсказывает, что если задействовать самую дорогостоящую систему телескопов Аллена из 350 антенн, то она «наткнется на сигнал еще до 2025 года».

Олег АРСЕНОВ

Результаты проверки

Признаюсь, что перед анализом проекта я был в предвкушении того, сколько проблемных мест удастся обнаружить. Но на моё удивление действительно интересных фрагментов кода (проблемных) оказалось не так уж много, что говорит о его качестве.

Тем не менее, подозрительные места были, и некоторые из них я бы хотел рассмотреть.

Для разогрева

Примеры кода в этом разделе нельзя подвести под какую-то одну категорию, как например «указатели» или «циклы», так они имеют разную тематику, но по-своему интересны.

Поэтому предлагаю перейти ближе к делу:

struct SETI_WU_INFO : public track_mem { …. int splitter_version; …. }; SETI_WU_INFO::SETI_WU_INFO(const workunit &w):…. { …. splitter_version=(int)floor(w.group_info-> splitter_cfg->version)*0x100; splitter_version+=(int)((w.group_info->splitter_cfg->version)*0x100) && 0xff; …. }

Предупреждение анализатора: V560 A part of conditional expression is always true: 0xff. seti_header.cpp 96

Подозрительным выглядит оператор ‘&&’, который используется для получения целочисленного значения. Возможно, в данном случае был необходим оператор ‘&’, так как иначе переменная ‘splitter_version’ всегда будет принимать одно из двух значений: 0 или 1.

Конечно, вероятность того, что подразумевалась прибавка к ‘splitter_version’ 0 или 1 есть, но, думаю, вы согласитесь, что она не очень велика, и в таком случае можно было использовать более понятный код (например, тернарный оператор).

Следующий подозрительный фрагмент кода — методы, которые должны возвращать значение, но, тем не менее, ничего не возвращают. Более того — они имеют пустые тела. Такой код как минимум выглядит подозрительно. Предлагаю взглянуть самим:

struct float4 { …. inline float4 rsqrt() const { } inline float4 sqrt() const { } inline float4 recip() const { } …. };

Предупреждения анализатора:

  • V591 Non-void function should return a value. x86_float4.h 237
  • V591 Non-void function should return a value. x86_float4.h 239
  • V591 Non-void function should return a value. x86_float4.h 241

Как видно из этого фрагмента, ни один из методов ничего не возвращает. Я специально выписал отдельно данный участок кода, и был несколько удивлён, увидев, что компиляция проходит успешно. Никаких предупреждений компилятора также не было. Но только до тех пор, пока данные методы не будут вызваны. При попытке сделать это всё же возникает ошибка компиляции.

Что это было: задел на будущее или ошибка — сказать сложно, так как никаких комментариев к данному коду не было. Просто имейте ввиду то, что я написал выше.

Но не будем зацикливаться на этом примере, лучше взглянем, что ещё удалось найти.

template std::vector xml_decode_field(const std::string &input, ….) { …. std::string::size_type start,endt,enc,len; …. if ((len=input.find(«length=»,start)!=std::string::npos)) length=atoi(&(input.c_str()[len+strlen(«length=»)])); …. }

Предупреждение анализатора: V593 Consider reviewing the expression of the ‘A = B != C’ kind. The expression is calculated as following: ‘A = (B != C)’. xml_util.h 891

Как понятно из кода, в ходе парсинга входных данных необходимо было получить значение длины (переменная ‘length’).

Что подразумевалось? В строке осуществляется поиск подстроки «length=», если она обнаружена, индекс начала подстроки записывается в переменную ‘len’. После этого исходная строка преобразуется в C-строку, из которой при помощи оператора индексации извлекается необходимое значение длины. В качестве вычисления индекса символа, хранящего значение длины, как раз используется индекс подстроки «length=» и её длина.

Однако из-за приоритета операций (или неправильно расставленных скобок в условии, видно, что они дублируются) всё пойдёт не так. Сначала будет выполнено сравнение со значением ‘npos’, а результат этого сравнения (0 или 1) будет записан в переменную ‘len’, что приведёт к неправильному вычислению индекса массива.

В ходе просмотра лога анализа я наткнулся на парочку интересных макросов. Предлагаю взглянуть и вам:

#define FORCE_FRAME_POINTER (0) #define SETIERROR( err, errmsg ) do { \ FORCE_FRAME_POINTER; \ throw seti_error( err, __FILE__, __LINE__, errmsg ); \ } while (0)

Предупреждение анализатора: V606 Ownerless token ‘0’. analyzefuncs.cpp 212

Сразу хочу сказать, что этот макрос по ходу кода встречался неоднократно. Непонятно, почему бы просто не генерировать исключение. Вместо этого в коде встречается непонятная лексема и присутствует цикл, для которого выполняется только одна итерация. Подход интересный, но к чему такой велосипед — неясно.

Указатели и работа с памятью

Для разнообразия — пример кода с указателями. Как правило, во фрагментах кода, содержащих работу с указателями или адресами, вероятность наступить на грабли порядком возрастает. Поэтому они вызывают больший интерес.

size_t GenChirpFftPairs(….) { …. double * ChirpSteps; …. ChirpSteps = (double *)calloc(swi.num_fft_lengths, sizeof(double)); …. CRate+=ChirpSteps[j]; …. if (ChirpSteps) free (ChirpSteps); …. }

Предупреждение анализатора: V595 The ‘ChirpSteps’ pointer was utilized before it was verified against NULLptr. Check lines: 138, 166. chirpfft.cpp 138

Анализатор предупреждает о том, что указатель используется до того, как выполняется проверка, на то, является ли он нулевым. Если не удастся выделить память и функция ‘calloc’ вернёт значение NULL’, будет выполнено разыменовывание нулевого указателя, что, как все мы прекрасно знаем, не очень хорошо.

Другой момент заключается в том, что функция ‘free’ вызывается только в том случае, если указатель не равен NULL’. Эта проверка избыточна, так как функция ‘free’ без проблем обрабатывает нулевые указатели.

Другой участок кода с подозрительным использованием функции ‘memset’. Давайте посмотрим:

int ReportTripletEvent(….) { …. static int * inv; if (!inv) inv = (int*)calloc_a(swi.analysis_cfg.triplet_pot_length, sizeof(int), MEM_ALIGN); memset(inv, -1, sizeof(inv)); for (i=0;i< 0) inv[j] = i; …. } …. }

Предупреждение анализатора: V579 The memset function receives the pointer and its size as arguments. It is possibly a mistake. Inspect the third argument. analyzereport.cpp 271

Из данного фрагмента кода видно, что сначала выделяется память под массив, после чего его элементы заполняются значением ‘-1’, а после с ними происходит работа. Но вот в функцию ‘memset’ третьим параметром передаётся не размер массива, а размер указателя. Для правильного заполнения массива необходимыми символами третьим аргументом следовало передавать размер буфера.

Циклы

Во многих проектах встречаются циклы, тело которых либо выполняется бесконечно, либо не выполняется вообще. [email protected] не стал исключением. С другой стороны — здесь последствия не выглядят такими критичными, как в некоторых других проектах.

std::string hotpix::update_format() const { std::ostringstream rv(«»); for (int i=2;i<2;i++) rv << «?,»; rv << «?»; return rv.str(); }

Предупреждение анализатора: V621 Consider inspecting the ‘for’ operator. It’s possible that the loop will be executed incorrectly or won’t be executed at all. schema_master.cpp 9535

Ошибка весьма тривиальна. Как все мы знаем, тело цикла ‘for’ выполняется, пока его условное выражение истинно. Здесь же уже на первой итерации условие будет ложным, так что сразу будет осуществлён выход из цикла. Лично я не могу понять, что здесь подразумевалось, но тем не менее тело этого цикла никогда не будет выполняться.

Аналогичный фрагмент кода встретился ещё раз, но в другом методе другого класса:

V621 Consider inspecting the ‘for’ operator. It’s possible that the loop will be executed incorrectly or won’t be executed at all. schema_master.cpp 11633

Не столь прозрачный, но потенциально ошибочный пример:

template std::istream &operator >>(std::istream &i, sqlblob &b) { …. while (!i.eof()) { i >> tmp; buf+=(tmp+’ ‘); } …. }

Предупреждение анализатора: V663 Infinite loop is possible. The ‘cin.eof()’ condition is insufficient to break from the loop. Consider adding the ‘cin.fail()’ function call to the conditional expression. sqlblob.h 58

Так как мы рассматриваем циклы, несложно догадаться, что ошибка — в условии выхода из цикла ‘while’. Хотя многие наверняка не обнаружат ничего подозрительного, так как применяемый здесь метод выглядит вполне стандартным. Но подводный камень есть, иначе этого примера в статье не было бы.

Дело в том, что при возникновении сбоя чтения данных такой проверки будет недостаточно. В таком случае метод ‘eof()’ будет постоянно возвращать ‘false’, как следствие — бесконечный цикл.

Для исправления ошибки необходимо добавить дополнительное условие. Тогда цикл будет выглядеть следующим образом:

while(!i.eof() && !i.fail()) { //do something }

Прочие подозрительные места

Аккуратными нужно быть и с битовыми операциями. В ходе анализа встретился участок кода, приводящий к неопределённому поведению:

int seti_analyze (ANALYSIS_STATE& state) { …. int last_chirp_ind = — 1 << 20, chirprateind; …. }

Предупреждение анализатора: V610 Undefined behavior. Check the shift operator ‘<<‘. The left operand ‘-1’ is negative. analyzefuncs.cpp 177

Как видно из кода, переменная инициализируется значением, полученным в результате битового сдвига. И всё бы ничего, но левый операнд отрицателен, а согласно стандарту C++11, эта операция приводит к неопределённому поведению.

Выходит палка о двух концах. С одной стороны — подобный код давно и неоднократно используется, с другой — в стандарте всё же указано, что данный код приводит к неопределённому поведению.

Окончательное решение остаётся за программистом, но обратить внимание на это стоит.

Неоднократно встречался код, где одной и той же переменной дважды присваивались различные значения, причём между этими присваиваниями никаких других операций с переменной не производилось. Один из примеров такого кода:

int checkpoint(BOOLEAN force_checkpoint) { int retval=0, i, l=xml_indent_level; …. retval = (int)state_file.write(str.c_str(), str.size(), 1); // ancillary data retval = state_file.printf( «%f\n» «%d\n» «%d\n», best_spike->score, best_spike->bin, best_spike->fft_ind); …. }

Предупреждение анализатора: V519 The ‘retval’ variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 450, 452. seti.cpp 452

В данной ситуации тяжело сказать, что подразумевалось или как это необходимо исправить. Но программист, писавший код, возможно, поймёт причину такого использования переменной. Нам же остаётся только удивляться и строить догадки.

Встретились ещё четыре подобных участков кода. Соответствующие сообщения анализатора:

  • V519 The ‘retval’ variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 470, 472. seti.cpp 472
  • V519 The ‘retval’ variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 490, 492. seti.cpp 492
  • V519 The ‘retval’ variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 513, 515. seti.cpp 515
  • V519 The ‘retval’ variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 533, 536. seti.cpp 536
  • V519 The ‘lReturnValue’ variable is assigned values twice successively. Perhaps this is a mistake. Check lines: 85, 97. win_util.cpp 97

Возможно, эти переменные использовались просто для просмотра значений, которые возвращают функции при отладке кода. Тогда ничего опасного нет и эти предупреждения можно игнорировать или подавить одним из множества способов, которые предоставляет анализатор PVS-Studio.

Напоследок приведу пример, где несколько нерационально используется функция ‘strlen’:

int parse_state_file(ANALYSIS_STATE& as) { …. while(fgets(p, sizeof(buf)-(int)strlen(buf), state_file)) { if (xml_match_tag(buf, «

Предупреждение анализатора: V814 Decreased performance. Calls to the ‘strlen’ function have being made multiple times when a condition for the loop’s continuation was calculated. seti.cpp 770

Ввиду того, что буфер (переменная ‘buf’) не изменяется в ходе выполнения цикла, нет никакой необходимости вычислять его длину на каждой итерации. Возможно, целесообразнее было бы завести для этого отдельную переменную, с которой и производить сравнение. Это не столь заметно при малых размерах буфера, но при больших, когда количество итераций существенно больше, может быть куда заметнее.

Данный код встречался неоднократно, вот ещё несколько подобных сообщений:

  • V814 Decreased performance. Calls to the ‘strlen’ function have being made multiple times when a condition for the loop’s continuation was calculated. seti.cpp 784
  • V814 Decreased performance. The ‘strlen’ function was called multiple times inside the body of a loop. xml_util.cpp 663
  • V814 Decreased performance. The ‘strlen’ function was called multiple times inside the body of a loop. xml_util.cpp 686

Роботы как инструмент межзвездной экспансии

Есть и другие причины, по которым продвинутые чужеродные виды, вероятно, не захотят причинять нам вред. Например, если бы они были продвинутыми мастерами межзвездных путешествий, было бы вероятно, что они могли бы понимать эффективность механизации процесса порабощения другого вида. Зачем испытывать все эти неприятности, когда вы можете просто создавать роботов? Которые могут сделать всю работу за вас – включая создание большего количества других роботов. Скрещивание не будет работать по той же причине, по которой инопланетяне, вероятно, не смогут нас съесть: несоответствие биохимии.

Хотят ли инопланетяне заполучить наши природные ресурсы? Опять же, если вид умеет преодолевать расстояния в галактическом масштабе, он вряд ли будет нуждаться в нефти или угле. Вода доступна в больших количествах в других местах за пределами Земли. Даже в нашей собственной Солнечной системе, например на Европе, гораздо больше воды чем на Земле. И инопланетянам не придется ни с кем воевать, чтобы добыть ее. То же самое касается ценных элементов, таких как гелий, иридий, вольфрам, золото и платина. Они могут быть найдены в газовых гигантах и ​​поясе астероидов.

Весьма сомнительно, что технически превосходящая нас раса полетит так далеко, чтобы колонизировать Землю. Они вполне, вероятно, могут использовать некоторые из своих обширных знаний. Которые позволят приспособить для жизни планеты, расположенные намного ближе к их дому. Мы ведь обнаружили сотни миров, которые могут быть хорошими кандидатами для терраформирования.

Рейтинг
( 2 оценки, среднее 4.5 из 5 )
Понравилась статья? Поделиться с друзьями: