Файл: Описание и сравнительные особенности наиболее популярных языков.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 30.03.2023

Просмотров: 67

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Введение

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

Целью работы является исследование современных языков программирования, их общих и отличительных свойств, а также выбора наиболее перспективных языков для обучения желающему освоить программирование. Для реализации этой цели были сформулированы следующие задачи: ознакомиться с историей развития программирования, хронологической последовательностью разработки разных языков; проанализировать, какие виды языков программирования классифицирует современная наука а также какие условные классификации предлагает профессиональное сообщество; определить, что понимается под современным языком программирования и, если это возможно, определить общие черты наиболее популярных языков.

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

Языки программирования

Краткая история языков программирования

Язык программирования – это формальный язык, предназначенный для записи компьютерных программ. Каждый язык программирования имеет определенные лексические, синтаксические и семантические правила, определяющие внешний вид программы и действия, которые выполнит исполнитель под ее управлением. В современном мире в роли исполнителя обычно выступает компьютер, однако история языков программирования берет начало до появления современных ЭВМ, в 19 веке, с появлением первых устройств, управляемых наборами инструкций. Примером прото-языка программирования может служить алгоритм вычисления чисел Бернулли на аналитической машине, составленной Адой Лавлейс в 1842 году.

С появлением в 40-х 20 века первых электронно-вычислительных машин, возникает машинный код – команды, которые может воспринимать электронное устройство, т.е. последовательность 1 и 0, сформированная перепадом напряжения. Машинный код был машинно-зависим, неудобен для программирования, сложен для контроля, громоздок, имел высокий фактор ошибки программиста при внесении единиц и нулей. Все это являлось предпосылками для поиска решения по автоматизации формирования машинного кода. В 1950 году для записи программ начали применять язык ассемблера – тип языков программирования, предложения которых по своей структуре в основном подобны командам и обрабатываемым данным конкретного машинного языка. Язык ассемблера позволил представить машинный код в более удобной для человека форме: для обозначения команд и объектов, над которыми эти команды выполняются, вместо двоичных кодов использовались буквы или сокращенные слова, которые отражали суть команды. Перевод программы на языке ассемблера в исполнимый машинный код производится ассемблером — программой-транслятором.


Если первым поколением языков программирования считать машинные коды, то язык ассемблера можно рассматривать как второе поколение языков программирования. Недостатки языка ассемблера, сложность разработки на нем больших программных комплексов, а также отсутствие некоего единого языка низкого уровня привели к появлению в середине 50-х годов 20 века языков, не привязанных к определенному типу ЭВМ — языков программирования высокого уровня. Язык ассемблера продолжил свое применение в модулях программ, написанных на языках высокого уровня.

Первые языки высокого уровня можно отнести к третьему поколению языков программирования. Первым из них, получившим практическое применение и дальнейшее развитие[1], стал Фортран (англ. FORmula TRANslator - переводчик формул), созданный в 1954-1957 году в корпорации IBM: предназначенный для научных и инженерных вычислений. В 1958 году разработана первая версия языка Алгол (англ. ALGOrithmic Language – алгоритмический язык) – Algol 58. Позднее она была доработана (Algol 60) и полностью переработана (Algol 68, отличавшийся сложностью синтексиса и не достигший популярности предыдущих версия). Именно в языке Алгол появилось представление о программе не как о свободной последовательности команд, а как о блочной структуре, состоящей из четко описанных и отделенных друг от друга частей. В Алголе появилась возможность организации рекурсивных процедур. Если в США был более популярен Фортран, то Алгол приобрел широкое распространение в Европе и СССР, как в качестве универсального языка описания алгоритмов в научных публикациях, так и в качестве средства практического программирования.

В 1959 году был разработан Кобол (англ. COmmon Business Oriented Language – общий бизнес-ориентированный язык). Его главной особенностью был приближенность синтаксиса к английскому языку. Благодаря легкости чтения, а также средствам работы со структурами данных и файлами, Кобол на десятилетия занял нишу наиболее распространенного языка в применении к бизнесу.

Наконец, в 1960 году для работ по искусственному интелекту был разработан Лисп (англ. LISt Processing language – язык обработки списков), первый из сохранившихся в использовании языков, использующих автоматическое управление памятью и сборку мусора. Лисп пережил десятилетия активного использования, в течение которых он вобрал в себя практически все существующие методологии программирования и получил развитие в диалектах/потомках, таких, как Common Lisp (CL).


Основной чертой высокоуровневых языков стала абстракция, то есть введение смысловых конструкций, кратко описывающих такие структуры данных и операции над ними, описания которых на машинном коде (или другом низкоуровневом языке программирования) очень длинны и сложны для понимания. Принципы, заложенные такими языками, как Фортран, Кобол и Лисп, получили дальнейшее развитие в период 60х-70х годов 20 века, когда были разработаны основные парадигмы программирования. В 1968-1969 году разработан язык Паскаль. В 1969-1973 году появляется язык Си, оказавший существенное влияние на развитие индустрии программного обеспечения, и давший основу синтаксиса таких языков программирования, как C# и Java.

В период конца 70х – начало 80х годов 20 века происходит окончательное формирование принципов объектно-ориентированного программирования. ОПП - методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса. Понятие класса стало важным шагом вперед в развитии программирования, существенно упростившим написание и отладку программного продукта. ООП идеологически произошел из структурного программирования, и сочетал лучшие его принципы с новыми концепциями: инкапсуляции (механизм языка, позволяющий ограничить доступ одних компонентов программы к другим; позволяет реализовать быструю и безопасную иерархию компонентов программ), наследования (способности объекта использовать методы производного класса, который не существует на момент создания базового), и полиморфизма (в широком смысле - способность функции обрабатывать данные разных типов; например, способности классов с одинаковой спецификацией могут иметь различную реализацию). Объектно-ориентированные языки программирования - C++, Java, Ruby, Python, JavaScript, Ruby являются на сегодняшний день наиболее востребованным классом языков.

На современном этапе развития программирования становится популярной и другая парадигма – функциональное программирование. ФП использует другой вид абстракции для вычислений, отличный от ООП. Основу ФП составляют функции, которые берут в качестве аргументов набор функций и возвращают другую. Каждый символ в ФП каждый символ является неизменяемым, и как следствие, функции не имеют побочных действий. Функция не может поменять значение вне своей области видимости, и тем самым повлиять на другие функции. Результат работы функции зависит только от переданных аргументов. Как следствие, языки функционального программирования имеют более легкий процесс отладки, программы можно тестировать параллельно. Модель вычислений без состояний определяет как основные преимущества, так и недостатки ФП. Наиболее популярными языками, реализующими функциональное программирования, являются Haskell, Scala, Erlixir, Erlang, Elm. Следует отметить, однако, что элементы функционального программирования включены и во многие современные языки ОПП, например, Java.


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

Способы классификации

Существует множество признаков, по которым проводят классификацию языков программирования (см. рис.1). Большая их часть не основывается на технических свойствах, не является дихотомичной, а в некоторых случаях – подвержена субъективности при типизации. Кроме того, начиная с 80-х годов 20 века в развитии языков программирования действует тенденция к консолидации. Языки заимствуют и перерабатывают некоторые особенности друг друга, объединяют черты различных своих предшественников, при этом не всегда соблюдая принцип непротиворечивости. Все это обусловливает факт отсутствия общепринятой строгой классификации языков программирования. Рассмотрим некоторые из способов и их несовершенства.

Рисунок 1. Классификация языков программирования [2]

Выше уже упоминалась хронологическая классификация языков. Согласно этому критерию, языки подразделяют как правило на пять поколений. Первое поколение – языки, реализованные на аппаратном уровне. Второе поколение – это языки ассемблера. Третье поколение – это первые из высокоуровневых языков, условно независимые от аппаратного обеспечения. Четвертое поколение приходится на период с 70-х по 90-е годы 20 века, языки этого поколения ориентированы на специализированные области применения. Для них характерны операторы, позволяющие одной строкой реализовать функциональность, которую на языках третьего поколения потребовалось бы описывать многократно большим исходным кодом. Пятое поколение (встречаются, однако, классификации, ограничивающиеся четырьмя поколениями) объединяет языки и прикладные системы, позволяющие автоматически формировать результирующий текст на универсальных языках программирования

По уровню языка различают языки низкого и высокого уровня. Под уровнем степень отличия семантики языка от машинного кода целевой архитектуры процессора. Языки низкого уровня – т.е. те, что ближе к машине, нежели к человеку – это языки первого и второго поколения. Языки третьего поколения преимущественно относят к высокому уровню, однако, к примеру, язык Си был при разработке позиционирован как высокоуровневый язык ассемблера и может быть обособленно классифицирован как язык среднего уровня или поколения 2,5. Языки четвертого поколения являются языками высокого уровня. Для языков пятого поколения иногда используется термин сверхвысокий уровень.


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

По способу реализации различают компилируемые, интерпретируемые и встраиваемые языки. Условность данной классификация заключается в том, что реализация не является присущим конкретному языку свойством, и можно говорить только о естественном для языка способе реализации, который определяется временем связывания программных элементов с их характеристиками. В частности, в языках со статической типизацией переменные и другие объекты программы связываются с типом данных на этапе компиляции, а в случае типизации динамической — на этапе выполнения, как правило — в произвольной точке программы. Некоторые свойства элементов языка, такие как значение арифметических операторов или управляющих ключевых слов, могут быть связаны уже на этапе определения языка. В других языках возможно их переназначение. Раннее связывание обычно означает большую эффективность программы, в то время как позднее — большую гибкость, ценой которого является меньшая скорость или усложнение соответствующего этапа. Для любого традиционно компилируемого языка (например, Паскаль) можно написать интерпретатор. Кроме того, большинство современных интерпретаторов не исполняют конструкции языка непосредственно, а компилируют их в некоторое высокоуровневое промежуточное представление. Большинство традиционно интерпретируемых или компилируемых языков могут реализовываться как встраиваемые. Некоторые языки, например, Java и C#, находятся между компилируемыми и интерпретируемыми: программа компилируется не в машинный язык, а в машинно-независимый код низкого уровня, байт-код. Далее байт-код выполняется виртуальной машиной. Для Java байт-код исполняется виртуальной машиной Java (Java Virtual Machine, JVM), для C# — Common Language Runtime. Подобный подход в некотором смысле позволяет использовать плюсы как интерпретаторов, так и компиляторов.

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