Hobby Talks #472 - История программирования
В этом выпуске мы рассказываем об истории программирования - о станке Жаккара и машине Бэббиджа, перфокартах и магнитных лентах, Фортране и Бэйсике, ассемблерах и компиляторах, структурном и объектно-ориентированном программировании.
Выпуск доступен для наших подписчиков на Спонсоре и Патреоне.
Транскрипт
Транскрипты подкаста создаются автоматически с помощью системы распознавания речи и могут содержать неточности или ошибки.
Доброго времени суток, дорогие слушатели! В эфире 472-й выпуск подкаста «Хобби Токс». С вами его постоянные ведущие Домнин и Ауралиен.
Спасибо, Домнин. Итак, от тем сладких и кулинарных мы переходим к темам более серьезным и, я бы даже сказал, гиковским. О чем мы, Домнин, поговорим?
Мы поговорим об истории программирования.
Да. От древнейших времен до наших дней. Про древнейшие времена я не очень иронизирую, потому что вообще база была заложена еще в IX веке. Потому что был такой персидский ученый Абу Абдулла Мухаммад ибн Муса аль-Хорезми, то есть из Хорезма буквально. Хорезмская была фамилия. Все остальное — это имя-отчество. Он был математиком, и не только математиком. Он вообще много чем увлекался: и историю писал, и карты рисовал, и в телескоп смотрел. Так что мы ему обязаны появлением таких терминов, как «алгебра» и «алгоритм».
Несмотря на то, что это является таким… Как это сказать? Например, у нас было слово «форца» в Советском Союзе, означавшее некие заграничные дефицитные вещи, которые стоят денег, которое, судя по всему, просто от английского for sale происходит, малопонятного для простого советского гражданина. Также вышло из «аль-Хорезми», что он написал книжку о сложении и вычитании. По-арабски — «Китаб аль-джабр валь-мукабала». Так вот, это самое algebra, то есть сложение просто, так поразило европейских книжников, что они назвали науку алгеброй. А производная от нее в переводе на латынь звучала как «Algoritmi de numero Indorum». То есть, видимо, они считали, что algoritmi — это, видимо, аль-Хорезми у них так превратился.
Да-да-да. Авиценна, который Ибн Сина, Ибн Рушд, который Аверроэс. Все переводят непонятные имена на свой лад. Это нормально для всех. Факт в том, что алгоритм таким образом попал в европейские языки. По-русски, кстати, в старые времена говорили «алгоритм». Алгоритм.
Вот это старинный… Как у нас Томас от Фома, так и алгоритм. Алгоритм.
Да. Ну вот, я помню, когда мы в детстве с тобой читали нашу любимую книгу про роботов.
Да. Это книжка 89-го года, переводная, в двух томах — «Осваиваем микрокомпьютеры». Она была посвящена программированию на Бейсике. Нас в ней тогда, в 3–4 года, интересовало не программирование, а то, что там для иллюстрации… Книжка американская, американцы любят все с картинками. Поэтому там огромное количество роботов, которые иллюстрируют разные моменты. К примеру, там было описано, как работает компьютерная программа, тем, что роботу предлагают покрасить стену, для чего у него там команда: взять кисть, залезть на лестницу, красить стену. Он залезает, но он не может красить, потому что нет команды взять краску. Другая иллюстрация была там же, где роботу дали достаточно подробную инструкцию: иди на почту, положи письмо в почтовый ящик. Но поскольку там не была задана никакая траектория конкретно, он пошел напролом и проломил кирпичную стенку. И все это, как ни странно, алгоритмы, друзья. Что делать, в какой последовательности — это и есть определение, по большому счету, алгоритма.
Алгоритмы используются не только в программировании, но и в современных рабочих процессах. Сейчас многие, очень даже многие сферы деятельности алгоритмизируются. Для многих из них, например, для журналистики, это уже вышло боком.
Так вот, после трудов аль-Хорезми прошло много времени, и программирование в том смысле, в каком мы его понимаем, началось с 1804 года. Жил да был один мужик во Франции, сын ткача, Жозеф Мари Жаккар. Причем ткача не абы какого, а ткавшего ткани со сложными узорами. Сам Жаккар к ткацкому делу оказался не способен по особенностям восприятия. Ему все эти сложные узоры как-то… у него не выходили. Из-за этого его отдали в печатники. Он стал печатать. Но его отец в любом случае должен был когда-нибудь помереть, и, соответственно, ткацкую мастерскую унаследовал сам Жозеф Мари Жаккар.
Чтобы как-то это все пристроить к делу, он начал придумывать способы упростить производство. И догадался, что можно попробовать вот этот узор тоже автоматизировать. Для того чтобы автоматизировать узор, он построил такую аналоговую машину, которая использовала в качестве схемы узора перфокарту. То есть, проще говоря, картонку с пробитыми в нужных местах дырочками. Дырочки отражали, где надо ткать чего. То есть узор, по сути, таким образом был просто на перфокарте отмечен, а станок, просто следуя ему, ткал сам. До этого приходилось все вручную ткать, и если ты допустил ошибку, то все, запорол ты ковер или что там у тебя, шелк тканый.
Это изобретение вызвало интерес у самого Наполеона. Он дал ему большую премию и стал финансировать распространение этих его станков. Вообще, Жаккара хотели убить за такое. Ткачихи с поварихами, со сватьей бабой Бабарихой, как в сказке у нас. Просто потому, что он делал бессмысленной их работу. He’s taking our jobs! — говорили они. Луддиты действительно пытались там нападать, громить, поджигать, но уже было ничего не сделать.
Так вот, этот ткацкий станок и перфокарты навели на разные интересные мысли математика Чарльза Бэббиджа. Это английский был такой математик, который, посмотрев на то, как здорово работает станок, а также на работу его соотечественника, тоже математика, Джорджа Буля… Он в первой половине XX века работал. Джордж Буль ввел математическую логику. Для нас с вами сейчас важно то, что он ввел понятие true/false, истинно-ложное. Булева переменная, так называемая. Двоичная логика, благодаря нему, была популяризована.
И Бэббидж решил, что нельзя ли использовать перфокарты для того, чтобы закодировать в двоичную систему исчисления более сложные какие-то числа и использовать ее в машине вроде как у Жаккара, только не чтобы ткать, а чтобы еще больше вычислять. Он начал работать с так называемыми разностными машинами, которые он предполагал… которые, как он предполагал, будут исключать человеческий фактор при выполнении сложных расчетов. Например, он постоянно натыкался на баги в логарифмических таблицах, которые служат для упрощения вычислений. Он таким образом стал строить машину совершенно футуристически какого-то стимпанкового вида.
Он, конечно, не знал о существовании так называемого антикитерского механизма. Мы про него, помнишь, рассказывали, когда про бронзовый век говорили? Выловили рядом с островом Антикитера, или как-то так называлось в греческом, аналоговый компьютер, который, что характерно, работал и служил для похожего расчета всяких астрономических явлений.
Да. То, что он работал, на самом деле относительно свежее открытие, потому что изначально вообще не очень было понятно, для чего он был нужен. Я так понимаю, что пришлось его чуть ли не сканировать, воссоздавать, сканировать его рентгеном, чтобы разобраться, как он устроен, потому что он все-таки не совсем в новом состоянии, из бронзы вроде как был сделан. И все это там слежалось за несколько тысяч лет в воде. Обнаружен он был в 1901 году, кстати говоря. Поэтому непосредственно работающие его прототипы, я так понимаю, появились совсем недавно. Которые воссоздали, чтобы они прямо работали.
Так вот, в отличие от этого антикитерского механизма, машины Бэббиджа так и не заработали на практике. Видимо, в связи с низким уровнем развития тогдашней техники. Слишком много чего еще было недоизобретено. Многое работало не так, как надо. Денег ухлопали — караул, там уже можно было корабль целый на них снарядить. Там больше 20 тысяч фунтов из разных источников, включая, собственно, деньги Бэббиджа. Он совершенно разорился на этой почве.
Да. Но Бэббидж-то еще машину строил для чего? Для того, чтобы арифметические подсчеты делать, правильно? А антикитерский механизм, для тех, кто вдруг забыл, что это, — это хреновина, которая позволяет положение небесных тел вычислять. То есть это астрономический прибор.
Да-да. Бэббидж вообще много чего другого сделал полезного. Например, спидометр — это тоже он. Разные там другие работы, не связанные напрямую с математикой. Факт тот, что для программирования больше полезной оказалась его коллега, графиня Ада Лавлейс, которая, заскучав от безделья, в 1843 году написала записку, так называемую «Записка G», не путать с точкой G, это другое совсем, которая рассуждала о том, как можно бы вот эту машину, если бы она была, попробовать, насколько я понял, использовать десятичный код на перфокартах, заставить произвести какое-нибудь вычисление. И вот там, собственно, эта программа, первая в истории человечества, и написана. И поэтому теперь Ада Лавлейс считается самым первым программистом в истории человечества. Чуть ли не святой покровитель программистов.
Прошло время, технология продвинулась, и в 1906 году Герман Холлерит, по-моему, как-то так фамилия была, создает табулятор, то есть механическую счетную машину. Нет, это не значит, что до этого табуляторов не было. Были, прекрасно в XIX веке использовались как такой аналоговый калькулятор. Дело просто в том, что эти табуляторы до Холлерита были однозадачными. То есть, чтобы они делали что-то помимо заложенного изначально в их механизм, их нужно было переделывать полностью. Проще было другое сделать.
А Холлерит сделал такой табулятор, в который можно было вставлять перфокарты и перенастраивать его на другую задачу. Вынул, вставил — уже третья задача. Почему он это сделал? Он американец был, у него практический был интерес. Дело в том, что в Штатах по закону каждые 10 лет должна проводиться перепись населения для того, чтобы вычислить, сколько нужно представителей от какой местности в Конгресс посылать. Это в Сенат — два от каждого штата, а в нижнюю палату надо смотреть, сколько народу живет. Вот от каждых 100 тысяч, что ли, отправляют.
Проблема в том, что это легко было во времена Бенджамина Франклина так повелеть, когда народу в Штатах было мало и сами они были маленькими по территории. А прошло сто с лишним лет, и предшествующая, перед той, в которой участвовал Холлерит с интегратором, перепись заняла вместе с обработкой данных восемь лет. То есть это означало, что следующую перепись проводить просто бессмысленно уже. Потому что она займет десять лет, и надо будет уже следующую проводить. И так просто это надо забросить как бессмысленное. А с табулятором Холлерита удалось за два года справиться с той же задачей. И положение было спасено.
Подобные табуляторы вплоть до 70-х годов, когда их вытеснили электронные вычислительные машины, продолжали использоваться с управлением перфокартами. И даже сделали заметный прогресс в этом. В 41-м году первый электромеханический компьютер, который можно было программировать путем перфолент, не перфокарт, а именно лент… Я так понял, лент, потому что ее можно закольцевать и мотать таким образом по кругу. Его создал Конрад Цузе. Как вы можете понять, создан он был под руководством рейхсфюрера СС, поэтому с его машиной остальному человечеству пообщаться не удалось.
Американцы, обеспокоенные тем, что немцы там чего-то химичат, в 43-м сами сделали очень похожую на него по принципу машину Mark I. Руководил разработкой Говард Эйкен, и курировала все дело компания IBM. Вот, собственно, она появляется на страницах истории.
Чтобы дальше продвинуться на этом поприще, в университете Пенсильвании Эккерт и Мокли, насколько я помню, создают первую электронно-вычислительную машину без уже механических частей под названием ENIAC. Насчет механических частей это может быть немножечко оптимистично, просто потому что вместо перфокарт или, допустим, перфолент ENIAC управлялся путем перетыкания кабелей. То есть система управления и программирования была похожа на то, как телефонистки раньше работали, тыкая штекеры в гнезда. То есть, по сути, эта самая доска с гнездами была большой перфокартой.
Весил он целый дом, весил 30 тонн, стоил полмиллиона тогдашних долларов, жрал по тем временам страшные 200 киловатт электроэнергии.
Ого!
Но зато за 3 микросекунды складывал два числа. Неудобство с ним было в том, что он был теплый ламповый, и поэтому каждые 7–8 минут приходилось бежать менять лампу. Лампы горели.
Их было просто много, да. Статистически какая-нибудь из них перегорала.
Ну да, 30 тонн. Их там… занимает целый дом. Целый этаж, наверное, в институте был.
Тем не менее, за счет этих втыканий можно было отказаться от перфокарт. Уже это считается первое электронное программирование. В 49-м году, замотавшиеся без конца чего-то перевтыкать операторы, начали думать над тем, как бы это все немножко автоматизировать. Поскольку автоматизировать предлагалось программу, они решили действовать такими же программными методами.
То есть до этого программирование выглядело примерно так, насколько я понял по бумагам, какие я нашел и посмотрел. На бумажке писалось сначала просто текстом, что должна делать программа. Потом этот текст сокращался до кодовых слов, которые получили название операционные коды, они же opcodes. И составлялась табличка, где эти операционные коды соответствовали двоичным командам на машинном языке. Чтобы это как-то автоматизировать, было решено сделать программу, которая сама будет эти операционные коды автоматически переводить в двоичные команды. Так появился ассемблер. То есть семейство низкоуровневых языков программирования, насколько я могу понять. Ауралиен, поправь меня, если что.
Да, так и есть. Ассемблер что позволяет делать? Он позволяет программировать не непосредственно битики-байтики, а как-то более высокоуровнево. То есть на момент его появления это было прям большое достижение, что можно было как-то в каком-то более-менее абстрактном виде давать команды своему компьютеру, и он их даже будет как-то делать. Но, конечно, до современных языков программирования был еще очень-очень длинный путь.
Все осложнялось еще и тем, что каждый ENIAC или кто еще должен был иметь свой конкретный ассемблер под его конкретное железо. Взять эту программу и попробовать на другой компьютер нельзя было.
Потому что, да, архитектура была другая, и они отличались чисто физически между собой. А ассемблер — он вот таким был слоем, который над непосредственно физическим оборудованием находится. Поэтому, если у вас разное оборудование, у вас будет разный ассемблер.
Как вообще на любом раннем этапе развития какой-либо технологии, все изобретают то, во что горазды. Как, например, было там с огнестрельным оружием в XIX веке, когда прогресс рванул: одни делают такие, другие сякие, одни револьверы с барабаном, другие револьверы с гармошкой, то есть с таким рядом у них магазин идет и опускается. Но через некоторое время оказалось, что барабан просто лучше, и поэтому он их вытеснил.
Да. Так вот, в 50-м году создается первая вычислительная машина, где программы уже хранятся не в виде втыкания кабелей, а на электронном носителе. Создал ее Алан Тьюринг. Назывался этот компьютер Automatic Computing Engine — ACE. Тьюринг много сделал для теоретизирования. То есть он, например, придумал эту абстрактную машину Тьюринга, на которой должны работать все мыслимые программы. Правда, ему это не помогло, потому что он был голубой, и очередной дружок-голубок его обокрал в процессе. А Тьюринг взял и заявил в полицию: я тут с дружком-голубком всякое делал, а он меня обокрал. Примите меры. Меры приняли, в том числе по отношению к самому Тьюрингу. Потому что вообще-то за это наказывали, за то, что вы не такой, как все. Он был такой очень человек, оторванный от реалий.
Так вот, в 51-м году — первый успех компьютера, где программы содержались на магнитных лентах. Компьютер назывался UNIVAC, и он использовался для того, чтобы обработать данные предвыборных опросов. Несмотря на то, что все аналитики доказывали, что победить должен… как там этого мужика… Короче, победить должен был не Эйзенхауэр, а победил Эйзенхауэр. И вот компьютер, как раз все обработав, предсказал так. Это сразу подняло авторитет программирования на доселе невиданные высоты.
В следующем, в 52-м году, доктор Грейс Хоппер, это весьма знаковая дама в истории программирования, создает первый компилятор. То есть, если попросту, это программа, переводящая исходный код на языке программирования в низкоуровневый язык, типа вот ассемблерного или даже сразу двоичного.
То есть что это такое, да, что такое язык программирования высокого уровня? Это когда вы строите дополнительный уровень. То есть вы можете программировать в машинных кодах, то есть непосредственно там супер-супер на низком уровне. Ассемблер является надстройкой над этим, а язык программирования высокого уровня является дополнительной надстройкой уже, скажем так, над ассемблером. Не всегда, но по большей части оно вот таким образом тогда работало. И что это означало? Это означало, что вы могли писать программу, используя более или менее какие-то адекватные команды, слова английского языка и вот это вот все, вместо того, чтобы запоминать какие-то эзотерические штуки: положить вот эту цифру в этот регистр, потом выполнить вот эту операцию с этим регистром и вот этим регистром.
И у вас получалось, что вы вместо того, чтобы говорить машине, что делать непосредственно, вы могли как-то более абстрактно говорить: машина, пожалуйста, сложи два числа. То есть сложи два числа, вот это и вот это, а не говорить при этом как именно. То есть это все машина уже должна уметь делать, когда вы компилируете программу, написанную на языке высокого уровня, в машинные коды.
Хоппер вообще много чем была недовольна в тогдашнем программировании. Например, ее раздражало отсутствие оператора jump, который делает что? Джампает. Поэтому ей приходилось — она работала с машинами на перфолентах — просто их закольцовывать, склеивая, и таким образом пускать. И это все оказалось ужасающе низкотехнологичным и вообще не соответствующим моменту.
Тем временем два года спустя, в 54-м году, IBM создает первый коммерчески успешный высокоуровневый язык, который полностью назывался Formula Translator, то есть «переводчик формул», но все мы его знаем как Fortran.
Да, Фортран известен многим на постсоветском пространстве с детства, потому что у нас были такие очень хорошие книжки, где профессор Фортран, лысый такой, яйцеголовый, усатый, нас учил всякому. Те, кто не читал эти книжки, скорее всего, все равно видели профессора Фортрана на меме «На словах ты Лев Толстой, а на деле не совсем».
Так вот, Фортран предназначался для того, чтобы производить инженерные расчеты, в том числе, например, всякие ракетные траектории, атомное оружие, много чего. Своим появлением Фортран, по сути, заложил основы чуть ли не для всех ныне используемых высокоуровневых языков. Кроме шуток, сам Фортран тоже местами до сих пор используется. В основном, насколько я понял, это всякие крупные банковские структуры, у которых настолько старое все там, что переделывать будет стоить денег много, а толку не очень много. Поэтому до сих пор используют архаичный по нынешним меркам Фортран. Но тогда он был прям прорывным. То есть он, например, вводил оператор if. То есть «если — то». Цикл for тоже, кстати, начался с него же. Правда, в Фортране он, насколько я помню, был do.
Да, это тут надо пояснить, действительно, для тех, кто вообще ничего не знает про программирование. Оператор if позволяет вам выбирать один из двух путей исполнения программы. То есть если у вас какое-то условие выполняется — помните эти булевы переменные, про которые мы говорили, которые могут принимать значение истина или ложь, — вот если у вас что-то истинно, то вы выполняете один набор команд. Если что-то ложно — то другой набор команд.
Грубо говоря, если, допустим, мы на столку бросаем проверку силы, то есть мы просто: если бросок больше либо равен N, то, значит, попал. Если меньше N, значит, не попал.
Да, это он. А иногда вам необходимо выполнять какую-то операцию несколько раз. Например, вы что-то там складываете само с собой или перемножаете какие-то числа для того, чтобы какие-нибудь матрицы друг на друга перемножить. Либо вам нужно что-то напечатать по букве или еще что-то такое. И для этого нужны операторы, которые умеют делать цикл, то есть выполнять одну и ту же операцию над каким-то набором данных, при этом смещаясь по этому набору данных. Вот для этого придуманы были циклы, в том числе уже упомянутый Домниным for и в том числе циклы в стиле do while, например. То есть «делай до тех пор, пока выполняется условие».
Фортран, как я уже сказал, был коммерчески успешен, но коммерчески успешен он был в смысле сидения на госзаказах и рисования траекторий для баллистических ракет. То есть если у вас что-то не такое серьезное, если вы не Boeing и не McDonnell Douglas, который может много денег взять с казны, если у вас какая-нибудь, не знаю, простая инженерная компания водопроводы проектирует, то Фортран для вас был слишком уж математическим, требовал очень высокой квалификации именно как математика у программиста. И он не умел обрабатывать текст напрямую, то есть нужно было преобразовывать его.
Это означало, что для истинно коммерческого применения Фортран не очень хорошо подходил. Уже упомянутая доктор Грейс Хоппер через пять лет, в 59-м году, специально для бизнеса создала COBOL — Common Business-Oriented Language, который, внимание, спойлеры, тоже используется до сих пор в некоторых местах.
Да-да. COBOL был сделан нарочито для того, чтобы он был как можно… Короче, чтобы не надо было математику знать особо. То есть там почти никакой математики в его программных строках нет. То есть типичная строка: move income to total, subtract expenses. То есть добавить доход к общей сумме, вычесть расход. Просто по-английски пишешь — и все. Там главное помнить, какие слова за что отвечают, они все интуитивно понятны. С текстом он тоже мог работать напрямую как раз за счет того, что он, собственно, текстом и писался. Там числовых переменных как бы и нет особо.
В 50-е годы, наконец, от электронных ламп мы начинаем переходить к транзисторам на полупроводниках, что сильно уменьшает размеры ЭВМ, повышает их надежность. Не надо теперь бегать и искать, какая там из тысяч ламп сгорела, и срочно ее заменять. Они стали гораздо меньше жрать электричество в том числе. И это привело к популяризации ЭВМ, соответственно, к появлению потребности в дальнейшем развитии программирования. Потому что стало все дешевле, меньше, и это могли себе позволить люди больших масштабов. Практичнее стало, короче.
60-е практичность еще больше повысили за счет внедрения интегральных схем, они же микросхемы, как мы обычно сейчас говорим. Или микрочипы, как хотите. До сих пор мы этим пользуемся. На интегральной схеме сразу и транзисторы, и диоды, и конденсаторы, и еще чего-то. Вот это позволило все еще больше миниатюризировать. Миниатюризирование сейчас дошло уже до атомарных каких-то величин.
Да, какие-то 5 нанометров.
Тогда же начали появляться все эти шуточные предсказания типа закона Мура про удвоение вычислительных мощностей, потом закон Вирта про то, что удвоение вычислительных мощностей будет нивелироваться все большей тормознутостью и запутанностью программного обеспечения.
И еще в 60-е появляется такой знаковый для нас, в том числе, язык, как BASIC. BASIC — это так называемый бэкроним, то есть аббревиатура, специально придуманная для того, чтобы складываться в определенное слово, basic, «базовый». И он как бы был разработан специально для тех, кто не силен ни в математике, ни вообще в чем-либо. Простой, нетребовательный к объему памяти. Это очень важно просто потому, что персональные компьютеры, которые там начали распространяться, похвастать серьезной памятью не могли, использовали крошечные ПЗУ, то есть постоянное запоминающее устройство, такой же маленький объем RAM, ОЗУ, как это у нас в Советском Союзе так говорилось, оперативное запоминающее устройство.
Оперативная память, да.
Вот. И в качестве внешнего носителя, как мы сейчас используем всякие флешки и внешние харды, или даже не используем, а просто все перекидываем через всякие там облака, тогда использовалась магнитная пленка на катушках. Как музыку слушали, так и это. Это все было не только маленьким по объему, но еще и было тормозным. Потому что пока там эти катушки будут крутиться. Соответственно, BASIC был адаптирован как раз под низкую скорость и не очень профессиональных пользователей.
То есть типичная программа выглядит так: номер строки, он всегда с нулем на конце, то есть не первая строка, а десятая; оператор, за оператором, ключевое слово имеется; за оператором идет в кавычках содержание оператора. То есть простейший пример программы: 10 PRINT “Привет” или там “Hello world”. 20 END — конец программы. Все, нажимаешь Enter, и тебе выведет Hello world.
Да. При этом 10 и 20 нужны просто для того, чтобы обозначить, где находится конкретно эта строка кода. Между ними можно добавлять разное. Почему 10 и 20? Потому что можно, например, написать 11, 12, если вам нужно что-то еще вставить, без того, чтобы переписывать постоянно эти порядковые номера. Так что да, по сути, то, что после вот этих 10 и 20, это является программой.
Да. Поддерживались операторы if, что позволяло создавать простенькие текстовые игры. Ну, типа вот как интерактивные книги эти: если вы считаете, что там Вася пошел дальше, то такая-то страница; если вы считаете, что Вася остановился и посмотрел, что происходит, то это такая-то страница. Вот по такой логике устроено программирование на Бейсике. Это стало дорогой к программированию для очень многих тогда.
И когда в 70-х, например, за счет миниатюризации персональные компьютеры со встроенными мониторами или подключавшиеся к телевизорам распространились по домашним хозяйствам и по офисам… Под офисами я имею в виду таким типом: секретарша какого-нибудь там юриста, такой офис. То есть не связанный никак с инженерией, расчетами, а просто бытовой такой компьютер. Так вот, в них вместо операционной системы просто массово ставился интерпретатор для Бейсика. И они работали прекрасно на голом Бейсике, и все. То есть ты включаешь компьютер, набираешь программу открыть с кассетного магнитофона рядом, или, если вы богатый, с флоппи-диска. Она вам открывает текст какой-нибудь, и можно читать его, редактировать. Все было легко и просто.
В конце 60-х Кен Томпсон и Деннис Ритчи создают язык B, но Ритчи этим B был недоволен. С его точки зрения, он был очень ограниченным. Поэтому в 69-м Ритчи создает язык C. Создавал он его с прицелом на написание операционных систем. И к 73-му году ядро Unix почти полностью переписывается на C.
В качестве плюсов C отличался простой базой с небольшим числом ключевых слов. Кроме того, он ориентировался на процедурное, а не структурное программирование. Ауралиен, объясни, если нетрудно, разницу, если попросту.
Да. Процедурное программирование — это когда вы программируете непосредственно команду за командой. То есть вы даете инструкции компьютеру, как чего делать. Как в том же самом, например, Бейсике: печатай вот это, сложи вот это вот с этим, сделай вот это вот и там еще вот это. То есть вы задаете порядок, вы непосредственно описываете, что должно быть сделано и как именно это должно быть сделано.
Объектно-ориентированное программирование имеет немножко другую парадигму. Оно начинает оперировать более сложным понятием, понятием объекта. То есть ваша программа вместо того, чтобы быть, скажем так, набором команд, становится еще более высокоуровневой в том плане, что вы должны описать происходящее, то есть описать то, что вам нужно сделать, на языке объектов, которые взаимодействуют друг с другом и могут иметь какие-то свойства, могут выполнять определенные действия.
Типичный пример, поскольку все эти языки программирования нередко использовались и разрабатывались для учебных целей, как тот же самый BASIC, который в Дартмутском колледже впервые появился, — обычно их использовали в первую очередь для того, чтобы управлять, например, оценками студентов или учеников этого колледжа, складывать все это в какую-нибудь базу данных, эти оценки поправлять. И те, кто смотрел «Очень странные дела», видели, как подружка Дастина исправляла ему оценку по латыни. Какую-то очень плохую на какую-то очень хорошую.
И, соответственно, если вы программируете на объектно-ориентированном языке, вы вместо того, чтобы конкретные команды указывать машине, что и как делать, говорите, что вот, значит, инициализируй объект этого студента. Потом этому студенту при помощи методов, которые доступны для объекта этого студента… То есть у каждого студента, у каждого объекта такого типа, типа «студент», ему доступны разные методы. Методы, которые можно применять для того, чтобы, например, установить ему оценку по такому-то предмету.
Посещаемость, допустим.
Посещаемость, да, там какую-нибудь. Или там какой-нибудь средний балл посчитать, по GPA, или как они там делают.
Условно, допустим, вычислить сначала среднее арифметическое его оценок, умножить на коэффициент его посещаемости и прибавить результат итогового тестирования, что-то такое.
Да-да-да. И в чем преимущество всего этого дела? Преимущество в том, что вы описываете сам объект, и при этом вы оперируете уже не инструкциями, что там «сделай А, Б, С», а вы оперируете более высокого уровня понятиями в стиле «посчитай среднюю оценку», «установи посещаемость» и сделай там еще что-нибудь более сложное. То есть это еще более абстрактный, по сути, путь программирования, который гораздо более сложный для понимания, если вы, например, программировали до этого только на языках, где надо указывать непосредственно команды, как в BASIC: делай А, делай Б, делай С. То есть еще более абстрактный уровень программирования.
Через год, в 70-м, уже Никлаус Вирт создает язык, который он планировал использовать для обучения студентов.
Да, еще один язык для студентов. Только если BASIC — он, во-первых, для тех, кто скорее уже даже не студент, а еще такой школота, а во-вторых, для всяких там секретарш-юристов, чтобы они могли два-три действия выучить, и больше ничего не надо. Pascal все-таки предполагался для использования в серьезной учебной подготовке, которая должна была не секретаршу на выходе дать, а нормального, опытного более-менее программиста. Поэтому Pascal был очень хорошо структурирован и остается… его до сих пор используют, хотя он как бы учебный.
Я на нем учился, кстати. Я учился на нем и в школе, и в университете. Это очень, на самом деле, удачный язык для того, чтобы обучать людей концепциям, которые характерны для программирования. У нас школота училась в основном на QuickBASIC, «кубасик».
Всех вот этих вот конструкций, для чего изобретать объектно-ориентированное программирование, для чего изобретать какое-нибудь функциональное программирование… Не знаю, мы поговорим о нем сегодня или нет, но тем не менее. Оно все нужно для того, чтобы как можно более сложные вещи делать короче, проще и понятнее для тех, кто это все делает. То есть чтобы не разбираться в каких-то кишках того, как все устроено в машинных кодах, а чтобы можно было что-то делать абстрактное, чтобы можно было этому научиться относительно быстро. И вот все эти высокоуровневые языки как раз выполняют эту функцию.
Да. Так вот, Паскаль. Паскаль за счет того, что он небольшой, хорошо структурированный, с широким использованием подпрограмм, хорошо оказался пригодным не только для обучения, но и для практической работы. До сих пор на нем много чего пишут.
В 70-е, я уже сказал, в целом компьютеры стали миниатюризироваться, удешевляться и распространяться по простым домохозяйствам с уже внедренным Бейсиком. В 73-м Бьёрн Страуструп создает на том же синтаксисе, что и C, новый язык C++, сильно заточенный на объектно-ориентированное программирование. Опять же, до сих пор широко используется.
Ты мне, я помню, в юности рассказывал про какую-то учебную игрушку, где некая пушка должна была отстреливать каких-то там набегающих врагов, и ей можно было вручную рулить, а там через некоторое время становилось это неэффективным, и надо было написать программку простенькую для того, чтобы она их отстреливала. Я помню, что такое было.
Я уже незамедлительно забыл.
Такое было, я такое не забываю. Да, C++ я тоже имел удовольствие изучать.
Да, ты мне, собственно, про него и рассказывал.
В 75-м выходит первый действительно народный мини-компьютер Altair 8800, на котором тут же начинают строчить на Бейсике свои первые популярные программы два чувака — Пол Аллен и Билл Гейтс, которые решают, что раз все так хорошо идет, надо создавать корпорацию. И реально ее создают. Поскольку в ней всего двое, получается какая-то микрокорпорация, а не мега, поэтому они ее так и назвали — Microsoft.
Маленький софт.
Да, маленький софт. Теперь какой он маленький, сами можете посудить.
Буквально через год после этой парочки вступает парочка номер два. Стив Возняк и Стив Джобс пилят Apple I — первый компьютер с, по-моему, единой материнкой в нашем понимании, который они начали продавать. Причем они его продавали скорее как материнку. То есть корпус надо было отдельно делать, и он был поначалу деревянный. И второе событие подстегнуло развитие программирования еще больше.
Для понимания, все эти компьютеры, которые Apple, — это представьте себе сегодня Raspberry Pi какой-нибудь. То есть, по сути, материнская плата, которая продается без ничего. То есть вы можете ее купить, на ней там что-то есть, но ее нужно подключать к разному самостоятельно. То же самое было и с этим Apple I, который продавался просто как такой вот кит, то есть набор всякого разного. Его там, я так понимаю, нужно было как-то еще собрать.
Тогда, понимаете, вообще много чего продавалось для людей, которые любят поковыряться. Вот типа людей, которые в гараже у себя Raspberry Pi, к нему подцепляют какую-нибудь видеокамеру, жесткий диск, майнят биткоин на нем, я не знаю, чего угодно. То же самое было с этим Apple I. То есть его можно было, по сути, из дерьма и палок, что-то к нему подключить и что-то на нем делать. Это был такой продукт исключительно для энтузиастов. Тем не менее, на тогдашнем уровне уже и это было круто, а еще круче стало в 81-м, когда вышел IBM PC, который мог похвастать не только могучим микропроцессором — представляете, целых 4,77 МГц тактовой частоты.
У-у-у, быстро!
Да, конечно, в Doom на таком не погоняешь, прямо скажем.
Да, при этом стоил он как крыло от самолета.
Да-да. Каких чудовищных денег. То есть это на современные бабки, я так понимаю, порядка 4–5 тысяч долларов.
4–5 тысяч долларов, совершенно верно.
Да. Так вот, несмотря на такой мощный процессор, там могло быть 320 килобайт оперативной памяти.
Да, килобайт.
Да. Или даже 640 килобайт оперативной памяти. Это было важно, потому что на эти компы предустанавливалась система MS-DOS, то есть Microsoft Disk Operating System, которую, соответственно, разработали вот эти граждане. Строго говоря, они не совсем ее разработали, они взяли disk operating system, написанную кем-то другим, и ее просто расширили для нужд IBM PC.
Расширили и углубили, как говорится.
И углубили, да. Операционная система выглядела как командная строка на черном экране, в которую ты забиваешь, и тебе… Тогда многие мониторы, или телевизоры, что вы там втыкали, были еще монохромными. И поэтому они могли быть монохромными и в IBM PC, а могли быть с зелененьким шрифтом до сих пор. Это такой реликт был из 50-х годов, связанный с особенностями тогдашних ЭЛТ-мониторов.
Я до сих пор у себя на Маке консоль, терминал, делаю с зеленым текстом. Мне очень нравится. Я очень доволен.
Это привело к массовому внедрению компьютеров в бизнесе. Как я уже сказал, вот в таком простом офисном. То есть если до 81-го года в офисах в основном были всякие печатные машинки, а компьютеров — раз-два, то теперь персональные компьютеры расползлись по всем местам. С приложениями в виде принтеров и даже, страшно сказать, модемов. Модем-то выглядел как вот плоская коробка из нашего детства, у нее сверху обычно ставился телефон. Такой, знаете, вот этот с диском, который… Ну или уже с кнопочками. Но архаичный фактор — такой старинный телефончик этот, с большой трубкой.
В 83-м Apple, не желая уступать, выпускают Apple Lisa, в котором есть, страшно сказать, графический интерфейс. Это сразу закладывает мысли всякие в головы программистов о том, нельзя ли создать какой-нибудь язык программирования, чтобы он тоже использовал графический интерфейс. То есть чтобы там разные, допустим, объекты можно было вот так мышкой перетащить и один на другой положить, и все. Это в итоге приведет к появлению ряда языков, какие-то более известные, какие-то менее. Самый, наверное, известный — это Microsoft Visual Basic, который, с одной стороны, строился почти на том же синтаксисе, что и старинный этот BASIC.
Как старинный? За 10 лет с лишним его популярного использования BASIC расползся на такое количество диалектов, так сказать, подъязыков, которые многие были друг другу несовместимы совсем, что трудно сказать, сколько я от первоначального BASIC в этом вижу. Я его просто никогда не видел, поэтому не могу. Но зато там были как раз за счет графического интерфейса элементы объектно-ориентированного программирования и компонентно-ориентированного программирования.
Опять же, для чего все это нужно? Для того нужно, что если вы хотите программировать что-то, что там по экрану движется, выглядит как иконка, как корзина какая-нибудь, куда-нибудь что-нибудь перетягивается мышкой, то очень удобно об этих вещах судить как об объектах. И вот, собственно, объектно-ориентированное программирование является достаточно удобной парадигмой для того, чтобы все эти вещи программировать. То есть у каждой… я не знаю, папку вы перетягиваете. У папки есть название, у папки есть, где она находится физически на компьютере, адрес какой-то, есть список содержимого и так далее и тому подобное. Все это, по сути, является объектом. И всю эту информацию удобно обрабатывать как одно единое целое. Концептуально — как объект под названием «папка».
Эти соображения подвигли Гвидо ван Россума к 1991 году создать Python. У нас в России его постоянно называют «питоном», но на самом деле он именно Python, потому что он назван не в честь змеи, а в честь труппы комической «Монти Пайтон». И руководство по Python в игре содержит множество отсылок и шуток на эту тему.
Ван Россум хотел, чтобы Python был вот таким прямо ультраобъектно-ориентированным, максимально использовал описанные только что Ауралиеном преимущества и при этом имел достаточно минималистичный синтаксис. Потому что Ван Россум считал, что современные ему программисты непроизводительные за счет того, что у них код некачественный, в нем много символов и мало толку. По этой причине Python считается за такой язык для крутых программистов, которые берут качеством, а не количеством. Правда, некоторые ругаются, что по сравнению с языками C-семейства он более низкоскоростной в смысле работы программ на нем. А кроме того, программы на нем получаются толще и занимают больше места, в смысле на жестком диске. То есть не по объему кода, а именно по тому, как они после компиляции выглядят в качестве исполняемых файлов.
В 1995 году Расмус Лердорф решает создать подобный язык для того, чтобы работать в интернете, в частности, с динамическими веб-сайтами. И он создает PHP, как это у нас в России опять же называется. Изначально это означало просто Personal Homepage.
Сейчас многие из молодежи уже не знают, но в 90-е считалось очень круто завести себе домашнюю страничку в интернете, где было написано что-нибудь типа: «Здрасте, я Вася Камушкин, я увлекаюсь камчатскими вислоухими ежами, вот я на фоне вислоухих ежей, вот вислоухие ежи на фоне меня». Все это грузится полчаса, сверху так мучительно прогружается. Сейчас это все заменили соцсети, а тогда, представляете, приходилось на какие-то жертвы.
Это да. Я помню, что в конце 90-х, начале нулевых типичное расширение на многих сайтах с котиками и прочим как раз было .php. Все на нем базировалось.
И этот 95-й год является годом тройной важности для языков программирования, потому что тогда же Джеймс Гослинг создает… Изначально он хотел назвать его Oak, «дуб» типа, но оказалось, что такой язык уже кто-то придумал. Поэтому его назвали Java, в честь «Явы». Только не той Явы, которая остров, а кофе марки Java.
Да, не тот «Ява», который мотоцикл.
Да. Но они как бы все названы в честь острова Ява, я так понял. И даже папиросы «Ява» названы. Хотя черт его знает, при чем тут папиросы. Но факт тот, что у них там на логотипе кофейная чашечка — она именно оттуда. Многие ее видели в бытность.
Так вот, первоначально идея была такая, что этот язык будет использоваться в карманном компьютере Star7. Star7 был, конечно, очень крутым компьютером, особенно для 95-го года. Но это его и погубило. Он был слишком крутым для 95-го года. Может быть, на него и был бы спрос, но он стоил 50 долларов.
50 долларов. Недорого.
Ну, ты учитывай, что это как вот сейчас калькулятор купить. Тогдашних долларов.
Ну, тогдашних долларов, да. Короче, он не нашел спроса, не взлетел. Была попытка задействовать эту самую Java в проекте какого-то интерактивного телевидения. Его не успели начать, как поняли, что это уже все, уже интернет, так сказать, заполонил. Телевидение — вчерашний день для старых бабок. Поэтому его вовремя забросили, а Java переориентировали.
Наработки, которые были с этим интерактивным телевидением запилены, оказались очень кстати для того, чтобы создавать клиент-программы и серверные программы. Ну и в целом клиент-серверные тоже. И вот Java так, в принципе, в современности и используется. То есть она никуда не делась, она до сих пор существует, выпускаются обновления всего этого дела и там среды исполнения кода, написанного на Java. Потому что как-то все написано. Там еще более абстрактно все устроено. То есть там есть программа, которую вы пишете на Java, она исполняется в особой среде исполнения, которая уже все в машинные коды преобразует и делает все как надо. То есть там еще больше промежуточных слоев, которые непосредственно превращают написанную программу на языке программирования высокого уровня в конкретные команды.
И современная ниша Java действительно, как Домнин абсолютно верно заметил, заключается в том, что ее используют для серверных приложений, ее использует суровый такой интерпрайз, всякие крупные конторы, в которых много написано разного. Банки, всякие транснациональные корпорации очень любят писать свои системы на Java, потому что Java — все ее знают, это фактически стандарт де-факто во многих областях человеческой деятельности. Она хорошо поддерживается, и обычно Java — это везде старое, потому что системы обычно используются длительное время. Не сказать, что десятилетиями — Java не настолько старая, но годами. Получается так, что обновлять эту самую версию Java никто не хочет, и все используют суперстарую Java просто для того, чтобы у них все продолжало работать и все у них было совместимо.
Для Android-приложений Java почти единственный язык.
Нет, конечно, нет. Значит, с Android-приложениями следующим образом выглядит дело. Действительно, первые приложения писались на Java, а потом они придумали новый модный молодежный язык под названием Kotlin, который более быстрый, который мультипарадигменный, он позволяет писать кода меньше. Проблема Java, одна из проблем Java, заключается в том, что для того, чтобы написать там что-то очень простое, нужно написать очень-очень много кода. То есть она крайне многословная, эта самая Java. Kotlin в этом плане гораздо лучше. Он удобный, он современный. Он существует, я не знаю, сколько там лет, наверное, 5–7, черт его знает. Я думаю, меньше 10 лет ему, я сейчас не скажу точно. Но вот в основном сейчас, конечно, стараются от Java в Android уходить и писать на этом самом Kotlin.
Примерно точно так же, как для iOS, для iPhone, для iPad пишут вместо Objective-C теперь программы на языке программирования Swift, которые, внимание, спойлеры, очень сильно похожи на Kotlin, а Kotlin очень сильно похож на Swift. Потому что все они друг на друга смотрят и тырят друг у друга идеи. Хорошие. Поэтому языки эти крайне друг на друга похожи.
Вот я, например, в начале нулевых как раз играл в RuneScape. Это была браузерная MMORPG, которая, в принципе, для меня была первой MMORPG, которую я вообще еще школьником сумел заценить. Она на Java. Тогда вообще все эти, знаете, веб-игры были массово написаны на Java. Zoom, помните? Вот и она тоже. Из более свежего — Minecraft. С Minecraft все упирается в то, чтобы писать для него всякие сторонние костыли, и тоже надо писать на Java. Ну вот и все. Ничего себе.
Говорят, что и Assassin’s Creed тоже будто бы на Java. Я тут не могу подтвердить или опровергнуть. Это что говорят.
И в третьем, так сказать, языке 95-го года… Изначально он предназначался для использования совместно с Netscape Navigator. Сейчас уже никто не помнит, что это за Navigator и что за Netscape такой. Он благополучно во второй половине 90-х помер.
Да. Потому что Netscape Navigator, я все борюсь с тем, чтобы не брякнуть Netflix вместо него, потому что Netscape уже давно-давно сгинул. Netscape когда-то был, как бы сказать, вот как Chrome сейчас какой-нибудь. Даже больше, чем Chrome. Просто потому, что в 90-х реально браузеров популярных было два: 90% было у Netscape Navigator и 10% — у Microsoft Internet Explorer, на который сейчас все плюют. Недавно его похоронили, теперь у них же Edge вместо всего этого.
Факт тот, что, может быть, Netscape Navigator жил бы и дальше, и плодил бы новые языки. Проблема в том, что Билли решил действовать по заветам своей сенатско-конгрессовской семейки и начал нечестную конкуренцию. То есть когда вышла Windows 98, в ней Internet Explorer был интегрирован так, что там на него все было завязано. То есть если вы застали те времена: вот если в 95-м там всякие значки и прочее открывал двойной щелчок, выделялся одинарным, то в 98-м там изначально стоит, что выделяются наведением, как ссылки в те времена, а одним щелчком открываются. Меня это сразу пробесило, просто потому что это очень медленно и тупо. Я это сразу вернул обратно. Но факт тот, что Internet Explorer стали совать по умолчанию туда. И Netscape пытались судиться, рядиться и ничего, в общем, не добились. После этого Netscape Navigator быстренько сдулся, и все стали сидеть через кривой-косой Internet Explorer. И сидели вплоть до нулевых.
Так вот, несмотря на такой печальный конец Netscape Navigator, для него как раз в 95-м, когда он еще был на коне, разрабатывался Бренданом Эйхом язык, который первоначально должен был именоваться Mocha. Я очень рад, что его переименовали. Это была бы «моча» у нас. У нас уже с Паскалем-то проблемы. Помнишь древний баян с Башорга, где чувак какой-то поставил себе в мессенджере статусом Pascal, и все ему стали писать в таком духе, будто они это читали как «пас-сал»? Так что с Mocha, я подозреваю, вышло бы еще хуже.
Но, к счастью, ее назвали по-другому. К счастью, из-за того, что как раз тогда Java стал известен как next big thing, было решено назвать его как-нибудь так, но только чтобы нельзя было схватить за копирайт какой-нибудь. Поэтому назвали его JavaScript. И он с нами по сей день, друзья. Еще один объектно-ориентированный язык, славен своей способностью автоматической уборки мусора. То есть выкидыванием объектов, которые на данном этапе исполнения стали ненужными.
Да, действительно. Раз про уборку мусора мы заговорили. Действительно, все эти языки высокоуровневые и особенно объектно-ориентированные имеют нехорошую тенденцию терять память, скажем так, по-простому.
Утечка памяти.
Да. Все зависит от того, насколько все хорошо программируется людьми, но как это выглядит вообще обычным образом? То есть вы для того, чтобы что-то сделать, поработать с какими-нибудь данными, должны для этих данных выделить память. После того как вы с данными поработали, получили какой-то результат, вам эта память больше не нужна. И дальше вы либо сами должны освободить эту память, либо вы должны положиться на свой компилятор или на среду исполнения, которая на самом деле будет эту память для вас освобождать. Конечно, не компилятор, а среда исполнения. То есть эта память может либо сама освободиться автоматически, что кто-то запрограммировал логику, как это сделать, либо вы должны ее освободить сами.
И вот для более старых языков это была большая проблема, потому что памяти было мало везде и надо было эффективнее ей пользоваться. И программы долгое время писались так, чтобы делать какие-то тяжелые вещи с небольшим объемом памяти. Там придумывались разные хитрые хаки и так далее и тому подобное. Особенно это характерно сейчас, если мы будем смотреть, как, например, программировали для каких-нибудь марсоходов, которые работают на программном обеспечении, написанном на C, и у них крайне, особенно те марсоходы, которые более ранние, у них крайне, в общем-то, такое скромное железо. И нужно было очень сильно изгаляться, чтобы там все сделать как надо.
Но, тем не менее, память действительно может теряться. И если этой памятью не заниматься непосредственно, то есть не освобождать ее самостоятельно, или если у вас операционная система или среда исполнения не умеет ее освобождать, память у вас может рано или поздно закончиться, и вам придется перезагружать свою машину, потому что все перестанет просто работать.
Те, кто играл в видеоигры сразу после их выхода, могли замечать, что в ходе все нормально, ничего не тормозит. 15 минут проиграл — уже начинаются какие-то тормоза необъяснимые. Через полчаса приходится ее включать-выключать обратно, потому что иначе невозможно. Это как раз утечка памяти из-за того, что ненужные более операции продолжают занимать место.
Да. И вот современные среды исполнения умеют делать то, что называется garbage collecting, то есть сбор мусора. Это мусор имеется в виду память, которая была выделена для чего-то. Там хранятся промежуточные результаты вычислений, но более они не нужны, потому что вычисления ваши закончились. Современные языки программирования и современные среды исполнения программ умеют обычно очень хорошо с этим работать.
Этим, кстати, отличается, например, тот же самый старый язык программирования для айфонов Objective-C от нового Swift. В Swift все это делается автоматически, а в старом Objective-C, который старый-старый, прямо образца, например, 2010–2011 года, нужно было программировать таким образом, чтобы память у вас освобождалась после того, как вы с чем-то поработали. То есть вы показали какой-то интерфейс на экране айфона, пользователь с ним повзаимодействовал, вы этот интерфейс спрятали. Теперь его вам надо еще удалить из памяти. То есть нужно было писать руками код, там retain/release, что вот, пожалуйста, счетчик использования этого объекта увеличивается на единицу, а release уменьшает. И как только этот счетчик доходит до нуля, операционная система выкидывает объект и говорит, что эта память теперь может использоваться повторно.
Да. Ну вот, и, в общем, с таким багажом мы до наших времен дожили. Я прямо, когда читал материалы для этого выпуска, содрогался о том, как ужасно все было в конце 80-х, когда мы родились. То есть самым типовым, насколько я помню, советским персональным компьютером на момент нашего рождения был «Микроша». «Микроша» представлял собой фабричную версию самодельного компьютера «Радио-86РК». РК — это значит «радиолюбительский компьютер», который предлагалось по инструкции из бумажки пилить: самому сделать платы, монтировать на них всякое. А этот «Микроша» производился у нас в Москве, в районе Алтуфьева, у нас завод есть электромеханический.
Выглядел он вот как то, что мы видели в той книжке про роботов, то есть как такая толстая клавиатура с блоком питания. Ее надо было включать в телек. И там был, страшно сказать, процессор с частотой 1,77 МГц, 32 килобайта оперативы.
Да.
И к нему были приложены аудиокассеты с программами. Там были загрузчик, редактор, ассемблер плюс дизассемблер, текстовый редактор, какой-то примитивный графический редактор. Я с трудом представляю, кому и зачем мог понравиться графический редактор в таком исполнении. Пара игрушек, типа «Тетриса», «Пакмана», еще там чего-то. И Бейсик еще тоже. Ну вот, работайте, программируйте.
Хорошо, что мы уже в чуть более позднем возрасте вошли в состояние интереса к компьютерам, а то пришлось бы нам тоже паять платы и писать на Бейсике.
Вообще, конечно, что сказать. Как человек, который имеет удовольствие общаться с современными языками программирования на ежедневной основе практически, я, конечно, могу вам доложить, что прогресс идет семимильными шагами. По сравнению с тем, что было 10–20 лет назад, 30 лет назад, это, конечно, небо и земля. Постоянно идет упрощение. Не упрощение в смысле того, что все становится примитивнее, а упрощение в смысле того, что инструментарий разработки программного обеспечения становится все более и более удобным для использования. Все больше и больше вещей берет на себя компилятор, берут на себя среды исполнения, берет на себя операционная система. И мы, как программисты, можем больше фокусироваться именно на функционале того, чего мы хотим добиться, нежели на том, как именно мы этого хотим добиться.
Еще я хотел сказать: мы пробежались по языкам программирования, по некоторым наиболее типичным. Совершенно очевидно, что их гораздо больше, чем мы можем осветить вообще, потому что этих языков, во-первых, существует великое множество просто потому, что некоторые из них имеют чисто утилитарное применение. Есть отдельные языки программирования, которые используются в каких-то хитрых аппаратно-программных комплексах. Есть языки программирования, которые используются, например, для военных задач и так далее.
Кроме того, современные языки программирования могут между собой различаться. Вот тот же самый Python. Вообще, Python этих по большому гамбургскому счету два. Есть Python 3 и есть Python 2, более старый. Они между собой на самом деле немного различаются по историческим причинам. Но, тем не менее, я не знаю, правда, сейчас насколько Python 2 все еще распространен. Python 3, я так понимаю, вся новая разработка обычно начинается на нем. Но если у вас есть что-то написанное на Python 2, скорее всего, и это что-то такое большое и раскидистое, скорее всего, вы будете какое-то время все это дело продолжать поддерживать, просто потому что переписать с одного языка программирования на другое что-то крайне тяжело.
Кроме того, все эти языки можно классифицировать некоторым образом. Вот мы уже немножко коснулись того, что есть языки, значит, функциональные, где вы прямо компьютеру говорите, что делать шаг за шагом. Есть объектно-ориентированные, которые оперируют понятиями объектов, связями между объектами, и то, что у вас происходит в вашей программе, рассматривается через призму взаимодействия разных объектов друг с другом. Причем иногда это объекты очень абстрактные, сложные, которые инкорпорируют в себя, например, связи между другими разными объектами.
Например, у вас есть экран первый, экран второй, и между ними вам нужно передавать много данных, чтобы их с первого экрана… Да, вот в первом экране что-то ввели, что-то посчиталось. На втором экране, который показывается после первого, нужно отобразить какие-то промежуточные результаты, еще что-нибудь у пользователя запросить. Все это передается через какой-то сложный объект под названием «контекст», который содержит в себе информацию, которая была посчитана, введена и так далее.
Объектно-ориентированные языки и функциональные языки группируются в так называемую императивную группу языков по парадигме программирования. То есть что здесь такое? Это когда вы говорите компьютеру, как чего делать. Контрастирует с императивной группой группа декларативных языков. Это когда вы компьютеру говорите, что именно надо сделать, но не как это сделать. То есть это функциональные языки, про которые мы сегодня особо не распространялись, какие-то там еще хитрые, еще более хитрые подходы, какие-то логические. Я вижу тут, Википедия мне подает здоровенный список. Но смысл заключается в том, что в этих языках вы чаще всего просто описываете, какой вам нужен результат. Компьютер сам выясняет, как это сделать.
И большинство современных языков, что Python, что Kotlin, что Swift, что Java, всякое разнообразное, и что языки, построенные на Java, обычно являются мультипарадигменными языками. Что это означает? Это означает, что на этих языках можно писать во всех вот этих парадигмах. То есть и функционально можно писать, и объектно-ориентированно можно писать, и можно даже писать структурно. То есть в зависимости от решаемой вами задачи вы можете писать в том стиле, какой вам нужен.
Какая здесь может быть аналогия? Это когда вот вы, вместо того чтобы… У вас там есть молоток, и вы им все делаете одним-единственным. А у вас помимо молотка есть еще топор, есть какие-нибудь кусачки, есть пила. И вы можете при помощи этого инструментария сделать гораздо больше, чем при помощи одного молотка. Вот современные языки — это на самом деле большой ящик с инструментами, который позволяет решать задачи наиболее удобным образом и наиболее быстро, в зависимости от того, что именно вам нужно сделать.
В общем, да, про языки программирования, на самом деле, можно говорить очень долго. Мы постарались максимально просто и максимально компактно рассказать о том, что являлось основными вехами в их развитии. Для этого у нас есть специальный абсолютно безграмотный в программировании Домнин, который вынужденно все это очень просто и максимально кратко рассказал.
Да-да, на самом деле пришлось столько слов узнать, о которых я вообще даже не подозревал, что они существуют. Причем многие вещи из того, что ты объяснял, я как бы понимал, я просто сказать не мог. Я как собака: все понимаю, но сказать не могу.
Ну да. Здесь, к сожалению, трудно рассказывать о языках программирования и об истории появления программирования простыми словами, потому что очень-очень все сильно менялось. Вот начиная с тех же самых перфолент, перфокарт — менялось вообще все. Менялась аппаратная база, менялись подходы к программированию, менялось вообще понимание того, как надо программировать. Менялось понимание того, для каких устройств надо программировать. Какие-то это компьютеры, или это какие-то портативные устройства, или это какой-то сервер, который работает в интернете и что-то показывает пользователю на их локальных машинах.
Постоянно происходили вот эти изменения, и аппаратно-программная база тоже постоянно менялась. И поэтому, на самом деле, для того чтобы разбираться в том, как устроено вообще программирование, как оно эволюционировало, это вообще, по большому счету, отдельная работа. Это история программирования. Историк, который специализируется на программировании. Чтобы как-то понимать принципы работы этих компьютеров, там иногда даже надо физику понимать, например, особенно для более ранних каких-то компьютеров.
Конечно, то, что мы имеем сейчас, когда люди могут изучать программирование без каких-то особых математических, например, познаний, или физических познаний, или даже познаний в computer science, то, что у нас по-русски называется информатика, — это, в общем-то, большое достижение. И это большое упрощение именно инструментария, который позволяет заниматься этим самым программированием.
Но, опять же, программирование бывает очень разное. Одно дело — программировать для мобильных телефонов, другое дело — программировать марсоход. Это очень разное программирование, поверьте мне, и по инструментарию, и по подходам, которые используются, и по парадигмам, которые используются для этого программирования, и как это все устроено.
И мы сегодня фокусировались именно на том, как эволюционировала сама вот эта идея создания чего-то, что будет использоваться для каких-то вычислений. Потому что если говорить о программировании как о современной индустрии программирования, конечно, это отдельная большая тема: как работать вместе с другими людьми, где хранить свой программный код, на чем этот программный код должен исполняться, как контролировать качество этого программного кода и так далее и тому подобное. То есть вот этих тем мы не касались просто потому, что нельзя впихнуть невпихуемое в подкаст об истории. Поэтому да, как-то вот так мы сегодня выступили.
Ну и на этой позитивной ноте будем переходить в послешоу.