От ассемблера до Java: краткая история программирования

От ассемблера до Java: краткая история программирования

Просто и понятно про то, как люди искали с компьютером общий язык

1С: Клуб программистов

4

11.10.2017

Первый компьютер появился больше 70 лет назад, и с тех пор успели разработать сотни языков программирования. «Мел» и разобрались в истории программирования и рассказывают её простым языком для тех, кому слова «интерпретатор», «полиморфизм» и «инкапсуляция» ни о чем не говорят.

Что было до появления первых языков программирования

В 1945 году в Америке построили первый компьютер — ЭНИАК (Electronic Numerical Integrator And Computer). Он состоял из 17 тысяч ламп, весил 27 тонн и стоил 480 000 долларов. Сравните: новый iPhone X за 1000 долларов помещается в кармане и почти в 25 тысяч раз мощнее.

В те времена ещё не было языков программирования, и ЭНИАК управлялся через систему команд, записанных в машинном коде — то есть в виде последовательности единиц и нолей. Писать программы на машинном коде было долго и сложно. Представьте, что в супермаркете на полке с ценниками нет названий товаров — только номер штрихкода и цена. Чтобы узнать цену, например, на икру, нужно посмотреть номер на банке и сопоставить с ценниками. Из-за ошибки в одну цифру можно взять чёрную икру по цене белого хлеба (а на кассе обнаружить, что сумма в чеке в сто раз больше). Так и одна ошибка в цифре машинного кода приводила к неправильному результату вычисления всей программы.

Первый в мире компьютер ЭНИАК

Ошибки в работе компьютера программисты называют «багами». В переводе с английского bug означает «насекомое» или «жучок». Это слово употребляли и раньше — например, радиоинженеры называли так технические неполадки в оборудовании, которые было трудно обнаружить. Но первый в истории компьютерный баг, по легенде, действительно был насекомым! В 1947 в Гарварде программист Грейс Хоппер искала причину ошибки в работе суперкомпьютера Mark II и обнаружила моль, которая залетела внутрь компьютера и заклинила систему. С помощью скотча она вклеила моль в рабочий журнал и озаглавила запись как «Первый фактический случай обнаружения бага».

Ассемблер — переводчик с человеческого на машинный

Как упростить управление компьютером задумались в Кембриджском университете, когда профессор Морис Уилкс начал работу над созданием электронно-вычислительной машины ЭДСАК. Позже именно для неё была разработана первая компьютерная игра — «Крестики-нолики». Но главная заслуга Уилкса, конечно, не в этом. А в том, что в 1949 году он создал программу, которая позволяла писать команды в удобной для человека форме и сама переводила их в машинный код.

Программу Уилкс называл собирающей системой или «ассемблером», от английского глагола «assemble» — собирать. Вместо двоичного кода в языке ассемблера использовались буквы, цифры или сокращения, которые отражали суть команды. Например, команда «Mov Ax, 6» на языке ассемблера означала «передвинь в ячейку памяти „Ах“ число 6». Согласитесь, запоминать такие команды гораздо проще, чем длинные ряды нолей и единиц.

И всё же у языка ассемблера были серьёзные недостатки. Коды по-прежнему должны были точно соответствовать системе команд компьютера, и для каждой конкретной вычислительной машины был нужен свой язык ассемблера. Такие языки называют машинно-зависимыми или языками низкого уровня.

Первые машинно-независимые языки

Первый язык высокого уровня появился в 1957 году в Америке. Он назывался Фортран (FORmula TRANslator) и позволял писать программы, не думая об архитектуре конкретного компьютера. Код стал «переносимым» — одна и та же программа теперь запускалась на разных устройствах.

Это стало возможным благодаря специальным программам — компиляторам. Они превращали текст на Фортране в машинный код и сами устанавливали соответствия между ним и системой команд компьютера.

Обложка автоматической системы кодирования Fortran для IBM EOS-704 EDPM, которая считается первой книгой о Fortran

Переносимость кода объединила усилия программистов по всему миру и позволила продавать программы. Теперь, чтобы решить квадратное уравнение или посчитать косинус, можно было использовать уже написанный другими программистами код, а не писать программу с нуля.

Так появились «библиотеки» — сборники программ, решающих определенный класс задач. Программисты писали библиотеки и продавали компаниям, которые использовали их для сложных вычислений — например, расчета траектории полета ракеты.

Фортран был ориентирован на научно-технические математические расчеты

Сегодня на этом языке так много математических библиотек, что среди ученых даже ходит присказка: «у любой математической задачи уже есть решение на Фортране». Он был настолько успешен, что в Европе создали ALGOL (ALGOrythmic Language) — свой язык программирования высокого уровня, чтобы избежать монополии.

Структурное программирование и язык Си

Программы с каждым годом становились сложнее, а значит росло количество ошибок и время отладки — их обнаружения и исправления. Потребовалось организовывать код программ так, чтобы избежать лишних ошибок и упростить их поиск. Так в начале 70-х появилось структурное программирование.

Идея структурного программирования — в создании программы из последовательных блоков. Программист работает над блоками по очереди и не переходит дальше, пока не убедится, что всё работает, как задумано. Для создания блоков используют три базовых конструкции: последовательность, ветвление и цикл.

Последовательность выполняется автоматически из стоящих друг за другом инструкций: «сначала выполни умножение и деление, потом — сложение и вычитание». Ветвление помогает работать с условиями: «если дискриминант больше нуля, тогда ищи решения, а если меньше, тогда напиши, что решений нет». Цикл помогает многократно повторять действия, пока выполняется условие: «пока корзинка не полная, сорви ягоду с куста и положи в корзинку».

Во времена структурного программирования появился язык Си. Его придумал американец Деннис Ритчи и в 1999 году получил Национальную медаль США за достижения в области технологий и инноваций. Язык был основан на старом языке Би, поэтому его назвали Си — по следующей букве английского алфавита. Си был универсальным и очень быстрым, поэтому сразу широко распространился и стал прародителем для современных языков: C++, C#, Objective C, Java.

Кен Томпсон (слева) и Деннис Ритчи (справа), создатели языка программирования Си

Объектно-ориентированное программирование и язык Java

Программы становились всё сложнее, и над одним проектом могли работать десятки человек. Нужно было найти универсальный путь, который бы объединял код, написанный разными программистами. Эту проблему решило объектно-ориентированное программирование (ООП), построенное вокруг абстракции данных. Это значит, что базовым элементом программы становится абстрактный «объект». Объектом может быть что угодно — радуга, квадратное уравнение, «Чёрный квадрат» Малевича. У каждого объекта есть набор характеристик. Например, у радуги это длина дуги, насыщенность, количество видимых цветов. Объекты с одинаковым набором характеристик объединяются в классы. Если взять класс «дом» и задать параметры — длину, высоту, количество этажей, можно получить конкретный дом, в котором вы живёте, — объект. При этом принцип работы один, и не важно, с какими именно данными вы работаете. Работать с объектами класса можно, не вникая в структуру: чтобы снести дом, нам необязательно знать, сколько в нем этажей и комнат.

Первым распространённым объектно-ориентированным языком стал Smalltalk. Его в 1970-х годах разработала группа учёных корпорации Xerox под руководством Алана Кэя. Этого американского учёного называют одним из отцов-основателей ООП — за работу над ним он получил премию Тьюринга. Позже, взяв за основу язык Си, датчанин Бьёрн Страуструп придумал С++. Сейчас этот язык используют для создания высоконагруженных систем (в которых нагрузки начинаются от 10 тысяч пользователей в секунду).

Алан Кэй считается отцом-основателем объектно-ориентированного программирования

В 1995 году на основе все того же Си создали язык Java. Он обходит многие сложности С++ и гораздо понятнее. Например, в С++ нужно внимательно следить за заполнением памяти программы. Если вы обрабатываете много данных, а затем перестаете их использовать и удаляете все ссылки на них — данные остаются в памяти программы и лежат мёртвым грузом. В Java очисткой такой памяти занимается «автоматический сборщик мусора». Но главной особенностью языка стал способ запуска программ.

Программы на Java превращаются программой-компилятором в специальный байт-код. Его можно запускать на любом устройстве, на котором установлена JVM (Java Virtual Machine) — виртуальная машина Java. Раньше один и тот же текст программы нужно было пропускать через компилятор несколько раз для каждой системы. В Java код компилируется только один раз и работает везде — за его связь с компьютерами отвечает JVM.

Такой подход был революционным с точки зрения переносимости кода. Программы стали кроссплатформенными — это значит, что можно написать один код для компьютера, холодильника, кофемашины и робота из лего, и все они поймут его, если у них есть JVM.

Сейчас Java — это главный язык Android-приложений и для работы с большими объемами данных (big data). Конечно, на Java история программирования не заканчивается. Но большинство новых языков проектируется под узкий класс задач, поэтому их сложно сравнивать между собой. Например, язык Swift был разработан компанией Apple специально для создания приложений под iOS и Mac, а язык Julia — для сохранения высокой производительности при работе с большим объемом вычислений.

Узнать больше об объектно-ориентированном программировании, истории языка Java и о том, как писать на нём программы, можно на специальном курсе «Клуба программистов» от компании 1С. Опытные преподаватели научат школьников 7-8 классов работать с графическими объектами и помогут создать свою первую анимацию на Java. В конце каждый сможет написать собственную компьютерную игру. Полный курс рассчитан на два года (по два занятия в неделю), а первый вводный модуль длится полгода.

Автор текста: Сергей Щербина

Читайте также
Комментарии(4)
Неверное изложение. Точнее, изложение в стиле менеджмента.
В структурном программировании главное — блоки. То есть программирование как сеть подпрограмм.
В ООП главное — иерархическая структура построения как программ, так классов и объектов. То есть самая примитивная структура. Это помогает менеджерам управлять программистами. Следующим шагом стали коммерческие эджайл методы — тяп-ляп и в продакшн. Использование самой примитивной структуры и похоронило структурное программирование, которое ориентировалось на структуру задачи.
И кто сказал, что Java проще, чем C++? Разные языки создаются под разные классы задач. А универсальные по определению менее эффективны, чем специализированные. Никто не будет писать backend на C, когда есть PHP. И никто не будет писать обработку big data на Java, когда есть R и Python. Статья в целом посвящена рекламе курсов Java. Можно понять посыл, что знать хоть один язык программирования лучше, чем ни одного. Но ни один настоящий специалист не скажет, что какой-то один язык программирования лучше всех.
Ну хоть что-то полезное делаете, а то ваши учётные продукты заставляют некоторых разработчиков даже падать в обморок, берёте втридорога… Ваще счастье что вы ваш продукт — всё-таки лучший на рынке, не смотрю ни на что… Остальные-то хуже…
Показать все комментарии
Больше статей