Хобби некоторых программистов — изучение кода старых игр и ПО. Иногда в нем обнаруживаются весьма любопытные вещи, например ошибки. На днях разработчик программного обеспечения на пенсии Мартин К. Мартин смог найти проблему в коде обработки довольно известной игры Lunar Lander, которая появилась на свет в 1969 году.

Что там за ошибка?

Эксперт обнаружил ее в ходе анализа пути посадки модуля с максимальной экономией ракетного топлива. Сама игра изначально написана 17-летним начинающим разработчиком Джимом Сторером. Он создал ее при помощи ПК PDP-8 и языка программирования FOCAL. Первая версия Lunar Lander — простая, как и многие другие игры и ПО того времени.

Так, в ней были лишь обновления статуса аппарата в ходе посадки на поверхность естественного спутника Земли. Игрокам требовалось управлять расходом топлива для того, чтобы успешно прилуниться. Если допущена ошибка, посадка не осуществлялась. Принимать решения необходимо было быстро — каждые 10 секунд от игрока требовалось найти выход из той или иной ситуации.

Несмотря на минималистичность самой программы, а также относительно сложное «прохождение», Lunar Lander стал популярным. Так, в 1974 г. появилась уже версия с графическим интерфейсом, что сделало ее еще более востребованной среди геймеров. Ну а в 1979 г. Atari выпустила аркадную игру, которая и запомнилась тысячам игроков того времени.

Lunar Lander стал культовым — его помнили все эти годы, а в 2009 г. у создателя оригинальной игры взяли интервью, восстановив историю реализации проекта. Кроме того, исходный проект был опубликован самим автором. Его оценили многие специалисты, но лишь 15 лет спустя, уже в 2024 году, разработчик и научный сотрудник MIT Мартин К. Мартин смог обнаружить ошибку в реализации физических расчетов.

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

Наконец, подходим к сути ошибки. Инженер обнаружил, что при задействовании этого сценария игра «не видела» прилунения модуля, хотя игрок — да. Проанализировав код, IT-археолог увидел, что он хорош, а внутри — большое количество различных физических расчетов. И в одном из случаев как раз и возникала ошибка, которая оставалась незамеченной более чем полвека.

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

Не только игры

Ошибка в игре — интересно, но не более того, но схожие проблемы возникали и в ходе реализации реальных космических полетов. Так, при подготовке полета «Аполлона-8» Маргарет Гамильтон, о которой не раз и не два писали на Хабре, смогла найти серьезную уязвимость. Стоит отметить, что изначально проблему обнаружила дочь Гамильтон, которая играла с симулятором ПК «Аполлона-8». Однажды, запустив его, она выполнила последовательность P01.

Последняя не имеет отношения к полету и задействуется лишь перед стартом корабля. Но, как оказалось, если выполнить P01 уже в ходе полета, то возникают проблемы. Руководство NASA тогда не захотело встраивать защитные меры в ПО, равно как и указывать предостережение в инструкции. Решили, что профессионал высочайшего уровня, астронавт, никогда не допустит такой ошибки.

Оказалось, напрасно: после того как «Аполлон-8» должен был покинуть орбиту Луны, астронавт Джеймс Ловелл по ошибке запустил эту злополучную инструкцию. В конечном счёте из компьютера космического аппарата пропали навигационные данные, определить положение в пространстве стало крайне сложно. В итоге экипаж корабля начал ориентироваться по звездному небу и вносить правки вручную. А Маргарет Гамильтон 9 часов провела в поисках решения этой критической проблемы.

В итоге все сложности разрешились, астронавты вернулись на Землю. И даже это не все. Дело в том, что во время полета «Аполлона-13» возникла еще одна проблема, в ходе которой компьютер также пришлось перепрограммировать вручную. Участником того полета был все тот же Джеймс Ловелл, исправивший ситуацию и в этом случае — без него, скорее всего, случилась бы авария и команда никогда не вернулась бы на Землю. Но благодаря экстренному обучению настройки компьютера во время полета «Аполлона-8» он получил навыки, которые спасли команду уже другого космического корабля — «Аполлон-13».

Комментарии (11)


  1. Jury_78
    19.06.2024 09:07
    +2

    Периодически вспоминают про проект НАСА Mars Climate Orbiter, где из-за путаницы в единицах измерений все испортили. :)


  1. Mizar91
    19.06.2024 09:07
    +5

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

    Я правильно понимаю, что речь идет об этой формуле?

    F = G \cdot {m_1 \cdot m_2\over r^2}

    Или об этой?

    F = m \cdot a


    1. Tarson
      19.06.2024 09:07
      +2

      В Техника Молодежи в 1985-87 годах это всё уже было на ПМК


      1. Mizar91
        19.06.2024 09:07

        Да, помню обзор этой игры на БРП-4, там тоже ошибка была, когда критерием посадки считалась глубина кратера после очередной итерации. И я сам писал что-то такое очень давно на бейсике еще, будучи школьником. Поэтому совершенно не понимаю, зачем там научная база от ученого-физика.


        1. positroid
          19.06.2024 09:07

          Может, речь о чем-то таком? Ученая степень вряд ли нужна, но почему бы ученому-физику не помочь сыну с уравнением движения модуля с учетом силы тяжести и тяги двигателя
          h = h_0 + v_0 t - \frac{1}{2} g t^2 + \frac{T t^2}{2m}


    1. mark_ablov
      19.06.2024 09:07
      +2


  1. SuharkovMP
    19.06.2024 09:07
    +3

    По крайней мере часть вашей статьи - перевод, почему не указываете это?

    https://arstechnica.com/gaming/2024/06/retired-engineer-discovers-55-year-old-bug-in-lunar-lander-computer-game-code/


  1. Areke
    19.06.2024 09:07
    +1

    Уже же есть статья по этой теме от ру_вдс


    1. VitGo
      19.06.2024 09:07
      +3

      да они наперегонки переводят чужое :-) таков уж этот хабр


    1. SuharkovMP
      19.06.2024 09:07

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

      И они не постеснялись указать, что это таки перевод, в отличие от МТС.


  1. Molchaliviy
    19.06.2024 09:07

    Наверное, не уже, а ещё...

    Судя по всему, МТС всё-таки были первыми, они опубликовали свою статью немного раньше.