Как называется первый язык программирования
Первый язык программирования: история создания, автор и название
Недавно, одному из читателей linchakin.com стало интересно, кем и когда был придуман первый язык программирования. И в этой статье я решил дать ему и Вам открытый ответ на данный вопрос.
Сразу хочу сказать, что, так как это было давно, некоторые даты не во всех источниках одинаковые.
Первые языки программирования
Официально первый язык программирования для компьютеров является «Plankalkül» (Планкалкюль) созданный немецким инженером Конрадом Цузе в период с 1943 по 1945. По другой информации, в 1948 году. Первые же наброски, каракули, если можно так сказать, датированы 1941 годом. Однако это не так уж и важно, ведь данные об этом языке были опубликованы лишь в 1972 году, а первый компилятор для него был реализован в 1975 г. в диссертации Иокима Хоманна. Другие независимые реализации были в 1998 году, а затем в 2000 году Свободным университетом Берлина.
«Short Code» (Короткий код, краткий код) – считается первый языком программирования высокого уровня. Он был предложен Джоном Мокли (иногда транскрибируют как Мочли) в 1949 году.
Другие первые языки программирования, которые были разработанные в 1950-х и 1960-х годах это: AutoCode, COBOL, FLOW-MATIC и LISP. Из них, в наши дни, только COBOL и LISP еще иногда, хоть и очень редко, но используют.
Эволюция языков программирования
Пятница — самое время расслабиться и вспомнить, с чего все началось. Представляем вам краткий экскурс в историю разработки от GeekBrains.
Доисторическая эра
С точки зрения определения даты рождения языка программирования существует некоторая двойственность.
С одной стороны, в первой половине 19 века Ада Лавлейс описала вычислительную машину и ввела основополагающие понятия цикла и рабочей ячейки, за что получила гордое звание первой женщины-программиста.
С другой, первый язык программирования в современном представлении зародился лишь во время Второй мировой войны на релейной машине Z4 немецкого изобретателя Конрада Цузе. Его название Планкалкюль (нем. Plankalkül — исчисление планов), и это был полноценный язык высокого уровня, поддерживающий условные операторы, арифметические операции, массивы, циклы, исключения и утверждения. Доподлинно известно, что в конце 40-х годов Планкалкюль позволял ЭВМ решать шахматные задачи.
Изобретение Цузе могло бы изменить ход истории, однако итоги войны и усилия американцев по популяризации собственного машинного языка отложили полноценное явление миру Планкалкюля вплоть до 1972 года.
Z4 в Немецком музее, Мюнхен
Языки для компьютеров
Вместо этого эволюция пошла по пути машинного языка. Он был удобен для компьютеров, но не очень удобен для программистов. Это была буквально работа с железом вручную: были лишь те команды, которые были зашиты в процессор, все остальные операции приходилось реализовывать вручную.
Прямым развитием машинного языка стал язык ассемблера. Это был первый размен скорости на удобство: ассемблер был чуть менее нативным, но гораздо более дружелюбным к программисту. До языков высокого уровня, комфортных для программиста, было еще далеко.
Качественный скачок произошёл после изобретения транзистора и первых доступных компьютеров. Это побудило в период с 1954-1957 году компанию IBM активно работать над разработкой популярного коммерчески языка Fortran (от англ. Formula и Translation).
Fortran — язык для научных и инженерных вычислений. Считается, что именно он стал первым реализованным языком высокого уровня. Благодаря большому количеству математических библиотек Fortran был и остается важным языком для разного рода научных изысканий.
Далее началось бурное развитие программирования: практически одновременно появились Algol, алгоритмический высокоуровневый язык, активно использовавшийся в СССР и Европе, LISP и COBOL.
Языки для народа
Но по-настоящему массовым программирование стало с появлением языка BASIC в 1964 году. Преподаватели Дартмутского Колледжа Джон Кемени и Томас Курц разработали его для обучения студентов основам программирования ЭВМ.
BASIC был алгоритмическим языком, для его создателей было важно не быстродействие и эффективность, а легкое понимание. Тем не менее BASIC быстро обрёл популярность в реализациях от Microsoft и Apple. Но не все были им довольны. По мнению противников языка простота и бесструктурность ранних версий BASIC поощряли применение порочных и опасных методик разработки.
«Студентов, ранее изучавших Бейсик, практически невозможно обучить хорошему программированию. Как потенциальные программисты они умственно изувечены без надежды на восстановление».
Эдсгер Дейкстра.
Кайнозой
В 1960-х годах компания Bell Labs всерьёз взялась за разработку операционной системы Unix для своих миникомпьютеров. Первые ОС были написаны на ассемблере, но эксперимент оказался неудачным.
Потом в алфавитном порядке Кеном Томпсоном и Деннисом Ритчи был специально разработан интерпретируемый язык B (Би), но и в этот раз результат оставлял желать лучшего.
Всё изменилось с третьей попыткой в 1972 году и языком C, который оказался настолько успешным, что и спустя 40 лет занимает важное место в разработке ПО. Например, по данным IEEE Spectrum С в 2015 году стоял на втором месте: «The 2015 Top Ten Programming Languages».
В другом полушарии на останках языка Algol-68 Никлаус Вирт разработал Pascal. Цель он преследовал ту же самую, что и BASIC — простота в обучении и наглядность выполняемых операций.
Несмотря на внешнюю незамысловатость, Pascal оказался крайне эффективным языком не только в деле обучения, но и в серьезной разработке. Он остаётся крайне востребованным как в школах, так и в мире больших приложений: Total Commander, WinRAR, ранние версии Skype и Nero Burning ROM были написаны на Pascal.
В конце 1970-х были сформированы принципы ООП, на основе которых был доработан язык C, получив сперва название «С with classes», а потом более привычное взгляду C++. Отчасти из-за совершенства творения, отчасти из-за славы одного из первопроходцев, C++ долгое время оставался самым востребованным языком. На нём были написаны операционные системы Symbian, Windows и OS X, браузеры Google Chrome и Mozilla, и ещё тысячи популярных приложений.
Через четыре года после появления первой версии C++ Ларри Уолл разработал Perl — «практичный язык для извлечения данных и составления отчётов» (Practical Extraction and Report Language). Изначально язык обрёл популярность благодаря функциям, заложенным в названии, однако позднее расширил свои возможности и аудиторию.
Сегодня Perl по-прежнему активно используется в качестве удобного средства обработки текста в командной строке, но не меньше востребован и в системном администрировании, веб-разработке и даже играх.
Современность
В статье об истории эволюции языков просто обязан упоминаться Python, горячо любимый не только преподавателями GeekBrains, но и, судя по широте использования, многими иностранными университетами и крупными зарубежными компаниями. Его структура и философия направлены на то, чтобы ускорить разработку готового продукта программистом. С точки зрения развития, это куда более совершенный язык, нежели все существовавшие до 1991 года. Он минималистичен, но при этом более читабелен, достаточно часто обновляется и прекрасен по соотношению «скорость — качество разработки».
Впрочем, теми же самыми характеристиками можно описать и Ruby, увидевший свет в 1995 году, с поправкой на то, что у Юкихиро Мацумото было 2 года, чтобы подумать, чем его язык может стать лучше современников.
Развитие интернета в конце XX века требовало более качественных языков обработки текста и данных. Так на свет появились HTML, PHP, CSS и JavaScript, без которых сегодня очень трудно представить веб-разработку.
Вместе с этим появился и Java — объектно-ориентированный язык, использующий виртуальную машину JVM. Это обеспечивает языку практически полную независимость от машины, на которой производится запуск. Совокупность этих факторов и популярность смартфонов c ОС Android позволяет Java возглавлять список самых популярных языков по версии Tiobe, а нам — рекомендовать его начинающим разработчикам в качестве первого или основного.
Если взглянуть на этот же самый рейтинг, в конце второго десятка можно отыскать современные языки программирования. Например, Swift — продукт компании Apple, популярный не только за счет своих качеств, но и благодаря громкому имени производителя.
Будущее
Уже сейчас появляются языки программирования, которые можно назвать языками сверхвысокого уровня. Они предназначены не для написания прикладных программ, а для обработки больших массивов данных и статистики. В их числе R, MATLAB и Julia.
Можно предполагать, что в будущем появятся человекоориентированные языки, на которых написать программу будет не сложнее, чем пост в ЖЖ. С другой стороны, квантовые компьютеры потребуют свой особый, квантовый ассемблер.
Как думаете, что будет дальше, и на какой из существующих языков поставите вы?
Спор о первом языке программирования: окончательное решение
Некоторые относятся к спору о выборе первого языка программирования примерно так:
Говорят, на выбор влияет миллион фаторов и спорить по этому поводу не имеет никакого смысла. Тем не менее, холивары продолжаются.
Виталий Брагилевский решил поставить точку и на 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 июня прокачать отдельные навыки.