Алгоритмические языки высокого уровня

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

Большая часть программ на АЯВУ оказывается машинно-независимой. Действительно, если, например, алгоритм оперирует с целыми числами при помощи обычных арифметических операций, то до определённого предела неважно как именно представляются целые числа машинными словами и какие именно машинные команды (или вспомогательные подпрограммы) реализуют операции умножения и сложения. Конечно, в языке программирования высокого уровня могут быть конструкции низкого уровня, такие как побитовые операции, но их использование ограничивается либо необходимостью доступа к специфическим машинным данным в системных программах, либо повышенными требованиями к эффективности программы. 

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

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

Алгоритмические языки высокого уровня можно разделить на классы в зависимости от парадигмы, то есть базовой системы понятий, на которой они основаны. Ниже мы кратко рассмотрим наиболее распространённые парадигмы: императивные и функциональные языки программирования. Помимо них существуют и другие, например, логические языки программирования (Prolog), языки основанные на нормальных алгоритмах Маркова (Refal) и т.д. Вообще говоря, это разделение весьма условно, поскольку в реально используемых современных языках программирования сосуществуют конструкции, относящиеся к разным парадигмам.

Императивные языки

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

· описание структуры хранящихся в памяти данных;

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

· организация последовательности исполнения базовых операторов.

С такой точки зрения машинные языки также можно отнести к императивным. Императивные АЯВУ начали появляться в конце 50-х годов XX века - Алгол-60, Фортран, Кобол. Потом создание новых языков приняло лавинообразный характер - Simula-67, Паскаль, Modula-2, C, С++ и десятки других. Были попытки создания универсального, подходящего для всех прикладных областей, языка программирования - Алгол 68, PL/I, Ada - но успешными их назвать нельзя. Новые языки программирования появляются до сих пор.

Функциональные языки

Свойственное императивным языкам программирования пошаговое исполнение инструкций не является неотъемлемым свойством понятия алгоритма. Примером того, что программу вычислений можно сформулировать точно, но при этом оставляя большую свободу в выборе последовательности действий и возможность для параллельного вычисления подзадач, являются функциональные языки программирования: Lisp, Scheme, Miranda, ML, Haskell, Scala и т.д.

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

на языке Scheme записывается как

(define (fact n)

(if (> n 0)

    (* n (fact (- n 1)))

    1)))

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

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: