Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
686.docx
Скачиваний:
85
Добавлен:
24.04.2019
Размер:
6.68 Mб
Скачать

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

3.2.1

Основные определения

Язык – система знаков, сопряженная с правилами их связывания и

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

человеческие мысли и образы. Формальный язык позволяет однозначно

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

134

Язык программирования – язык, позволяющий выразить человеческие

мысли

и

образы

в

формальном

виде,

однозначно

воспринимаемом

вычислительным устройством в рамках конкретной модели вычислений.

К составным частям языка можно отнести: лексику, синтаксис и

семантику.

Лексика – описание элементов языка (его элементарных конструкций).

Например, лексемами языка Си являются: for, if, int, char, while,+, -,...

Синтаксис – совокупность правил написания языковых элементов

(лексем).

Семантика – смысловое наполнение языковых конструкций, связь между

элементами языка и их значением.

Существуют языки, в которых лексемы и синтаксис очень близки, а

семантика – различна. Обычно так происходит, если в основе языков лежат

различные модели вычислений.

Существует несколько подходов к определению семантики языков

программирования.

Наиболее

широко

распространены

разновидности

следующих

трёх:

операционного,

денотационного

(математического)

и

деривационного (аксиоматического). При описании семантики в рамках

операционного

подхода

обычно

исполнение

конструкций

языка

программирования интерпретируется с помощью некоторой воображаемой

(абстрактной)

ЭВМ.

Деривационная

семантика

описывает

последствия

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

постусловий. Денотационная семантика оперирует понятиями, типичными для

математики – множества, соответствия, а также суждения, утверждения и др.

Статическая типизация – приём, широко используемый в языках

программирования,

при

котором

переменная,

параметр

подпрограммы,

возвращаемое значение функции связывается с типом в момент объявления и

тип не может быть изменён позже (переменная или параметр будут принимать,

а функция – возвращать значения только этого типа). Примеры статически

типизированных языков – Ада, Си++, Паскаль.

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

программирования

и

языках

спецификации,

при

котором

переменная

связывается с типом в момент присваивания значения, а не в момент

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

и та же переменная может принимать значения разных типов. Примеры языков,

где есть динамическая типизация – Smalltalk Python, Ruby, PHP, Perl,

JavaScript, Object Pascal, Lisp, xBase.

135

3.2.2

Классификация языков

Языки можно классифицировать по следующим критериям:

 Место в жизненном цикле проектирования (язык программирования,

язык спецификации);

 Степень формальности (формальный язык, неформальный язык);

 Используемая модель вычислений;

 Полнота по Тьюрингу;

 Способ реализации (интерпретатор или компилятор);

 Способ типизации (динамическая или статическая);

 Тип используемой семантики (операционная, денотационная

деривационная).

3.2.3

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

Программирование ВВС представляет собой сложный многоуровневый

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

от этапа и характера использования языки принято делить на языки

специфицирования (этап проектирования) и языки программирования (этап

реализации), однако существует мнение, что любой формальный язык, в

принципе, можно использовать на любом из этих этапов. В отличие от ВС

общего назначения, в ВВС на этапе создания языкового описания некоторого

объекта зачастую невозможно сказать, в каком виде этот объект будет

реализован - как традиционная программа для программируемого процессора,

как конфигурация ПЛИС или как специализированный аппаратный блок.

Исходя из такой особенности применения языков при проектировании ВВС,

наиболее общим и удобным следует считать взгляд на языки с позиции

использования их для специфицирования средств ВВС для различных целей и

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

языков был предложен в, что естественным образом следует из концепции

многоязыкового

проектирования

ВВС.

Ниже

мы

рассмотрим

языки,

используемые при создании ВВС, именно с этих позиций. Основное внимание

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

уровне.

Языки используются во время одного из самых важных шагов

проектирования системы: на этапе спецификации системы. Существует

множество языков спецификации. Каждый из них имеет свои преимущества, но

превосходит другие только в пределах ограниченной прикладной области.

Отбор языка - вообще компромисс между несколькими критериями, такими как

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

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

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

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

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

136

где различные части принадлежат разным прикладным категориям, например,

управление/данные или непрерывный/дискретный.

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

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

форму,

чтобы

выполнить

обработку

и

преобразование

начальной

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

суть которых была представлена в предыдущем разделе. Модели вычислений

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

могут быть синхронными или асинхронными.

3.2.4

Полнота по Тьюрингу

В

теории

вычислимости2

исполнитель

(множество

вычисляющих

элементов) называется тьюринг-полным, если на нём можно реализовать

любую вычислимую функцию. Другими словами, для каждой вычислимой

функции существует вычисляющий её элемент (например, машина Тьюринга)

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

вычислителей, являются вычислимыми функциями (возможно, при некотором

кодировании входных и выходных данных). Название пошло от Алана

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

дал определение множества функций, вычислимых посредством машин

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

тьюринг-полные. Это касается как императивных языков, таких как Паскаль,

так и функциональных (Haskell) и языков логического программирования

(Prolog). Полными по Тьюрингу являются также грамматики общего вида.

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

примитивно рекурсивные функции, контекстно-свободные и регулярные

грамматики.

3.2.5

Модель вычислений

Модель вычислений, вычислительная модель (model of computation, MOC)

– набор законов взаимодействия элементов вычислительной системы.

Модель вычислений – набор правил организации вычислительного

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

Модель вычислений – набор формальных правил, в рамках которых

организована взаимосвязь и поведение множества составляющих атомарных

частей модели некоторой вычислительной системы.

2

Теория вычислимости – это раздел современной математики и теории вычислений, возникший в

результате изучения понятий вычислимости и невычислимости. Изначально теория была посвящена

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

исследования теории вычислимости расширилось - появляются новые определения понятия вычислимости и

идёт слияние с математической логикой, где вместо вычислимости и невычислимости идёт речь о доказуемости

и недоказуемости (выводимости и невыводимости) утверждений в рамках каких-либо теорий.

137

Модель вычислений – строго определенная парадигма (набор правил),

описывающая

протекание

вычислительного

процесса,

способы

обмена

данными, взаимодействия между отдельными функциональными элементами.

Модель вычислений – недвусмысленный формализм для представления

спецификаций проекта и проектных решений.

Модель

вычислений

математическая

модель,

демонстрирующая

пользователю вычислительные возможности вычислителя и правила их

использования.

Теория вычислимости и теория сложности вычислений трактует модель

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

использованных для вычисления, но также и относительных издержек их

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

выполнения, объём памяти, а также ограничения алгоритмов или компьютера

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

модельно-ориентированной инженерии модель вычислений и её выбор дают

ответ на вопрос, как ведёт себя система в целом, если известно поведение её

отдельных частей. При асимптотической оценке сложности вычислений модель

вычислений определяется через допустимые примитивные операции, для

каждой из которых известна её цена.

Известен целый ряд моделей вычислений, зависящих от набора

применяемых операций и их вычислительной сложности. Они распадаются на

следующие

большие

категории:

абстрактные

машины

(абстрактные

вычислители), используемые для доказательства вычислимости и получения

верхней границы вычислительной сложности алгоритма и модели принятия

решений,

используемые

для

получения

нижней

границы

сложности

вычислений для алгоритмических задач.

Примеры языков принадлежащих различным моделям вычислений:

3.2.6

Си, Pascal, Ada – императивная модель или модель Фон-Неймана;

VHDL, Verilog – модель дискретных событий;

Prolog, Рефал – сентенциональная модель;

XML – иерархическая модель данных;

SQL – реляционная модель;

Lisp – функциональная модель [40].

Стиль программирования

Стиль программирования – внутренне концептуально согласованная

совокупность средств, базирующаяся на некоторой логике построения

программ.

Впервые

этот

термин

введен

в

книге

"Основания

программирования".

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

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

138

Термины программирование и программа необходимо определить более точно,

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

понимается последовательность действий, совершаемых машиной Фон-

Неймана, а в качестве стиля программирования рассматривается базирующийся

на машине Фон-Неймана структурный стиль программирования. В таком

контексте непонятно, можно ли считать программой текст, написанный на

языке VHDL или Verilog, а также тексты, описывающие системы, работающие

в других моделях вычислений.

Непейвода

приводит

следующую

классификацию

стилей

программирования:

3.2.7

сентенциальное программирование (Рефал, Prolog);

функциональное программирование (Lisp);

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

событийное программирование;

структурное программирование (Си);

параллельное программирование;

объектно-ориентированное программирование [42, 43].

Стиль программирования, модель вычислений, платформа

Стиль программирования находится над моделью вычислений, так как

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

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

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

случае

возникает

резкий

скачок

сложности

проектируемой

системы,

увеличиваются количество ошибок, сроки выполнения, быстро заканчивается

бюджет проекта. К сожалению, большинство программистов не воспринимает

эту проблем, что обычно приводит к увеличению проектных бюджетов и

огромному количеству ошибок.

В

качестве

примера

нарушения

гармонии

между

стилем

программирования и моделью вычислений можно привести ОС РВ, в которых

искусственно создается потоковая модель вычислений, а в качестве стиля

программирования используется структурное программирование (чаще всего

на языке Си). Аналогичные проблемы есть в современных операционных

системах общего назначения (Microsoft Windows 2000/XP/Vista, Linux,

FreeBSD, Mac OS и т.д.) и в системах программирования для них (Java, C#, C++

и т.д.). В своей статье "Проблемы с потоками" Эдвард Ли подробно освящает

эту проблему [13].

Чтобы избежать противоречий, используют способ проектирования на базе

платформ, в котором каждый слой имеет свою модель вычислений и

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

при этом является фундаментом для последующих слоев и перемешивания

понятий, встречающегося в современных ОС РВ, не происходит [40].

139

3.2.8

Критерии оценки языков

Профессор Роберт У. Себеста из университета штата Колорадо, в своей

книге «Основные концепции языков программирования» [47], к основным

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

 Удобочитаемость;

 Лёгкость создания программ;

 Надёжность.

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

 Простоту (минимум языковых конструкций);

 Ортогональность (способность языка порождать новые языковые

конструкции, например, структуры данных, с помощью небольшого

количества элементарных конструкций);

 Поддержку абстракции (выделение главного);

 Выразительность (понятно и компактно).

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]