Конец 70-х. Швейцария, Федеральная политехническая школа Цюриха — та самая, из которой вышел Эйнштейн. Профессор Никлаус Вирт, создатель языка Pascal, ставит перед собой и своими студентами задачу: сделать так, чтобы одну и ту же программу можно было запустить на любом компьютере без переписывания кода. Звучит знакомо? Именно эту задачу через 20 лет решит Java со своей виртуальной машиной JVM. Но Вирт и его команда сделали это ещё в 1979 году — за два десятилетия до того, как слово «кроссплатформенность» стало модным.
Их решение называлось UCSD Pascal. Внешне — обычный Паскаль. Но внутри — революция. Компилятор превращал исходный код не в машинные инструкции, а в байт-код — универсальные команды для воображаемого процессора. Этот воображаемый процессор, называемый p-машиной, эмулировался на реальном «железе» небольшой программой. Байт-код был компактным, переносимым и работал на чём угодно: на Apple II, на IBM PC, на мини-компьютерах DEC.
Сегодня этот принцип лежит в основе Java, .NET, Python и даже смарт-контрактов Ethereum. А тогда, в 1979-м, это выглядело как магия.
Зачем придумали p-машину, если компиляторы и так работали
Обычный компилятор берёт исходный код на Pascal и переводит его прямо в инструкции конкретного процессора — например, Intel 8080 или MOS 6502. Итоговая программа работает быстро, но намертво привязана к одному типу «железа». Чтобы запустить её на другом компьютере, приходится переписывать компилятор и перекомпилировать код.
Вирт рассуждал иначе. Давайте разделим задачу на две части:
- Сначала компилятор переведёт исходный код в универсальный байт-код, который не зависит от процессора.
- А уже на конкретном компьютере небольшая программа-эмулятор (p-машина) будет исполнять этот байт-код.
Результат превзошёл ожидания. Байт-код занимал в несколько раз меньше места, чем скомпилированная машинная программа. Это было критически важно в эпоху, когда оперативная память измерялась килобайтами, а дисковое пространство — десятками мегабайт. Переносимость стала реальностью: один и тот же файл можно было запустить на Apple II, IBM PC и DEC PDP-11 без единого изменения.
Программисты быстро оценили удобство. Ты пишешь код один раз, компилируешь в байт-код, и он работает везде, где есть p-машина. Мечта, ставшая реальностью за 15 лет до Java.
Перевод с гиковского
Представь, что ты — повар высокой кухни. Обычный компилятор — это рецепт на итальянском, который поймёт только итальянский повар с итальянскими продуктами. Байт-код — это рецепт, записанный универсальными пиктограммами: нож, сковородка, огонь. Понятно любому повару в любой стране. Вирт придумал именно такие пиктограммы для компьютеров.
Как UCSD Pascal захватил мир — и почему проиграл
Система UCSD Pascal стала хитом среди первых микрокомпьютеров. Её портировали на десятки платформ. Студенты учились программировать на ней. Инженеры писали серьёзный софт. Казалось, ещё немного — и байт-код станет стандартом.
Но вышло иначе. Три проблемы погубили проект:
- Скорость работы. P-машина была медленнее нативного кода в 5–10 раз. Для серьёзных задач это имело значение.
- Конкуренция. В начале 80-х на сцену вышел C — быстрый, переносимый на уровне исходного кода и не требующий виртуальной машины. Он перетянул одеяло на себя.
- Бизнес. UCSD Pascal оставался университетским проектом. За ним не стояло крупной корпорации, способной продавливать стандарт.
К середине 80-х UCSD Pascal сошёл со сцены. Но идея не умерла.
Короткая байка
Говорят, когда Джеймс Гослинг в начале 90-х проектировал Java, он держал на столе руководство по UCSD Pascal. «Всё уже придумали до нас», — сказал он коллегам. Те отмахнулись: «Тогда почему мы этим не пользуемся?» Гослинг ответил: «Потому что тогда не было интернета. А теперь он есть».
Откуда ноги растут у Java, Python и Ethereum
В 1995 году Sun Microsystems выпустила Java. Ключевое новшество — виртуальная машина JVM, исполняющая байт-код. Архитектура та же, что у UCSD Pascal: компиляция в байт-код, затем эмуляция на реальном процессоре. Но теперь был интернет, браузеры и апплеты — и Java взлетела.
Сегодня байт-код повсюду:
- Java и Kotlin компилируются в байт-код JVM.
- C# компилируется в байт-код .NET CLR.
- Python превращается в байт-код перед исполнением.
- Ethereum исполняет байт-код смарт-контрактов на виртуальной машине EVM.
И всё это — наследники p-машины Вирта. Технологии, придуманной швейцарским профессором, когда кремниевые гиганты ещё спорили, нужен ли миру персональный компьютер.
Читайте также в «Синдроме Утёнка | IT»:
Рождение Fortran: как Джон Бэкус убедил всех, что машина может писать код лучше человека
Язык B: забытый отец Си, без которого не было бы ни Windows, ни Linux
Пять копеек напоследок
Никлаус Вирт не заработал на байт-коде ни цента. Его изобретение опередило время и осталось в учебниках. Но каждый раз, когда вы запускаете приложение на Java, выполняете Python-скрипт или отправляете транзакцию в Ethereum, вы пользуетесь идеей швейцарского профессора, который просто хотел, чтобы программы работали везде. И они работают.
Понравился выпуск? Подписывайся на «Синдром Утёнка | IT» — тут мы компилируем историю в байт-код и исполняем его на виртуальной машине ностальгии.