Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Обзор языков программирования высокого уровня (Программирование)

Содержание:

Введение

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

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

Целью работы является рассмотрение основных языков программирования высокого уровня.

Задачи:

  • рассмотреть классификации языков программирования;
  • изучить особенности языков программирования;
  • провести сравнительный анализ.

1 Программирование

Программа – это последовательность инструкций (команд), описывающая алгоритм решения с помощью компьютера.

Программирование — процесс создания или модификации программ для ЭВМ.[1]

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

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

Программа может содержать инструкции, написанные на языках программирования высокого уровня (ЯВУ), которые позволяют записать алгоритмы в удобной для понимания человеком форме, приближенной к естественным языкам (исходный код), или последовательность машинных команд (инструкций, «понятных» компьютеру, на котором данная программа должна выполняться).

1.1 Классификация языков программирования

Существует множество классификаций языков программирования по различным критериям. На рисунке 1.1 приведены некоторые из них.

НОУ ИНТУИТ | Лекция | Методическое обеспечение САПР ...

Рисунок 1.1 - Разбиение языков программирования по части классификаций

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

Язык низкого уровня – это язык программирования, предназначенный для определенного типа компьютера и отражающий его внутренний машинный код; языки низкого уровня часто называют машинно-ориентированными языками. Их сложно конвертировать для использования на компьютерах с разными центральными процессорами, а также довольно сложно изучать, поскольку для этого требуется хорошо знать внутренние принципы работы компьютера. Пример низких языков: Ассемблер.

Язык высокого уровня–это язык программирования, понятия и структура которого удобны для восприятия человеком. Любая программа на языке высокого уровня впоследствии транслируется в машинный код.[7] Языки высокого уровня используют для решения проблем, и поэтому их часто называют проблемно-ориентированными языками. Каждая команда языка высокого уровня эквивалентна нескольким командам в машинных кодах, поэтому программы, написанные на языках высокого уровня, более компактны, чем аналогичные программы в машинных кодах. Примеры высоких языков: C++, С#, Visual Basic, Python.

1.1.2 Классификация по поколениям

Языки программирования принято делить на пять поколений.

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

Языки второго поколения (2GL) создавались для того, чтобы облегчить тяжёлую работу по программированию, перейдя в выражениях языка от низкоуровневых машинных понятий ближе к тому, как обычно мыслит программист. Эти языки появились в 1950-е годы, в частности, такие языки как Фортран и Алгол.

Под третьим поколением (3GL) первоначально понимались все языки более высокого уровня, чем ассемблер. Главной отличительной чертой языков третьего поколения стала независимость от аппаратного обеспечения, то есть выражение алгоритма в форме, не зависящей от конкретных характеристик машины, на которой он будет исполняться. Код, написанный на языке третьего поколения, перед исполнением транслируется либо непосредственно в машинные команды, либо в код на ассемблере и затем уже ассемблируется. При компиляции, в отличие от предыдущих поколений, уже нет соответствия один-к-одному между инструкциями программы и генерируемым кодом. Примеры языков: C#, Java, C++.

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

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

1.1.3 Классификация по способу трансляции

Можно выделить три принципиально разных способа реализации языков программирования: компиляция, интерпретация и встраивание.

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

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

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

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

Некоторые языки, например, Java и C#, находятся между компилируемыми и интерпретируемыми. А именно, программа компилируется не в машинный язык, а в машинно-независимый код низкого уровня, байт-код. Далее байт-код выполняется виртуальной машиной. Для выполнения байт-кода обычно используется интерпретация, хотя отдельные его части для ускорения работы программы могут быть транслированы в машинный код непосредственно во время выполнения программы по технологии компиляции «на лету».

1.1.4 Классификация по парадигме программирования

Парадигма программирования – это система идей и понятий, определяющих стиль написания компьютерных программ. [5]

Эта классификация имеет довольно большое число разных стилей программирования. Ниже описано лишь три из них.

Модульное программирование

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

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

Объектно-ориентированное программирование (ООП) - метод программирования, в котором главными элементами программ являются объекты.[4]

Важнейшие принципы ООП:

  • Инкапсуляция - объединение данных и свойственных им процедур обработки в одном объекте. Фундаментальным понятием является класс - шаблон, на основе которого может быть создан конкретный программный объект. Он описывает свойства и методы, определяющие поведение объектов этого класса. Каждый конкретный объект, имеющий структуру этого класса, называется экземпляром класса.
  • Наследование - такая организация классов, которая предусматривает создание новых классов на базе существующих и позволяет классу потомку иметь (наследовать) все свойства класса – родителя.
  • Полиморфизм - означает, что рожденные объекты обладают информацией о том, какие методы они должны использовать в зависимости от того, в каком месте цепочки (дерева классов) они находятся. Это концепция, реализующая "множество методов в одном интерфейсе".

Функциональное программирование

Функциональное программирование предполагает обходиться вычислением результатов функций от исходных данных и результатов других функций, и не предполагает явного хранения состояния программы. Соответственно, не предполагает оно и изменяемость этого состояния.[6]

Так же выделяют императивное программирование, декларативное программирование, структурное программирование, логическое программирование, компонентно-ориентированное программирование, прототипно-ориентированное программирование, агентно-ориентированное программирование и др.

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

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

  • Basic;
  • Pascal;
  • Delphi;
  • Fortran;
  • С и С++;
  • Java;
  • C#;
  • Python;
  • и т.д.;

Рассмотрим некоторые из них:

2.1 C++

C++ — чрезвычайно мощный язык, содержащий средства создания эффективных программ практически любого назначения, от низкоуровневых утилит и драйверов до сложных программных комплексов самого различного назначения.

Достоинства:

Высокая совместимость с языком С, позволяющая использовать весь существующий С-код.

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

Имеется возможность работы на низком уровне с памятью, адресами, портами.

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

Кроссплатформенность. Доступны компиляторы для большого количества платформ, на языке C++ разрабатывают программы для самых различных платформ и систем.

Эффективность. Язык спроектирован так, чтобы дать программисту максимальный контроль над всеми аспектами структуры и порядка исполнения программы.

Недостатки:

Синтаксис, провоцирующий ошибки:

Препроцессор, унаследованный от С, очень примитивен.

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

2.2 C#

C# нельзя рассматривать только как язык, это часть большой системы, которая включает в себя ОС Windows, среду разработки Visual Studio (и другие инструменты), ну и, конечно, саму Microsoft, которая обеспечивает поддержку этого языка. C# будет существовать и развиваться, пока существует Microsoft и пока люди пользуются Windows, а это будет ещё очень и очень долго.

Достоинства:

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

Минусы:

  • ориентированность, в основном, только на .NET (на Windows платформу);
  • бесплатность только для небольших компаний и программистов одиночек.

2.3 Java

Язык Java — полностью объектно-ориентированный язык. Сказанное означает, что для написания даже самой маленькой и самой простой программы придется описать по меньшей мере один класс.[3]

Достоинства:

  • Переносимость. Программы, написанные на языке Java, после однократной трансляции в байт-код могут быть исполнены на любой платформе, для которой реализована виртуальная Java-машина. Наиболее эффективно возможности реального компьютера может использовать только программа, написанная с использованием «родного» машинного кода.
  • Безопасность. Функционирование программы полностью определяется (и ограничивается) виртуальной Java-машиной. Отсутствуют указатели и другие механизмы для непосредственной работы с физической памятью и прочим аппаратным обеспечением компьютера. Дополнительные ограничения снижают возможность написания эффективно работающих Java-программ.
  • Надежность. В языке Java отсутствуют механизмы, потенциально приводящие к ошибкам: арифметика указателей, неявное преобразование типов с потерей точности и т.п. Присутствует строгий контроль типов, обязательный контроль исключительных ситуаций. Многие логические ошибки обнаруживаются на этапе компиляции. Наличие дополнительных проверок снижает эффективность выполнения Java-программ.

Недостатки языка:

  • Язык не полностью объектно-ориентирован: Язык не имеет таких свойств полностью объектно-ориентированного языка, как индивидуальные переменные, множественное наследование и.т.д.
  • Соответствие корпоративным требованиям: Язык довольно популярен в мире программ с открытым кодом и технически превосходит многие коммерческие аналоги. Однако ему не хватает некоторых важных, с точки зрения корпоративной среды-особенностей. Это означает, что если мы захотим использовать PHP в корпорации, то это либо вообще не удастся сделать, либо потребуется значительно больше дополнительных программных средств, чем при использовании Java или C++.

2.4 Python

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

Достоинства языка

  • Кросплатформенность. Несомненным достоинством является то, что интерпретатор Python реализован практически на всех платформах и операционных системах.
  • Расширяемость языка. Это означает, что имеется возможность совершенствования языка всеми заинтересованными программистами. Интерпретатор написан на С и исходный код доступен для любых манипуляций.
  • Большое количество подключаемых к программе модулей, обеспечивающих различные дополнительные возможности. В качестве примера можно привести следующие модули:

Numerical Python - расширенные математические возможности, такие как манипуляции с целыми векторами и матрицами;

Tkinter - построение приложений с использованием графического пользовательского интерфейса (GUI) на основе широко распространенного на X-Windows Tk-интерфейса;

Недостатки языка.

  • Наверное единственным недостатком, является сравнительно невысокая скорость выполнения Python-программы, что обусловлено ее интерпретируемостью.

2.5 Swift

Swift — это скомпилированный язык программирования для приложений iOS, macOS, watchOS, tvOS и Linux.

Первой особенностью синтаксиса языка Swift является его принадлежность к группе C-подобных языков программирования. Разработчики, которые уже знакомы с C-подобными языками, найдут в Swift много знакомых конструкций. Блоки кода все также разделяются парой фигурных скобок, а циклы, условия и функции содержат знакомые нам ключевые слова if, else, for, return.[7]

Достоинства

  • Производительность. Как заявляет Apple, Swift в 2,5 раза быстрее Objective-C и в 8 раз быстрее, чем Python 2.7.
  • Лаконичный синтаксис. Если брать за критерий количество строк кода, которые нужно написать для решения задачи, то Swift идёт в первой десятке по минимализму.
  • Видимый результат. Для Swift есть специальный инструмент Playground — своего рода интерактивная песочница, где программист сразу видит результаты работы программы. Иногда это в несколько раз увеличивает скорость разработки и помогает быстро разобраться с проблемным участком кода.
  • Функционально совместимый. Благодаря интеграции с библиотекой исполнения программ Objective-C (Objective-C Runtime Library) можно писать программы на Swift, C, Objective-C, и C++ одновременно.

Недостатки

  • Ограниченный кадровый потенциал. Swift новичок среди языков, в связи с этим талантливых разработчиков пока не так много. Но этот недостаток легко превратить в достоинство тем, кто хочет стать Swift разработчиком. Потребность в них только увеличивается, а конкуренция все еще не большая.
  • Малое количество библиотек. В Swift все еще довольно мало встроенных функций, которые бы работали одинаково хорошо во всех версиях. Большинство библиотек и фреймворков разработаны для более ранних версий языка и совершенно бесполезны в новых.
  • Нестабильность. Многие разработчики жалуются на одну и ту же проблему. Из-за изменений, представленных в новой версии языка, Swift ведет себя очень нестабильно. Это значит, что если разработчик хочет перейти на новую версию языка — ему нужно будет переписать код. Правда, эта проблема была частично решена с помощью Swift Migration Tool в XCode, что сделало миграцию на 4-ю версию языка довольно простой задачей.

2.6 Object Pascal

Object Pascal является расширением языка Паскаль, который был разработан в Apple Computer. Он относится к относится к ветви объектно-ориентированным языка программирования.

Когда речь заходит об обсуждение сильных и слабых сторон Object Pascal, стоит говорить не столько о самом языке, сколько о Delphi – главном представителю «семейства», ввиду его востребованности и освоенности программистами. Итак, поверхностно взглянем на его характеристики:

Преимущества:

  • Понятный синтаксис;
  • Доступные IDE;
  • Минимальные затраты времени на освоение IDE и создание прикладных приложений.

Недостатки:

  • Малое количество библиотек по сравнению с С/С++/Object C;
  • Недостаточная гибкость из-за того, что язык создавался не с нуля, а по сути, эволюционировал от Pascal;
  • Слабая поддержка, как со стороны разработчиков IDE, так и самого языка;
  • Ограничение функциональности.

3 Сравнительный анализ языков программирования высокого уровня

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

https://techrocks.ru/wp-content/uploads/2020/02/1-Screenshot-from-2020-02-07-21.24.00.png

Рисунок 1 - Диаграмма популярности языков программирования

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

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

Условные обозначения в таблицах.

+ Указанная возможность присутствует

− Указанная возможность отсутствует

+/− Возможность поддерживается не полностью

−/+ Возможность поддерживается очень ограниченно

? Нет данных

N/A Постановка вопроса не применима к языку

Таблица 1 - Возможность использования парадигм

Язык / Парадигма

Императивная

Объектно-ориентированная

Функциональная

Рефлексивная

Обобщённое программирование

Логическая

Декларативная

Распределенная

Active Oberon

+

+

Ada

+

+

+

+

C

+

−/+

+/−

+

+/−

C++

+

+

−/+

−/+

−/+

+/−

C#

+

+

+/−

−/+

+

−/+

−/+

D

+

+

+/−

−/+

+

−/+

+/−

Eiffel

+

+

+/−

?

+/−

?

+

Erlang

+

+

+

+

+

Prolog

?

?

+

+

+

F#

+

+

+

−/+

+

+

Go

+

+/−

+/−

+

Groovy

+

+

+

+

+

+

−/+

Java

+

+

−/+

−/+

+

+

JavaScript

+

+

+/−

+

+

+/−

Haskell

+

+

+

+/−

+

+

Common Lisp

+

+

+/−

+

+

+/−

+

+/−

Modula-3

+

+

+

+

−/+

Nemerle

+

+

+

−/+

+

+/−

+

Perl

+

+

+

+/−

+

−/+

PHP

+

+

+/−

+

+

+

Python

+

+

+

+

+

+

−/+

Ruby

+

+

+

+

+

+

−/+

Rust

+

−/+

+

−/+

+

+

Scala

+

+

+

−/+

+

?

+

?

Smalltalk

+

+

+

+

+

+/−

+/−

+/−

Tcl

+

+

+

+

?

VB.NET

+

+

+/−

−/+

+

+/−

Delphi

+

+

−/+

−/+

+

OCaml

+

+

+

+

+

PureBasic

+

−/+

+/−

?

−/+

?

+/−

Таблица 2 - Поддерживаемая трансляция

Open-source компилятор (интерпретатор)

Возможность компиляции

Bootstrapping

Многопоточная компиляция

Интерпретатор командной строки

Условная компиляция

Active Oberon

+

+

+

+

+

+

Ada

+

+

+

+

+/−

+/−

C

+

+

+

+

−/+

+

C++

+

+

+

+

+/−

+

C#

+

+

+

+

+

D

+

+

+

+

+/−

+

Eiffel

+

+

+

?

?

?

Erlang

+

−/+

+

+

+

+

F#

+

+

+

+

+

+

Go

+

+

+

+

+/−

Groovy

+

+

+

+

+

?

Java

+

+

+

+

−/+

JavaScript

+

+

+

?

+

−/+

Haskell

+

+

+

+

+

+

Common Lisp

+

+

+

+

+

+

Modula-3

+

+

+

Nemerle

+

+

+

+

+

Perl

+

+

?

?

+

+

PHP

+

+

N/A

?

+

+

Python

+

+

+

N/A

+

N/A

Ruby

+

+

+

N/A

+

N/A

Rust

+

+

+

+

+

Scala

+

+

+

+

?

Smalltalk

+

+

+

+

+

Tcl

+

N/A

N/A

+

N/A

VB.NET

+

+

?

+

+

+

Delphi

+

+

+

?

+/−

+

Ocaml

+

+

+

+

+

N/A

PureBasic

+

+

+

+

Таблица 3 - Возможности управления памятью

 

Создание объектов на стеке

Неуправляемые указатели

Ручное управление памятью

Сборка мусора

Active Oberon

+

+

+/−

+

Ada

+

+

+

−/+

C

+

+

+

C++

+

+

+

−/+

C#

+

+

+

+

D

+

+

+

+

Eiffel

−/+

+

Erlang

?

+

F#

+

+

Go

?

?

?

+

Groovy

+

Java

+

JavaScript

+

Haskell

+/−

+

Common Lisp

+/−

+

Modula-3

+

+

+

Nemerle

+

+

+

+

Perl

+

PHP

+

Python

+

Ruby

+

Rust

+

+

+

+/−

Scala

?

+

Smalltalk

?

+

+

+

Tcl

+

VB.NET

+

Delphi

−/+

+

+

OCaml

?

+

PureBasic

+

+

+

Таблица 4 - Объектно-ориентированные возможности

Интерфейсы

Мультиметоды

Mixins

Переименование членов при наследовании

Множественное наследование

Решение конфликта имен при множественном наследовании

Active Oberon

+

N/A

Ada

?

?

?

?

?

C

+/−

N/A

N/A

N/A

C++

−/+

−/+

−/+

+

+

C#

+

−/+

N/A

D

+

+

?

N/A

Eiffel

?

?

+

+

+

Erlang

N/A

N/A

N/A

N/A

N/A

N/A

F#

+

?

N/A

Go

+

?

?

?

?

Groovy

+

+

+

?

Java

+

+

N/A

JavaScript

?

?

?

?

?

Haskell

N/A

N/A

N/A

N/A

N/A

N/A

Common Lisp

N/A

+

+

+

+

Modula-3

N/A

Nemerle

+

?

N/A

Perl

+/−

?

−/+

+

+

PHP

+

+

N/A

Python

+

+

+

+

Ruby

?

+

?

N/A

Rust

+

−/+

?

N/A

N/A

N/A

Scala

?

+

?

?

?

Smalltalk

?

+

N/A

VB.NET

+

?

N/A

Delphi

+

+

N/A

OCaml

+

?

?

+

?

PureBasic

+

N/A

+/−

?

Заключение

Выполнив данную работы были рассмотрены популярные языки программирования высокого уровня и рассмотрены их особенности.

Так же был проведен сравнительный анализ по:

  • Популярности;
  • Возможности использования парадигм;
  • Возможности использования принципов ООП;
  • Возможности управления памятью;
  • Принципам трансляции языка.

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

Список литературы

  1. А.А. Тюгашев. Основы программирования. Часть I. – СПб: Университет ИТМО, 2016. – 160 с.
  2. Бахтизин, В.В.Б30 Языки программирования: язык ассемблера: методическое пособиедля студ. спец. 1-40 01 01 «Программное обеспечение информационных технологий» днев. и дист. форм обуч. / В.В.Бахтизин, С. Б. Мусин, Е.В. Шостак. –Минск: БГУИР, 2010. –32с.
  3. Васильев A.Н. Java. Объектно-ореентированное программирование. Учебное пособие. СПБ.: Питер, 2013. - 400с.
  4. Герман, О. Программирование на Java и C# для студента / О. Герман, Ю. Герман. - М.: БХВ-Петербург, 2014. - 512 c.
  5. Демин, А. Ю. Информатика. А.Ю. Демин, В.А. Дорофеев, Попов В.Н., Погребной А.В. — Москва: Издательство Юрайт, 2019. — 83c.
  6. Санников, Е. В. Курс практического программирования в Delphi. Объектно-ориентированное программирование / Е.В. Санников. - М.: Солон-Пресс, 2013. - 188 c.
  7. Харазян А. А. Язык Swift. Самоучитель. — СПб.: БХВ-Петербург, 2016. — 176 с.: ил. —(Самоучитель)