Опережая время: какой язык программирования считается первым
Мы решили разузнать, какой язык программирования был самым первым. Чтобы разобраться в вопросе, начали с зарождения информатики в XIX веке.
Первый программист Ада Лавлейс
Говоря о первом языке, сложно умолчать о первом программисте. Графиня Ада Лавлейс, дочь лорда Байрона, всю свою жизнь посвятила математике и механике, трудилась в свое удовольствие без зарплат и дедлайнов. Результатом ее любви к точным наукам стали описание первой в мире вычислительной машины и создание программы для нее.
Аду Лавлейс часто упоминают вместе с Чарльзом Бэббиджем. Он изобрел первый прототип современного компьютера — логарифмическую машину. Но реализовать ее не удалось: проект разрастался на бумаге, а финансирование от английской короны заканчивалось. Ада познакомилась с ученым при дворе, и с этой встречи началось ее глубокое увлечение его работами.
В 1840 году изобретение Бэббиджа привлекло внимание профессоров из Турина. Он получил приглашение от итальянского правительства, где военный инженер Луиджи Менабреа взял у него интервью о принципах работы разностной машины и издал статью на французском.
В то же время Ада занялась переводом статьи на английский язык, параллельно переписываясь с Бэббиджем. Она не только перевела принцип работы, но и сопроводила его обширным комментарием. В нем она описала алгоритм для вычисления последовательности Бернулли с помощью машины. Кстати, его используют до сих пор, поэтому программа опередила себя на несколько десятков лет. Аду Лавлейс по праву считают первым программистом в истории человечества. В 1980 году в США новый язык назвали в ее честь.
Я не считаю, что структуры головного мозга менее подвластны математикам, нежели движения и свойства звезд и планет; вполне, если выбрать для их рассмотрения правильную точку зрения. Я хотела бы оставить последующим поколениям вычисляемую модель нервной системы.
Машинный код и языки ассемблера
Масштаб работы Бэббиджа и Лавлейс оценили только в ХХ веке, когда научно-технический прогресс шагнул вперед и математики нового поколения увидели, что все это уже было до них.
В 1940-х годах инженеры начали конструировать первые электронно-вычислительные машины — громоздкие, неудобные и с перфокартами. Вот такие:
Для передачи команд использовали цепочки нулей и единиц — машинный код. Мягко говоря, не самый удобный вариант для программистов: приходилось «разговаривать» с компьютером на его языке, хорошо знать составляющие ЭВМ. А еще легко было допустить ошибку при записи кода.
Процесс создания программ требовал автоматизации, и в пятидесятых годах появились первые языки программирования низкого уровня — ассемблеры. Низкий уровень означает, что язык все еще близок к машинному коду, но уже становится проще для восприятия человеком.
Первый высокоуровневый язык Планкалкюль
Часто можно услышать, что первым языком высокого уровня был Fortran (1957). Но еще в разгар Второй мировой войны немецкий ученый Конрад Цузе создал Plankalkül — первый высокоуровневый язык. Он написал на нем49 листов программ для оценки шахматных позиций и документацию в отдельной брошюре. Работы Цузе увидели свет только после войны, в 1972 году.
Планкалкюль — электромеханический язык, так как разрабатывался для компьютера Z4. Автор не создал для него аппаратной реализации. Первый компилятор для Планкалкюля написали в Германии в 2000 году: он называется Plankalkül-2000. Его разработали в Свободном университете Берлина спустя пять лет после смерти Цузе. Это интерпретатор диалекта Планкалкюля — он чуть проще самой первой версии языка. Если вам захочется почувствовать дух истории, на нем даже можно написать простенькую программку.
Plankalkül не нашел практического применения, но вполне соответствует современным стандартам высокоуровневых языков. В нем есть четыре вида переменных, массивы, циклы, кортежи, подпрограммы и условные конструкции. С помощью языка можно выполнять простые арифметические операции и сортировку чисел.
Fortran — первый язык с компилятором
В 1957 году в компании IBM группа программистов, возглавляемая Джоном Бэкусом, представила первый работающий высокоуровневый язык Fortran. В его основе лежит принцип анализа всей строки.
Сегодня Фортрану61 год, но он до сих пор востребован и популярен в Data Science. За это время вышло множество версий, язык эволюционировал и обрел четкие стандарты. Благодаря огромному наследию кода он используется для различных вычислений в научных разработках, геологических изысканиях и астрофизике.
Если вам интересна история, взгляните на потрясающую схему развития языков программирования, начиная с Фортрана.
Как видите, однозначного ответа на вопрос, какой язык программирования придумали первым, не существует. Первую абстрактную программу написала Ада Лавлейс, первым высокоуровневым языком был Plankalkül, но эру высоких информационных технологий начал Fortran. Все они первые в личном зачете, и каждый важен для того или иного этапа развития информационных систем.
Если программирование вас вдохновляет, предлагаем пройти курс «Веб-разработчик». Вы получите представление об основах JavaScript и PHP, примените их на практике и освоите востребованную специальность.
Автор в сфере IT, digital, экономики и финансов. Ведет некоммерческий проект для начинающих писателей «ЛитЦех».
Краткая и на 146% точная история языков программирования
Жозеф Мари Жаккар учит ткацкий станок читать перфокарты, создавая первый многопоточный процессор. Изобретение в штыки приняли ткачихи, которые уже тогда что-то подозревали.
Ада Лавлейс, устав от положенного по социальному классу безделья, делает наброски в блокноте, которые станут известны как первая компьютерная программа. С поправкой, конечно, на то, что компьютеров тогда ещё не было.
Алан Тьюринг изобретает вообще всё, королева очарована им, но Тьюринг предпочитает ей мужскую компанию, что заканчивается для него печально.
Позже королева, конечно, остыла и простила Тьюринга, но тот, к сожалению, уже давно был мёртв.
Алонзо Чёрч тоже изобретает вообще всё вместе с Тьюрингом. Но будучи по другую сторону пруда избегает расположения королевы и его последствий.
Джон Бэкус создаёт Фортран — первый язык, который «используют настоящие программисты».
Грейс Хоппер, устав от спарринга с Чаком Норрисом, изобретает первый бизнес-ориентированный язык программирования. Ну а так как всё связанное с бизнесом должно иметь длинное и скучное название, она нарекает его «бизнес-ориентированным языком общего назначения» или COBOL для краткости.
Джон Кемени и Томас Курц решают, что программировать слишком сложно, и им нужно вернуться к базовым принципам. Так что они разбрасывают повсюду номера строк и называют своё детище BASIC.
Никлаус Вирт создаёт Паскаль и пару других языков программирования. Да, кому-то нравится марки собирать, а его хобби было создавать языки программирования.
Никлаус также изобретает Закон Вирта, который делает закон Мура устаревшим, так как разработчики будут писать настолько раздутые программы, что никакие мэйнфреймы не успеют за ними. Как мы знаем, это предсказание сбылось — посмотрите, например, на Electron.js и на его абстракции.
Деннис Ритчи от скуки, нагрянувшей в разгар напряжённого рабочего дня в Bell Labs, решает изобрести «C», который окажет ошеломительное влияние на индустрию: с этого момента все новые языки будут использовать фигурные скобки. «C» так же ввёл ошибки сегментации и другие инновации в программировании.
Так как до конца напряжённого рабочего дня оставалась пара свободных часов, Деннис и его приятели из Bell Labs решили создать пример программы на «C» и случайно создали операционную систему под названием Unix.
Алан Кэй изобретает объектно-ориентированное программирование и называет его Smalltalk. В Smalltalk всё является объектом. Даже объект является объектом.
Ларри Уолл становится проповедником и делает Perl доктриной.
Жан Ишбиа решает создать язык, посвящённый Аде Лавлейс и носящий её имя.
Брэд Кокс и Том Лав решают создать специальную, плохочитаемую версию «C» на основе Smalltalk. Своё детище они назовут Objective-C. И по сей день не нашлось ни одного человека, способного понять синтаксис этого языка.
Бьёрн Страуструп отправляется на своем DeLorean назад в будущее, где замечает, что «C» слишком уж быстро компилируется. Когда же в таком случае будут отдыхать разработчики? Чтобы как-то решить проблему, он добавляет в новый язык всё, что только может придумать, и называет своё детище C++.
Программисты повсеместно используют его, чтобы им не мешали читать xkcd на работе, в то время пока «ещё компилируется».
Роберту Иерузалимски и его друзья решают, что им нужен местный язык сценариев — Lua. Трагическая ошибка при переводе с бразильского приводит к тому, что индексы начинают считать с 1.
Расмус Лердорф создает язык шаблонов для своей персональной страницы в интернете.
Но мир решает использовать язык вообще для всего в вебе, так что Расмус добавляет биндинги к базе данных, и на свет появляется PHP.
Юкихиро Мацумото несчастен и замечает несчастье окружающих. Он создаёт Ruby, чтобы сделать окружающий мир чуточку счастливее. Это работает, и все становятся счастливы.
Брендан Эйх на выходных разрабатывает язык, который позже будет использоваться в каждом браузере в мире и, в конечном итоге, в Skynet.
Первоначально Брендан пошел в Netscape и сказал, что новый язык называется LiveScript, но Java стала популярной как раз во время код ревью, поэтому все решили, что лучше использовать фигурные скобки и переименовать язык в JavaScript.
Из-за проблем с товарными знаками JavaScript был переименован в ECMAScript во время стандартизации, но это уже никому не важно, все продолжают называть язык JavaScript.
Джеймс Гослинг изобретает Java, первый по-настоящему очень подробный объектно-ориентированный язык программирования, в котором шаблоны проектирования преобладают над прагматизмом.
В обиходе появляются фразы вроде «шаблон поставщика менеджера службы поставщика провайдера диспетчера контейнеров».
Андерс Хейлсберг заново изобретает Java и называет её C #, ведь программирование на «C» круче, чем на Java. Все любят новую Java за то, что она совсем непохожа на Java.
Дэвид Хансен создает фреймворк для Ruby под названием Ruby on Rails. Люди не могут понять, что это две разные вещи, и вновь становятся несчастными.
Джон Резиг пишет вспомогательную библиотеку для JavaScript. Почему-то каждый думает, что это новый язык, и целыми днями копипастит сниппеты JQuery из интернета.
Кен Томпсон и Роб Пайк решили создать новый С, но с меньшим быстродействием и большим количеством талисманов в виде сусликов.
Грэйдон Хор тоже хочет создать новый «C». Если другим можно, почему ему нельзя? Он нарекает детище Rust.
Люди требуют, чтобы каждый фрагмент любого программного обеспечения был переписан на Rust СЕЙЧАС ЖЕ. Грейдон не хочет этим заниматься и уходит работать над Swift для Apple.
Андерс Хейлсберг хочет писать на C# в браузерах, так что изобретает TypeScript, который как JavaScript, но с большей долей «Java» и меньшей «Script».
Джереми Ашкенас хочет быть счастливым, как разработчики Ruby, поэтому создает CoffeeScript, который компилируется в JavaScript, но больше похож на Ruby. Но Джереми никогда не становится так же счастлив, как были когда-то разработчики Ruby.
Крис Латтнер делает язык с целью — не быть как Objective-C. В результате Swift похож на Java.
Спор о первом языке программирования: окончательное решение
Некоторые относятся к спору о выборе первого языка программирования примерно так:
Говорят, на выбор влияет миллион фаторов и спорить по этому поводу не имеет никакого смысла. Тем не менее, холивары продолжаются.
Виталий Брагилевский решил поставить точку и на Saint AppsConf представил окончательное решение. После прочтения статьи (или просмотра доклада) вы будете знать, как правильно отвечать родственникам или знакомым, которые узнали, сколько зарабатывают в IT и что удалёнка тут не помеха, и теперь интересуются, с чего же начать.
Виталий Брагилевский работает в JetBrains и преподает в СПбГУ на факультете математики и компьютерных наук, член комитета по стандартизации языка программирования Haskell и наблюдательного комитета по разработке компилятора Glasgow Haskell Compiler языка Haskell, автор книги «Haskell in Depth».
Итак, давайте разбираться, как начать изучать программирование, какие инструменты использовать? На самом деле, это важный вопрос.
Еще Дейкстра в 1972 году написал: «. the tools we are trying to use and the language or notation we are using to express or record our thoughts are the major factors determining what we can think or express at all!»
Часто язык программирования (и язык вообще) просто не дает сделать то, что мы хотим, или дает это сделать не так, как мы хотим. Язык — это важный инструмент, и к его выбору нужно относиться серьезно.
Если совершить в этом выборе ошибку (или чаще кто-то делает выбор за ученика), то последствия могут быть серьезными. Именно так появились программисты:
Раз мы видим таких людей, то логично предположить, что первый язык программирования как-то влияет.
У меня есть персональная история на этот счет. Моим первым языком программирования был Фортран, если не считать неудачного похода на лекцию по Бэйсику, на которой преподаватель рассказывал уже о массивах, а мне как новичку все было непонятно и отбило желание продолжать. Тогда я пошел в библиотеку, взял книжку по Фортрану и стал выполнять упражнения по программированию на листочке. Мне, честно говоря, так было даже удобнее — зато компилятор не ругается.
История вопроса
Начну с так называемой проблемы Ричарда Вексельблата. Этот человек известен тем, что его PhD стала первой в департаменте Computer Science. В 1980 году он написал статью о последствиях выбора первого языка программирования (Richard L. Wexelblat. The consequences of one’s first programming language. Proceedings of the 3rd ACM SIGSMALL symposium and the first SIGPC symposium on Small systems, 1980).
Началось все в 1978 году, когда Ричард написал в журнал письмо с провокационным заголовком «Ошибки молодости, или Действительно ли Бейсик вреден для вашего здоровья?». Ответы на это письмо и послужили материалом для статьи.
На основе повторяющихся точек зрения Ричард Вексельблат сделал следующие выводы:
Изучив историю вопроса поглубже, я убедился, что исследований, посвященных выбору языка программирования, сотни. Есть даже работы, обобщающие работы по выбору ЯП, например: Kevin Parker, Bill Davey. The History of Computer Language Selection. (In Arthur Tatnall. Reflections on the History of Computing: Preserving Memories and Sharing Stories, AICT-387, Springer, pp.166-179, 2012, IFIP Advances in Information and Communication Technology (SURVEY)).
Авторы, опираясь на обширную библиографию, выделяют факторы, влияющие на выбор языка, не только для обучения, но и для реализации проектов:
В оригинале у каждого критерия есть дополнительные характеристики, которые для нас не так важны. Нам интересно, что лидерами по итоговому «Authors’ score» является Python и Eiffel — язык, который вряд ли можно назвать популярным.
Сначала я надеялся проранжировать ЯП по этим критериям и сделать собственные выводы, но, посмотрев на колонку Haskell, обнаружил вранье по каждому пункту! И решил, что таблица не имеет никакого отношения к действительности — вот такое «объективное» сравнение.
Поразмыслив, я пришел к выводу, что в таком сравнении нет смысла. Допустим, я бы добавил столбец с Kotlin и поставил бы галочку в каждом пункте, или не поставил. Это бы не означало ровным счетом ничего.
Тогда я решил посмотреть, а что же используется для обучения по факту. Тут картина другая.
Источник данных.
То, что данные за 2014 год, не должно вас смущать, потому что системы высшего образования меняются очень медленно и общая картина к настоящему времени не сильно изменилась.
Python по-прежнему на первом месте, Java — отражает запросы Oracle, Sun Microsystems и других компаний на обучение именно этому языку. Среди университетов, которые начинают обучение программированию с C++ наверняка университет Техаса — там начальный курс читает Бьёрн Страуструп и, думаю, студенты справляются с ним хорошо.
Многие языки, интересные академической общественности, вообще не попали в этот рейтинг, в частности:
Глас народа
Изучив историю вопроса, я решил узнать мнение современных разработчиков через опрос в twitter. Вопрос сформулировал так: «Какое свойство языка программирования вы считаете наиболее важным при выборе ПЕРВОГО языка для обучения программированию?» И предложил варианты ответов, которые довольно легко соотнести с конкретными языками.
С учетом всех технических особенностей опросов в twitter, результаты следующие.
Больше половины опрошенных сказали, что главное — простота. 25%, ответивших распространенность, считают, видимо, что надо сразу думать о востребованности на рынке. Высокий процент людей, которые считают, что сначала надо с указателями разобраться, меня настораживает. А то, что только 8% за богатый набор библиотек, показывает, что первый язык все-таки не должен быть предназначен для того, чтобы делать что-то реальное.
Ответы к опросу
Приведу несколько интересных мнений из обсуждения опроса.
Дмитрий Коваников (@ChShersh) — опытный разработчик и преподаватель — высказал ряд важных соображений, с которыми я полностью согласен: «Высокоуровневость и интерактивность. Чтобы получить результат работы программы и иметь возможность посмотреть его можно было с минимальным числом шагов. Программирование — это не про создание переменных, циклов или рекурсий, это про решение проблем средствами ЯП».
Артём Пеленицын (@ulysses4ever) отметил методическую составляющую: «Наличие специализированных методических (учебники, задачники, туториалы, Q&A форумы) и технических (простые и внятные IDE с минималистичным интерфейсом, степперы/дебаггеры с GUI) средств».
Андрей Мисков (@andreymiskov) напомнил о другом важном факторе: «Предсказуемость: не отвлекаться на null/undefined и 0.1 + 0.2. Постепенное увеличение возможностей: никакого ООП и мутаций, пока не освоишь данные и функции. Типа как в Racket/HtDP или в Pyret/PAPL».
Нашлись и защитники С: «Лично я считаю, что C был и остаётся самым лучшим для более фундаментального изучения. На мой взгляд, простой и достаточно интуитивный синтаксис, и много разных концепций (память, указатели, стэк, аллокации). Только одно НО, ни в коем случае не C89, минимум C99, а лучше C11».
Были и упоминания Scala, и Rust — причем в контексте типизации и простоты. Что наводит нас на мысль, что, к сожалению, языки программирования как тоталитарные секты. У них есть адепты, которые несмотря ни на что продвигают свой любимый язык и не желают прислушиваться к критике (и вообще чужому мнению).
Яркий пример такого «сектантства» — спор о том, как обозначать присваивание «=» или «:=». Этому спору уже больше 40 лет, есть статьи, посвященные только этому вопросу. И это только один повод из сотен подобных «важных вопросов».
Не надо холиварить — популяризируйте свой язык, но не действуйте как адепты тоталитарных сект.
Отличия промышленного языка от учебного
Мы уже почти пришли к тому, чтобы найти окончательное решение в задаче выбора первого языка. Осталось только определить, а чем же учебный язык отличается от промышленного.
Во-первых, в промышленном языке для достижения одной и той же цели всегда есть много способов.
Во-вторых, сообщения об ошибках в промышленных языках направлены на то, чтобы профессионал быстро понял, в чем проблема, и исправил. Как следствие они содержат много полезной для специалиста технической информации, которая новичка может напугать и сбить с толку. Этот аспект иногда делает невозможным использование профессионального языка для обучения. Если вы когда-нибудь видели сообщения об ошибках в C++, то поймете, о чем я говорю.
И наконец, отличаются цели. Например, быстродействие важно в промышленной эксплуатации, но не имеет особого значения, когда только-только осваиваешь программирование.
Выучить ЯП, когда умеешь программировать, легко. В задаче с первым языком учиться предстоит именно программировать, а это сложнее.
По вопросу обучения программированию как таковому тоже есть книги, например такие.
В очень классической (только посмотрите на обложку) книге «Структура и интерпретация компьютерных программ» создается впечатление о программировании как о магической деятельности, а о программистах как, обладающих исключительными способностями, колдунах. Это, конечно, совершенная неправда.
Обложка второй книги «How to design Programs» отражает абсолютно другой подход — инженерный. Он мне нравится гораздо больше, и я считаю, что учить программировать надо как любому другому инженерному делу.
В «How to design Programs» есть несколько важных принципов, чему нужно учить при обучении программированию:
Beginning Student Language
Чтобы реализовать эти принципы, автор книги Matthias Felleisen придумал идею языков для обучения. Это языки, которые постепенно расширяют свои возможности.
Начинается все с BSL — Beginning Student Language — в котором есть только необходимый минимум: определение функции, вызов функции, условная операция, арифметика. И дальше, вместе с задачами, язык постепенно растёт, добавляются такие конструкции как списки, рекурсия, функции высшего порядка. Постепенно с помощью языка, уже SL, становится возможным решать более сложные задачи. Заканчивается эта цепочка языком Racket из семейства Lisp, который является замыканием всех предыдущих и позволяет программисту реализовать что угодно.
Так выглядит элементарная программа в среде DrRacket в режиме для начинающего студента.
Pyret
Другой подход к обучению программирования предложили Shriram Krishnamurthi с соавторами. Они создали язык Pyret и опубликовали книгу «Programming and Programming Languages», потому что, повторюсь, без обучающих материалов никто язык изучать не станет.
Обратите внимание на названия некоторых глав из этого учебника:
Язык Pyret строится таким образом, чтобы было можно идти по плану без забегания вперед. На нём на самом деле можно запрограммировать всё, что встречается до 27-й главы, не зная, что в языке есть типы. А в 27-й главе выясняется, что тут есть статическая типизация и ей можно пользоваться. Этот язык создан специально, чтобы двигаться от начала к концу, постепенно водя в оборот новые концепции.
Ниже пример программы на языке Pyret и среды, в которой для этого языка.
Например, тесты, которые встраиваются в программу (блок where: ), — обязательная часть синтаксиса. Документирование тоже встраивается в синтаксис ( doc: ). Такие полезные конструкции верхнеуровнево есть в языке и их использование прививается в процессе обучения.
CodeWorld
Идея простой реализации графики реализована в среде CodeWorld. Там есть свой язык, но можно использовать Haskell и тут же получать что-нибудь красивое — для новичков это привлекательно.
PascalABC.NET
Наш ответ BSL и Pyret разрабатывают в ЮФУ в Ростове-на-Дону Станислав Михалкович и его студенты.
Это такой Pascal, который не устарел. В нём есть, например: foreach, внутриблочные описания переменных, case по строкам, длинные целые, обобщённые классы и подпрограммы, интерфейсы, перегрузка операций, лямбда-выражения, исключения, сборка мусора, методы расширения.
Выше на скриншоте программа в 120 строчек красиво и с анимацией собирает Ханойские башни.
Окончательное решение
Проницательный читатель уже догадался, что никакого окончательного решения в вопросе выбора первого языка программирования нет. Его нет ни у меня, ни у кого-то еще. И это хорошо: нам в информатике не нужны единые учебники истории, рассказывающие единственно правильную точку зрения.
Мы еще в самом начале статьи выяснили, что важнее, как учить, чем на каком языке. Тем не менее, есть способы начать изучать программирование правильнее с точки зрения будущего развития.
Начать лучше с языка, который больше для этого подходит: Racket, Pyret, Python, PascalABC.NET. Главное, чтобы начальный этап — этот первый язык — заложил основу для будущего развития.
С языков первого уровня в этой схеме будет легко перейти на какой-то из базовых промышленных или академических языков: JavaScript, C, C#, Java, Haskell, OCaml, F#. Но если начать сразу с JavaScript, то получится Фортран-программист на новый лад, который потом везде будет писать как на JS, и это будет ужасно. А если это будет второй язык, то такой деформации не произойдет.
Дальше, когда заложена основа в определенной области, открывается миллион возможностей. На схеме показаны только некоторые из них.
Возможно, сейчас вам не нужно знать много языков. Особенно, если вы мобильный разработчик. Но все платформы рано или поздно устаревают, и когда это произойдет, окажется, что выигрывает тот, у кого шире бэкграунд и кто знает больше языков из разных областей.
Если вы пройдетесь по языкам нижнего уровня схемы, и будете примерно представлять их устройство, это сделает вас лучшим разработчиком на любом языке.
Если (а как иначе, вы же читаете это на Хабре) вы уже успешно стартовали карьеру разработчика, углубились в какую-нибудь одну область и теперь хотите знать, а что происходит за её пределами и куда еще направить своё внимание, — присоединяйтесь к фестивалю РИТ++ Online. Там за два дня (25 и 26 мая) вы сможете получить срез всей IT-индустрии, а на мастер-классах с 27 мая по 10 июня прокачать отдельные навыки.