Кто говорит на языках программирования
И как эти языки развиваются, становясь всё удобнее для человеков (и машин)
Программы, упрощающие нашу работу на компьютере, пишутся на языках программирования. Языки программирования также написаны на языках программирования. Так мы, люди, шаг за шагом идём к взаимодействию с машиной на простом человеческом языке. Ну наконец-то!
Как всё начиналось
Знаменитая статья Алана Тьюринга, которую позже перепечатали под названием «Может ли машина мыслить?», сперва была опубликована в научном журнале Mind в 1950 году под заглавием «Вычислительные машины и разум» (Computing Machinery and Intelligence).
Но первый язык программирования появится значительно раньше. Его предшественником можно назвать машинный алгоритм Ады Лавлейс, дочери лорда Байрона. Названная в честь сестры поэта, Ада за всю жизнь так и не увидела отца — из-за развода родителей. Анна Изабелла Байрон, мать Ады, постаралась увлечь свою дочь математикой, опасаясь, что та, как и её отец, займётся поэзией.
Познакомившись с Чарльзом Бэббиджем, проектировщиком аналитической машины, Ада стала его соратницей и помощницей. Хотя Чарльз Бэббидж так и не построил работающий прототип, многие его наработки помогли другим изобретателям того времени. Только сыну Бэббиджа удалось закончить работу отца.
Понимая принципы действия аналитической машины, Ада написала первую в мире программу, введя понятия «цикл», «прерывание» и другие, знакомые теперь каждому программисту.
Более того, в своих записях она предполагала, что аналитическая машина способна создавать алгебраические формулы, а в перспективе — писать музыку и картины. Нынешнее развитие искусственного интеллекта показывает, насколько она была права.
В ходе дискуссий, сопровождавших разработку первого лампового компьютера под названием ENIAC, Джон фон Нейман и его коллеги составили документ, который описал созданное ими устройство, — это способствовало появлению машинных языков.
Затем Кэтлин и Эндрю Бут разработали проект раннего цифрового компьютера, так называемого автоматического релейного калькулятора (Automatic Relay Calculator). В далёком 1946 году Эндрю Бут в основном занимался конструированием ЭВМ, а Кэтлин Бут — программированием. Учитывая принципы построения цифровых машин, Кэтлин написала команды, на основе которых в дальнейшем был спроектирован язык Assembler.
Язык машинных инструкций состоит из комбинаций нулей и единиц, так что он непонятен для человека.
Поэтому для написания программы человеку необходимо описание машинных команд в более удобной форме, например в виде текстовых мнемоник. Таким описанием и стал Assembler.
Но уже тогда становилось понятно, что недостаточно просто писать команды для компьютера, необходимо решать инженерные задачи и описывать структуру программы более полно. Например, в 1843 году Ада Лавлейс написала программу для вычисления чисел Бернулли — последовательности рациональных чисел, играющей важную роль в математике. Такое описание требует сложных для машины абстракций. А языки, подходящие для работы с такого рода абстракциями, называют высокоуровневыми — в противовес низкоуровневым, машинным.
Ассемблер не был единственным языком программирования в 40-е и 50-е годы: в это же время появляются Plankalkül, Short Code и другие. Они уже были высокоуровневыми в нашем понимании, но ещё простыми, процедурными языками.
С середины 50‑х годов создавался высокоуровневый язык Fortran. И в 1957 появился компилятор для этого языка, позволяющий перевести код, понятный пользователям, на машинный язык. Удобство Fortran и эффективность компилятора способствовали росту популярности. Уже к 1963 году было создано более 40 компиляторов для большинства распространённых ЭВМ. Таким образом, Fortran стал первым широко распространённым языком программирования.
Не зря профессора из знаменитой советской книжки про компьютеры звали Фортраном!
В 1958 году в Германии и США создали Algol. В этом языке реализовали концепцию структурного программирования: программа разбивалась на подпрограммы, что упрощало разработку и поиск ошибок. До появления Algol программа была неструктурированной последовательностью команд. Наряду с Fortran, применявшимся для вычислений в научных работах, Algol стал популярен в академических кругах.
Язык Cobol, максимально приближенный к английскому языку и понятный даже тем, кто не владел программированием, был создан в 1959 году. Новшеством этого языка стало введение структуры данных «запись», объединяющей данные разного типа, например строки, числа или даты. Новые языки позволяли писать программы без лишнего погружения в машинный код, становились процедурными, стремились к доступности и упрощению.
В основе — простота
И наконец, язык BASIC был разработан Томасом Курцем и Джоном Кемени в 1964 году. В самом названии языка заложено его ключевое свойство — простота. Задуманный для пользователей без технического образования, этот язык открыл для многих программирование. Когда я только познакомился с компьютером, это был первый язык, который я узнал.
«Бейсик» помог мне увидеть компьютер с другой стороны: не как средство для игр или инструмент офисной работы, а как машину, творящую чудеса.
Идея разработки языка, доступного не только программистам, но и пользователям, посетила также Никлауса Вирта. Ранее учёный принимал участие в разработке языка Algol. Используя полученные знания, в 1972 году он написал язык с доступным для понимания синтаксисом и упрощённой компиляцией. Компилятор, созданный для Pascal, трансформировал изначальный код в код языка Ассемблер, для работы с которым требовался только интерпретатор. Это нововведение потом применили при написании языка Java.
Позднее Pascal зарекомендовал себя как язык для обучения программированию. А BASIC после появления персональных компьютеров стал самым доступным для пользователя языком программирования на них.
До сих пор язык BASIC помогает многим людям там, где нужно простое программирование. Например, его диалект, Visual Basic, используется для работы с графическими интерфейсами, требуется для разработки профильных приложений, встроен во многие офисные программы.
В 1969 году разработали операционную систему, предназначенную для одновременной работы нескольких пользователей. С полуночи 1 января 1970 года начинается «эпоха UNIX», компьютеры всего мира отсчитывают время от этой даты.
В 1971 году был изобретён микропроцессор, после чего, в середине 70‑х, началось массовое распространение персональных компьютеров. Появление ОС широкого профиля требовало создания языков для их написания. Такими языками стали C и C++.
И кое-что посложнее
Синтаксис языка C сопоставим с типичными машинными инструкциями. Но при этом язык был более высокоуровневым, поддерживал типизацию данных и работал с привычными для программистов абстракциями: числами, датами, строками, файлами. Этот язык, можно сказать, был создан для написания операционных систем — и до сих пор остаётся востребованным для таких задач. Язык программирования C разрабатывался сотрудниками компании Bell Labs Кеном Томпсоном и Деннисом Ритчи на базе ранее созданного ими языка B. Видно, что с названиями ребята не очень заморачивались...
Также Томпсон и Ритчи создали операционную систему UNIX. Первая редакция ОС UNIX была написана на языке Assembler, но он не решал все поставленные задачи. Вторая редакция ОС UNIX была написана на языке B. Редакция со встроенным компилятором языка C, во многом на нём написанная, стала третьей по счёту и вышла в 1973 году.
С появлением UNIX и подобных операционных систем программисту больше не нужно было понимать, как технически работает его компьютер. Вместо этого ему нужно было понимать, как работает операционная система. Теперь можно было не думать о байтах и битах — предстояло думать о том, как описать реальные объекты на языке программирования. Для этих задач язык C не подходил. Это и послужило толчком к созданию языка C++ и дальнейшему развитию концепции объектно ориентированного программирования.
Одним из первых языков, оперирующих не командами, а объектами, был язык Simula 67. Написанный в 60-е годы, он во многом опередил своё время. Синтаксис этого языка больше напоминает языки процедурного характера, такие как BASIC.
В 80‑х годах Бьёрн Страуструп, работая над задачами теории очереди, пришёл к выводу о необходимости создания языка, который, с одной стороны, будет быстрым, а с другой — будет описывать сложные объекты. Он взял за основу язык C и дополнил его конструкциями из языка Simula. Так появился C++. В итоге C породил целое семейство языков с похожим синтаксисом, их называют C-подобными языками: С++, Java, С#.
В 1981 году появились IBM-PC-совместимые компьютеры. Это дало толчок к развитию таких систем, как MS-DOS. Встал вопрос о разработке массовых программ со сложным графическим интерфейсом. Языки BASIC и Assembler всё ещё оставались востребованными, но постепенно уступали C-подобным языкам.
Уже с середины 80‑х начала широко распространяться клиент-серверная архитектура. По мере её развития требовались новые подходы в языках программирования, что привело к написанию таких серверных языков, как Python, PHP и другие.
1991 год многое изменил: появился протокол HTTP, идентификатор URL и такое явление, как Всемирная паутина (World Wide Web). Мир стал глобальнее и ближе.
История развития языка клиентских приложений JavaScript тесно связана с историей развития браузеров. Браузер NCSA Mosaic, наряду с протоколом HTTP обеспечивший доступность интернета, был выпущен в 1993 году. Его основными разработчиками были Марк Андриссен и Эрик Бина. Вскоре после разработки Mosaic Марк Андриссен покинул NCSA и вместе со своими друзьями основал компанию Netscape Communications Corporation, основным продуктом которой стал браузер Netscape.
Марк Андриссен, его коллега по Netscape Communications Брендан Айк и Билл Джой, сотрудник Sun Microsystem, написали JavaScript, язык для веб-дизайнеров и программистов, не обладающих высокой квалификацией.
Они хотели создать язык, который, с одной стороны, будет встраиваться в саму страницу, а с другой — соединять разрозненные мультимедийные части. Преальфа языка была включена в Netscape 2. А 4 декабря 1995 года язык был переименован в JavaScript, для этого была получена лицензия у компании Sun. Его пришлось переименовать из-за популярности слова Java в среде программистов — в связи с тесным сотрудничеством компаний Sun и Netscape и их общей позицией по отношению к развитию языка.
JavaScript сделали стандартным языком браузеров. И он остаётся таким по сей день.
Битва браузерных языков
Взяв за основу браузер Mosaic, компания Microsoft разработала браузер Internet Explorer, по умолчанию включённый в набирающую популярность операционную систему Windows. В отличие от Netscape Navigator, Internet Explorer был доступен бесплатно. Такая политика компании Microsoft привела к её победе в первой войне браузеров. В 1999 году рынок коммерческих браузеров перестал существовать, Internet Explorer захватил 99% рынка. После того как компания Netscape в связи с долгами была перекуплена провайдером AOL, разработчики выложили исходный код своего браузера в открытый доступ, что дало толчок к появлению браузера Mozilla.
В борьбе за конкурентное преимущество компания Microsoft в 1996 году выпустила аналог языка JavaScript, названный JScript. Microsoft и Netscape вносили всё больше несовместимых друг с другом улучшений в разрабатываемые языки.
После победы над Netscape не существовало единого стандарта скриптового языка браузера.
Вопрос стал настолько острым, что в том же 1996 году по инициативе компании Netscape ассоциация ECMA начинает стандартизацию семейства JavaScript-подобных языков. Спецификацию приняли в июне 1997 года. Позднее в семейство ECMA-языков вошёл ещё один язык, активно повлиявший на облик интернета в 2000 годах: язык Flash-приложений ActionScript. Хотя технология Flash была стандартом мультимедиа и браузерных игр в 2000–2010 годах, в ней неоднократно находили уязвимости. В 2015 компании Facebook и Mozilla призвали к отказу от использования технологии, за этим последовал массовый бойкот со стороны браузеров.
Попытки создать портативное устройство предпринимались ещё в 90‑х. В рамках одного из проектов, опередивших своё время, — Star7 компании Sun Microsystems — был написан язык Java, сперва использовавшийся как язык серверных приложений. Позже он перешёл в нишу мобильных устройств и стал основным языком ОС Android.
Портативные компьютеры стали популярны благодаря Стиву Джобсу и его компании Apple. В 2007 году появляется первый iPhone. Активно ворвавшись в гонку мобильных устройств, он на долгие годы определил представление пользователей о мобильном интернете. Вместе с появлением новых устройств появились и новые требования.
Началась новая война браузеров, закончившаяся победой Webkit. Сегодня на основе Webkit написано большинство браузеров.
А разработка JavaScript-интерпретатора V8, созданная для браузера Chromium, позволила использовать JavaScript вне браузеров при помощи платформы Node.js.
В 2000-е, после появления архитектуры x86-64, встал вопрос о создании языков, которые заменят C. Язык C разрабатывался до появления IBM-PC-совместимой архитектуры, и некоторые его особенности были продиктованы спецификой архитектуры PDP-11, для которой писалась операционная система UNIX. Сам язык C далеко не всегда точно отражал особенности аппаратной архитектуры, если она отличалась от архитектуры PDP-11.
Требовались языки, которые заменят C, прежде всего в применении новых возможностей процессоров, например многопоточности. Такими языками стали Rust и Go, разработанные в конце 2000‑х и начале 2010‑х.
Развитие аналитических инструментов и появление большого объёма данных продолжали перекраивать ландшафт языков программирования. В 2015 году появилась платформа TensorFlow, которая дала вторую жизнь Python. К 2024 Python стал одним из самых популярных языков.
Визуальное программирование и общение с машиной на человеческом языке могут заменить языки программирования там, где требуются новые средства решения рутинных задач. А появление больших языковых моделей и No-code-платформ подтверждает этот тренд. Сегодня даже школьник может решить сложные задачи через простые интерфейсы.
Ну а вы теперь знаете обо всех основных языках программирования: откуда они появились и для чего нужны. Отличненько, едем дальше!