Теоретические и практические предпосылки появления языков программирования
Попытки автоматизировать вычисления предпринимались математиками и инженерами с давних пор. Уже в XVII в. создать механические устройства, складывающее числа, пытались такие исследователи, как Вильгельм Шиккард, Готфрид Лейбниц, Блез Паскаль. В 1830-х гг. Чарльз Бэббидж и Ада Лавлейс не только сконструировали аналитическую машину, но и сформулировали такие понятия, как "ячейка памяти", "цикл". В середине XIX в. Джордж Буль заложил основы бинарной логики, а в конце того же столетия Герман Холлерит применил для автоматизации вычислений электричество и научился хранить информацию на перфокартах.
Теоретическую базу для разработки компьютеров с современной архитектурой заложили работы Алана Тьюринга, который в 1930-е гг. формулизовал понятие алгоритма, и Джона фон Неймана, обосновавшего принципы построения электронных вычислительных машин. Эти достижения вкупе с появлением в 1940-х гг. первых устойчивых реализаций компьютеров, дали толчок эволюции языков программирования (ЯП).
Первые средства разработки компьютерных программ
В 1950-х гг. программирование представляло собой разработку в машинных кодах. Например, обозначив сложение как 01 и условившись, что первым аргументом к этой операции будет указываться номер ячейки памяти, а вторым - обрабатываемое число, можно записать компьютерную инструкцию
01 10 15
, что будет означать "сложить содержимое ячейки 10 и число 15".
Такой способ записи неэффективен, поэтому уже в конце 1940-х гг. стали появляться более удобные способы записи программ - языки ассемблера, где, например, для обозначения сложения используется не безликое число 01
, а команда ADD
, соответствующая английскому слову "сложить".
Рисунок 1. Страница из учебника по Ассемблеру. Автор24 — интернет-биржа студенческих работ
Появление ассемблеров позволило сократить количество рутинных операций, сформировать многократно используемые макросы и библиотеки подпрограмм, обмениваться ими. Но несмотря на то, что ассемблеры (языки низкого уровня) обеспечивают высокую скорость вычислений, для создания крупных и сложных программ они не годятся. Поэтому поиски все более эффективных средств общения между человеком и компьютером продолжались.
Появление языков высокого уровня
В 1954 г. под руководством американского инженера Джона Бэкуса был разработан первый успешный язык высокого уровня - Fortran (Formula Translation, т.е. преобразователь формул). Он применяется и развивается до сих пор и стал прообразом для других ЯП, например, для Basic.
По мере роста производительности вычислительной техники и ее доступности появлялось все большее количество ЯП высокого уровня. В качестве наиболее успешных ЯП 1950-1960-х гг. можно назвать ALGOL, Lisp.
Наиболее революционным стало появление на рубеже 1960-1970-х гг. языка Си, разработанного Деннисом Ритчи и Брайаном Керниганом и Кеном Томпсоном. На нем в тот же период была написана операционная система (ОС) Unix, ставшая прообразом многих современных систем, а также давшая мощный толчок развитию сетевых технологий.
Рисунок 2. Брайан Керниган (Brian Kernighan), Деннис Ритчи (Dennis Ritchie) и Кен Томпсон. Автор24 — интернет-биржа студенческих работ
Во второй половине 1960-х гг. итальянские исследователи Коррадо Бом и Джузеппе Джакопини и, независимо от них, голландец Эдсгер Дийкстра определили в качестве базовых элементов компьютерной программы следование, ветвление и цикл. Эти теоретические представления заложили основу для развития структурного программирования, классическим представителем которого является разработанный французским инженером Никлаусом Виртом язак Pascal.
В ту же эпоху были сформулированы принципы модульного программирования:
- разбиение задачи на независимые модули;
- рассмотрение модуля как системы с входными и выходными параметрами;
- сборка модулей в загружаемую программу с помощью компоновочных средств;
- комментирование функционала каждого модуля.
Современная эра в развитии программирования
К концу 1980-х гг. компьютеры перестали быть экзотическими устройствами, доступными лишь корпорациям, научным учреждениям и государственным органам. Процесс всеобщей компьютеризации превратил программирование в демократичную профессию и потребовал более эффективных, производительных инструментов.
Большую популярность завоевало в то время объектно-ориентированное программирование (ООП), позволяющее эффективно описывать предметные области, т.е. объекты реального мира. Основными постулатами этой концепции стали:
- наследование: классы (описания объектов) могут быть основой для построения других классов, расширяющих функционал родительских;
- инкапсуляция: класс может содержать в себе поля и методы с регулируемым уровнем доступа; сущности внутри класса могут быть публичными, защищёнными или приватными;
- полиморфизм: методы классов могут запускаться с разными наборами параметров, позволяя решать сходные задачи несколькими способами.
Флагманом ООП можно назвать язык C++, разработанный в 1980-х гг. Бьерном Страуструпом. На нем был написаны многие ОС и приложения, ставшие классическими.
Идеи ООП зародились еще в 1960 - начале 1970-х гг. Первым успешным языком, реализующим эту парадигму, считается Smoltalk созданный Аланом Кеем.
В начале 1990-х гг. принципы ООП получили мощное развитие в рамках созданного корпорацией Sun Microsystems языка Java (автор Джеймс Гослинг), а также других популярных тогда языков, таких, как Turbo Pascal, Visual Basic и др.
В те же годы появилась потребность в стандартизированных многократно применяемых компонентах, таких, как элементы пользовательского интерфейса. В связи с этим появилась концепция компонентного программирования (Microsoft COM, Java Beans, CORBA). Компоненты особым образом упаковываются и распространяются в виде бинарных модулей (файлы dll, jar и т.п.). Особо следует отметить язык C#, совмещающий в себе достижения как объектно-ориентированного, так и компонентного программирования.
Веб разработка.
Начиная с 2000-х гг. наряду с распространением персональных компьютеров мощное развитие получают сетевые технологии, глобальная сеть Интернет. Резко растет спрос на разработку веб-приложений, сайтов. В этих условиях происходят следующие явления:
- сформировавшиеся на тот момент популярные ЯП обзаводятся собственными веб-фреймворками (сервлеты для Java, ASP-страницы для C#, на Си и C++ пишутся веб-серверы Apache, Nginx, Lighttpd).
- активизируется развитие скриптовых языков, позволяющих быстро создавать веб-страницы (Perl, PHP, Python, JavaScript);
- формируются международные стандарты, описывающие клиент-серверное взаимодействие во Всемирной паутине (например, протоколы семейства IP), а также интернациональные консорциумы (W3C, ECMA), занимающиеся стандартизацией средств веб-разработки;
- становятся популярными парадигмы программирования, позволяющие писать приложения меньшего объема, но более продуктивно; происходит возрождение функционального программирования и снижение популярности ООП;
- широко применяются клиентские (React, Angular, Vue) и серверные фреймворки, позволяющие за счет применения специальных синтаксисов быстро создавать приложения из готовых компонентов и алгоритмов.
Рисунок 3. Пример кода на языке PHP. Автор24 — интернет-биржа студенческих работ