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

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

Содержание:

Введение

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

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

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

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

Языки высшего уровня открывают третье поколение языков программирования. Основная отличительная особенность – наличие смысловых конструкций, с помощью которых можно кратко описывать структуры данных и операции над ними. Также, ЯПВУ присущи следующие не менее важные черты:

  • От программиста не требуется знание машинных команд
  • Язык не связан с конкретным типом ЭВМ, что обеспечивает переносимость программного кода
  • Одно выражение на языке высокого уровня в большинстве случаев транслируется в целую последовательность машинных команд

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

Первые ЯВУ

В середине 50-х годов под руководством Джона Бэкуса (IBM) был разработан первый язык программирования высшего уровня – FORTRAN (FORmula TRANslator). В отличие от уже существовавших на тот момент времени транслируемых языков программирования, FORTRAN предоставлял возможность записи алгоритма вычислений с использованием условных операторов и операторов ввода/вывода. Как и другие новые языки программирования, FORTRAN имел серьезные недостатки, а также в нем отсутствовала поддержка современных концепций структурирования данных и модульного проектирования программного продукта. Однако, несмотря на все перечисленные недостатки, преимущества абстракции были по достоинству оценены большинством программистов. Эффективность использования FORTRAN подтверждалась снижением времени и сил, требуемых для разработки программ, повысилась их надежность. Также, снизился уровень машинозависимости из-за абстрагирования от регистров и машинных команд. Многие конструкции языка первоначально разрабатывались под архитектуру IBM 407. Данная разработка имела успех и это привело к тому, что производители других вычислительных систем стали создавать свои версии трансляторов.

Альтернативой языку FORTRAN, изначально создававшемуся под архитектуру IBM, стал разработанный Питером Науром язык ALGOL (ALGOrithmic Language). Целью разработчиков являлась независимость от архитектуры целевой вычислительной машины. Язык разрабатывался для общих и научных приложений, однако достичь популярности FORTRAN ему не удалось из-за недостаточной поддержки со стороны производителей ЭВМ.

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

Эволюция ЯВУ

Из первых языков программирования Algol больше других повлиял на последующие языки – от него произошли два таких важных языка как Jovial, который использовался для операционных систем реального времени в Военно-воздушных силах США и Simula, ставший одним из первых языков моделирования. Но наиболее известным языком-потомком Algol является Pascal.

Целью разработки языка Pascal была возможность демонстрации идей объявления типов и контроля их соответствия. Впоследствии это оказалось одной из наиболее важных концепций в проектировании языков программирования. У данного языка было одно большое преимущество и один большой недостаток. Преимуществом являлась легкая переносимость на любую ЭВМ как следствие того, что компилятор был написан на самом Pascal. Недостаток данного языка заключался в невозможности разработки серьезных программ, требовавших написания больших объемов кода. Полное отсутствие возможности декомпозиции программы на модули в Pascal стали причиной создания языка Modula в качестве альтернативы.

Параллельно с разработкой языка Pascal по инициативе Министерства обороны США началась работа по созданию языка высокого уровня Ada, названного в честь Ады Лавлейс. Предпосылкой к этому стало накопление большого количества программ на различных языках программирования (FORTRAN, Algol и т.д.), сопровождение которых становилось все более затруднительным. Создание языка началось с определения требований и выработки спецификаций к «универсальному» языку программирования. Далее, в процессе конкурсного отбора был выбран наиболее соответствующий требованиям язык программирования, который впоследствии был доработан и в результате стал языком программирования Ada. Новый язык обладал строгой типизацией данных, строго описанным синтаксисом. Однако несмотря на все преимущества данный язык программирования оказался сложным для восприятия, что затруднило процесс сопровождения программ, написанных на нем. Это стало причиной провала попытки создания Ada как универсального языка программирования.

Универсальный язык программирования C был разработан в середине 70-х годов Денисом Ритчи, сотрудником Bell Laboratories, как язык для написания ядра операционной системы UNIX. Операционные системы традиционно писали на ассемблере, поскольку языки высокого уровня считались неэффективными. Язык С абстрагируется от деталей программирования, присущих ассемблерам, предлагая структурированные управляющие операторы и структуры данных и сохраняя при этом всю гибкость ассемблерного низкоуровневого программирования. Так как система UNIX была легко доступна и написана на переносимом языке, то она быстро стала популярна в академических и исследовательских учреждениях. Когда новые компьютеры и прикладные программы выходили из этих учреждений на коммерческий рынок, вместе с ними распространялись UNIX и С. Язык С проектировался так, чтобы быть близким к языку ассемблера, и это обеспечивает ему чрезвычайную гибкость, но проблема состоит в том, что эта гибкость приводит к возможности допущения скрытых ошибок в программе, поскольку ненадежные конструкции не проверяются компилятором. Язык С – превосходный инструмент в руках профессионала и удобен для небольших программ, но при разработке на нем больших программных комплексов группами разработчиков разной квалификации могут возникнуть серьезные проблемы. Впоследствии данный язык лег в основу разработки языков программирования C++ и Java.

В 80-х годах Бьерн Страуструп, также из Bell Laboratories, использовал С как основу для языка C++, добавив поддержку объектно-ориентированного программирования, аналогичную той, которую предоставлял язык Simula. Кроме того, в C++ исправлены многие ошибки языка С, и ему следует отдавать предпочтение даже в небольших программах, где объектно-ориентированные свойства не так важны.

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

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

В 90-х годах с популяризацией и распространением сети Интернет появляются новые возможности распределенной обработки данных. Вследствие этого создаются языки для разработки серверных приложений (Java, Perl, PHP), языки разметки (HTML, XML). Традиционные языки программирования также претерпевают изменения. Под понятием язык программирования начинает пониматься не только функциональность самого языка, но и библиотеки классов, предоставляемые средой программирования.

В настоящее время языки программирования применяются в самых различных областях, таких как:

  • Научные расчеты
  • Системное программирование
  • Обработка информации
  • Искусственный интеллект
  • Издательская деятельность
  • Удаленная обработка информации
  • Описание документов

Парадигмы программирования

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

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

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

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

Следующим определяющим шагом совершенствования языков высшего уровня стало появление объектно-ориентированного подхода к программированию. Понятие объекта впервые было использовано в языке Simula. При данном подходе программа представляет собой описание совокупностей (классов) объектов, их свойств, методов и отношений между этими объектами.

Объектно-ориентированный подход основывается на 3 основных принципах:

  • Полиморфизм – свойство системы, позволяющее использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
  • Инкапсуляция – свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе. Также, под этим понятием может пониматься сокрытие – принцип проектирования, заключающийся в разграничении доступа различных частей программы к внутренним компонентам друг друга.
  • Наследование – свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью. Класс, от которого производится наследование, называется базовым, родительским или суперклассом. Новый класс — потомком, наследником, дочерним или производным классом.

Элементы языков программирования высшего уровня

Языки программирования – это формальные языки специально созданные для взаимодействия человека с компьютером. Каждый язык программирования, как и естественные языки имеет:

  • Алфавит
  • Синтаксис
  • Семантика

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

Синтаксис

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

Синтаксис задается с помощью формальной нотации.

Самая распространенная формальная нотация синтаксиса — это расширенная форма Бекуса — Наура (РБНФ). В РБНФ мы начинаем с объекта самого верхнего уровня, с программы, и применяем правила декомпозиции объектов, пока не достигнем уровня отдельного символа.

Пример. Правило записи условного оператора в форме РБНФ:

Имена, выделенные курсивом, представляют синтаксические категории, а имена и символы, выделенные полужирным шрифтом, представляют фактические символы, которые должны появиться в тексте программы. Каждое правило содержит символ «:: =», означающий «представляет собой». Прочие символы используются для краткости записи:

  • [ ] Не обязательный
  • {} Ноль или более повторений
  • | Или

Таким образом, else-оператор в if-операторе не является обязательным.

Правила синтаксиса легче изучить, если они заданы в виде диаграмм (рис. 2.1). Круги или овалы обозначают фактические символы, а прямоугольники — синтаксические категории, которые имеют собственные диаграммы.

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

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

Семантика

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

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

  • Указателем на следующую команду, которая будет выполнена
  • Содержимым памяти программы

Семантика команды задается описанием изменения состояния, вызванного выполнением команды.

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

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

Типизация данных

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

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

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

Тип данных назначается при объявлении объекта и определяет:

  • Значения, которые может принимать объект данного типа
  • Операции, которые используются для манипуляции над объектами данного типа

Исходя из опыта разработки и использования языков программирования, некоторые типы данных рассматриваются в качестве основных:

    • Простые типы данных
      • Целый
      • Вещественный
      • Символьный
      • Логический
      • Перечисляемый
      • Интервальный
    • Структурированные типы данных
      • Функция с конечной областью определения
      • Декартово (прямое) произведение
      • Объединение
      • Множество
    • Ссылочный тип данных

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

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

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

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

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

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

  • Не делать ничего. Непосредственно программист отвечает за то, чтобы присваивание имело смысл.
  • Неявно преобразовать значение выражения к типу, который требуется в левой части выражения.
  • Строгий контроль соответствия типов: отказ от выполнения присваивания, если типы различаются.

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

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

Примеры языков программирования высшего уровня

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

C++ — компилируемый, статически типизированный язык программирования общего назначения. Поддерживает такие парадигмы программирования, как процедурное программирование, объектно-ориентированное программирование, обобщённое программирование. Язык имеет богатую стандартную библиотеку, которая включает в себя распространённые контейнеры и алгоритмы, ввод-вывод, регулярные выражения, поддержку многопоточности и другие возможности. C++ сочетает свойства как высокоуровневых, так и низкоуровневых языков /страус. В сравнении с его предшественником — языком C, наибольшее внимание уделено поддержке объектно-ориентированного и обобщённого программирования.

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

Синтаксис C++ унаследован от языка C. Одним из принципов разработки было сохранение совместимости с C. Тем не менее, C++ не является в строгом смысле надмножеством C. Множество программ, которые могут транслироваться как компиляторами C, так и компиляторами C++, довольно велико, но не включает все возможные программы на C.

В C++ доступны следующие встроенные типы. Типы C++ практически полностью повторяют типы данных в C:

  • Символьные: char, wchar_t (char16_t и char32_t, в стандарте C++11).
  • Целочисленные знаковые: signed char, short int, int, long int (и long long, в стандарте C++11).
  • Целочисленные беззнаковые: unsigned char, unsigned short int, unsigned int, unsigned long int(и unsigned long long, в стандарте C++11).
  • С плавающей точкой: float, double, long double.
  • Логический: bool, имеющий значения true или false.

Также, при разработке языка было впервые введено понятие ссылок.

C++ добавляет к C объектно-ориентированные возможности. Он вводит классы, которые обеспечивают три самых важных свойства ООП: инкапсуляцию, наследование и полиморфизм. В стандарте C++ под классом подразумевается пользовательский тип, объявленный с использованием одного из ключевых слов class, struct или union, под структурой подразумевается класс, определённый через ключевое слово struct, и под объединением подразумевается класс, определённый через ключевое слово union.

C++ поддерживает множественное наследование. Базовые классы указываются в заголовке описания класса, возможно, со спецификаторами доступа. Наследование от каждого класса может быть публичным, защищённым или закрытым. По умолчанию базовый класс наследуется как private. В результате наследования класс-потомок получает все поля классов-предков и все их методы. Если один класс-предок наследуется несколько раз (это возможно, если он является предком нескольких базовых классов создаваемого класса), то экземпляры класса-потомка будет включать столько же подэкземпляров данного класса-предка. Чтобы избежать такого эффекта, если он нежелателен, C++ поддерживает концепцию виртуального наследования. На все виртуальные вхождения класса-предка в дерево наследования класса-потомка в потомке создаётся только один подэкземпляр.

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

C++ поддерживает динамический полиморфизм и параметрический полиморфизм.

Параметрический полиморфизм представлен:

  • Аргументами по умолчанию для функций
  • Перегрузка функций

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

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

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

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

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

Java — строго типизированный объектно-ориентированный язык программирования, разработанный компанией Sun Microsystems. Программы на Java транслируются в байт-код Java, выполняемый виртуальной машиной Java (JVM) — программой, обрабатывающей байтовый код и передающей инструкции оборудованию как интерпретатор.

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

Часто к недостаткам концепции виртуальной машины относят снижение производительности. Ряд усовершенствований несколько увеличил скорость выполнения программ на Java:

  • Применение технологии трансляции байт-кода в машинный код непосредственно во время работы программы (JIT-технология) с возможностью сохранения версий класса в машинном коде
  • Широкое использование платформенно-ориентированного кода (native-код) в стандартных библиотеках
  • Аппаратные средства, обеспечивающие ускоренную обработку байт-кода

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

Java не является процедурным языком: любая функция может существовать только внутри класса. Это подчёркивает терминология языка Java, где нет понятий «функция» или «функция-член», а только метод. В методы превратились и стандартные функции. Например, в Java нет функции sin(), а есть метод Math.sin() класса Math (содержащего, кроме sin(), методы cos(), exp(), sqrt(), abs() и многие другие). Конструкторы в Java не считаются методами. Деструкторов в Java не существует, а метод finalize() ни в коем случае нельзя считать аналогом деструктора.

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

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

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

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

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

  • Классы являются одновременно объектами со всеми ниже приведёнными возможностями.
  • Наследование, в том числе множественное.
  • Полиморфизм (все функции виртуальные).
  • Инкапсуляция (два уровня — общедоступные и скрытые методы и поля). Особенность — скрытые члены доступны для использования и помечены как скрытые лишь особыми именами.
  • Специальные методы, управляющие жизненным циклом объекта: конструкторы, деструкторы, распределители памяти.
  • Перегрузка операторов (всех, кроме is, '.', '=' и символьных логических).
  • Свойства (имитация поля с помощью функций).
  • Управление доступом к полям (эмуляция полей и методов, частичный доступ, и т. п.).
  • Методы для управления наиболее распространёнными операциями (истинностное значение, len(), глубокое копирование, сериализация, итерация по объекту, …)
  • Метапрограммирование (управление созданием классов, триггеры на создание классов, и др.)
  • Полная интроспекция.
  • Классовые и статические методы, классовые поля.
  • Классы, вложенные в функции и классы.

Python поддерживает парадигму функционального программирования, в частности:

  • Функция является объектом
  • Функции высших порядков
  • Рекурсия
  • Развитая обработка списков (списочные выражения, операции над последовательностями, итераторы)
  • Аналог замыканий
  • Частичное применение функции
  • Возможность реализации других средств на самом языке

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

Программное обеспечение (приложение или библиотека) на Python оформляется в виде модулей, которые в свою очередь могут быть собраны в пакеты. Модуль оформляется в виде отдельного файла, а пакет — в виде отдельного каталога. Подключение модуля к программе осуществляется оператором import. После импорта модуль представлен отдельным объектом, дающим доступ к пространству имён модуля. В ходе выполнения программы модуль можно перезагрузить функцией reload().

Python — стабильный и распространённый язык. Он используется во многих проектах и в различных качествах: как основной язык программирования или для создания расширений и интеграции приложений. Python с пакетами NumPy, SciPy и MatPlotLib активно используется как универсальная среда для научных расчётов в качестве замены распространённым специализированным коммерческим пакетам Matlab, IDL и другим. Сочетание простоты и лаконичности с возможностью использования сложных абстракций и мощных разнообразных инструментов делает Python удобным в качестве скриптового языка. Также Python подходит для выполнения нестандартных или сложных задач в системах сборки проектов, что обусловлено отсутствием необходимости предварительной компиляции исходных файлов. Интерпретатор Python может использоваться в качестве мощной командной оболочки и скриптового языка для написания командных файлов ОС. Лёгкость обращения из Python-скриптов к внешним программам и наличие библиотек, дающих доступ к управлению системой, делают Python удобным инструментом для системного администрирования. Кроссплатформенность самого языка и библиотек делает его привлекательным для унифицированной автоматизации задач системного администрирования в гетерогенных средах, где совместно применяются компьютеры с операционными системами различных типов.

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

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

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

К скалярным типам данных относятся:

  • Целочисленный тип (integer)
  • Число с плавающей точкой (float, double)
  • Логический тип (boolean)
  • Строковый тип (string)

К нескалярным типам относятся:

  • Массив (array)
  • Объект (object)
  • Внешний ресурс (resource)
  • Неопределенное значение (null)

Начиная с пятой версии PHP обладает полной поддержкой ООП. Класс в PHP объявляется с помощью ключевого слова class. Методы и свойства класса могут быть общедоступными (public, по умолчанию), защищёнными (protected) и скрытыми (private). PHP поддерживает все три основных механизма ООП — инкапсуляцию, полиморфизм подтипов и наследование (родительский класс указывается с помощью ключевого слова extends после имени класса). Поддерживаются интерфейсы (ставятся в соответствие с помощью implements). Разрешается объявление финальных, абстрактных методов и классов. Для обращения к методам родительского класса используется ключевое слово parent. Множественное наследование может быть реализовано с помощью механизма особенностей. Особенности похожи на примеси, за исключением того что для них нельзя напрямую создать экземпляр. Повторное использование кода заключено в использовании кода особенности в нескольких классах. Допускается использовать в одном классе несколько особенностей. Механизм особенностей имеет средства разрешения конфликтов имён. При запуске программы код особенности будет «вкомпилирован» в код содержащего его класса.

Классы в PHP имеют ряд «магических» методов (англ. magic methods), начинающихся с двух символов подчёркивания. Эти методы являются достаточно гибким инструментом: переопределяя их, можно добиться существенного изменения поведения объекта. Все функции-члены реализованы виртуальными и потому все они являются методами.

PHP-скрипты обычно обрабатываются интерпретатором в порядке, обеспечивающем кроссплатформенность разработанного приложения:

  • Лексический анализ исходного кода и генерация лексем
  • Синтаксический анализ полученных лексем
  • Генерация байт-кода
  • Выполнение байт-кода интерпретатором без создания исполняемого файла

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

Заключение

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

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

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

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

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

  1. Бен-Ари М. Языки программирования. Практический сравнительный анализ. М.: Мир, 2000. 366 с.
  2. Сухомлин В.А., Баженова И.Ю. Введение в программирование. 2-е изд., испр. М.: Интуит, 2016. 411 с.
  3. Голицына О.Л., Попов И.И. Программирование на языках высокого уровня. Учебное пособие. М.: Форум, 2010. 496 с.
  4. Синицын С.В., Михайлов А.С., Хлытчиев О.И. Программирование на языке высокого уровня. Academia, 2010. 400 c.
  5. Страуструп Б. Язык программирования С++. Специальное издание. М.: Бином, 2015. 1136 с.
  6. Шилдт Г. С++. Базовый курс. Вильямс, 2015. 624 с.
  7. Шилдт Г. Java. Полное руководство. Вильямс, 2017. 1376 с.
  8. Лутц М. Программирование на Python. 4-е изд. Символ-Плюс, 2011. 992 с.
  9. Зандстра М. PHP. Объекты, шаблоны и методики программирования. Вильямс, 2011. 560 с.
  10. Могилев А.В., Листрова Л.В. Методы программирования. Компьютерные вычисления. СПб.: БХВ-Петербург, 2008. 320 с.
  11. Роберт У. Себеста. Основные концепции языков программирования. 5-е изд. М.: Вильямс, 2001. 672 с.
  12. Пирс Б. Типы в языках программирования. Добросвет, 2012. 680 с.