Путешествия во времени — это распространённая тема в научной фантастике, но вопрос о том, может ли язык программирования реализовать эту концепцию, остаётся открытым. Хотя время как концепция часто используется в фильмах и книгах, в реальном мире временные путешествия пока что не нашли своего применения. Например, на конференции путешественников во времени, проведённой в 2005 году в MIT, не появилось ни одного временного путешественника.
Язык программирования Mariposa
Недавно появился язык программирования под названием Mariposa, который утверждает, что способен реализовать временные путешествия в рамках своего функционала. Такие «игрушечные» языки создаются для экспериментов с новыми или необычными функциями, как, например, изменение порядка выполнения кода — в данном случае это и есть «временные путешествия».
В контексте программирования временные путешествия подразумевают возможность перемещения вперёд и назад по коду или возврат к предыдущим состояниям, но это не имеет ничего общего с манипуляцией с реальным четырёхмерным пространством-временем. Пока мы ещё не достигли этого уровня, но в области компьютерных наук давно ведутся исследования, касающиеся времени в электронных системах, благодаря постоянному интересу к параллельному выполнению и обмену сообщениями в реальном времени.
Как работает Mariposa
В Mariposa можно управлять порядком выполнения кода, присваивая переменной определённый момент времени и задавая контекст для этого момента. Вот простой пример, взятый из документации Mariposa:
x = 1
t = now()
print(x)
at t:
x = 2
Согласно обычному порядку выполнения, этот код должен вывести «1». Однако, поскольку переменная t присваивается во второй строке, все изменения, указанные в блоке at t:, применяются немедленно, и код выводит «2». Язык ограничивает возможность возвращаться к одному и тому же моменту времени дважды, позволяя при этом считывать и записывать значения в родительские контексты.
С помощью определённой цепочки вызовов и изменения значения t внутри блоков at t:, можно создавать неожиданные поведения. Полезность этих эффектов для решения вычислительных задач остаётся предметом обсуждения — авторы языка заявляют, что создали его «в качестве исследовательской игры». Безусловно, любые приложения, связанные с манипуляцией временными данными, могут извлечь выгоду, но только в том случае, если существует необходимость в изменении исторических значений по временным меткам, а не просто в записи их.
Другие языки с временными возможностями
Хотя Mariposa привлекла внимание, она не является первым языком, внедрившим концепцию временных путешествий. Существует пакет Haskell, названный tardis, который создает два трансформера состояний: один перемещает вперёд во времени, другой — назад. Как объясняется в документации, «самый лаконичный способ объяснить это: getPast получает значение из последнего sendFuture, в то время как getFuture получает значение из следующего sendPast». Прошлое одной функции становится будущим для другой.
Программная манипуляция значениями может привести к интересной логике, хотя это может быть и просто новшеством. Тем не менее, возможность временных путешествий при отладке кода имеет реальные преимущества и имеет свою историю, уходящую корнями в Smalltalk. Современные фреймворки, которые включают реализации отладчиков с функцией временных путешествий, включают Elm и Redux, использующие журналы для воссоздания любого момента времени. Существуют также реализации таких отладчиков для других систем, включая WinDbg (Windows), rr (Linux) и Undo (Linux).
Темпоральные базы данных
В то время как языки программирования с временными возможностями изменяют значения переменных в предыдущих или будущих состояниях, при работе с большим количеством данных обычно используются базы данных. В темпоральных базах данных транзакции никогда не перезаписываются, а просто получают временные метки. Множество баз данных включают темпоральные функции, включая PostgreSQL, IBM Db2 и Snowflake.
Формальная логика
Компьютерные науки и программирование стремятся не только к манипуляциям со временем, но и к моделированию времени в формальной логике, которая может быть использована более детерминированным образом. Конкуренция, в частности, проверка систем с совместным доступом к переменным, является давней проблемой программной инженерии. Существует даже ежегодная конференция, посвящённая этой теме.
Формальная логика развила системы для рассуждений о времени, включая интервальную темпоральную логику (ITL), которая изначально была разработана для спецификации и проверки аппаратных средств. ITL использует конечные последовательности и предполагает линейное время, что позволяет проверять логику многопоточности в аппаратуре. Фактически, ITL была интегрирована в язык верификации аппаратного обеспечения e.
Один из первых языков, использующих ITL, Tempura, в настоящее время разрабатывается как (Ana)Tempura. Tempura была изначально разработана Роджером Хейлом, но сейчас поддерживается Антонио Кау и Беном Мосзковски, с последним релизом в сентябре 2023 года. У этого языка есть приложения для голосовой связи, мониторинга выполнения и искусственного интеллекта.
Современные решения
Тем не менее, большинство современных языков и систем моделирования, сосредотачиваются на правильной синхронизации временных изменений в многопоточных системах. В следующем разделе мы рассмотрим несколько теоретических идей, которые рассматривают прошлые и настоящие состояния как ресурсы, доступные программе в настоящем времени.
Будущее программирования
Хотя временные путешествия на данный момент невозможны, общая теория относительности предполагает, что время может двигаться в обоих направлениях. Это привело к многочисленным спекуляциям о математических моделях, которые могут сделать это возможным. Физики обсуждали различные идеи, начиная от сверхплотных объектов, вращающихся с одной четвертью скорости света, до зеркал, отражающих волны назад во времени.
Среди этих спекуляций, теоретический астрофизик Игорь Новиков выдвинул гипотезу о «закрытых временных петлях», которые могут позволить путешествия в прошлое, если данные в петле остаются самосогласованными. Это и есть принцип самосогласованности Новикова, который гласит, что история не может измениться.
Компьютерный учёный и футурист Ханс Морабек предложил использовать логическую петлю времени, чтобы быстро решать сложные задачи. Он предположил, что с помощью схемы с отрицательной временной задержкой можно рассчитать результат, который будет отправлен обратно в начальный момент времени. Однако, как показали позже исследования, многие из этих сложных задач сводятся к проблеме останова — определению того, завершится ли работа компьютера.
На сегодняшний день временные путешествия остаются в области теории, и хотя языки, о которых мы говорили, предоставляют интересные концепции программирования, нарушающие линейный поток программы, реальная возможность отправки будущих событий в прошлое по-прежнему недостижима.