На чём пишут ПО для космических аппаратов?

Fr1Zz

SpaceXСтатті
22104

Предисловие

При обсуждении готовящихся к запуску или уже запущенных космических аппаратов, так или иначе мы обращаем внимание на то, каким образом эти аппараты работают. Зачастую такие обсуждения ограничиваются затрагиванием общей конструкции аппарата, установленных на него приборов или других модулей, служащих определённой цели. Мы всё время повторяем: “Инженеры установили то… Разработали это… Сконструировали другое”, тем самым уделяя всё внимание им.

Конструкторы собирают Mars 2020 (Я голосовал за Clarity).

Однако, отдавая должное инженерам и конструкторам многие забывают, что даже со всем аппаратным обеспечением, модулями, приборами и т.д. и т.п., аппарат не будет выполнять свои функции без программного обеспечения, которое, как правило, создаёт другая группа людей – программисты. Если железяки являются телом аппарата, то ПО является его интеллектом, оно вдыхает жизнь в эту груду металла, позволяет людям управлять ей, даже находясь на другом конце Солнечной системы. Как говорил мой преподаватель по программированию… Магия! Не вникая в суть невозможно понять масштаб работы, которую нужно проделать для реализации этой “магии”, однако каждый, кто в изучении программирования уходил хотя-бы на несколько ступеней выше знаменитого “Hello World!”, понимает, что это неимоверный труд. Поэтому я и решил затронуть эту тему и ниже я вкратце распишу какие языки и методы программирования используют в различных космических компаниях, а именно в NASA, SpaceX и Роскосмосе, и как эти языки менялись, меняя за собой всю отрасль.

Как кодят в NASA?

История этого ведомства, скорее всего, является самой необычной и насыщенной уймой странностей и необъяснимых вещей. Именно поэтому раздел о нём будет самым длинным. Дело в том, что в NASA не особо любят заниматься переписыванием одного и того же кода от миссии к миссии и часто там практикуется повторное использование компонентов кода, успешно зарекомендовавших себя в предыдущих миссиях. Казалось бы, это правильное решение и в целом с этим нельзя не согласиться. Это увеличивает надёжность будущего аппарата и сокращает время разработки ПО под него. Однако вот незадача… Технологии идут вперёд. И код, подходящий для одной архитектуры, нужно переделывать, чтобы он заработал на более новой. Делать это, конечно, никто не торопился. Именно поэтому миссии THEMIS и STEREO, запущенные в 2007 и 2006 годах соответственно, работали с использованием модулей от предыдущих миссий на процессорах Intel 8085, выпущенных ещё в 1976 году. Код для них очевидно писался на машинно-ориентированных языках по типу Ассемблера. Простым для чтения, а уж и для переноса на другие системы, такой код точно не назовёшь, однако его использование невероятно сильно ускоряло работу ПО. Команды обращаются к процессору как бы напрямую, без посредников.

Одна и та же программа на Ассемблере и многим известном Паскале.

Естественно, что в то время уже существовали языки и более высокого уровня, тот же Fortran. Однако использовался он не так активно и преимущественно для компьютеров, которые будут находиться на Земле, а не в полёте. К тому же, просто использовать Fortran тогдашнее руководство не захотело и во время раскрутки программы Space Shuttle в 70-ые года было принято решение разработать на основе Fortran новый язык программирования, отвечающий новым требованиям стандартов, которые так были необходимы для упорядочивания всей накопившейся к тому времени кодовой каши. Было решено разработать два языка: HEL/S для ПО космических аппаратов, и HEL/G для наземного оборудования. Однако с HEL/S создатели явно перемудрили, сделав код абсолютно не читабельным даже для программиста выше среднего уровня. Вот простейший пример.

Код на HEL/S:

         2     

 z = y + x * h                        

               i

И вот что под ним имеется в виду (i – индекс):

 z = y^2 +x*hi

Вот уж где точно магией не пахнет. Таким образом, язык HEL/S был оставлен в прошлом, а HEL/G даже не появился на свет. В итоге NASA начало временно использовать язык программирования Ada, разработанный до этого под нужды ВВС США. Изначально он использовался для управления военными объектами, снарядами, самолётами, кораблями и другими безделушками в реальном времени. Как вы уже могли догадаться, единственным языком в NASA он не стал. Всё также кто-то где-то использовал Fortran, кто-то Pascal, а кто-то вообще Visual Basic или Bliss. Ко всей этой солянке в начале нулевых добавились знаменитые С, С++ и Perl. Стали, наконец, появляться операционные системы в привычном нам понимании. К слову, многие аппараты до этого вообще путешествовали по космическим просторам без каких либо операционных систем (Пионер вам в пример). Таким образом приоритет захватил быстрый и удобный язык С. Именно на нём сейчас работает большая часть космических аппаратов, в том числе всем известный любимчик – марсоход Curiosity. Под роверы на С была написана универсальная операционная система VxWorks. Все марсоходы начиная от Pathfinder и заканчивая Curiosity работают на ней.

Пример языка С.
Программа просто выводит надпись “hello, world”.

С триумфом С солянка языков программирования никуда не делась и для разных миссий/задач всё ещё используются различные языки, в том числе обожаемый многими нынче Python. Никуда так и не делся кошмар любого любителя ООП (объективно ориентированное программирование) – Ассемблер. Кстати таким же, как я, фанатам языков по типу Java или C#, работающих с помощью виртуальной машины, в космическом программировании ловить нечего, ибо слишком большое время отклика у таких программ для космических расстояний. Ну зато программа, написанная на утюг, будет работать и на Tesla.

Как кодят в SpaceX?

Если NASA – это ваш 60-летний сосед, пользующийся кнопочным телефоном, время от времени читающий газеты (те самые, бумажные) и прогуливающийся до рынка, чтобы прикупить себе что-нибудь модное, то SpaceX – это молодой паренёк со смартфоном в руках, в котором есть всё, начиная от звонков и новостей, заканчивая интернет магазинами с доставкой. Компания Илона Маска также использует несколько языков программирования, однако их в разы меньше, чем у NASA и все они являются современными высокоуровневыми языками, код которых на минимальном уровне, в принципе, может прочитать даже тот, кто ни разу не знакомился с программированием.

Красота же, правда?

Для программного обеспечения на всех ракетах серии Falcon, на всех кораблях Dragon используется шикарнейший язык С++, который какое-то время в универе я считал идеальным языком программирования (пока не познакомился с Java). Язык максимально универсален и, плюс ко всему, относительно машинных языков прост в изучении. На нём пишут практически всех современных роботов, все системы дистанционного управления и всё, что только можно. По заявлениям сотрудников SpaceX, этот язык занимает основную позицию, среди всех других языков в компании. Своё место нашли C# и JavaScript. На них работают большая часть внутренних инструментов и услуг компании. Например кофеварка в кабинете Илона Маска, вероятнее всего, работает на C# (если она у него есть). Для других технологических задач также используются Knockout, Handlebars, Python, LESS. Моделирование же проводится в LabVIEW с помощью графического языка программирования G. Из операционных систем же для своих аппаратов, SpaceX отдали предпочтение Linux.

В общем, у SpaceX, в отличие от тех же NASA, с разработкой ПО всё намного проще и практичнее. Но всё же стоит учесть через что пришлось пройти NASA, перед тем как появились современные языки программирования и этот путь не может не сказываться на нынешних делах этого ведомства. SpaceX же фактически пришли в идеальный момент, когда все трудности за них уже преодолело NASA и сильно запариваться с машинными языками программирования команде Илона не пришлось, когда уже есть С++.

Как кодят в Роскосмосе?

“С? С++? Что за бред? Какой-то набор скобочек и запятых? Зачем нам это?” – подумали российские инженеры, когда эти языки начали появляться на свет. И правильно сделали. Ведь ещё в СССР был разработан универсальный способ писать ПО для ракет и космических кораблей. Всё началось с разработки всемирно известного Бурана.

В представлении не нуждается.

Для реализации этого проекта был разработан ПРОЛ2 – язык для разработки комплексных бортовых программ в реальном времени. Сразу за ним подоспели ДИПОЛЬ – проблемно-ориентированный язык для создания программ для наземных испытаний и ЛАКС — язык для моделирования. Все это было создано под БЦВМ – бортовую цифровую вычислительную машину. Для неё также была написана отдельная операционная система, получившая название “Пролог-диспетчер”. После запуска Бурана, как мы все знаем, лавочка была прикрыта и больше Буран не эксплуатировался, однако его наработки не были забыты и даже ещё более усовершенствованы. Таким образом на свет родился Дружелюбный Русский Алгоритмический язык, Который Обеспечивает Наглядность. Или сокращённо ДРАКОН. Главной фишкой этого языка является то, что программировать на нём может кто угодно, даже не программист. По крайней мере на его чистой версии. Язык является в меньшей степени языком и в большей набором схем, создающимся в редакторе. ДРАКОН-Схемы получились очень удобными и читаемыми для всех людей, даже не являющимися программистами.

Алгоритм Дейкстры реализованный на ДРАКОН’е.

Но на этом его создатели решили не останавливаться. Всё-таки одними схемами сыт не будешь и ДРАКОН стал гибридным языком программирования, что значит, что он способен как-бы сливаться с другими языками программирования, образуя таким образом ДРАКОН-Java, ДРАКОН-Python и так далее. Вот это я понимаю магия. Язык оказался настолько надёжным и мощным, что используется он и по сегодняшний день, причём не только в Роскосмосе. Некоторые проекты ESA реализованы на нём, планируемый в будущем “Морской старт” от S7 тоже будет реализован на ДРАКОН’е.

По мелочи, конечно, использовались и другие языки программирования. Мой преподаватель (тот что шутил про магию), рассказывал как для разработки ПО серии аппаратов “Венера” использовался язык Fortran, однако основой после Бурана всё же остался максимально универсальный ДРАКОН.

Конец

На этом всё, спасибо всем, кто дочитал до конца. Буду рад любым отзывам и оценкам.

71 коментарів

Розгорнути всі

Будь ласка, у свій профіль, щоб коментувати пости, робити закладки та оцінювати інших користувачів. Це займає всього два кліки.

Січ 31, 2020 14:12

Вот это активность) Спасибо всем, кто помечал опечатки. Писал ночью, поэтому без них никуда)

Січ 29, 2020 02:09

Огромное спасибо, было очень интересно почитать. Давно хотел поискать информацию на эту тему, теперь буду знать, от чего отталкиваться 🙂
Лично мне не хватило небольшого вывода в конце, но это дело вкуса. Обязательно выведем в социальные сети!
Удивлён был тем, что в SpaceX пользуются сишарпом, хотя он вроде как действительно у них применяется только во внутренних инструментах 🙂

P.S. Позволил себе заключить код из блоков цитаты в блоки кода. Завтра сделаю этот тип блока доступным для всех пользователей в редакторе.

Січ 29, 2020 21:15

Павел, подправьте, пожалуйста, масштаб картинки с примером на С.

Січ 29, 2020 23:54

Я-то подправлю, но размер картинки может устанавливать автор текста, так что в следующий раз лучше обращаться к нему напрямую.

Січ 29, 2020 02:46

Спасибо! Очень интересно.

Січ 29, 2020 08:45

Ну, С/С++ – хороший компромисс между производительностью и легкостью написания/чтения. В Тесле тоже этот набор языков используют.
Смотрю автору очень нравится java и было много сказано про СпейсЭкс. Так вот, Маск написал Zip2 на java ). https://youtu.be/NxmO_QuD4Do?t=3535 – 59-я минута.
Draw red squre – that was amazing!В браузере на java, 95-й год ).
”Yellow pages will never die” – famous last words

Січ 29, 2020 11:03

Спасибо за интересный материал! Открыл для себя много интересных подробностей!

Но наверное, самым популярным языком программирования на космических аппаратах является Arduino IDE)))) ну или Python))

Січ 29, 2020 12:39

языком программирования ….. является Arduino IDEЭто заблуждение большинства новичков. Arduino (а точнее Wiring) это не язык программирования, а набор библиотек. В Arduino IDE все программы (скетчи) пишут на C/C++

Січ 29, 2020 13:20

Я немного опечатался.

Вообще Arduino IDE — это среда программирования.

A как раз Wiring это язык программирования, основанный на С++

Спасибо что заметил опечатку!

Січ 29, 2020 21:16

Это он так шутит. Ну, или троллит.

Січ 29, 2020 13:05

Я, надеюсь, вы про пайтон пошутили.

Січ 29, 2020 13:20

А почему?

Січ 29, 2020 13:49

“Я, надеюсь, вы про пайтон пошутили.”
То есть, ардуино у Вас не вызвало таких ассоциаций? Только пайтон? 🙂

Січ 29, 2020 20:45

Ну, с учетом того, что производители сейчас в состоянии загнать в один чип целую JAVA-машину, то почему бы и не “Питон”? Для задач не реального времени?

Січ 29, 2020 13:05

Информативно, просто, понятно (только в расшифровке ДРАКОН’а нестыковочка)

Січ 29, 2020 14:42

Да, надо было одно слово с маленькой (строчной) буквы оставить. Тогда и аббревиатура бы срослась)

Січ 29, 2020 19:11

Язык ДРАКОН – это конкретная реализация языка из семейства IEC 61131-3, а именно SFC. Это даже не язык сам по себе, а среда визуального программирования условной последовательности действий какого-нибудь процесса. Описывает их очень компактно и обозримо на экране. Сейчас входит во многие программные пакеты для программирования промышленных контроллеров, особенно любо лепить в нем роботов.

Січ 29, 2020 20:13

Ни в какие пакеты ДРАКОН не входит. Вообще, есть по сути только две реализации – Тышова и Митькина. Первая чудовищная, вторая просто немного ужасная. Ну и еще пара недоделанных поделок. Все участие “дракона” в “буране” по словам самого же Паронджанова, “нарисовали алгоритм на бумаге и отдали программистам на кодирование”. ДРАКОН-ФЛОКС, внутренняя система пилюгинцев, по доступным описаниям, тоже ужасна. Впрочем, убедиться в этом самостоятельно может любой желающий, скачав книги Паронджанова, ДРАКОН/TCL Митькина, ну или поделку Тышова. Ну, можно еще почитать drakon.su, если нервы крепкие.

Січ 30, 2020 01:29

внутренняя система пилюгинцев – Можно поподробнее про моих однофамильцев пожалуйста? Это кто такие?

Січ 30, 2020 07:39

Пардон, не ДРАКОН-ФЛОКС, а ГРАНИТ-ФЛОКС.
Программисты поймут, если я скажу, что в графит-флоксе все переменные (“идентификаторы”)- глобальные.
Верификация в дураконе: “При верификации человек тщательно изучает компьютерные чертежи спецификаций и алгоритмов, представленные на бумаге или экране и выявляет многие ошибки”
идентификаторы в графит-флокск: “В реальных алгоритмах длина идентификатора не должна превышать 16 символов”, “при чтении идетификаторов нужно пропускать первые пять символов, и начинать чтение после первой точки”

“ДРАКОН — графический язык, язык зрительных образов. Шампур-язык — язык шампур-схем. Для шампур-языка задан только визуальный синтаксис. (шампур-язык) — это не язык программирования, а язык крупноблочных схем программ, то есть. язык полипрограммирования (импер-языка), постольку импер-язык есть интерпретированный шампур-язык.”

Січ 29, 2020 22:21

Если интересно, накопал страничку, какой хлам пользуют в “Роскосмосе”: https://che-shr-cat.livejournal.com/73384.html

Лют 02, 2020 09:33

Ну, во-первых, не такой уж страшный хлам. Хотя отстали изрядно даже от отставания советских времён.
Во-вторых, у буржуев тоже часто используются устаревшие решения. Ибо постоянно ставить “новые” – это риски, деньги и такая же бюрократия.
Совсем недавно на хабре были неплохие статейки про космическую микроэлектронику.
https://m.habr.com/ru/post/483016/
Это вторая часть, про то, что сейчас в России делают/пытаются делать. И там есть ссылка на первую часть – про историю, и про состояние на западе. Более “популярно написанная”, нежели вторая.

Січ 29, 2020 20:20

Интересно, мне одному словосочетание “Как кодят.. ” взрывает мозг?

Січ 29, 2020 20:30

мне одному словосочетание «Как кодят.. » взрывает мозг?Всем кодерам кодить нисколько не можно, поскольку занятие это взрывает их мозг 🙂

Січ 29, 2020 20:42

Я, вообще-то, “в теме” 1987 года, но никогда не “кодил”, по жизни “писал”. Эх, вот так жизнь зря и проходит…

Січ 29, 2020 20:27

Интересно, а что за ассемблер приведен на первом скриншоте? Явно не Intel’овской 80ХХ серии, скорее всего, какого-либо микроконтроллера. Кстати, думаю ассемблер в космической сфере до сих пор востребован – в любой сфере, где используется куча микроконтроллеров с памятью объемом с игольное ушко, без ассемблера – никуда.

Січ 29, 2020 20:40

Показался знакомым, но нет. Поискал и думаю, что код здесь показан для примера, безотносительно к ПО косм аппаратов. Похоже на http://nparker.llx.com/a2/opcodes.html, https://dwheeler.com/6502/oneelkruns/asm1step.html. Никогда не пробовал.

Січ 29, 2020 20:55

Да, славные доайфонные времена, 8-битные процессоры, килобайтная память, винчестеры размером с тумбочку – ностальгия…

Січ 30, 2020 06:56

скорее всего, насколько память подсказывает, это 6502.
Такие стояли в ранних Эпплах, болгарских Правецах-8 (где я с ними сталкивался), советских Агатах.

Січ 30, 2020 14:07

болгарских Правецах-8 (где я с ними сталкивался), советских Агатах.Не, через мои руки прошли тачки семейства PDP-11 (совковая серия “СМ” ), и клоны Интелловских 80xx, затем я пагубную практику разговаривать с процессорами на их языке прекратил.

Січ 30, 2020 17:18

А ещё были Моторола 6800

Січ 29, 2020 20:31

Дякую за цікаву статтю! Напевно в Наса програмістам працювати не так цікаво як в SpaceX)))

Січ 29, 2020 20:42

Сейчас бы темплейтер Handlebars и приблуду для стилей LESS в один ряд с Python поставить))

Січ 29, 2020 20:45

Может кому-то будет интересно, запись выступления где программист SpaceX рассказывает о том как используют Bazel. https://youtu.be/t_3bckhV_YI

Січ 29, 2020 20:55

Спасибо, правда звук ужасный. Но это не к Вам ))

Січ 29, 2020 21:31

От себя добавлю что язык дракон очень напоминает языки стандарта МЭК, такие как FBD, SFC и LD. Эти языки используют поголовно все кто пишет программы на ПЛК (промышленные контроллеры). То есть многие программы под контроллеры высокой надежности пишутся на таких же как ДРАКОН графических языках. Например по для автомобильных конвееров и промышленных роботов. Кому интересно, гуглите МЭК.

Січ 29, 2020 23:26

Так может он потому и “напоминает”?..
А то я в детстве тоже учил некий АЯП, типа “если-то-иначе-все”? И ничего, сейчас иногда если мелькнет VB If-Then-Else-End If даже не вздрагиваю.
ИМХО “язык” не может быть графическим. За фасадом, призванным удовлетворить потребоности в коммуникации с другими участниками команды, всегде стоит нечто исполняющее/интерпретирующее.

Лют 01, 2020 18:44

Knockout, Handlebars и Less – Не языки программирования.
1-й JS фреймворк.
2-й шаблонизатор
3-й css препроцессор. Т. Есть компилирует less стили в обычные css стили.
Всё это используется в веб разработки – скорее всего при создании сайтов и веб сервисов используют.
Возможно и Python для этого.
К космосу прямого отношения вряд ли имеют

Лют 25, 2020 07:13

Думаю, использование процессоров 8085 в миссиях THEMIS и STEREO могло быть обусловлено не только желанием использовать ранее разработанное ПО, но и требованиями надёжности, в том числе в условиях космической радиации. До сих пор не так уж много микропроцессоров выпускается в радиационно-стойком исполнении. И все они отстают по производительности от своих собратьев “общего назначения”. Здесь, как впрочем и везде, действует правило “чем проще – тем надёжнее”. А если есть надёжный, уже проверенный процессор, производительности которого хватает для решения поставленной задачи – почему бы не использовать его.

То, что в NASA в итоге перешли на язык ADA – опять же очень закономерно. На западе его используют не только в военной сфере, но и в авиации. Ну а о безопасности и оправданности его использования, впрочем, как и использования C++ в SpaceX – судить не нам. Вера – великая вещь, пусть даже это и вера в непогрешимость компилятора.

Операционная система VxWorks, насколько я знаю, была разработана не для марсоходов, и даже не по заказу NASA.

Ну а в целом – очень интересно было почитать, спасибо автору! Жаль нет ссылок на источники, я бы с удовольствием почитал подробнее.

Чер 18, 2020 11:56

Печально всемирно извесний буран!Прикольная стаття спс)

Чер 18, 2020 13:04

Интересно, спасибо!