Краткий генезис и эволюция языков программирования

c5929d0fa883ec551efb9d7c2ac5b4e8.png

Мир программирования претерпел значительные изменения с момента своего зарождения. За эти годы было создано и продолжает развиваться множество языков, каждый из которых обладает уникальным синтаксисом, функциями и приложениями. Их важность в современном мире заключается в способности создавать различные приложения, упрощающие жизнь. Развитие языков программирования было необычайным и сыграло решающую роль в технологических достижениях. Здесь мы очень кратко описали историю и хронологию появления языков программирования.

Ранние начинания

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

Так выглядела бы машина Бэббиджа, если бы автор её всё-таки создал.

Так выглядела бы машина Бэббиджа, если бы автор её всё-таки создал.

В 1843 Ада Лавлейс, которая является ученым‑математиком, пишет первый алгоритм для машины Бэббиджа. Машина должна была работать на перфокартах, как ткацкий станок Жаккарда. Через много лет алгоритм Лавлейс признали первой в мире программой. Так родилась идея программирования, где самой ранней формой стал машинный код, использующий двоичные цифры (0 и 1).

Однако программирование на машинном коде является довольно‑таки сложной задачей, приходилось оперировать бесконечными цепочками единиц и нулей. Написание и уж тем более проверка такого кода достаточно трудозатратны, не говоря о понимании если код был написан другим. Именно поэтому, для упрощения был создан ассемблер, суть команды в котором обозначалась сокращенными словами и буквами.

Команда под руководством Тома Килберна и Фредерика Уильямса разработали первый пример ассемблера, который использовался для Manchester Mark 1. Далее ассемблер развивался вместе с компьютерным оборудованием: добавление новых функций инструкции, полностью отвечали развитию аппаратных возможностей. Необходимо отметить что ассемблер используется и сегодня, правда в очень узких областях. В современном программировании ассемблер чаще всего используется для прямого управления оборудованием, доступа к специализированным инструкциям процессора или для решения критических проблем производительности.

Языки высокого уровня

С развитием технологий функционал ассемблера перестал удовлетворять потребности. Необходимо было выходить на новый уровень программирования. И один из первых языков, который появился под давлением времени, стал — Fortran. Возможность создания в текстовом виде с описанием логики выполнения с использованием циклов, ветвлений, подпрограмм, оперирование массивами и представление данных в виде действительных, целых и комплексных чисел увлекли инженеров и ученых. А благодаря своим библиотекам и научным «каркасам» Fortran до сих пор актуален, пусть и в научной среде.

Еще одна ветвь развития — C. Если Fortran стал инструментом для ученых, то C был создан для помощи программистам. Многие придерживаются мнения, что C — это продвинутый ассемблер. Несмотря на это, кодирование на С остается востребовано, чему потворствует, в первую очередь, развитие микроэлектроники: так как контроллерам, гаджетам, сетевым устройствам необходимы драйвера и другое, относительно низкоуровневое, ПО для взаимодействия с оборудованием.

Объектно‑ориентированное программирование

Это высокий уровень кодирования, который все больше отходит от машинного программирования и реализуют различные парадигмы, помимо процедурных. К ним относится и реализация ООП (объектно‑ориентированных принципов программирования). Java, C++, Python, Rub, JavaScript — этот спектр языков является наиболее популярным и востребованным на сегодняшний день.

ООП характеризуется предопределенными модульными единицами программирования (объектами, классами, подклассами и т. д.), предназначенными для ускорения процесса программирования и упрощения обслуживания ПО.

Алан Кей, ученый и создатель концепции ООП, выделил следующие мотиваторы развития: поиск превосходных модульных структур для сложных систем, которые включали бы сокрытие деталей и желание разработать более гибкие версии назначений. Язык программирования является объектно‑ориентированным, если он поддерживает абстракцию данных и классов, наследование и полиморфизм.

Simula 1 и Simula 67, разработанные учеными из Норвегии, Оле‑Йоханом Далем и Кристен Нюгор, признаны первыми языками ООП. На ранних этапах разработки Simula ее создатели представляли себе модель системы имитации, состоящую из различных станций, каждая со своими очередями клиентов. Клиенты были доступны на всех станциях, что означало, что каждая станция могла «заимствовать» пользователя из очереди, изменять его переменные, а затем перенаправлять его в очередь другой станции. Станции могли автономно создавать или удалять клиентов и управлялись самой программой. Эта итерация, иногда называемая Simula 0, так и не достигла стадии реализации, но заложила основу для будущих объектно‑ориентированных языков.

Сама идея объектно‑ориентированного программирования набрала обороты в 1970-х годах, в это время, в исследовательском центре Xerox Palo Alto (PARC),  был создан — Smalltalk. Отличительной чертой Smalltalk является его чистая объектная ориентация: все в коде является объектом, включая экземпляры классов, простые типы данных и даже блоки кода (замыкания).

В начале 1980-х годов Бьорн Страуструп интегрировал идею ООП в C. Получившийся язык был назван «C с классами», который в 1983 году претерпел ребрендинг и стал носить знакомое название — С++.

От визионерских идей Кристен Нюгаард и Оле‑Йохана Даля с Simula до новаторской работы Адель Голдберг и Алана Кея с Smalltalk и последующей эволюции C++ Бьорна Страуструпом были заложены основы для парадигмы, которая произвела революцию в наших представлениях о структурировании и организации кода.

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

Эра интернета и скриптовых языков

Считается, что скриптинг — это современное течение, однако и у него имеется богатая история. Скриптинг существует с тех пор, как появились компьютеры. Фактически, он был единственным способом использования компьютера в ранние дни.

В 1950-х и 60-х годах программисты отправляли перфокарты операторам мэйнфреймов и машины работали в пакетном режиме. Язык управления заданиями, JCL от IBM, часто упоминается как один из первых языков сценариев. Но хотя скриптовые языки были функциональными, время отклика было далеко не таким быстрым, как у современных компьютеров — часто требовалось не менее дня, чтобы получить результаты.

В 1960-х годах начали разрабатываться интерактивные системы разделения времени и идея скриптовых оболочек вошла в практику. Одним из самых ранних проектов был MULTICS. Когда несколько программистов Bell Labs покинув проект, решили реализовать собственную систему, которую назвали UNIX. Одним из нововведений в оболочках Unix стала возможность отправлять вывод одной программы на вход другой, что позволило выполнять трудоемкие задачи в одной строке кода оболочки. В мире Unix появились и другие скриптовые языки, такие как AWK и Sed, для работы с текстом.

Другой важный язык сценариев — Perl,  был изобретен в 1987-м году Ларри Уоллом, стал популярным во время бума всемирной паутины в 90-х годах при создании веб‑приложений. Далее уже последовали и другие языки, такие как Python и Ruby.

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

Некоторые примеры популярных языков сценариев включают JavaScript, Python, PHP, Ruby. Эти языки обычно интерпретируются, то есть они выполняются строка за строкой программой, называемой интерпретатором, а не компилируются в машинный код. Это позволяет сократить время разработки и упростить отладку.

Скриптовые языки зачастую более гибкие и простые в изучении, чем традиционные языки программирования, что делает их популярным выбором как для новичков, так и для профессионалов.

В веб‑разработке существует два различных подхода к выполнению скриптов: клиентские и серверные скрипты.

  • Клиентские, включают запуск скриптов на компьютере или устройстве пользователя через браузер. Этот метод обычно используется для повышения интерактивности веб‑сайта, например, путем проверки вводимых данных в формах или отображения динамического контента. JavaScript — наиболее широко используемый язык для клиентских скриптов.

  • Скрипты на стороне сервера подразумевают выполнение сценариев на веб‑сервере перед доставкой страницы в браузер пользователя. Этот метод используется для создания динамического контента на сервере, например, для доступа к базе данных или обработки данных форм.

Также языки сценариев могут использоваться в системном администрировании. Примерами скриптов языка сценариев, используемых в системном администрировании, являются Shell, Perl и Python.

Расцвет мульти‑парадигменных языков

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

Каждая парадигма лучше всего подходит для программирования в определенных прикладных областях. Однако реальные проблемы часто лучше всего реализуются путем объединения концепций из разных парадигм, поскольку они включают аспекты из нескольких областей, и это объединение более удобно реализуется с использованием мульти‑парадигменных языков программирования.

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

Сама концепция мульти‑парадигменного кодирования возникла с развитием методологий и языков, а ее принятие принесло огромную пользу индустрии по разработке софта, способствуя стимулированию инноваций.

Примерами языков программирования с несколькими парадигмами являются Python, JavaScript и C++. Эти языки предлагают обширные возможности для кодирования в разных стилях, что делает их очень популярными среди разработчиков. Кроме того, доступны инструменты и библиотеки, облегчающие реализацию каждой парадигмы, что ускоряет процесс разработки и оптимизирует качество получаемого кода.

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

Будущее языков программирования

Каждые несколько лет появляются новые языки программирования, которые обещают произвести революцию в разработке программного обеспечения.

  1. Немалую роль в эволюции языков сыграет и развитие ИИ. Будущее кодирования увидит появление более специализированных языков машинного обучения, таких как Julia и Swift, которые изменят ландшафт разработки софта. Кроме того, роль машинного обучения и искусственного интеллекта в оптимизации кода, предиктивном обслуживании сократит разрыв между данными и кодом.

  2. Платформы Low‑code и no‑code (LC/NC) по сути демократизируют процессы веб‑разработки, позволяя людям с ограниченным опытом программирования создавать функциональные программные приложения.

  3. С появлением квантовых компьютеров, разрабатывается новый класс специализированных языков программирования для использования потенциала квантовых процессоров. Квантовые языки программирования, такие как Q# и Quipper, разрабатываются для решения уникальных задач.

  4. Хотя функциональное программирование существует уже несколько десятилетий, оно должно пережить возрождение благодаря своей пригодности для параллельных и распределенных вычислений. Парадигма функционального программирования делает акцент на неизменяемости, чистых функциях и декларативном стиле кода, что может привести к более надежному и поддерживаемому программному обеспечению.

  5. Безсерверные вычисления меняют способ, которым программисты развертывают и управляют приложениями. Этот подход позволяет разработчикам сосредоточиться на том, что у них получается лучше всего — на написании кода — без необходимости разбираться с деталями предоставления сервера и управления инфраструктурой. Хотя безсерверные вычисления не считаются языком программирования, они включены сюда из‑за влияния на написание кода.

  6. Поскольку мир сталкивается с экологическими проблемами, технологическая индустрия продолжит прилагать усилия по обеспечению устойчивости для снижения потребления энергии. Экологичное кодирование или разработка зеленого программного обеспечения подразумевает и написание энергоэффективного кода, который позволит снизить потребление ресурсов. На данный момент наиболее энергоэффективными языками программирования являются C, Rust, C++, Ada, Java, Pascal.

Эволюция языков программирования является свидетельством неустанного стремления к лучшим инструментам для решения сложных задач. С первых дней машинного кода и языка ассемблера до современной эры высокоуровневых мульти‑парадигменных языков каждый шаг приближал нас к более продуктивным, выразительным и мощным способам общения с компьютерами.

Хронология создания языков программирования

  1. В 1843 г Ада Лавлейс написала первый алгоритм программы.

  2. Конрад Цузе создал Plankalkul в 1940-х годах. Он содержал множество последовательностей кодирования, которые инженеры и сейчас обычно используют для выполнения основных действий.

  3. 1949 году создан ассемблер, предшественник современного программирования.

  4. В 1952 году Autocode стал первым компилируемым языком программирования.

  5. В 1957 году Джон Бэкус создал FORmula TRANslation (FORTRAN).

  6. В 1958 году были изобретены ALGOL и LISP. ALGOL.

  7. В 1959 году Грейс Мюррей Хоппер разработала COBOL

  8. В 1964 году был создан BASIC.

  9. В 1970 году Никлаус Вирт реализовал PASCAL.

  10. Smalltalk, SQL и C появились в 1972 году.

  11. Жан Ичбиа инициировал разработку Ады в начале 1980-х годов.

  12. В 1983 Бьорн Страуструп создал C++;, а Том Лав и Брэд Кокс — Objective‑C.

  13. В 1987 году Ларри Уолл разработал Perl.

  14. Haskell был создан в 1990 году и назван в честь выдающегося математика Хаскелла Брукса Карри.

  15. Visual Basic и Python появились в 1991 году.

  16. В 1993 году Юкихиро Мацумото создал Ruby.

  17. Java, JavaScript и PHP были впервые представлены в 1995 году.

  18. Компилятор C# был создан в 2000 году.

  19. В 2003 году была создана Scala, в этом же году появился Groovy.

  20. Google представил свой Go в 2009.

  21. В 2011 году появился Kotlin, совместимый с Java, для разработки приложений на Android.

  22. В 2012 год появляются Julia, TypeScript, Elixir.

  23. Apple разработала Swift в 2014 году.

  24. В 2015–2016 годы появляются: Rust, Raku, Ring и Zig.

И напоследок несколько любопытных схем, отражающих взаимосвязи между разными языками (кликабельно):

2d29091ee29ad040e18cc333d14ec803.png8ef1a8c9bd508729c91e0e670bf4ac95.png

© Habrahabr.ru