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

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

Содержание:

Введение

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

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

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

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

Глава 1. Современные языки программирования

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

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

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

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

Из всего множества языков программирования, лишь немногие из них получили признание программистов всего мира. Чтобы определить самые популярные языки программирования воспользуемся данными голландской компании «TIOBE Software BV», которая известна, как компания с регулярно рассчитываемым рейтингом популярности языков программирования.

Согласно, полученным данным компании «TIOBE Software BV» возьмем десять самых популярных языков программирования на декабрь 2016 года, которые представлены в таблице 1.

Таблица 1. Десять популярных языков программирования [1]

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

Рейтинг

1

Java

17,856 %

2

С

8,726 %

3

С++

5,335 %

4

Python

4,239 %

5

Visual Basic .Net

3,302 %

6

C#

3,171 %

7

PHP

2,919 %

8

JavaScript

2,862 %

9

Assembly language

2,539 %

10

Perl

2,338 %

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

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

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

Исследуем эти языки программирования с основных позиций:

  • Парадигмы программирования;
  • Применяемые виды трансляторов;
  • Используемые виды типизации;

Глава 2. Парадигмы программирования

Парадигма (от греч. παράδειγμα, «пример, модель, образец) – совокупность фундаментальных научных установок, представлений и терминов, принимаемая и разделяемая научным сообществом и объединяющая большинство его членов. Обеспечивает преемственность развития науки и научного творчества.

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

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

  1. действие;
  2. правило;
  3. диаграмма переходов;
  4. другие сущности;

Парадигма программирования определяет то, в каких терминах программист описывает логику программы.

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

Самые известные парадигмы программирования:

  • Императивная – это процедурное программирование;
  • Декларативная – это функциональное и логическое программирование;
  • Структурная – это модульное и объектно-ориентированное программирование;
  • Метапрограммирование – это генерация кода и самомодифицирующийся код;

2.1. Императивное программирование

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

Основные черты императивных языков программирования:

  • использование именованных переменных;
  • использование оператора присваивания;
  • использование составных выражений;
  • использование подпрограмм;
  • и др.

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

2.2. Декларативное программирование

Декларативное программирование – это парадигма программирования, в которой задается спецификация решения задачи.

Подходы, реализующие декларативное программирование:

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

Как показывает практика, что отличие математической функции от понятия «функции» в императивном программировании заключается в том, что императивные функции могут опираться не только на аргументы, но и на состояние внешних по отношению к функции переменных, а также и менять состояние внешних переменных.[2]

    • Логическое программирование – основанное на автоматическом доказательстве теорем, с использованием механизмов логического вывода информации с использованием заданных фактов и правил вывода, основанных на формальных исчислениях. Данный метод программирования основан на теории и аппарате математической логики с использованием математических принципов резолюций.[3]

2.3. Структурное программирование

Структурное программирование – в основе этого метода программирования лежит представление программы в виде иерархической структуры блоков.

В соответствии с данной парадигмой:

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

Подходы структурного программирования:

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

при этом основными концепциями являются понятия объектов и классов.

  • Класс – это тип, описывающий устройство объектов. Это абстрактный тип данных, который создает программист;
  • Объект – сущность в адресном пространстве вычислительной системы, которая появляется при создании экземпляра класса.

Понятие «класс» - некоторое поведение и способ представления.[4]

Понятие «объект» - это нечто, что обладает определенным поведением и способом представления.[4]

2.4. Метапрограммирование

Метапрограммирование – этот метод программирования, основанный на создание программ, которые порождают программы как результат своей работы или программ, которые меняют себя во время выполнения.

Подходы метапрограммирования:

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

Генераторы пишутся для создания специализированных программ для реализации сложных парадигм.[5]

Парадигмы и подходы к решению задач в современных языках программирования представлены в таблице 2.

Таблица 2. Парадигмы и подходы языков программирования

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

Парадигма

Подход

Java

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

структурная

объектно-ориентированный

С

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

процедурный

С++

мультипарадигмальный

метапрограммирование

процедурный

метапрограммирование

Python

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

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

структурная

процедурный

функциональный

объектно-ориентированный

Visual Basic .Net

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

структурная

процедурный

объектно-ориентированный

C#

мультипарадигмальный

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

процедурный

объектно-ориентированный

PHP

мультипарадигмальный

процедурный

объектно-ориентированный

JavaScript

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

структурная

функциональный

процедурный

объектно-ориентированный

Assembly language

всевозможные

структурный

функциональный

процедурный

Perl

мультипарадигмальный

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

функциональный

объектно-ориентированный

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

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

Глава 3. Трансляторы

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

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

На сегодняшний день трансляторы разделяют на две группы:

    • компиляторы;
    • интерпретаторы.

3.1. Компилятор

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

Компилятор обеспечивает преобразование программы с одного языка на другой. Команды исходного языка отличаются по организации и мощности от команд машинного языка. Есть языки, в которых одна команда исходного языка транслируется в 7-10 машинных команд. В исходном языке часто используется строгая типизация данных, которая осуществляется через их предварительное описание. Процесс трансляции с таких языков обычно называется компиляцией, а исходные языки обычно относятся к высокоуровневым языкам.[6]

3.2. Интерпретатор

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

Интерпретатор на выходе не порождает программу на машинном языке. Распознав команду исходного языка, он тут же выполняет ее.

Типы интерпретаторов:

  • Простой интерпретатор – анализирует и тут же выполняет программу покомандно.
    • Достоинством является мгновенная реакция;
    • Недостаток – обнаруживает ошибки в тексте программы только при попытке выполнении команды с ошибкой.
  • Интерпретатор компилирующего типа – система из компилятора, превосходящего исходный код программы в промежуточное направление.
    • Достоинством является большее быстродействие выполнение программ;
    • Недостаток – большее требование к ресурсам и требование на корректность исходного кода.[6]

Достоинства интерпретаторов:

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

Недостатки интерпретаторов:

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

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

Таблица 3. Трансляторы современных языках программирования

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

Транслятор

Java

компиляция в байт-код

интерпретатор

С

компилятор

С++

компилятор

Python

компиляция в байт-код

интерпретатор

Visual Basic .Net

компиляция в MSIL-код

компилятор

интерпретатор

C#

компиляция в MSIL-код

интерпретатор

PHP

компиляция в байт-код

интерпретатор

JavaScript

компиляция в байт-код

интерпретатор

Assembly language

компилятор

интерпретатор

Perl

компиляция в байт-код

интерпретатор

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

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

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

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

Глава 4. Типизация данных

Тип – это устойчивая и независимая совокупность элементов, которую можно выделить во всём рассматриваемом множестве.

Математически тип может быть определен двумя способами:

    • Множеством всех значений, принадлежащим типу;
    • Предикатной функцией, определяющей принадлежность объекта к данному типу.

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

Типы данных различаются так же и на нижних уровнях системы. Даже в Ассемблере x86 различают такие типы как «целое число» и «вещественное число». Это объясняется тем, что для чисел разных типов отводятся разные объемы памяти, используются различные регистры микропроцессора, и для операций над ними применяются разные команды Ассемблера и разные ядра микропроцессора.

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

Часто используемые типы данных:

  • Простые:
    • Перечисляемый тип – хранит значения прямо указанные в его описании.
    • Целочисленный тип – хранит целое число и без знака.
    • Вещественный тип – хранит вещественное число с запятой и с плавающей точкой.
    • Символьный тип – хранит один символ в разных кодировках.
    • Множество – совпадает с обычным математическим понятием множества.
    • Логический тип – принимает только два значения ложь(false)=0 и истина(true)=1.
    • Указатель – хранит адрес в памяти, который указывает на какую-либо информацию, как правило – указатель на переменную.
  • Составные:
    • Массив – хранит индексированный набор элементов одного типа.
    • Строковый тип – хранит строку набора символов.
    • Запись или структура – хранит набор разных элементов или полей, который хранится как единое целое.
    • Файловый тип – хранит только однотипные значения, к которым доступ осуществляется только последовательно.
    • Класс, метакласс и интерфейс – хранит абстрактные типы данных в объектно-ориентированном программировании.

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

Существует всего два вида контроля типов данных:

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

Подходы для определения соответствия типов данных:

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

На сегодняшний день не существует единого мнения о том, какой вид типизации лучше.

4.1. Динамическая типизация данных

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

Недостатки динамической типизации:

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

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

Отсутствие проверки типов данных на этапе написания и трансляции программы ведет к появлению некоторых достоинств:

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

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

4.2. Статическая типизация данных

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

Недостатки:

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

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

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

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

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

Таблица 4. Типизация в языках программирования

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

Типизация

Java

статическая, строгая

С

статическая

С++

статическая

Python

динамическая, строгая

Visual Basic .Net

динамическая

C#

статическая, строгая

PHP

динамическая

JavaScript

динамическая, слабая

Assembly language

динамическая

Perl

динамическая

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

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

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

Заключение

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

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

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

  • Проектирование межплатформенных приложений – которые не зависят от используемой платформы.
  • Разработка Интернет-приложений – это приложения, которые работают через Интернет.
  • Создание Web-приложений – клиент-серверных архитектур.
  • Возможность быстрого создания приложений и средств по автоматизации.

Также актуальны приложения полностью и эффективно использующие все ресурсы современных платформ.

Перечень используемой литературы

1. TIOBE Software: Tiobe Index: http://www.tiobe.com/tiobe-index/

2. Городняя Л.В. Основы функционального программирования. /– М.: Изд-во "Интернет-университет информационных технологий – ИНТУИТ.ру", 2004. – 280 c.: ил. ISBN 5–9556–0008–6

3. Анатолий А. Андрей К. Логическое программирование и Visual Prolog(с CD).. – СПб.: «БХВ–Петербург», 2003. – С. 990. ISBN 5–94157–156–9.

4. Иан Грэхем. Объектно–ориентированные методы. Принципы и практика = Object–Oriented Methods: Principles & Practice. – 3–е изд./ – М.: «Вильямс», 2004. – С. 880. ISBN 5–8459–0438–2

5. Андрей Александреску. Современное проектирование на С++ /Вильямс, 2004 г. 336 стр. Тираж: 3500 экз. ISBN 5–8459–0351–3

6. Е.Н.Ишакова – Разработка компиляторов: http://window.edu.ru/resource/206/19206/files/metod593.pdf