Среднее Заочное отделение / 8 семестр / Эксплуатация программного обеспечения сетей телекоммуникаций / 1. Классификация языков программирования
Язык программирования — это формализованный язык, который представляет собой совокупность алфавита, правил написания конструкций (синтаксис) и правил толкования конструкций (семантика).
Алфавит — фиксированный для данного языка набор основных символов, допускаемых для составления текста программы на этом языке.
Синтаксис — система правил, определяющих допустимые конструкции языка программирования из букв алфавита.
Семантика — система правил однозначного толкования отдельных языковых конструкций, позволяющих воспроизвести процесс обработки данных.
Языки программирования, если в качестве признака классификации взять синтаксис образования его конструкций, можно условно разделить на классы:
· машинные языки – языки программирования, воспринимаемые аппаратной частью компьютера (машинные коды);
· машинно-ориентированные языки – языки программирования, которые отражают структуру конкретного типа компьютера (ассемблеры);
· алгоритмические языки – не зависящие от архитектуры компьютера языки программирования для отражения структуры алгоритма (Паскаль, Фортран, Бейсик и др.);
· процедурно-ориентированные языки – языки программирования, где имеется возможность описания программы как совокупности процедур (подпрограмм);
· проблемно-ориентированные языки – языки программирования, предназначенные для решения задач определенного класса (Лисп, Симула и др.);
· интегрированные системы программирования.
Программирование ЭВМ можно осуществлять на языке машинных команд (машинных кодов), на языке, использующем символическое обозначение машинных команд, языке ассемблера и языке высокого уровня. Понятие уровня языка определяется аппаратно–программными средствами, с помощью которых инструкции, записанные на некотором языке, переводятся в язык, понятный для ЭВМ.
Современные ЭВМ имеют несколько уровней, каждому из которых соответствует определенный язык (язык данного уровня).
Самый нижний уровень — микропрограммный, который обеспечивает выполнение инструкций системы команд ЭВМ. Микропрограммный уровень определяется реализацией АЛУ(арифметико-логическое устройство), составом и назначением регистров в процессоре и т. д., т. е. ориентирован на конкретную ЭВМ (машинно-ориентирован).
Следующим уровнем является машинный уровень, которому соответствует язык машинных команд.
Взаимодействие между рассмотренными уровнями производится следующим образом:
Каждая машинная команда, поступающая из памяти в процессор, анализируется и вызывает исполнение определенной микропрограммы, реализующей заданную командой операцию.
Ассемблерный уровень является символической формой представления языка машинных команд. Язык ассемблера более удобен для программирования, но требует использования специальной программы для перевода на язык машинных, команд.
Перечисленные низкие языковые уровни относятся к разряду машинно-ориентированных.
Следующий уровень представлен языками высокого уровня (ЯВУ), которые часто называют проблемно-ориентированными, поскольку каждый из них разработан для решения определенного круга задач: научных (Алгол, Фортран, Бейсик), экономических (Кобол), управления в реальном масштабе времени (Ада, Модула).
Другой классификацией языков программирования является их деление на языки, ориентированные на реализацию основ структурного программирования, и объектно-ориентированные языки, поддерживающие понятие объектов и их свойств и методов обработки.
В настоящее время насчитывается несколько сотен языков высокого уровня, а если считать и их диалекты, то это число возрастет до нескольких тысяч. Языки программирования высокого уровня существенно отличаются от машинно-ориентированных (низкого уровня) языков. Во-первых, машинная программа в конечном счете записывается с помощью лишь двух символов 0 и 1. Во-вторых, каждая ЭВМ имеет ограниченный набор машинных операций, ориентированных на структуру процессора. Как правило, этот набор состоит из сравнительно небольшого числа простейших операций, типа: переслать число в ячейку; считать число их ячейки; увеличить содержимое ячейки на +1 и т.п. Команда на машинном языке содержит очень ограниченный объем информации, поэтому она обычно определяет простейший обмен содержимого ячеек памяти, элементарные арифметические и логические операции. Команда содержит код и адреса ячеек, с содержимым которых выполняется закодированное действие.
Языки программирования высокого уровня имеют следующие достоинства:
· алфавит языка значительно шире машинного, что делает его гораздо более выразительным и существенно повышает наглядность и понятность текста;
· набор операций, допустимых для использования, не зависит от набора машинных операций, а выбирается из соображений удобства формулирования алгоритмов решения задач определенного класса;
· конструкции команд (операторов) отражают содержательные виды обработки данных и задаются в удобном для человека виде;
· используется аппарат переменных и действий с ними;
· поддерживается широкий набор типов данных.
Таким образом, языки программирования высокого уровня являются машинно-независимыми и требуют использования соответствующих программ-переводчиков (трансляторов) для представления программы на языке машины, на которой она будет исполняться.
Примеры языков высокого уровня:
· Fortran: это первый компилируемый язык созданный Джимом Бэкусом в 50-е годы. Основным критерием при разработке компиляторов Фортрана являлась эффективность исполняемого хода. Поэтому хотя в Фортране был впервые реализован ряд важнейших понятий программирования, удобство создания программ было принесено в жертву возможности получения эффективного машинного кода;
· Pascal: язык Паскаль, созданный в конце 70-х годов основоположником множества идей современного программирования Никлаусом Виртом, во многом напоминает Алгол, но в нем ужесточен ряд требований к структуре программы и имеются возможности, позволяющие успешно применять его при создании крупных проектов;
· C: данный язык был создан в лаборатории Bell и первоначально не рассматривался как массовый. Он планировался для замены ассемблера, чтобы иметь возможность создавать столь же эффективные и компактные программы, и в то же время не зависеть от конкретного вида процессора;
· С++ — это объектно-ориентированное расширения языка Си, созданное Бьярном Страуструпом в 1980 году. Множество новых мощных возможностей, позволивших резко увеличить производительность программ, наложилось на унаследованную от языка Си определенную низкоуровневость, в результате чего создание сложных и надежных программ потребовало от разработчиков высокого уровня профессиональной подготовки;
· Java: этот язык был создан компанией Sun в начале 60-х годов на основе Си++. Он призван упростить разработку приложений на основе Си++ путем исключения из него всех низкоуровневых возможностей. Но главная особенность этого языка — компиляция не в машинный код, а в платформо-независимый байт-код. Этот байт-код может выполнятся с помощью интерпретатора — виртуальной машины JVM (Java Virtual Machine), версии которой созданы сегодня для любых платформ.
Транслятор — это программа, которая переводит входную программу на исходном (входном) языке в эквивалентную ей выходную программу на результирующем (выходном) языке.
Компилятор — это транслятор, который осуществляет перевод исходной программы в эквивалентную ей объектную программу на языке машинных команд или на языке ассемблера.
Таким образом, компилятор отличается от транслятора лишь тем, что его результирующая программа всегда должна быть написана на языке машинных кодов или на языке ассемблера. Результирующая программа транслятора, в общем случае, может быть написана на любом языке — возможен, например, транслятор программ с языка Pascal на язык С. Соответственно, всякий компилятор является транслятором, но не наоборот — не всякий транслятор будет компилятором. Например, упомянутый выше транслятор с языка Pascal на С компилятором являться не будет.
Интерпретатор — это программа, которая воспринимает входную программу на исходном языке и выполняет ее. В отличие от трансляторов интерпретаторы не порождают результирующую программу (и вообще какого-либо результирующего кода) — и в этом принципиальная разница между ними. Интерпретатор, так же как и транслятор, анализирует текст исходной программы. Однако он не порождает результирующей программы, а сразу же выполняет исходную в соответствии с ее смыслом, заданным семантикой входного языка. Таким образом, результатом работы интерпретатора будет результат, заданный смыслом исходной программы, в том случае, если эта программа правильная, или сообщение об ошибке, если исходная программа неверна.
К числу основных достоинств компилируемых языков по сравнению с интерпретируемыми относятся:
· в компилируемых языках процесс построения (создания) исполняемого модуля выполняется один раз, а не при каждом запуске, что экономит время;
· в компилируемых языках обнаружение синтаксических ошибок происходит до запуска программы на выполнение, а не в его процессе.
Несмотря на очевидные недостатки интерпретируемых языков, они применяются в разных специфических задачах, а также в тех случаях, где простота программы важнее ее производительности.