Как бы мы скомпилировали наш код, если бы все наши двоичные файлы исчезли?

Как бы мы скомпилировали наш код, если бы все двоичные файлы в мире исчезли и у нас был бы только исходный код? Сначала вы можете подумать: «Все в порядке: у меня здесь есть мой код Roslyn», но подождите! Это на С#! Итак, вы смотрите на старый компилятор C#, который, в свою очередь, написан, скажем, на C++, но подождите... и так далее. Вы бы в конечном итоге спаяли себе компилятор ASM?

Как бы мы перестроили текущее программное обеспечение, если бы у нас было все текущее оборудование и весь исходный код программного обеспечения, но не было реального программного обеспечения? Будем ли мы следовать тому же пути, что и раньше, или мы пойдем по сокращенному пути и в конечном итоге получим, например, управляемый код раньше? Можем ли мы полностью отказаться от неуправляемого кода и в конечном итоге получить ОС, подобную Singularity ? Будем ли мы создавать наши новые загрузчики и компиляторы так, чтобы они могли использовать наш существующий (и, возможно, к тому времени, когда мы запустим, древний код), или мы будем писать все с нуля?

Вы можете написать компилятор на языке, который он компилирует; см., например , en.wikipedia.org/wiki/Bootstrapping_%28compilers%29
@ScottWhitlock вопрос не в том, как был написан первый компилятор, а в том, как бы мы написали первый компилятор сейчас, имея современные знания и не имея программного обеспечения.
@RytisI - я не вижу, чем это могло бы быть по-другому. Вы пишете ассемблер на машинном коде, а затем компилятор на ассемблере. Это не магия.
@ScottWhitlock уверен, что это другое. Одно дело создать новый язык в существующей инфраструктуре, а другое — начать с нуля. Как бы вы передали машинный код вашего ассемблера на свой i7?
«Как бы вы передали машинный код вашего ассемблера на свой i7?» Как было указано, ответ прост: вы бы не стали.
соответствующий анекдот может вдохновить: ee.ryerson.ca/~elf/hack/recovery.html
Считаются ли FPGA двоичными файлами? В некоторых вы записываете биты в аппаратное обеспечение. Насколько зависят от двоичных файлов такие ПЛИС? Мне интересно, не станут ли некоторые из сумасшедших небольших хобби-проектов, которые я видел, со сложными системами, встроенными в аппаратное обеспечение, внезапно станут очень полезными все еще работающими компьютерами.
Я с @ScottWhitlock, я не вижу разницы. В худшем случае вы берете руководство i7 и начинаете создавать псевдонимы для последовательных групп машинных инструкций, которые образуют общие операции, такие как вывод символа на экран. И оттуда поднимаемся. На самом деле мы делаем это в первый год ИТ в Гранаде, используя Code 2 (извините, ссылка только на испанском языке), потому что это проще, чем процессор 8086 или i7.
Выглядит очень гипотетически, так как двоичные файлы хранятся везде (флэш, ПЗУ, диск). Вы можете думать о логике внутри PAL и микрокоде в большинстве процессоров. Потеря всех двоичных файлов означает, что практически любое последнее оборудование также сломано. А как насчет промежуточных представлений (например, байт-кода java)? Это бинарники или нет?
Написание компиляторов и ассемблеров с нуля нередко улучшает ваше понимание программирования. Есть много людей, которые пишут ассемблеры или базовые компиляторы исключительно на ассемблере, и есть много людей, которые достаточно хорошо знают машинный код, чтобы вручную собирать код.

Ответы (10)

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

Мы бы начали с небольшого чипа, такого как ATtiny. Его можно запрограммировать через последовательную шину SPI , которая на 100% синхронизируется мастером. Это означает, что у вас может быть набор из 4 переключателей, управляемых человеческими руками, и если вы поворачиваете их в правильном порядке, вы можете вводить инструкции в память ATtiny.

Теперь первой программы не нужно много. Это хорошо, потому что крутить такие переключатели тяжело. Первым приложением, вероятно, будет текстовый редактор, подобный приложению, которое позволит вам написать приложение с простыми в использовании переключателями (например, установить 8 переключателей на байт, а затем нажать клавишу «подтвердить», чтобы сохранить его в программе), а некоторые базовые возможности чтения/записи (перейдите к байту 200, замените его на e8). Прежде чем отключить его, это будет расширено для записи во флэш-память на ATtiny. Теперь у нас есть рабочий компьютер (хоть и маленький). Когда вы выключите его и снова включите, он может перезагрузить приложение текстового редактора.

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

Теперь мы можем использовать это для программирования большего чипа, такого как ATmega. На самом деле, мы могли бы начать с ATmega, потому что у него схожая программируемость, но я чувствовал, что история была бы более ясной, если бы мы начали с программирования чего-то, что слишком мало, чтобы удержать любой современный инструмент, такой как компилятор C++. Как бы то ни было, как только мы получим достаточно большой чип, мы сможем разработать настоящий ассемблер. Возможно, стряхните пыль с одного из тех старых матричных принтеров и напечатайте текст на параллельный порт. Стряхните пыль со старой клавиатуры PS/2 и подключите ее напрямую к ATmega. Теперь у нас есть полноценный ассемблер с капелькой человеческой порядочности.

Теперь начинается этап начальной загрузки. Мы можем использовать этот ATmega для начальной загрузки некоторых более крупных чипов, таких как i7, потому что мы можем использовать его для программирования чипов FLASH, таких как те, к которым подключен BIOS. Это непросто, но у нас есть много инженеров, которым все еще приходится работать над этими слоями, так что кто-то вспомнит достаточно, чтобы заставить биос работать. При этом вполне разумно ожидать, что рабочая клавиатура и экраны будут работать (больше не нужно печатать код на принтерах, чтобы прочитать его). Мы также должны снова получить доступ к жестким дискам, чтобы мы могли писать код более постоянно. Я ожидаю, что на этом этапе кто-нибудь напишет голую версию vi(да, она может получить больше голой кости, чемvi) и ассемблер, оба из которых работают с элементарной файловой системой. Все это находится в пределах возможностей сегодняшнего разработчика. На самом деле, некоторые из них подумали бы, что это действительно весело (пока не закончится Mtn. Dew).

Теперь о реальной фазе начальной загрузки. Кто-то напишет драйвер сборки для доступа к современной файловой системе, например EXT3. Это будет некрасиво, но этого достаточно, чтобы найти копию какой-нибудь древней версии C из первых дней начальной загрузки. C был запущен путем написания очень простого компилятора C, который обрабатывал некоторые (но далеко не все) команды языка C. Затем этот простой компилятор использовался для разработки более продвинутой версии C и т. д., каждый раз добавляя функции по мере того, как их становилось все легче и легче писать.

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

Я думаю, что «вопрос нескольких недель» — это скорее оптимизм. Попробуйте как-нибудь Linux From Scratch . На то, чтобы добраться до едва пригодной для использования системы, могут уйти дни. Даже с чем-то немного более автоматизированным, таким как Gentoo , полная перестройка системы даже на мощной системе может занять очень много времени, не говоря уже о том, если вы хотите перестроить все программное обеспечение, поставляемое с современным дистрибутивом Linux. Тем не менее, я согласен с общими принципами, изложенными в этом ответе, если не с точным расписанием.
@MichaelKjörling Правда, я могу полагаться на параллельные усилия многих людей одновременно и полагаться на безумных людей, которые могли бы бегло говорить на драйвере ядра, если бы кто-нибудь еще понял, что они говорят =) Признаюсь, прошли годы с тех пор, как я вырвал себе волосы во время установки Gentoo stage 0!
@Michael Kjörling Однако, если бы это была всемирная катастрофа, я бы ожидал, что над ее исправлением будет работать немало людей, и очень большое количество устройств, которые бесполезно лежат без дела; как только основы будут решены, десятки (сотни, даже тысячи) компьютеров могут сидеть там и компилировать все.
Тем не менее, мы должны защитить этих ботаников от мародерствующих банд мародеров, которые возникнут.
@ArmanX Разве это не предполагает некоторой способности координировать усилия? С предположительно неработающими Интернетом и телекоммуникационными системами это будет довольно сложно. Даже радио с современным оборудованием было бы в лучшем случае сомнительным, учитывая, что даже умеренное старинное радиооборудование часто в некоторой степени управляется программным обеспечением. Например, Kenwood TS-680S, выпущенный в 1989 году, управляется программным обеспечением и, вероятно, не будет использоваться в мире, где исчез весь двоичный код . Совместимые компоненты для замены могут быть труднодоступными.
@MichaelKjörling Это требует некоторой способности координировать, но не слишком много. Например, Силиконовая долина, вероятно, быстро начнет этот процесс, используя Sneakernet в качестве основного средства коммуникации.
Этот ответ технически лучший, но в нем полностью отсутствуют аспекты апокалипсиса. Я предполагаю, что вопрос, возможно, был задан таким образом. Но вы не можете начать кодирование без питания...
@ Никто, я думал об этом. Есть много решений, которые начинаются с генераторов. Многие генераторы не имеют программного обеспечения для загрузки, поэтому они будут работать идеально. (С другой стороны, солнечные батареи на крыше часто имеют сложное программное обеспечение для зарядки для балансировки нагрузки и многого другого. Они не будут работать, пока их не вернут в сеть).
@Никто о власти. Удивительно, как много ботаников в наши дни достаточно счастливы, чтобы надеть лайкру и генерировать несколько сотен ватт энергии для личного транспорта в наши дни. Не нужно много времени, чтобы превратить их в самодостаточный возобновляемый источник энергии, защищенный от апокалипсиса в будущем!
@Aron Генератор на моем велосипеде имеет мощность 6 Вт, поэтому моя пиковая мощность 400 Вт совершенно бесполезна для выработки энергии. :-) Конечно, в принципе это не так сложно. Но на самом деле это и распространение двоичных файлов в хаосе может легко занять год или больше. Я просто хотел подчеркнуть, что технически это просто, но есть практические трудности с перезапуском мира после этого апокалипсиса. Это займет некоторое время.
@ Никто Я инженер-программист. У меня дома есть стиральная машина. В нем находится электродвигатель. У меня также есть настольный компьютер с SMPS. Из этих двух вещей и моего велосипеда я мог бы построить работающий генератор за неделю, меньше, если бы вы могли выделить мне кого-нибудь, кто умеет сваривать.
Конечно, вы могли бы. Вот почему я поставил смайлик после моего первого заявления. Но большинство людей не могли. А большинство людей даже не смогли переустановить свою ОС, не говоря уже о перепрошивке чипов в духовках, холодильниках, автомобилях, не-предназначенных-для-открытия-закрытых-смартфонах. Эти люди просто паникуют. Переустройство общества — это не вопрос технической осуществимости, это вопрос организации и утомительного ручного повторяющегося труда, а может быть, и борьбы с преступниками и т. д. Это то, что я пытался сказать.
@MichaelKjörling и CortAmmon вам не нужно собирать Linux с нуля , как указано: How would we rebuild current software, if we had all the current hardware and all software source code, but no actual software?. У вас уже есть ВСЕ исходные коды для ВСЕХ существовавших программ. Вам просто нужно его скомпилировать. Когда у вас запущен компилятор gcc , что является последней точкой ответа, это просто вопрос цепной реакции компиляции , поэтому я думаю, что нескольких недель должно хватить: P
@xDaizu Я подозреваю, что вы имеете в виду мой главный комментарий к этому ответу, и если вы это сделаете, вы упустите суть. Linux From Scratch — это дистрибутив Linux, который вы создаете с нуля самостоятельно, используя систему ускорения, прежде чем он станет самостоятельным хостингом. (Gentoo похож, но имеет инструменты для автоматизации многих из них и поставляется с уже созданной средой начальной загрузки.) Речь идет не о написании программного обеспечения , а о его компиляции . И чтобы добраться до точки, где вы можете создавать программное обеспечение, начиная вообще без двоичных файлов, требуется немалый объем работы.
@MichaelKjörling да, я перешел по вашей ссылке после комментария, мой плохой. Тем не менее, я думаю, что это займет «недели» (а не «годы»), принимая во внимание, что будут огромные экономические стимулы и около ~80% программистов и инженеров-программистов будут работать над этим (что бы они поступить иначе?). Правда, связь была бы очень плохой (нет интернета!), но это уже другой вопрос. Возможно, правительства заберут тысячи из нас в объединенный объект?
@xDaizu Я не вижу нигде, чтобы утверждалось, что на что-то подобное уйдут годы. На самом деле, Корт Аммон, похоже, делает совершенно противоположное заявление: «Мы не увидим кучку гиков, толпящихся в комнате в течение 4 лет, за которыми следует работающий i7, загружающий Linux».
@MichaelKjörling, ты сказал I think "a matter of weeks" is being rather on the optimistic side.. Я понял, что следующим порядком величины будут годы , поскольку недели и месяцы достаточно близки, чтобы их можно было считать эквивалентами. ^^У
@xDaizu Это вложение слов в мой рот (или на клавиатуру), которые я никогда не использовал. Пожалуйста, не делай этого. Если вы не уверены, что кто-то имеет в виду, спросите об этом, прежде чем делать предположения, которые могут иметь или не иметь никакого основания в реальных намерениях или реальности.
@MichaelKjörling Теперь вы просто обсуждаете семантику (закатывает глаза). Но... ладно, я подыграю. Каков точный диапазон времени, который нельзя было бы точно выразить словами «недели недели» или «несколько лет», которые вы намеревались выразить в своем топовом комментарии? (И когда вы ответите на это, я, вероятно, потрачу это время на english.stackexchange, просто из любопытства: P)
Загляните на CollapseOS.org, это отличный язык для быстрой сборки работающего компьютера с использованием минимального количества сборок. Мне нравится ваш ответ о программировании ATTiny человеческими руками: D

Мы созвонились с некоторыми людьми, которые сделали это в первый раз.

Нет, серьезно. У нас есть много экспертов в этой области, которые еще живы, и они вполне могут иметь достаточно знаний между собой, чтобы построить работающий BIOS. Оттуда мы можем продолжить процесс намного быстрее, чем это было сделано в первый раз: мы просто консультируемся со следующей группой экспертов для получения следующей части знаний, которую мы используем для создания следующего уровня программного обеспечения.

В конце концов, этот процесс доходит до экспертов Microsoft и всех крупных компьютерных компаний, которые создают и поддерживают языки, которые мы используем сегодня, и они просто нажимают F5, компилируют исходный код языка и предоставляют нам новый набор двоичных файлов.

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

Как бы телефоны все еще работали. Цифровые коммутаторы запускают код с некоторыми известными проблемами обновления.
@ JDługosz Верно, но некоторые телефоны все еще работают по аналоговым линиям с простыми штекерными соединениями. Кроме того, мы знаем, где эти люди могут быть — просто идите и найдите их.
Найдите их в классическом автомобиле, с дорогами, забитыми мертвыми автомобилями, мертвыми сигналами и мертвыми бензоколонками. Эта история подчеркнет, насколько широко распространены микроконтроллеры.
@ JDługosz - помните, что не все микроконтроллеры полагаются на двоичные файлы - микроконтроллеру с простым машинным кодом не требуется двоичный код для выполнения этого кода.
-1: согласно комментарию @JDługosz. Коммутаторы почти все без исключения цифровые.
@Ayelis Woooww. Как мило с твоей стороны. Для справки, все, несколько минут назад я проголосовал за ответ Айелиса с почти идентичным комментарием.
@Ayelis Более того, на самом деле все еще существует большое количество распределительных щитов с коммутационными щитами, которые используются в небольших городах и деревнях для местных и национальных соединений.
@ArtOfCode Я просто пытаюсь вписаться. Вы проголосовали за меня после того, как отрицательно оценили одну часть моего многочастного ответа, основываясь на вашем ограниченном понимании работы низкоуровневого кода (как видно из ваших ссылок на один язык высокого уровня), даже не позволив мне объяснить. Я понял, что это означает, что принято голосовать против ответов в целом, основываясь на собственном ограниченном понимании одной части указанного ответа. Когда в Риме.
@ArtOfCode «простой машинный код» — это двоичный исполняемый файл. Это не меняет того, было ли оно создано путем перевода на язык более высокого уровня. Машинный код как раз и предлагается стереть.
@JDługosz Верно. Должен признаться, что не думал об этом полностью...
@Ayelis Тогда позвольте мне прояснить это. Я проголосовал за ваш ответ не потому, что одна его часть была неправильной, а потому, что одна его часть, на которой остальная часть ответа имела хотя бы какое-то основание, была неправильной. Здесь крайне необычно голосовать против на основе ограниченного понимания; напротив, если бы у меня было меньше понимания, я был бы более склонен просто поверить вашему ответу.
Сомневаюсь, что люди, умеющие перекомпилировать компиляторы из ASM, живут в "городах поменьше". Несмотря на это, вы Упомянули, что мы можем «просто пойти и найти их», что расширяет рамки вашего ответа, поэтому я буду более важным человеком и уберу свой отрицательный голос. (Хотя вам действительно следует отредактировать свой ответ, чтобы уточнить...)
Обмен стека @Ayelis имеет несколько систем, которые обнаруживают серийное голосование или кольца для голосования и либо автоматически отменяют голоса, либо доводят их до сведения модератора. Имейте в виду, однако, что изменение частоты голосов (как вверх, так и вниз) является обычным явлением и обычно не вызывает подозрений.

Сегодня мы не сможем использовать какой-либо компьютер, если исчезнут все бинарные программы, поскольку все они имеют какую-то прошивку (например, BIOS) для загрузки, и эта прошивка находится внутри некоторого ПЗУ (часто флэш-ПЗУ).

Время, когда первобытную программу начальной загрузки можно было легко ввести (без помощи какого-либо другого компьютера), давно прошло. В 1960-х вы могли загрузить IBM7094 с коммутаторами!

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

Кстати, я полагаю, что если бы мы потеряли все бинарные файлы свободного программного обеспечения на Земле, у нас было бы гораздо больше проблем, чем если бы мы потеряли все бинарные файлы проприетарного программного обеспечения (я предполагаю, что в обоих случаях исходный код остается доступным).

Узнайте больше о начальной загрузке , в частности о компиляторах начальной загрузки , например, как был написан первый компилятор . Читайте также блог J.Pitrat о начальной загрузке искусственного интеллекта , он посвящен вопросам начальной загрузки с точки зрения сильного ИИ.

См. Также этот ответ и тот на очень связанный вопрос. Вас также может заинтересовать Linux From Scratch , или Isaac Operating System (написанная на собственном языке, работающая на «голом железе»), или даже MirageOS .

Конкретная проблема с начальной загрузкой всего компьютера сегодня заключается в том, что это довольно сложно (в частности, но не только, из-за технологических сложностей: справочные руководства Intel x86-64 состоят из многих тысяч страниц, а x86 и ПК очень сложны, в частности потому, что исторических причин и причин обратной совместимости), поэтому это займет много времени (много лет работы), и (к сожалению) трудно получить за это деньги. Итак, есть социальная проблема. Это может быть немного проще с другим оборудованием (например, RISC-V , который на самом деле не существует или гораздо менее эффективен).

Связанный с этим вопрос заключается в том, как перезапустить Интернет, если или когда он выйдет из строя.

Конечно ничего не запустится. Но с чего бы начать, имея всю эту технологию и не имея ничего, что бы на ней работало? Как бы восстановить наше нынешнее состояние?
Вы, вероятно, не сможете ничего восстановить сегодня.
Ха, конечно не сегодня, но как и с чего нам начать?
@RytisI - возможно, вытащив свой велосипед, потому что твоя машина не заводится, и никто не знает, почему, поскольку ни один из компьютеров или телевизоров не работает.
Спасибо за отличный ответ! Я публикую награду через 2 дня и устанавливаю ее как принятую, если до этого времени не появятся лучшие ответы.
Ваша ссылка на этот ответ кажется хорошим ответом, это будет итеративный процесс. Хотя не уверен насчет первой итерации :)
Вы не начнете с начальной загрузки вашего текущего многоядерного процессора Intel, а с небольшого микропроцессора.
Я думаю, что процессоры, использующие микрокод, также перестанут работать. Что, я думаю, означает большинство современных процессоров (хотя и не некоторые конструкции RISC). Нам, вероятно, придется собрать что-то вручную для старого процессора (например, 6502) и разобрать старые машины, где вы переключаете серию переключателей, чтобы установить адрес, а затем переключаете, чтобы установить байт по этому адресу. Используйте его для загрузки ассемблера, затем используйте ассемблер для создания компилятора и запуска EPROM для дисков и т. д. Возможно, на этот раз мы можем пропустить некоторые старые языки, такие как Dartmouth BASIC и несколько версий COBOL.

Апокалипсис сегодня

Рано утром все бинарные файлы в мире исчезают. Все части скомпилированного кода исчезли; данные все еще там, файлы кода все еще не повреждены, но все части скомпилированного кода исчезли. Пуф.

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

Тем не менее, это не просто инженерная или программная катастрофа. Это событие масштаба апокалипсиса. Хороший кусок мира останется без надежной еды, воды или электричества; связь будет полностью отключена.

Когда начать?

Лучшим местом будет колледж или университет, так как у них, скорее всего, есть работающий считыватель перфокарт (и генератор). Используя перфокарты в качестве начального интерфейса, наши бесстрашные программисты могли сразу начать писать код.

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

Этим крошечным компьютерам понадобится какой-то интерфейс; будем надеяться, что есть старая клавиатура на транзисторах и несколько старых ЭЛТ . Современные клавиатуры и ЖК-экраны зависят от прошивки. Немного поработав над кодом, наши программисты получили компьютер, клавиатуру, экран и способ сохранить свой код.

Дополнительно будут перепрошиты любые устройства с прошивкой, которую можно быстро перезаписать; некоторое старое оборудование, такое как старые приводы компакт-дисков, имело очень мало прошивки, но все же могло читать современные диски.

Предохранители безопасности

Вернуть утраченное будет гораздо труднее. Почти все современное оборудование будет не чем иным, как мусором; почти все чипы со сгоревшим защитным предохранителем будут бесполезны, превратив мобильные телефоны и ноутбуки в кирпичи. Жесткие диски, хотя данные все еще существуют, не будут иметь микропрограммы для извлечения этих данных.

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

Назад в будущее

Как только компьютеры (какими бы крошечными они ни были) заработают, жизнь станет немного проще, но большая часть современного оборудования станет бесполезной. Даже если бы биос на современной материнской плате можно было бы пересобрать, видео, ethernet, даже звуковые карты были бы без прошивки. Программное обеспечение вернется к тому состоянию, в котором оно было в конце 1980-х годов. Это вернется, постепенно, но я ожидаю, что это займет больше времени, чем в первый раз. Что с апокалипсисом, и все такое.

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

В каком-то смысле вы правы в своем ответе, но я думаю, что вопрос был основан на том, как можно было бы сделать совершенно новый старт в компьютерах, если бы мы начали на нашем нынешнем уровне. А не как вы ответили, продукт всех исчезающих бинарников.
«Двоичные файлы» в этом контексте относятся к двоичным исполняемым файлам, а не к двоичному формату данных с основанием два.
Предположительно, мы не потеряем исходный код, поскольку исходный код находится в формате Ascii, а не в двоичном формате. И пока у нас есть исходный код, мы можем перекомпилировать все, что мы потеряли. Однако, если мы потеряем исходный код, мы будем изрядно опустошены. Ассемблер нужно будет вводить вручную, а все языки более высокого уровня придется вводить с нуля. Хотя у нас все еще может быть много исходного кода в виде распечаток или книг!

Технически прошивка является «аппаратной», поэтому я ожидаю, что она останется. Я предполагаю, что «исчезновение двоичных файлов» больше связано с удаляемой информацией, чем с физическим бедствием, которое поразило все устройства хранения информации, но едва не пропустило все, что не выглядело как работающий машинный код. Если бы действительно прошивка осталась, то думаю у нас была бы хорошая фора. Мы должны быть в состоянии загрузить любую систему, которая может работать с прошивкой и, по крайней мере, иметь какую-то примитивную ОС и возможность редактирования текста. Интересная проблема заключается в том, что если у нас есть исходный код, но большая его часть электронная, то он по большей части бесполезен для нас, пока мы не восстановим системы, способные его прочитать.

Поскольку вокруг так много потенциально полезного программного обеспечения, было бы разумнее воспроизвести компиляторы, которые могли бы перестроить программное обеспечение. Это означает, что общество, скорее всего, не будет пытаться заново изобретать языки программирования с нуля, пока мы не восстановим те, которые мы только что потеряли. Поскольку мы перестали пользоваться Интернетом и хранилищем цифровой информации, лучше всего ориентироваться на наиболее документированные языки, по которым у нас есть книги. Без сомнения, компилятор C будет первым и наиболее важным высокоуровневым инструментом при перестроении. Если у вас есть это, прогресс может быть достигнут очень быстро. Затем вы можете пересобрать целые операционные системы, множество программных инструментов и компиляторов для множества языков. Есть причина, по которой этот 40-летний язык до сих пор возглавляет список TIOBE. Это «английский» мира программирования: неуклюжий, раздражающий,

Поскольку в мире так много экспертов по C/C++, если у вас есть система, которая может вводить текст и сохранять байты на диске, создание компилятора на самом деле не должно быть таким сложным. Скорее всего, группа людей будет улучшать «IDE» с помощью необработанного ассемблерного/машинного кода и, вероятно, заново изобретать его с нуля только для повышения производительности. Многие части минимальной ОС пришлось бы переборщить только для того, чтобы запустить и запустить этот первый компилятор C. Но я почти уверен, что получение первой самодостаточной сборки компилятора было бы моральным эквивалентом стартера на гигантском двигателе, который наконец-то запустил маховик, чтобы он мог работать самостоятельно.

Фактически, этот процесс, скорее всего, произойдет во многих местах по всему миру. Вполне возможно, что Россия или Восточная Европа выпустит первый работающий компилятор C "после катастрофы" из-за большого количества хакеров/вирусописателей, которым приходится разбираться в низкоуровневом коде. Хотя в Китае много хакеров, они склонны проникать в системы более высокоуровневыми путями. Я был бы удивлен, если бы они создали ранний компилятор C с нуля (хотя большая группа предприимчивых студентов университета может сделать это одним лишь усилием воли). Хакеры из США и Западной Европы будут иметь преимущество в том, что им будет доступно наибольшее количество книг по C и справочников, написанных на языке, который они легко понимают.

Теперь, если прошивка также стирается, все становится намного, намного сложнее, как и при переключении переключателей, как описано другими. Это так угнетает, что я даже не могу об этом думать. Но я предполагаю, что потоки объединяются, как только вы получаете базовую консоль (клавиатуру, монитор, постоянное хранилище... будь то диск, лента, флэш-память и т. д.).

Хотя многие языки имеют самостоятельные компиляторы, большинство компиляторов можно было бы перестроить с нуля на C, и большинство разработчиков исходного языка могли бы помочь в этом. Я думаю, что в целом перестройка будет происходить намного быстрее, чем люди могут себе представить (от базовой консоли до самостоятельного компилятора C за 6 месяцев или меньше). Почти во всех случаях люди, вероятно, решат, что лучше просто заменить то, что было утеряно, и восстановить функциональность, чем сходить с рельсов и переделывать вещи.

Редизайн произойдет, если вы также потеряете исходный код . Возможно, информация сохраняется в книгах, но если бы все электронные исполняемые файлы и исходники были утеряны, то, я думаю, мы бы увидели значительный редизайн и переход к более продвинутым технологиям. Я думаю, что С все равно будет перестроен с нуля из-за его статуса своего рода лингва-франка. И, возможно, Java и несколько других основных языков будут возрождены (хотя, очевидно, из реализаций чистой комнаты). С другой стороны, было бы намного сложнее восстановить Linux, Windows или OS X без исходного кода, только по книгам.

Интересно, что мы могли бы воспользоваться этой возможностью, чтобы устранить множество надоедливых недостатков языков, инструментов и операционных систем. Возможно, мы получим не совсем C, а своего рода улучшенный C99, в котором будет удалено много устаревшего хлама. С одной стороны, всем было бы выгодно просто реализовать точный компилятор C99, чтобы люди со всего мира могли обмениваться исходными текстами на языке C по мере перестройки цифрового мира. Это будет препятствовать инновациям. И по этой причине Linux, скорее всего, станет де-факто ОС новой эры, просто потому, что многие ее части можно было восстановить из книг и знаний, запертых у определенных мастеров высокого уровня.

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

Хотя многие неудавшиеся языки просто не будут воспроизведены (разве что их любящими создателями), самые популярные языки, несомненно, возродятся из-за сохраненной ценности программистов, хорошо владеющих этими языками. То же самое и с инструментами. Однако потребуется много времени, чтобы перестроить что-то вроде Microsoft Office или Adobe Photoshop, не говоря уже о Windows Server 2012. Эти инструменты могут никогда больше не появиться, и, возможно, начнется новая гонка вооружений, чтобы заново изобрести каждую категорию программного обеспечения с нуля.

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

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

Сначала мы использовали двоичные коды операций для создания кода. Вам нужно будет знать каждый код операции, используемый процессором, и вводить свою программу байт за байтом в память компьютера. Позже была изобретена стенографическая форма, в которой для описания операций использовались слова. Это называлось мнемонической формой. Это почти как современная сборка. На втором этапе появились ассемблеры макросов, которые позволяли использовать макросы. Это языки низкого уровня.

Язык среднего уровня — это что-то вроде C и PL/I, это не очень абстрактные языки. Люди обычно считают это самым хакерским языком — «Эй, я использую язык средней абстракции, это должно означать, что я суперхакер». Но, как правило, языки с более низкой абстракцией более подвержены дефектам. C обеспечивает базовый вызов функций на основе аргументов функций и других менее примитивных абстракций, таких как массивы и структуры. Это намного проще программировать, чем чистый ассемблер, и если все сделано аккуратно, может даже получиться переносимый код. Но C не хватает абстракций, таких как объекты, строки (формальные строки, а не строки, основанные на хакерских указателях).

Язык с более высоким уровнем абстракции — это Java или C#. К сожалению, оба языка интерпретируются в виртуальной машине. Это означает, что выполнение кода должно быть переведено на лету из абстрактной виртуальной машины во что-то, понятное процессору более низкого уровня. Вич медленный. Другой язык, предлагающий очень высокий уровень абстракции, — это Python, Ruby и т. д. Поэтому люди думают, что языки высокого уровня должны интерпретироваться. Object Pascal (отвергнутый уродливый сын) столь же абстрактен, как Java, но производит действительно скомпилированный код (вплоть до двоичного формата).

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

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

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

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

тл;др

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

С# не интерпретируется. Я не так много знаю о Java, но я подозреваю, что это не так: Java компилируется в байт-код, который запускается виртуальной машиной. C# компилируется прямо в машинный код, обычно JIT, но все равно компилируется.
C# интерпретируется с точки зрения уровней абстракции.
Чтобы быть более ясным, я однажды написал интерпретатор языка, который использовал виртуальную машину. Настоящие компиляторы способны переводить абстрактный код в конкретный код, работающий на «голом железе», все, что отличается от интерпретатора. К сожалению, рынок меняет научные определения в соответствии с экономическими интересами...
Нет, C# — компилируемый язык. Смотрите это . Он использует виртуальную машину, но это не означает, что она интерпретируется. Компилятор преобразует C# в машинный код, поэтому он является компилятором.
С точки зрения уровней абстракции виртуальная машина — это не скомпилированный код. Но маркетинговые требования таких компаний, как Microsoft и Sun, должны были изменить определение, чтобы оно соответствовало их требованиям. Большинство людей думают, что Java — это первый язык, в котором использовалась виртуальная машина. Pascal P-Code (в 70-х годах) использовал виртуальную машину и не считался скомпилированным по классическому определению языков.
Прочтите ссылку. Использование ВМ не имеет ничего общего с компилированием или нет, компилирование или интерпретация определяется исключительно временем трансляции: интерпретируемые языки транслируются другой программой в машинный код во время выполнения , компилируемые языки заранее транслируются в машинный код. C#, по этому определению, компилируется.
Чувак, я пишу компиляторы, если захочу. Виртуальная машина не считается действительно скомпилированной. У нас есть имя для этого "Псевдокомпилятор". Язык Clipper был псевдокомпилирован, как p-code на паскале. Вам нужен гораздо больший период времени, чтобы увидеть правду, помимо торговых определений.
Чтобы быть скомпилированным, вам нужно преобразовать код в машинный код, настоящий машинный код, который гораздо менее абстрактен, чем обычный IL. Виртуальные машины такого типа вносят множество дополнений в набор кодов операций, чтобы позволить языкам высокого уровня легко переводиться в их байт-код (например, создание объектов), что намного сложнее на реальном оборудовании.
До Java все было намного проще: Компиляторы: перевод кода с более высокого уровня абстракции на более низкий уровень абстракции. Интерпретаторы: выполнение кода без изменения уровня абстракции. Переводчики: переводит код между двумя языками без изменения уровня абстракции. Псевдо-компиляторы: перевод языка в формат байт-кода, который менее абстрактен, чем язык, но еще не является низкоуровневым. Как только Sun выпустила Java, они изменили определение через отдел маркетинга, а не исследовательский отдел.
Если бы Java преуспела, метка псевдокомпилирования должна была бы исчезнуть. Зачем отказываться от использования C/C++ или Delphi (которые действительно скомпилированы) для использования псевдо-скомпилированной Java? Ага! Давайте назовем его скомпилированным и поспорим, что все это съедят... Гебблс бы согласился.

Как бы мы скомпилировали наш код, если бы все двоичные файлы в мире исчезли [...]

Попросите кого-нибудь с Международной космической станции использовать «Союз-ТМА» и привезти все еще работающий ноутбук со всеми доступными компиляторами. (Эй, технически их нет в мире ...)

Восстановление будет намного быстрее , чем вы думаете

Найдите машину до 1986 года и поезжайте в компьютерный музей. Запустите ящик Altair, Imsai или Digital Group и запустите его как обычно: включите загрузчик начальной загрузки .

Переключение означает установку адреса памяти на 16 переключателях адреса, затем установку значения данных на 8 переключателях данных и нажатие «ЗАПИСЬ», затем автоматический переход к следующей ячейке памяти, повторение промывки и промывки.

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

введите описание изображения здесь

Используйте устройство для чтения с бумажной ленты, чтобы ввести свою программу, или, эй, вот идея, как насчет операционной системы . Вы знаете, как Apple Monitor (2048 байт), который включает много кода для эмуляции TTY на внутреннем дисплее и клавиатуре Apple, не обязательно, просто используйте физический TTY или VT100.

А теперь перерыв на обед .

Несколько сотен байтов в ОС учат ее читать/записывать кассету. Еще пара тысяч научит его читать/записывать диски. Я не спекулирую, они так работали.

Между тем, параллельные усилия продолжаются

  • как-то хранить загрузчик в ПЗУ, чтобы срубить мозоли на пальцах

  • первичная дисковая файловая система

  • простой текстовый редактор (хм, VT100 еще работают?)

  • ассемблер (компилятор языка ассемблера, поэтому мы можем сказать LDA #INPUT_MODEвместо A9 03.).

И нам лучше поужинать до закрытия всех ресторанов.

На данный момент мы работаем с командной строкой точно так же, как и сейчас, за исключением того, что используем настоящий VT100 вместо окна Terminal/PuTTY. У нас не будет, ls -Rпотому что у нас пока нет рекурсивной файловой системы, но маленькие шаги, Элли.

Говоря о маленьких шагах, мы начинаем писать языки высокого уровня и заниматься кросс-разработкой; т.е. используйте Imsai для кросс-компиляции 80386, чтобы загрузить Compaq 386 (помните, что ваш самый первый код x86 будет родным 32-битным и не будет иметь представления о старых барьерах ОЗУ 64k/1MB), затем используйте это для кросс-компиляция для PowerMac G3 и т. д.

Сложная часть - координация

Проблема в том, что эти усилия предпринимаются независимо в каждом отдельном месте, где существует работающая машина Altair/Imsai/Digital Group. Теперь задача заключается в координации усилий, когда телефоны не работают. Если бы телефоны работали, любой музейный модем на 300 бод заставлял бы бригады разговаривать и обмениваться кодами.

И телефонная компания не бездействует; они пытаются выяснить, как получить что-то вверх.

Примерно через день после запуска телекоммуникаций кто-то перепишет (пере)программное обеспечение BBS, при условии, что он не нашел старую копию исходного кода BBS в журнале BYTE. Теперь мы делаем то же самое, что и здесь. Это баллистически увеличивает скорость восстановления, особенно с учетом того, что каждая страна в мире определила это как национальный стратегический приоритет.

Прошивка вызывает раздражение

К сожалению, многие компоненты в настоящее время, такие как USB-брелки, имеют «прошивку», работающую на более низком уровне системы, и на самом деле не имеют «жесткого» бэкдора, такого как передняя панель Imsai, для принудительной загрузки загрузчика начальной загрузки. Если эта прошивка исчезнет, ​​каждую машину придется взломать или утилизировать. Однако это не будет проблемой, пока мы не перейдем к оборудованию 2000-го, так что Pentium и Mac Quadra 800, вероятно, по-прежнему будут работать нормально. И с ними мы можем переделать/заменить другие.

Это правда, что у Quadra 800 нет передней панели переключателей. Тем не менее, на его печатной плате есть следы, и вам придется немного взломать аппаратное обеспечение, чтобы установить в него загрузчик начальной загрузки, или просто научиться записывать EPROM.

Мы знаем пункт назначения

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

Помните, что почти весь существующий код понимает кто-то , кто жив, и кто, если на него надавить, может переписать его. Лучше.

Это было бы лучше всего.

Это позволило бы нам (хе-хе) «перезагрузить» дизайн наших вычислительных систем с нуля, а не постоянно тащить за собой старую устаревшую инфраструктуру, которая все усложняет. Код будет оптимизирован и унифицирован отчасти потому, что нам нужно восстановить мир, а у нас нет времени на поддержку множества устаревших способов сделать то же самое. Досбокс ушел . Пропали винды . Флэш пропал . Оптимизация HTML/CSS/AJAX . И т.д. и т.п. Правительство растопчет все проблемы с патентами из-за чрезвычайного положения в стране.

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

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

Когда у нас есть работающий компилятор C89 , проблема далеко не решена: многие программы не могут скомпилироваться без glib, для которого требуется gcc, который также является компилятором C++, требующим библиотек C++.

Таким образом, для компиляции большинства программ вам нужен компилятор C++, а для этого вам нужен компилятор C++.

Для достижения потребуется много времени. И этого времени может быть достаточно, чтобы сделать программное обеспечение C89 популярным, чтобы новое программное обеспечение было написано с нуля или преобразовано в C89.

Такие легкие языки программирования, как luaC89, заменят остальные.

Вы можете загрузить и использовать старый GCC (например, GCC 4.3), написанный на C (не C++). Используйте это g++-4.3для сборки и компиляции g++-4.6; используйте это g++-4.6для компиляции , а затем g++-4.9используйте для компиляции . Насколько мне известно, переход внутренних компонентов GCC с C на C++ был задуман с учетом такого итеративного процесса. g++-5g++-6
Это действительно стратегия написания более простого компилятора для компиляции более сложного компилятора. Это по-прежнему сложный путь для компиляции программного обеспечения только для C.