Поскольку Бэббиджу не удалось ни самому построить универсальный компьютер, ни убедить других это сделать, первая подобная машина появилась лишь спустя сто лет. То, что происходило в этот промежуток времени, скорее напоминает древнюю историю универсальности: хотя счётные устройства, похожие на разностную машину, стали создаваться ещё до того, как Бэббидж сдался, его идею аналитической машины практически полностью игнорировали даже математики.
В 1936 году Тьюринг разработал исчерпывающую теорию универсальных классических компьютеров. Но он не собирался строить такой компьютер, а только хотел применять теорию абстрактно для изучения природы математических доказательств. И когда через несколько лет были сконструированы первые универсальные компьютеры, то опять в этом не было никакого особого намерения реализовать универсальность. Их построили в Британии и США во время Второй мировой войны для специфичных военных целей. Британские компьютеры под названием Colossus («Колосс»; в их создании принимал участие Тьюринг) использовались для взлома шифров; американский компьютер ENIAC был предназначен для решения уравнений, необходимых для наведения больших орудий. Оба были построены на электронных вакуумных лампах, которые работали как реле, но почти в сто раз быстрее. В то же самое время в Германии инженер Конрад Цузе собирал на релейных схемах программируемый калькулятор — так, как это должен был бы сделать Бэббидж. Во всех трёх применялись технологические решения, необходимые для универсального компьютера, но ни одно из них не было вполне универсальным по своей конфигурации. Машины Colossus применялись только для дешифрации, и после войны большая часть из них была разобрана. Машина Цузе была уничтожена в ходе бомбардировок Германии союзниками. А вот ENIAC’у судьба позволила совершить скачок к универсальности: после войны ему нашли массу применений, для которых он никогда не предназначался, таких как прогнозирование погоды и проект создания водородной бомбы.
В истории развития электронных технологий после Второй мировой войны преобладала миниатюризация, и в каждом новом устройстве реализовывались всё более и более микроскопические переключатели. Около 1970 года эти усовершенствования вызвали скачок к универсальности, когда несколько компаний независимо друг от друга создали микропроцессор, универсальный классический компьютер на одной кремниевой микросхеме. С этого момента разработчики любого устройства для обработки информации могли взять микропроцессор и настраивать его — программировать — под определённые задачи, которые устройство должно было выполнять. Сегодня стиральная машина, стоящая у вас дома, наверняка управляется компьютером, который можно было бы запрограммировать для решения задач астрофизики или обработки текстов, если бы у него были подходящие устройства ввода-вывода и достаточный объём памяти для хранения необходимых данных.
Удивительно, но в этом смысле (другими словами, если отбросить то, что связано со скоростью, ёмкостью памяти и устройствами ввода-вывода) «люди-компьютеры» девятнадцатого века, паровая аналитическая машина с её звонками и свистками, ламповые вычислительные машины времён Второй мировой войны, занимавшие целые комнаты, и современные суперкомпьютеры выполняют один и тот же набор вычислений.
Другая их общая черта — то, что все они цифровые: они работают с информацией в форме дискретных значений физических величин: к примеру, электронный переключатель может быть включён или выключен, а зубец шестерёнки находиться в одном из десяти положений. Широко распространённые когда-то альтернативные, «аналоговые», компьютеры, такие как логарифмическая линейка, в которых информация представляется в виде непрерывных физических переменных, сегодня практически не используются
[36]. Дело в том, что современный цифровой компьютер можно запрограммировать так, что он сымитирует любое такое устройство и будет работать лучше практически во всех приложениях. В результате скачка к универсальности в цифровых вычислениях аналоговые компьютеры были забыты. И это было неизбежно, ведь универсального аналогового компьютера не существует.
Причина тому — необходимость исправления ошибок: ошибки, накапливающиеся в ходе длинных вычислений из-за неидеальных компонентов, тепловых флуктуаций, случайных внешних воздействий, сбивают аналоговые компьютеры с намеченного пути вычислений. Возможно, это прозвучит как незначительное или парохиальное суждение, но всё как раз наоборот. Без исправления ошибок весь процесс обработки информации, а значит, и создания знаний, будет неизбежно ограничен. Исправление ошибок относится к началу бесконечности.
К примеру, система подсчёта «палочек» универсальна, только если она цифровая. Представьте себе, что какие-нибудь древние пастухи попытались бы вычислить не количество голов, а общую длину стада. Выпуская козу из загона, они бы отматывали нитку длиной с козу. А потом, по возвращении коз, сматывали бы нитку обратно. Когда весь клубок оказывался бы смотанным, это означало бы, что все козы вернулись в загон. Но на деле из-за накопления ошибок измерения всегда либо оставалась бы лишняя часть нити, либо её не хватало. Любая заданная точность измерений предполагала бы максимальное число коз, которое можно надёжно подсчитать таким «аналоговым» способом. То же будет верно и для всех арифметических операций, производимых с помощью таких «палочек». Каждый раз, когда соединяли нити, представляющие несколько стад, или одну нить разрезали на две части, чтобы отметить разделение стада, когда её «копировали», отмеряя ещё одну такой же длины, появлялись бы ошибки. Их можно было бы сгладить, повторив каждую операцию много раз, а затем взяв среднюю длину. Но операции сравнения и копирования длин сами могут выполняться лишь с конечной точностью, и поэтому с их помощью нельзя сократить темп накопления ошибок в расчёте на один шаг, ниже этого уровня погрешности. Таким образом, появилось бы максимальное число последовательных операций, которые можно выполнить, прежде чем результат окажется бесполезен для заданной цели, а значит, аналоговые вычисления никогда не могут быть универсальными.
Нам же нужна система, которая принимает наличие ошибок как должное, но исправляет их при появлении — это случай того, что «проблемы неизбежны, но их можно решить» на самом низшем уровне эмерджентности, связанной с обработкой информации. В аналоговых вычислениях исправление ошибок сталкивается с основной логической проблемой, заключающейся в том, что невозможно сразу отличить значение с ошибкой от правильного, потому что согласно самой природе аналоговых вычислений каждое значение может оказаться правильным. Правильной могла быть любая длина нити.
А в вычислениях, которые ограничиваются целыми числами, это не так. В случае с верёвкой мы могли бы представлять целые числа как верёвку длиной в целые числа сантиметров. После каждого шага мы обрезаем или удлиняем верёвку до ближайшего сантиметра. Тогда ошибки перестанут накапливаться. Предположим, например, что эти измерения можно производить с допустимым отклонением в одну десятую сантиметра. Тогда после каждого шага все ошибки будут обнаружены и устранены, что исключит ограничение на число последовательных шагов.