Разработчик, тимлид и ведущий IT Way Podcast Павел Калашников начинает на Хекслете цикл статей про историю IT. Первая — про 1970 год, создание мини-компьютера, патент на компьютерную мышь, разработка Pascal и старт UNIX-времени.
Привет, меня зовут Паша Калашников. А это события, люди и технологии, определившие образ цифровых технологий и мира. То, без чего с нами невозможно общаться, еще труднее — нанять. Очередной год, очередная статья.
Черт возьми, за последние пару лет эту фразу или очень похожую слышали и выучили наизусть миллионы людей зрителей шоу «НМДНИ» с Леонидом Парфеновым. Поэтому мы решили дать вам немного Парфенова и рассказать об истории программирования и цифровых технологий.
Эта статья из блога Хекслета озвучена в подкасте IT Way Podcast. Вы можете послушать выпуск на Spotify, Яндекс.Музыке или Apple Music. Если эти материалы будут вам заходить, сделаем и видео.
Сегодня рассказываем про 1970 год:
- Зарегистрировали патент на компьютерную мышь. Хотя она уже существовала какое-то время
- Появился первый мини-компьютер. PDP 11/20
- Самый сложный язык программирования — первый. Разработан Pascal
- Начало UNIX-времени. В прямом смысле этого слова
- На каком языке работали Шаттлы, спускаемые аппараты, искавшие Титаник, и первых автоматизированных системах анализа крови. Появление Forth.
Начало времен
Какой сейчас год? Этот вопрос используют шутки ради для подчеркивания архаичности происходящего, указывая на то, что подобное уже случалось и довольно давно.
Но как бы там ни было — этот вопрос очень резонный. И он даже не в том, что мы не знаем точной даты и времени появления планеты Земли (да и непонятно, что считать моментом образования планеты). Мы даже точку отсчета, о которой договорились всем миром, точно не определили.
Первый год нашей эры привязан к рождению Иисуса Христа. Но по мнению большинства ученых, игумен Дионисий Малый, когда определял этот год в VI веке нашей эры, ошибся на несколько лет. То есть мы с вами живем спустя 2022 года после года, который определил игумен из Рима. Тут даже хочется уже спросить не «Какой сейчас год?», а «Когда мы?». Невольно наталкиваешься на экзистенциальные размышления.
Спокойно! Если вы потерялись во времени, у меня есть для вас утешение — я точно могу сказать, где мы находимся. На момент, когда я пишу этот текст, прошло 1665554042 секунд с 1 января 1970 года 00:00:00.
Это и есть Unix-время. Очевидно, что Unix-время названо в честь семейства операционных систем Unix, которые появились в конце 60-х- годов.
Сегодня такое численное представление времени используют практически во всех операционных системах и компьютерах. И я бы мог сказать: «Смотрите — это число, которое точно может определить ваше место во времени», — но это не так. Ведь Unix-время не учитывает секунды координации — практику, которая используется по всему миру с 1972 года, то есть уже после старта Unix-времени. Астрономы по всему миру определили, что вращение Земли вокруг Солнца постепенно замедляется.
Поэтому иногда нужно «фиксить» мировое цифровое время и добавлять ко времени одну секунду. Такое периодически делают 30 июня или 31 декабря. С 1972 года добавлено примерно 30 дополнительных секунд, последний раз так сделали в 2016 году. Как это выглядит? Максимально просто: 31 декабря заканчивается не на 23:59:59, а на 23:59:60. Вот когда надо щелкать пальцами, господин Старк!
Операционные системы и критическое программное обеспечение учитывают эти дополнительные секунды, в том числе и Unix. Но именно UNIX-время их не учитывает, потому что ее методология была придумана раньше.
У UNIX-времени есть другое интересное свойство. 19 января 2038 года в 03:14:08 время закончится. Изначально для определения UNIX-времени использовали 4-байтные числа, а их диапазон — от -231 до 231 - 1.
В случае с UNIX-временем 01.01.1970 — это ровно 0. Минимальное возможное время — 13 декабря 1901 года, 20:45:52 (соответственно −2 147 483 648 секунд от 1 января 1970 года), а максимальное возможное время 19 января 2038 года в 03:14:08. Что произойдет в эту секунду с операционными системами? С современными — ничего, они давно используют не 32-разрядные числа (4 байта — 32 бита), а 64-разрядные числа для управления UNIX-временем. Этого количества секунд хватит на 200+ млрд лет. Так что, если вы не планируете переживать нашу Галактику, вам времени хватит.
А вот у систем с 32-разрядным временем могут быть проблемы, которые зависят от конкретной реализации времени в этих системах: в некоторых время начнется с минимального отрицательного числа — с 13 декабря 1901 года, в других будет 1970 год. А некоторые вообще перестанут работать. За такими процессами будет интересно наблюдать.
Читайте также: Вы забыли, что Ruby — крутой: Павел Калашников — об удовольствии программировать на Ruby
Появление компьютерной мыши
Вы знаете, кто такой Дуглас Энгельбарт? Нет? А этот человек повлиял на вашу жизнь больше, чем Егор Крид или Нурлан Сабуров. Вот лишь краткий список изобретений, который приписывают Дугласу Энгельбарту:
- компьютерная мышь
- графический интерфейс
- гипертекст
- групповые онлайн-конференции
Вы спросите, а как можно было изобрести групповые онлайн-конференции. Он сделал Zoom? Нет. Он не создавал Zoom. Дуглас Энгельбарт описывал принципы работы всех вышеперечисленных решений и регистрировал эти наработки как патенты. В 1970 году Дуглас получил патент US3541541A на “X-Y position indicator for a display system” (Система отображения координатного указателя на экране)
Интересный факт, что первая версия мыши была собрана еще в 1963 году, а представлена публике в декабре 1968 года на Осенней Объединенной компьютерной конференции в Сан-Франциско. Но отдельной презентации у нее не было — ее показали как вспомогательное устройство для групповой онлайн-конференции. Тогда этим термином назвали онлайн-переписку между компьютерами в одной сети и совместную работу над документом. Мышь использовалась как манипулятор, с помощью которого пользователи переключались между режимами.
Дуглас Энгельбарт не разбогател за счет патента на мышь. Как признавались его коллеги, единственный чек, который он получил — это несколько тысяч долларов от компании Xerox, когда она готовилась создавать компьютер с графическим интерфейсом.
В 1972 году Xerox разработали свою собственную мышь, это была первая мышь с шариком внутри. Если вам больше 25 лет, вы помните, что до появления оптических мышек существовали мышки с шариком. Их еще нужно было иногда вытаскивать и чистить, чтобы отклик был лучше.
Именно у Xerox через 12 лет команда Стива Джобса взяла идею мышки и графического интерфейса, которую применила в своем компьютере Macintosh. Эта история в красках рассказана в художественном фильме «Пираты Силиконовой долины» про первые десятилетия существования Apple и Microsoft.
За Дугласа Энгельбарта можно не переживать — помимо патента на мышь у него было еще около 20 патентов, в том числе связанных с оборонной промышленностью. Кроме этого, он регулярно получал премии в размере сотен тысяч долларов. Так что все у Дугласа сложилось хорошо!
Первый мини-компьютер
Есть ли у вас предрасположенности к гигантизму? Не знаю про вас, но могу точно сказать, что у специалистов и руководителей компании DEC они скорее всего были. В 1970-х годах они активно выпускали мини-компьютер серии PDP-11 (белая коробка, на фото справа).
Безусловно, никаких пространственно-когнитивных искажений у специалистов компании DEC не было. Компьютеры серии PDP-11 были как большими шкафами, так и маленькими, как изображено на фото выше. Маленькие версии компьютеров мог перемещать один человек.
Чем эта серия компьютеров примечательна и почему мы обратили на нее внимание? Во-первых, это был один из первых по-настоящему серийных компьютеров. Конструкция устройств серии PDP-11 была реализована таким образом, чтобы собирать их на конвейере с помощью неквалифицированной рабочей силы. Грубо говоря, не каждый специалист, который участвует в сборке компьютера, должен был иметь инженерное образование. Переход на конвейер позволил сильно уменьшить себестоимость машины.
Во-вторых, это одна платформа. На всякий случай напомню, что портативных операционных систем (именно так называются операционные системы со способностью запускаться на разных моделях компьютеров) тогда было совсем немного. Под каждую модель компьютера создавалась своя операционная система.
Безусловно, операционные системы от одного производителя были схожи, но полную совместимость компьютеры того времени имели крайне редко. Это приводило к тому, что для каждой модели компьютеров приходилось писать свои программы.
Тогда как все компьютеры серии PDP-11 имели обратную совместимость. Грубо говоря, программа, написанная для большой модели компьютера, работала и на его мини-версии. Это не было прорывом, но впервые работало настолько стабильно.
Читайте также: Как гитарист стал биологом, а потом придумал философию современных компьютеров. История Алана Кея
Самый сложный язык программирования — Pascal
Спросите у программиста, какой для него самый сложный язык программирования? В ответ услышите несколько вариантов: Haskell, Brainfuck, Malbolge, C++, R и так далее. И все эти ответы будут неверными.
Самый сложный язык программирования — первый. Первый для каждого отдельного разработчика. Именно с этим языком мы дольше всего сидели и разбирались, как вообще это ваше программирование работает. Как писать циклы, присваивать переменные, зачем писать функции. Если первый язык программирования был объектно-ориентированным, ломали голову над принципом работы с классами и объектами.
Вы уже догадались, зачем в главе про Pascal мы поднимаем этот вопрос. Несколько десятилетий Pascal использовался как обучающий язык программирования. И это не мудрено — ведь Никлаус Вирт создавал Pascal именно как учебное пособие для начинающих программистов. В этой связи для большинства современных программистов Pascal — первый язык программирования в жизни.
В современном мире Pascal практически перестал использоваться как обучающий первый язык программирования: его заменили Python и Javascript. Это логично: на Pascal сложно писать реальные программные продукты, а Python и JavaScript — лидеры индустрии. Поэтому студенту не нужно после окончания курса обучения переходить на другой язык, чтобы начать реальную разработку.
В 1970-х, 80-х и 90-х на разных версиях Pascal создавали реальные программные продукты. Диалекты языка и среда разработки были лидерами индустрии, но в 90-х Java, PHP, Python и другие языки программирования начали постепенно оттеснять диалекты Pascal из реального продакшна.
Первый релиз Pascal произошел в 1970 году, но это могло случиться и раньше — Никлаус Вирт потратил несколько лет, чтобы подготовить первую версию языка. Синтаксис и базовые конструкции Pascal приучали начинающих программистов к дисциплине и не давали тех свобод, которыми уже обладали другие «коллеги по цеху». Первая версия Pascal была строго-типизированным процедурным языком.
Степеней свободы с каждой новой спецификацией Pascal становилось все больше — это связывали с тем, что в индустрии появлялись языки программирования, дающие много свобод программисту. Поэтому появился запрос на снятие ограничений и в обучении специалистов.
Что же сделало Pascal мегапопулярным в 70-е годы, кроме суперсовременного для того времени синтаксиса? Компилятор Pascal весил очень-очень немного — он был сильно меньше по размеру относительно других популярных языков того времени. А как мы помним, в те времена размер — один из главных критериев любой программы. Использование компилятора меньшего размера становилось главным критерием выбора в пользу Pascal.
Другим важным преимуществом Pascal перед конкурентами была цена. Компьютеры стоили в те времена баснословных денег, сложные программные продукты едва ли уступали в стоимости. Разработчики ПО отдавали свои программы за очень большие деньги, тогда как гибкий диск со средой Pascal стоил всего $50. Это сразу массово привело Pascal в школы и небольшие университеты. Программисты учили Pascal, а потом создавали компании и программные продукты с его помощью, распространяя сам язык дальше.
Ну и в конце этой главы картинка, чтобы олдскулы свело :) program primer
— просто песня, которая поет откуда-то издалека.
«Астрономический» язык программирования — Forth
В 2016 году на Github был опубликован репозиторий с исходными кодами аппарата Аполлон-11 на Ассемблере. Время запуска Аполлонов было очень важной вехой в развитии разработки — люди программировали космические корабли, которые летали на другую планету (я знаю, что Луна не планета, просто так звучит лучше). Все больше людей узнавали о возможностях программирования, и хотели стать не только астронавтами, но и программистами, которые этих астронавтов отправляют в космос.
Вы можете самостоятельно ознакомиться с исходным кодом одной из самых успешных космических миссий человечества и найти там потрясающие куски кода. Кроме без преувеличения гениальных решений присутствуют знакомые каждому программисту строчки и комментарии. Например, следующая строка кода:
TC BANKCALL # TEMPORARY, I HOPE HOPE HOPE
«Это временное решение», — написал разработчик почти 60 лет назад.
В целом программы Аполлонов были очень сложными, как и другие программные продукты, разработанные для сложных аппаратов.
Радиотелескопы, активно развивающиеся в то время, программировались на Ассемблере. К началу 70-х разработчики поняли, что им нужен другой язык, который позволит реализовывать сложные поддерживаемые решения для микроЭВМ для радиотелескопов.
Решением этой проблемы занялся Чарльз Мур. Он начал программировать язык Forth, который к 1976 году стал стандартом в американском астрономическом сообществе. Название означает «четвертый», которое авторам языка нужно было уместить в пять букв — и уже никто не помнит, почему так. Поэтому из слова Fourth убрали одну букву.
Одна из главных особенностей, которую автор языка заложил в Forth — возможность запрограммировать язык на этом же языке. Это сейчас стало модным и нормальным, что языки программирования написаны на этих же языках. Перейдите в репозитории языков программирования Github и посмотрите в них распределение языков: Ruby на 60% написан на Ruby, Python на 65% написан на Python, Go на 88% написан на Go. Но тогда языки высокого уровня, а именно таким был Forth, не обладали достаточной «мощностью», чтобы на них возможно было запрограммировать сам язык.
Параллельно с этим перед Муром стояла задача сделать достаточно гибкий язык программирования, чтобы можно было создавать и использовать абстракции для конкретной предметной области. Вам может показаться, что на Forth можно программировать DSL, но нет. До первых DSL в том виде, как мы их знаем, еще минимум одно десятилетие. Forth стал одним из флагманов зарождения и развития абстрактных типов данных в программировании.
В этой части статьи я вкратце расскажу про методологию программирования на Forth, прочитав которую вы можете подумать: «А что тут революционного?». Напоминаю, что этой истории — более 50 лет. Механики Forth действительно были новыми для того времени, они «поднимали» программиста на уровень абстракции выше. Фактически на тот уровень, на котором мы с вами сейчас находимся.
Методология программирования на Forth построена на главном принципе: определение слов на основе слов, имеющихся в словаре. Вот так выглядит программа “Hello World” на Forth.
: hexlet . “Hello, World!” ;
теперь обращаемся к вновь созданному слову:
hexlet
в ответ получим:
Hello, World!
В тот момент такой подход был в новинку.
На Forth кроме радиотелескопов программировали некоторые инструменты для шаттлов, системы управления аэропортами и многое другое. Сегодня Forth переродился в язык Fift, который используется в TVM, или Telegram Open Network Virtual Machine. То есть на языке Fift пишутся смарт-контракты для блокчейна TON.
В официальном описании языка Fift написано, что он основан на стековом языке и очень похож на Forth. Так что у него все еще есть будущее.
В следующей статье
Это были события, люди, технологии 1970 года. То без чего с нами невозможно общаться, еще труднее — нанять.
Следующий год — 1971: релиз прародителя Linux — операционной системы UNIX, в MIT разработана первая программа для работы с email, никому неизвестная компания Intel выпустила свой первый процессор.
Продолжайте учиться: На Хекслете есть несколько больших профессий, интенсивов и треков для мидл-разработчиков и даже сеньоров: они позволят не только узнать новые технологии, но и прокачать уже существующие навыки