На каком языке программирования создавались первые программы
Языки программирования создавались и разрабатывались в течение многих лет. Некоторые из них до сих пор находятся в процессе развития, так как потребности потребителя растут, разрабатывается новое «железо» и программистам приходится искать новые решения, а также принципы работы с инновациями.
Само понятие «язык программирования» можно трактовать как формальную знаковую систему, которую программисты используют для написания компьютерных программ. Однако, о языке машин инженеры стали задумываться намного раньше, чем у них появилась возможность писать на нем и создавать программы.
Идею о создании языка машин впервые в 19 веке высказал ученый Чарльз Бэббидж. Его считают основателем и отцом первого в мире компьютера. На тот момент его идеи были лишь предположениями. Он не знал о мониторах и микросхемах, но ему удалось точно описать основные принципы работы вычислительных машин. Со временем инженеры сделали грандиозный вывод о том, что эффективное использование компьютеров заключается в правильно подобранных алгоритмах.
Пик развития языков программирования пришелся на 50-е годы 20 века. Тогда, чтобы программировать, инженерам приходилось знать полностью всю архитектуру компьютера и понимать его машинные коды. В 50-е ты не мог быть программистом, если не знал, как собирается компьютер и из чего он состоит. У компьютеров того времени даже клавиатуры не было, но были перфокарты, которые не очень упрощали будни тогдашнего инженера-программиста.
Когда человеку нужно упростить свой труд, сделать его более автоматизированным, он начинает придумывать новые идеи и изобретать то, что могло бы облегчить ему жизнь. Так начали появляться первые языки программирования.
В то время инженеры-программисты были вынуждены детально изучать все машинные команды, а потом внимательно писать код, каждый раз тщательно его проверяя. Чтобы как-то упростить задачу, программистам требовалось перевести цифровые обозначения операций в буквы. Так появился первый язык программирования – Ассемблер (от английского assemble – собирать). Сейчас его считают языком низкого уровня программирования, но в свое время он произвел настоящий фурор. Программы, написанные на Ассемблере, были достаточно эффективны и работоспособны.
Пятница — самое время расслабиться и вспомнить, с чего все началось. Представляем вам краткий экскурс в историю разработки от 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.
Можно предполагать, что в будущем появятся человекоориентированные языки, на которых написать программу будет не сложнее, чем пост в ЖЖ. С другой стороны, квантовые компьютеры потребуют свой особый, квантовый ассемблер.
Как думаете, что будет дальше, и на какой из существующих языков поставите вы?
Сразу ответ про название - Почему "для себя любимого". Так я написал честно о статье которая родилась под впечатлением поиска информации об истоках языков программирования история которых шла буквально параллельно со мной.
Чуть ниже я приведу картинку с отметкой языков программирования которые я освоил в своей практике и могу изобразить простой код управления РЛС или написать Тетрис с Арканоидом.
Итак, задавшись вопросом знания о котром у меня не было в давние времена, я решил провести следствие по телу . делу.
Неужели сразу после машинных кодов на которых работали станки с ЧПУ и программные комплексы управления (всякой ТВН и ТГН техникой) был тот самый Ассемблер о котором все "задвинутые программеры(исты)" так любят вспоминать?
Ассемблер — язык программирования низкого уровня. Язык программирования низкого уровня — язык программирования, который ориентирован на конкретный тип процессора и учитывает его особенности. В данном случае «низкий уровень» не значит «плохой». Имеется в виду, что операторы языка близки к машинному коду и ориентированы на конкретные команды процессора.
Физические принципы работы электронных устройств ЭВМ таковы, что компьютер может воспринимать команды, состоящие только из единиц и нулей — последовательность перепада напряжения, то есть машинный код. На начальной стадии развития ЭВМ человеку было необходимо составлять программы на языке, понятном компьютеру, в машинных кодах. Составлять программы для ЭВМ приходилось учитывая структуру конкретной машины, что конечно не способствовало прогрессу и унификации.
Понятно что процесс формирования машинного кода можно автоматизировать.
Уже в 1950 году для записи программ начали применять мнемонический язык — язык assembly. Язык ассемблера позволил представить машинный код в более удобной для человека форме: для обозначения команд и объектов, над которыми эти команды выполняются, вместо двоичных кодов использовались буквы или сокращенные слова.
Но разве до или параллельно Ассемблеру не было попыток создать язык для ЭВМ ?
Не долгий поиск привел меня к источнику в котором упоминается БОЛЕЕ ДРЕВНИЙ чем на картинке язык. Ни разу не читал первоисточников об этом языке, так что особо верить в данную информацию не рекомендую.
Официально первый язык программирования для компьютеров является « Plankalkül » (Планкалкюль) созданный немецким инженером Конрадом Цузе в период с 1943 по 1945. По другой информации, в 1948 году.
Первые же наброски, датированы 1941 годом. Данные об этом языке были опубликованы лишь в 1972 году, а первый компилятор для него был реализован в 1975 г. в диссертации Иокима Хоманна. Другие независимые реализации были в 1998 году, а затем в 2000 году Свободным университетом Берлина.
С середины 50-х г. XX в. начали создавать первые языки программирования высокого уровня (high-level programming languages). Эти языки не были привязаны к определенному типу ЭВМ (машинонезависимы). Для каждого из них были разработаны собственные компиляторы.
Первый язык высокого уровня Фортран был создан в период с 1954 по 1957 год группой программистов под руководством Джона Бэкуса в корпорации IBM. Фортран в СССР появился позже, чем на Западе, поскольку поначалу в СССР более перспективным языком считался Алгол. Во внедрении Фортрана большую роль сыграло общение советских физиков со своими коллегами из CERN, где в 1960-х годах почти все расчёты велись с использованием программ на Фортране.
Именно на Фортране я писал свои первые программы используя Перфокарты и специальные устройства для продырявливания перфокарт - Перфораторы .
Разумеется сейчас при слове Перфоратор первое что придет в голову это дрель с ударным механизмом, а раньше о такой дрели даже не мечтали, а перфораторы для перфокарт были.
Многие из нас задавались вопросом: на чём и каким образом была написана самая первая программа, когда писать было ещё не на чем. И что появилось первее: программа или среда разработки? Спойлер: сначала появилась программа.
Итак, 19 век. С этого времени начинается история программирования. Ада Ла́влейс и Чарльз Бэббидж . С этих имён и начинается история программирования!
Не буду углубляться в биографию, если интересно, можете о ней узнать из видео, скажу лишь, что Чарльз был весьма талантливым математиком. Первый его проект выглядел вот так:
Суть данного изобретения в том, что оно позволяло автоматизировать вычисление различных математических формул, функций, логарифмов посредством перемещения скомбинированных между собой шестерёнок.
Вторым его проектом по счёту, но не по значимости, была Аналитическая машина . Это огромный механизм на паровом двигателе, назначением которого являлось исполнение основных математических операций: сложение, вычитание, деление, умножение. Данное устройство давало возможность работать с большими числами, с большой точностью и большой скоростью (по крайней мере для того времени)
Инструкции по её программированию были написаны Адой Лавлейс. Они-то и являлись по факту первыми программами в мировой истории.
Программирование же в том виде, в котором мы привыкли его видеть сегодня (то есть ввод команд с клавиатуры в среду разработки, затем компиляция и выполнение) появилось только в 20-м веке, когда вычислительные машины научились работать с электричеством. И стали по праву называться Электронными Вычислительными Машинами - ЭВМ. Сначала программирование производилось лишь перепадами напряжения. Наличие напряжения = 1. Отсутствие напряжения = 0. Так и появился двоичный код. После всем двоичным командам присвоили "имена" в виде конкретных слов. Например в двоичном коде команда сложения выглядела как: 000010. А после она обозначалась лишь словом ADD. Так и появился первый язык Ассемблера.
Каждая вычислительная машина программировалась на своём уникальном языке, что было не очень удобно. Дабы привести программирование к единому формату на всех платформах, был изобретён язык Fortran. После чего уже начинается история языков программирования высокого уровня.
Более подробно о первом программировании и первых программистах я рассказываю в своём ролике. Можете его посмотреть или просто послушать, если не хочется читать вышеприведённый текст.
Приятного просмотра :)
Этим текстом я хочу начать цикл статей об истории развития языков программирования. Он является адаптированной версией этого сборника.
Программирование появилось задолго до 50-х годов XX века. Первые идеи высказал ещё Чарльз Бэббидж (1792-1871), которого по праву считают отцом компьютера. Он не знал о транзисторах, микросхемах и мониторах, но достаточно точно описал основные принципы, на которых будут строится все вычислительные машины. Развила идею графиня Ада Лавлейс (1815-1852). Её место в истории до сих вызывает немало споров, но одно абсолютно точно – именно Ада фактически стала первым известным программистом. Благодаря её трудам стало понятно, что путь к эффективному использованию машин – алгоритмы, описанные в коде.
Аналитическая машина Бэббиджа
Но программирование не могло развиваться в отрыве от компьютеров. Без них это просто игры разума, абстракция, вне зависимости от качества идей. Поэтому вплоть до 1950-х языки программирования представляли из себя набор машинных инструкций, часто узкоспециализированные и вымирающие вместе с целевым устройством.
Суть проблемы
Сегодня вам не надо ничего знать об архитектуре компьютера, для большинства программистов вообще важен только язык, всё остальное – вторично. В 1950-х всё было иначе – приходилось работать с элементарными машинными кодами, а это практически всё равно что программировать при помощи паяльника.
Ещё одной проблемой было то, что за разработку языков отвечали люди, непосредственно связанные с созданием компьютеров – в первую очередь инженеры и лишь вынужденно программисты. Потому они и представляли язык в виде последовательности номеров операций и ячеек памяти. Грубо говоря, это выглядело так:
01 x y – добавление содержимого ячейки памяти y к ячейке x;
02 x y – аналогичная процедура с вычитанием.
В итоге код программы превращался в бесконечную череду цифр:
Сегодня такой код вам покажется ужасом, но в начале 1950-х был нормой.
Компьютер 1940-х годов
Программистам приходилось долго учиться машинным командам, потом внимательно писать код, а после завершения ещё несколько раз его перепроверять – риск ошибки был велик. Проблемы возникла, когда развитие машин стало тормозиться нехваткой кадров для написания программ. Требовалось срочное решение.
Первый сборщик
Решение лежало на поверхности: необходимо перевести цифровые обозначения операций в буквы. То есть вместо «01 10 15» использовать «ADD 10 15». Это требовало дополнительного перевода символов в машинную команду, но, учитывая проблему, жертва была минимальна.
Решение оказалось настолько очевидным, что доподлинно неизвестно, кто первым изобрёл язык Ассемблера. Вероятнее всего, он появился одновременно сразу в нескольких местах. За название и популяризацию ответственными принято считать авторов книги «The preparation of programs for a digital computer» Уилкса, Уилера и Гилла. Нетрудно догадаться, что название Ассемблер происходит от английского слова assemble – собирать, монтировать, что вполне точно описывает процесс. Позднее символы стали касаться не только простейших операций, но и адресации, что значительно упростило читаемость кода.
Сейчас это кажется элементарным решением, но тогда реализация была сложным процессом, требующим созданий таблиц соответствия, присовения обозначения каждой ячейке памяти. Это привело к трём фундаментальным вещам:
- Появлению понятия символьная переменная или просто переменная.
- Созданию таблиц, с помощью которых вы могли найти соответствие символов, операций и ячеек памяти.
- Пониманию, что программирование может стать искусством.
Это стало катализатором языкового прорыва.
Компиляторы и предубеждения
Ассемблер позволил создать простые превращения. Например, перевод 01 в ADD. Макроассемблер расширил эту идею и подарил программистам возможность сворачивать несколько инструкций в одну. К примеру, если в программе вы постоянно добавляли значение в ячейку памяти и проверяли, не переполнена ли она, всё это можно было записать в макрос INCRT и использовать его, меняя лишь переменные. По сути, макроассемблеры превратились в первые языки высокого уровня.
Но в таком подходе заключалась важная проблема – каждый раз перед созданием кода необходимо было сворачивать базовые операции в макросы. Требовался инструмент, который освободит программистов от постоянного копирования. Так появился компилятор.
Теперь-то мы знаем, что благодаря компилятору мы можем создать язык программирования с абсолютно любым синтаксисом, главное, чтобы он грамотно переводил наш код в машинные команды. А в то время специалисты скептически относились к языкам высокого уровня. Частично это было обусловлено производительностью компьютеров – упрощение синтаксиса со сложными трансформациями дорого обходилось, могло вернуть технологический прогресс на несколько лет назад. Частично причиной были эмоции – было тяжело отойти от формы машинных команд, потерять контроль над процессами. Программисты всерьёз боялись, что после компиляции они не смогут понять исполняемые команды. Сегодня нам наплевать, как выглядит машинный код, а в те времена это казалось важной проблемой.
Тем не менее компилятор стал единственным выходом из ситуации, но здесь проявилась другая трудность – арифметические выражения. Их исполнение не совпадает с тем, как машина читает код. Из школьного курса мы знаем порядок вычислений в выражении «2+3*5», но машина читает код в одном направлении, так что ответ будет неверным. Да, указанный пример можно решить, создав макрос, но для сложных выражений уровня «(2 + 3 * 5 + 4/6) * 10 + 16- (14 + 15) * 8» требовался принципиально иной подход.
Эпоха новой формации
Найти алгоритм анализа стека удалось Джону Бэкусу, создателю Фортрана. Он начал работать над ним в 1954 году и ему потребовалось почти 5 лет, чтобы доказать право языков высокого уровня на существование. Полное название Фортрана – The IBM Formula Translating System, или FORmula TRANslator. Несмотря на 60-летний возраст, он остаётся одним из самых популярных языков программирования и невероятно востребован в Data Science. За это время мы видели множество версий: Fortran 1, II, 66, 77, 90, 95, 2008, а в следующем году выйдет ещё одна (планировался Fortran 2015, но из-за задержек название может смениться на 2018). Именно в Фортране впервые были одновременно реализованы многие атрибуты языка высокого уровня, среди которых:
- арифметические и логические выражения;
- цикл DO (ранняя форма цикла FOR);
- условный оператор IF;
- подпрограммы;
- массивы.
Ещё одним важным наследием Фортрана, о котором даже не догадываются современные программисты, является использование ограничений для переменных для целых чисел. Все они должны были начинаться с одного из 6 символов I, J, K, L, M, N (происходит от I-Nteger). Именно отсюда взялась привычка для перечислений брать переменные i, j и т.д.
IBM 704 – машина, на которой был создан Fortran
При этом Фортран оставался языком, приближенным к машинам. Например, там существовало такое:
Причиной была архитектура компьютера IBM, которой требовалась команда для использования нужного регистра: отрицательного, нулевого или положительного. Близость к машинам проявлялась и в известной команде GOTO (позднее она была унаследована Basic), означавший прямой переход к той или иной команде.
Возвращаясь к проблеме арифметических выражений, алгоритм перебора стека (то есть анализа всей строки) не был эффективным решением, но он доказал, насколько реализация может быть простой и логичной.
Языки для каждого
Fortran 1 был научным языком, в его основе лежали операции с комплексными числами и с плавающей запятой. Он даже не умел обрабатывать текст, для этого приходилось преобразовывать его в специальные коды. Поэтому Фортран оказался непригоден для бизнеса, где был специально создан язык Cobol.
Синтаксис у него принципиально иной, максимально приближенный к естественному английскому языку. Практически не было арифметики, только выражения вида:
Cobol стал олицетворением максимального удаления от прежнего машинно-арифметического мышления к общечеловеческому. И главное – теперь можно было работать с текстом и записями.
Следующим фундаментальным языком стал Algol (ALGOrithmic Language), предназначенный для научных отчётов и публикаций. В нём впервые появились естественные для нас вещи:
- отличия между присваиванием := и логическим равенством =;
- использование цикла for с тремя аргументами: начальное значение, предел, шаг;
- блочная структура программ, заключённая между begin и end, это исключило необходимость применения GOTO.
Четвёртым китом 1950-х стал Лисп (LISt Processing language), разработанный специально для обслуживания искусственного интеллекта. Главной его особенность стала работа не с императивными данными, а с функциями. Для этого Джону Маккарти пришлось предусмотреть множество механизмов для нормальной работы: динамическую типизацию, автоматическое распределение памяти, сборщик мусора. В конечном счёте, именно Лисп стал прародителем таких языков, как Python и Ruby, а сам до сих пор активно применяется в ИИ.
Таким образом, 1950-е изменили образ мышления программистов, подарили четыре фундаментальных языка и поставили мир на рельсы компьютерной революции.
В следующий раз поговорим о том, как развивались языки и мир программирования в 1960-е.
Освоить востребованную профессию в Data Science можно всего за полтора года на курсах GeekBrains. После учёбы вы сможете работать по специальностям Data Scientist, Data Analyst, Machine Learning, Engineer Computer Vision-специалист или NLP-специалист.
Читайте также: