Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТРПП пособие Шишов.doc
Скачиваний:
131
Добавлен:
17.11.2018
Размер:
3.25 Mб
Скачать

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

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

  • быть удобен как для начинающего программиста, так и для специалиста;

  • способствовать читабельности программы;

  • дисциплинировать и заставлять следовать хорошему стилю программирования;

  • подходить для написания как небольших, так и глобальных программ;

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

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

  • позволять быстро и эффективно выполнять программы.

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

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

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

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

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

  • экономию понятий

  • ортогональность понятий

  • единообразие понятий

Экономия понятий предполагает достижение максимальной мощности языка с помощью минимального числа понятий.

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

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

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

Чем мощнее язык, тем труднее обеспечить концептуальную целостность.

Как правило выделяют следующие свойства языков:

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

Удобочитаемость языка – свойство, которое обеспечивает легкость восприятия программ человеком.

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

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

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

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

Эффективность языка обеспечивает эффективную реализацию языка.

Сложилась определенная классификация языков программирования. Рассмотрим основные типы языков.

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

 Машино–ориентированные языки позволяют использовать все возможности вычислительной машины. Их использование обеспечивает:

  • высокое качество создаваемых программ (компактность и скорость  выполнения);

  • возможность использования конкретных аппаратных ресурсов;

  • предсказуемость объектного кода и заказов памяти.

Но вместе с тем

  • для составления эффективных программ необходимо знать систему команд и особенности функционирования данной ЭВМ;

  • трудоемкость процесса составления программ (особенно на машинных языках), плохо защищенного от появления ошибок;

  • низкая скорость программирования;

  • невозможность непосредственного использования программ, составленных на этих языках, на ЭВМ других типов.

Машинно–ориентированные языки подразделяются на классы.

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

Особенности устройства ЭВМ определяют способы её управления. Командами для управления ЭВМ служат всё те же битовые последовательности. Поэтому наиболее естественным способом управления ЭВМ является кодирование команд в виде битовых последовательностей. Для первых ЭВМ альтернативных способов управления просто не существовало.

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

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

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

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

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

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

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

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

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

Основные преимущества машинно–независимых языков (языков высокого уровня) перед машинными (языками низкого уровня) таковы:

  • алфавит алгоритмического языка значительно шире алфавита машинного языка, что существенно повышает наглядность текста программы;

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

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

  • требуемые операции задаются с помощью общепринятых математических обозначений;

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

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

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

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

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

Существует два основных вида трансляционных программ трансляторы и интерпретаторы. Их функции и особенности работы будут рассмотрены отдельно.

Наиболее известные языки высокого уровня – Фортран, Алгол, Кобол, Паскаль, Бейсик, Си, Пролог и т.д

Машино–независимые зыки делятся на классы.

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

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

Фортран, Алгол – языки, созданные для решения математических задач;

Simula, Слэнг – для моделирования;

Лисп, Снобол – для работы со списочными структурами.

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

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

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

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

Языки управления базами данных – предназначены для решения задач, связанных с большими объёмами разнотипной информации. Таков, например, язык SQL (structured queries language – язык структурированных запросов), использующийся в подавляющем большинстве СУБД (систем управления базами данных).

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

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

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

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

2. Если программа большая и повторная компиляция всего исходного текста занимает много времени, разделение ее на части экономит время компиляции.

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

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

Для блочного языка программирования (стандарт Паскаля) характерна чёткая иерархия (зависимость разных уровней) подпрограмм от глобальных до внутренних.

Таблица. Сравнение модульных и блочных языков программирования

Блочные языки

Модульные языки

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

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

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

Возможно использовать глобальные переменные разных уровней.

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

Компиляция занимает мало времени.

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

Недостатки

Модули не могут компилироваться отдельно.

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

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

Другая классификация делит языки на вычислительные и языки символьной обработки. К первому типу относят Фортран, Паскаль, Алгол, Бейсик, Си, ко второму типу – Лисп, Пролог, Снобол и др.

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

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

Среди процедурных языков выделяют в свою очередь структурные и операционные языки. В структурных языках одним оператором записываются целые алгоритмические структуры: ветвления, циклы и т.д. В операционных языках для этого используются несколько операций. Широко распространены следующие структурные языки: Паскаль, Си, Ада, ПЛ/1. Среди операционных известны Фортран, Бейсик, Фокал.

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

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

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

Языки описания сценариев, такие как Perl, Python, Rexx, Tcl и языки оболочек UNIX, предполагают стиль программирования, весьма отличный от характерного для языков системного уровня. Они предназначаются не для написания приложения с нуля, а для комбинирования компонентов, набор которых создается заранее при помощи других языков. Развитие и рост популярности Internet также способствовали распространению языков описания сценариев. Так, для написания сценариев широко употребляется язык Perl, а среди разработчиков Web-страниц популярен JavaScript.