Процедурные языки программирования
Процедурное (императивное) программирование является отражением архитектуры традиционных ЭВМ, которая была предложенафон Нейманом в 1940-х годах. Теоретической моделью процедурного программирования служит алгоритмическая система под названием Машина Тьюринга.
Программа на процедурном языке программирования состоит из последовательности операторов (инструкций), задающих процедуру решения задачи. Основным является оператор присваивания, служащий для изменения содержимого областей памяти. Концепция памяти как хранилища значений, содержимое которого может обновляться операторами программы, является фундаментальной в императивном программировании.
Выполнение программы сводится к последовательному выполнению операторов с целью преобразования исходного состояния памяти, то есть значений исходных данных, в заключительное, то есть в результаты. Таким образом, с точки зрения программиста имеются программа и память, причем первая последовательно обновляет содержимое последней.
Процедурный язык программирования предоставляет возможность программисту определять каждый шаг в процессе решения задачи. Особенность таких языков программирования состоит в том, что задачи разбиваются на шаги и решаются шаг за шагом. Используя процедурный язык, программист определяет языковые конструкции для выполнения последовательности алгоритмических шагов.
Бейсик (от BASIC, сокращение от англ. Beginner’s All—purpose Symbolic Instruction Code — универсальный код символических инструкций для начинающих; англ. basic— основной, базовый) — семейство высокоуровневых языков программирования.
Был разработан в 1963 году профессорами Дартмутского колледжа Томасом Куртом (Thomas E. Kurtz) и Джоном Кемени (John G. Kemeny).
Язык предназначался для обучения программированию и получил широкое распространение в виде различных диалектов, прежде всего, как язык для домашних микрокомпьютеров.
До середины 1960-х компьютеры (ЭВМ) были слишком дорогими машинами, использовавшимися в основном для научно-технических задач, и выполнявшими задачи не в интерактивном режиме (т.н. пакетная обработка), когда общение с машиной осуществлялось через её оператора.
Языки программирования этой поры, как и компьютеры, на которых они использовались, были разработаны для работы с ними обученных технических специалистов и программистов. Поскольку машины были дорогими, то и машинное время было дорого — поэтому на первом месте стояла скорость выполнения программы (скорость счёта).
Однако, в течение 1960-х цены на компьютеры стали падать так, что даже небольшие компании могли их себе позволить; их быстродействие всё увеличивалась и наступило время, когда стало возможно организовать более эффективную непосредственную работу пользователей с компьютерами в так называемом режиме разделения времени (time-sharing).
Бейсик был придуман в 1963 году преподавателями Дартмутского Колледжа Джоном Кемени и Томасом Куртцом, и под их руководством был реализован командой студентов колледжа. Со временем, когда стали появляться другие диалекты, этот «изначальный» диалект стали называть Dartmouth BASIC.
Бейсик был спроектирован так, чтобы студенты могли без затруднений писать программы, используя терминалы с разделением времени. Он предназначался для более «простых» пользователей, не столько заинтересованных в скорости исполнения программ, сколько просто в возможности использовать компьютер для решения своих задач не имея специальной подготовки.
При проектировании языка использовались следующие восемь принципов: новый язык должен
- быть простым в использовании для начинающих
- быть языком программирования общего назначения
- предоставлять возможность расширения функциональности, доступную опытным программистам
- быть интерактивным
- предоставлять ясные сообщения об ошибках
- быстро работать на небольших программах
- не требовать понимания работы аппаратного обеспечения
- защищать пользователя от операционной системы
- простую языковую базу, из которой вынесены в библиотеки многие существенные возможности, вроде математических функций или функций управления файлами;
- ориентацию на процедурное программирование, обеспечивающую удобство применения структурного стиля программирования;
- систему типов, предохраняющую от бессмысленных операций;
- использование препроцессора для, например, определения макросов и включения файлов с исходным кодом;
- непосредственный доступ к памяти компьютера через использование указателей;
- минимальное число ключевых слов;
- передачу параметров в функцию по значению, а не по ссылке (при этом передача по ссылке выполняется с помощью указателей);
- указатели на функции и статические переменные
- области действия имён;
- записи — определяемые пользователем собирательные типы данных (структуры), которыми можно манипулировать как одним целым;
- автоматическое управление памятью;
- поддержка объектно-ориентированного программирования (при этом первые версии C++ генерировали код программы на языке Си);
- вложенные функции (существуют компиляторы языка Си реализующие эту функцию, например компилятор GNU);
- полиморфизм функций и операторов;
- встроенная поддержка многозадачности и сети
- функции высшего порядка
- карринг.
- применение технологии трансляции байт-кода в машинный код непосредственно во время работы программы (JIT-технология) с возможностью сохранения версий класса в машинном коде,
- широкое использование платформенно-ориентированного кода (native-код) в стандартных библиотеках,
- аппаратные средства, обеспечивающие ускоренную обработку байт-кода (например, технология Jazelle, поддерживаемая некоторыми процессорами фирмы ARM).
Процедурные языки программирования
Процедурные языки программирования — языки программирования, код которых можно разделить на процедуры.
Программирование – это очень объемная сфера знаний, изучить которую целиком не сможет ни один человек на свете. Сейчас существует более 120 различных языков программирования, каждый из которых в той или иной мере используется для решения своих специфических задач. Все языки делятся на разные типы. Очень видное место в свое время занимали так называемые процедурные языки программирования. Некоторые их них активно применяются даже сейчас.
Основная особенность языков процедурного программирования – их императивность, что означает создание четкого набора последовательных инструкций, которые должен поочередно выполнять компьютер. Парадигме императивности соответствуют такие главные характеристики:
- Весь код программы состоит из набора команд или инструкций, которые выполняются вычислительной машиной последовательно в заданном порядке;
- Данные, которые были получены в результате первых подсчетов, могут храниться и извлекаться из памяти в любое время и быть использованы.
Даже используемый синтаксис в таких языках является в некотором роде императивным – команды для выполнения похожи на приказы в обычной человеческой речи. Также важное место в процедурном программировании занимает использование подпрограмм, активное применение оператора присваивания, а также наличие составных выражений.
Некоторые процедурные языки
Исторически так сложилось, что процедурно ориентированные языки программирования начали появляться первыми и на них в значительной степени основывалось все дальнейшее развитие вычислительной техники. Именно поэтому можно смело говорить, что все первые языки программирования были именно процедурными. Рассмотрим некоторые из них подробнее.
Машинные коды и ассемблер
Традиционно к процедурным языкам программирования относят машинные инструкции, а также появившиеся несколько позже языки ассемблера. Машинный код представлял собой систему последовательных команд, написанных под конкретно взятую ЭВМ, которая выполняется процессором устройства либо его микропрограммами – уже написанными последовательностями действий процессора. В основе таких инструкций лежит работа двоичного кода, который выражается в последовательности нулей и единиц. Нуль означает для ЭВМ отсутствие электрического сигнала, а единица – подачу единичного импульса. Здесь четко соблюдается подчинение процедурному программированию – каждая последующая команда в программе может быть выполнена только по реализации предыдущий. Если в одной из команд произошла ошибка, то программа просто прекращала свою работу и инженеру нужно было искать ошибку в коде.
Похожим образом функционируют языки ассемблера. Здесь возможности написания сложных команд уже существенно расширены, применяются макрокоманды, возможно создание удобной адресации.
Fortran
Появившийся в 1950-х годах Fortran также относится к процедурным языкам программирования. Конечно, его возможности были уже несравнимо выше, нежели первые машинные коды и ассемблеры. Данный язык относят к высокоуровневым языкам программирования, он имеет свой транслятор, позволяет решать серьезные математические и логические задачи. С помощью Fortran были автоматизированы подсчеты линейных, дифференциальных и интегральных уравнений, выполнялись аппроксимации функций, преобразования Фурье. Очень многие библиотеки с пакетами Фортран доступны и активно используются даже в наше время.
Модификации языка последних годов превратили его в мощный инструмент, способный работать и с объектно-ориентированным программированием, и с обобщенным и модульным программированием. Также вместе с Фортран в 1950-х появились и другие процедурные языки, которые в целом были довольно схожи. Сюда относят в первую очередь Алгол, Ada, всем известный Basic.
С
Язык С, который берет свое начало с далеких 70-х также является процедурным. Выполняемые в нем процедуры и функции сильно похожи на классический ассемблер, что позволяет этому языку легко обращаться непосредственно к железу компьютера. На этом языке пишутся операционные системы, драйвера, самое разнообразное прикладное программное обеспечение. В то же время Си имеет практически полный функционал из того, что предлагают непроцедурные языки программирования. С его помощью можно разрабатывать практически любое ПО, он активно используется для написания некоммерческих программ и приложений, также плюсом С является его высокая совместимость с самыми разными аппаратными платформами.
Паскаль
Известный практически каждому студенту Паскаль также относиться к процедурным языкам. Если в коде программы здесь будет какая-либо ошибка, то она не станет запускаться. Здесь можно использовать подпрограммы, независимые структуры данных. Решаемая с помощью Паскаль задача как бы разделяется на более простые задания (что типично для процедурных языков). Когда все простые решения получены, то они соединяются в общее решение исходного задания.
Некоторые особенности процедурного программирования
Основными понятиями из ПП можно назвать следующее:
Модуль. Часть программы, которая может храниться в отдельном файле. Он выполняет часть функций, связанных с какими-то определенными переменными, объектами или константами;
- Тип данных. Как и в других видах языков это понятие обозначает некоторый массив данных, которые определяются к одному типу;
- Функция. Полностью самостоятельный и законченный участок программы, решающий поставленную перед ним задачу. В процедурных языках часто присутствует множество встроенных функций, но для своих задач можно писать и новые.
В целом, процедурные языки – это интересная часть истории программирования. Они и сейчас довольно активно используются как в образовательных, так и прикладных целях. Тот же Фортран имеет редакцию от 2010 года.