По космосу постоянно носятся всевозможные волны и частицы: радиоволны, гамма-излучение, всевозможные электроны, нейтрино и что только не. Большая часть этого хозяйства не долетает до Земли благодаря атмосфере. Но кое-что долетает. Одно из таких излучений — космические лучи (осторожно, Википедия!). Они могут обладать большой энергией и проникать за счёт этого сквозь почти любые предметы, в том числе сквозь толщу атмосферы.
Если космический луч будет обладать достаточной энергией, он может пройти сквозь атмосферу, пролететь сквозь крышу здания, залететь в микросхему и выбить из ножки транзистора имеющийся там заряд — так в ячейке памяти могут возникнуть незапланированные 0 или 1. Это приведёт к тому, что программа может начать неправильно работать. Именно этот принцип мы используем в своём эксперименте.
Если хотите получше разобраться в том, что такое космические лучи и как они могут влиять на электронику, посмотрите это видео. Оно на простом английском, поэтому даже школьных знаний хватит для того, чтобы разобраться, что там происходит:
Что будем делать
Мы напишем простой скрипт, который поможет нам отловить космические лучи и убедиться в их существовании на практике. Логика будет такая:
- Космические лучи изменяют случайным образом заряд электрона на выводах транзисторов памяти.
- Когда это происходит, заряд меняется на противоположный. Это значит, что, если транзистор отвечал за хранение нуля, там появится единица, и наоборот.
- Для отлова лучей мы будем использовать логические переменные, которые принимают значение Истина (1) или Ложь (0).
- Для хранения таких простых значений компьютер часто использует один бит памяти, который как раз и принимает значения 0 или 1.
- Мы напишем скрипт, который постоянно проверяет значение логической переменной, и, если он поменяется, — сразу выводится сообщение о том, что найден космический луч.
Для скрипта мы используем 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 подсвечивает команды, которые никогда не выполнятся, — он делает их бледнее. Если присмотреться, можно увидеть, что этот код не такой яркий, как остальной, — так компьютер показывает нам, что этот код он выполнять не будет:
Получается, что даже при запуске мы ничего не получим: компьютер упростит код и выбросит оттуда важные для нас команды. Чтобы этого не произошло, нужно выполнять и компилировать программы со специальными параметрами: отключать оптимизаторы, проверки на условия и так далее. Иногда это может оказаться сложнее, чем написать сам код :-)
А зачем это всё?
Весь кайф ИТ в том, что тут можно многое проверить на практике и получить какие-то реальные результаты: построить графики, вытащить нужные данные с сервера или получить красивый сайт. Наш скрипт — один из способов подтвердить существование космических лучей на практике, без лабораторий и сложного оборудования. А самое классное то, что это может попробовать каждый. Попробуйте и вы.