Как поймать космические лучи с помощью простой программы
easy

Как поймать космические лучи с помощью простой программы

Это сложно, но возможно

По космосу постоянно носятся всевозможные волны и частицы: радиоволны, гамма-излучение, всевозможные электроны, нейтрино и что только не. Большая часть этого хозяйства не долетает до Земли благодаря атмосфере. Но кое-что долетает. Одно из таких излучений — космические лучи (осторожно, Википедия!). Они могут обладать большой энергией и проникать за счёт этого сквозь почти любые предметы, в том числе сквозь толщу атмосферы.

Если космический луч будет обладать достаточной энергией, он может пройти сквозь атмосферу, пролететь сквозь крышу здания, залететь в микросхему и выбить из ножки транзистора имеющийся там заряд — так в ячейке памяти могут возникнуть незапланированные 0 или 1. Это приведёт к тому, что программа может начать неправильно работать. Именно этот принцип мы используем в своём эксперименте.

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

Что будем делать

Мы напишем простой скрипт, который поможет нам отловить космические лучи и убедиться в их существовании на практике. Логика будет такая:

  1. Космические лучи изменяют случайным образом заряд электрона на выводах транзисторов памяти.
  2. Когда это происходит, заряд меняется на противоположный. Это значит, что, если транзистор отвечал за хранение нуля, там появится единица, и наоборот.
  3. Для отлова лучей мы будем использовать логические переменные, которые принимают значение Истина (1) или Ложь (0). 
  4. Для хранения таких простых значений компьютер часто использует один бит памяти, который как раз и принимает значения 0 или 1.
  5. Мы напишем скрипт, который постоянно проверяет значение логической переменной, и, если он поменяется, — сразу выводится сообщение о том, что найден космический луч.

Для скрипта мы используем Python, но можно взять любой другой язык программирования. Если не знаете, с чего начать работу в Python, начните с этой статьи:

Как установить Python на компьютер и начать на нём писать

Пишем скрипт

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

В программировании есть два значения логической переменной — True (1) и False (0). Мы можем указать в проверке сразу эти значения, без переменной, и тогда компьютер будет проверять именно их. При этом компьютер для хранения этого значения всё равно выделит какую-то ячейку памяти, самую маленькую, — и вот это как раз мы будем использовать для того, чтобы поймать космический луч.

Допустим, мы делаем такое условие:

Если Ложь, то выводим сообщение про лучи

В этом случае действие (вывод сообщения) заранее невыполнимо, потому что оно срабатывает, когда условие истинно. Но в этом и заключается хитрость, что как только космический луч поменяет значение в этой ячейке памяти на противоположное (с ложного на истинное, с 0 на 1), то условие сразу выполнится и мы увидим сообщение.

Запишем это на Python:

def detectCosmicRays():
    if False:
        print('Обнаружен космический луч!')

detectCosmicRays()

Оптимизируем код

У нашего кода есть проблема — условие проверяется и выполняется только один раз. Если в момент запуска луч не пройдёт через ячейку памяти — скрипт сработает впустую. Чтобы скрипт работал постоянно, добавим в него бесконечный цикл. Так он будет работать до тех пор, пока не сработает ловушка для луча.

Сделаем бесконечный цикл с помощью команды while:

def detectCosmicRays():
    # запускаем бесконечный цикл
    while True:
        # ловушка для космического луча
        if False:
            # выводим сообщение
            print('Обнаружен космический луч!')

# запускаем функцию обнаружения лучей
detectCosmicRays()

Теперь вроде всё хорошо: цикл выполняется бесконечно и рано или поздно мы поймаем момент, когда луч изменит значение заряда в транзисторе памяти и сделает условие истинным. Но что, если луч изменит не это значение, а то, что мы использовали в цикле — поменяет его с True (1) на False (0)? В этот момент цикл остановится и скрипт перестанет работать.

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

def detectCosmicRays():
    # запускаем бесконечный цикл
    while True:
        # ловушка для космического луча
        if False:
            # выводим сообщение
            print('Обнаружен космический луч!')
    # если цикл остановился, то это тоже признак внешнего вмешательства луча
    print('Обнаружен космический луч!')
# запускаем функцию обнаружения лучей
detectCosmicRays()

Что может пойти не так и в чём сложность этой идеи

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

В нашем случае компилятор заранее увидит, что условие не выполнится ни разу и что цикл никогда не остановится. Это значит, что он просто удалит ненужные команды, которые никогда не пригодятся, и запустит итоговую программу без них. Даже редактор кода VS Code подсвечивает команды, которые никогда не выполнятся, — он делает их бледнее. Если присмотреться, можно увидеть, что этот код не такой яркий, как остальной, — так компьютер показывает нам, что этот код он выполнять не будет:

Как поймать космические лучи с помощью простой программы

Получается, что даже при запуске мы ничего не получим: компьютер упростит код и выбросит оттуда важные для нас команды. Чтобы этого не произошло, нужно выполнять и компилировать программы со специальными параметрами: отключать оптимизаторы, проверки на условия и так далее. Иногда это может оказаться сложнее, чем написать сам код :-) 

А зачем это всё?

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

Текст:

Михаил Полянин

Редактор:

Михаил Полянин

Обложка:

Алексей Сухов

Корректор:

Ирина Михеева

Вёрстка:

Мария Дронова

Соцсети:

Юлия Зубарева

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Начать карьеру в ИТ
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Еще по теме
easy