barsic

advertisement
Средства программирования.
На протяжении всех лет существования практика программирования требовала
совершенствования технологических приемов и создания на их основе таких средств
программирования, которые упростили бы процесс разработки программ, позволяя
создавать все более сложные программные системы. Первые программы были
организованы очень просто. Они состояли из собственно программы на машинном языке
и
обрабатываемых
данных.
Сложность
программ
ограничивалась
способностью
программиста одновременно мысленно отслеживать последовательность выполняемых
операций
и
местонахождение
большого
количества
данных.
Создание
сначала
ассемблеров, а затем и языков высокого уровня сделало программу более обозримой за
счет снижения уровня детализации и естественно позволило увеличить ее сложность.
Появление в языках средств, позволяющих оперировать подпрограммами, существенно
снизило трудоемкость разработки программ. Подпрограммы можно было сохранять и
использовать в других программах. В результате были накоплены огромные библиотеки
расчетных и служебных подпрограмм, которые по мере надобности которые по мере
надобности вызывались из разрабатываемой программы. Типичная программа того
времени состояла из основной программы, области глобальных данных и набора
подпрограмм, выполняющих обработку всех данных или их части.Слабым местом такой
архитектуры было то, что при увеличении количества подпрограмм возрастала
вероятность искажения части глобальных данных какой-либо подпрограммой. Например,
обычно подпрограмма поиска корней уравнения на заданном интервале по методу
деления отрезка пополам меняет величину интервала. Если при выходе из подпрограммы
не предусмотреть восстановления первоначального интервала, то в глобальной области
окажется неверное значение интервала, полученное при последнем делении отрезка в ходе
работы подпрограммы. Необходимость исключения таких ошибок привела к идее
использования в подпрограммах локальных данных.И вновь сложность разрабатываемого
программного
обеспечения
стала
ограничиваться
возможностью
программиста
отслеживать процессы обработки данных уже на новом уровне. К этому добавились
проблемы
согласования
интерфейса
при
ведении
разработки
несколькими
программистами. В результате встал вопрос создания технологии разработки сложных
программных продуктов, снижающей вероятность появления ошибок. Усилиями многих
авторов
такая
технология
была
создана
и
получила
название
«структурное
программирование». Структурное программирование представляет собой совокупность
рекомендуемых технологических приемов, охватывающих выполнение всех этапов
разработки программного обеспечения. Были сформулированы основные принципы
выполнения разработки:
•принцип нисходящей разработки, рекомендующий на всех этапах вначале определять
наиболее общие моменты, а затем поэтапно выполнять детализацию (что позволяет
последовательно концентрировать внимание на небольших фрагментах разработки);
•собственно структурное программирование, рекомендующее деленные структуры
алгоритмов и стиль программирования (чем нагляднее текст программы, тем меньше
вероятность ошибки);
•принцип
сквозного
структурного
контроля,
предполагающий
проведение
содержательного контроля всех этапов разработки (чем раньше обнаружена ошибка, тем
проще ее исправить).
В основе структурного программирования лежит декомпозиция (разбиение на части)
сложных систем с целью последующей реализации в отдельных небольших (до 40 ... 50
операторов) подпрограмм. В отличие используемого ранее интуитивного подхода к
декомпозиции, структурный подход требовал представления задачи в виде иерархии
подзадач простейшей структуры, для получения которой рекомендовалось применять
метод пошаговой детализации. С появлением других принципов декомпозиции
(объектного, логического и т.д.) данный способ получил название процедурной
декомпозиции.
Метод пошаговой детализации заключается в следующем: определяется общая структура
программы в виде одного из вариантов:
- последовательности подзадач (например, ввод данных, преобразование данных, вывод
данных),
- альтернативы подзадач (например, добавление записей к файлу или их поиск),
- повторения подзадачи (например, циклически повторяемая обработка данных);
- каждая подзадача, в свою очередь, разбивается на подзадачи с использованием тех же
структур;
- процесс продолжается, пока на очередном уровне не получается подзадача, которая
достаточно просто реализуется средствами используемого языка (1-2 управляющих
оператора
языка).
Структурное программирование
Структу́рное программи́рование — методология разработки программного обеспечения, в
основе которой лежит представление программы в виде иерархической структуры блоков.
Предложена в 70-х года XX века Э. Дейкстрой, разработана и дополнена Н. Виртом.
В соответствии с данной методологией
1. Любая программа представляет собой структуру, построенную из трёх типов
базовых конструкций:
o последовательное исполнение — однократное выполнение операций в том
порядке, в котором они записаны в тексте программы;
o ветвление — однократное выполнение одной из двух или более операций, в
зависимости от выполнения некоторого заданного условия;
o цикл — многократное исполнение одной и той же операции до тех пор,
пока выполняется некоторое заданное условие (условие продолжения
цикла).
В программе базовые конструкции могут быть вложены друг в друга
произвольным
образом,
но
никаких
других
средств
управления
последовательностью выполнения операций не предусматривается.
2. Повторяющиеся фрагменты программы (либо не повторяющиеся, но
представляющие собой логически целостные вычислительные блоки) могут
оформляться в виде т. н. подпрограмм (процедур или функций). В этом случае в
тексте основной программы, вместо помещённого в подпрограмму фрагмента,
вставляется инструкция вызова подпрограммы. При выполнении такой
инструкции выполняется вызванная подпрограмма, после чего исполнение
программы продолжается с инструкции, следующей за командой вызова
подпрограммы.
3. Разработка программы ведётся пошагово, методом «сверху вниз».
Сначала пишется текст основной программы, в котором, вместо каждого связного
логического фрагмента текста, вставляется вызов подпрограммы, которая будет
выполнять этот фрагмент. Вместо настоящих, работающих подпрограмм, в программу
вставляются «заглушки», которые ничего не делают. Полученная программа проверяется
и отлаживается. После того, как программист убедится, что подпрограммы вызываются в
правильной
последовательности
(то
есть
общая
структура
программы
верна),
подпрограммы-заглушки последовательно заменяются на реально работающие, причём
разработка каждой подпрограммы ведётся тем же методом, что и основной программы.
Разработка заканчивается тогда, когда не останется ни одной «затычки», которая не была
бы удалена. Такая последовательность гарантирует, что на каждом этапе разработки
программист одновременно имеет дело с обозримым и понятным ему множеством
фрагментов, и может быть уверен, что общая структура всех более высоких уровней
программы верна. При сопровождении и внесении изменений в программу выясняется, в
какие именно процедуры нужно внести изменения, и они вносятся, не затрагивая части
программы, непосредственно не связанные с ними. Это позволяет гарантировать, что при
внесении изменений и исправлении ошибок не выйдет из строя какая-то часть программы,
находящаяся в данный момент вне зоны внимания программиста.
История
Методология структурного программирования появилась как следствие возрастания
сложности
решаемых
на
компьютерах
задач,
и
соответственного
усложнения
программного обеспечения. В 70-е годы XX века объёмы и сложность программ достигли
такого уровня, что «интуитивная» (неструктурированная, или «рефлекторная») разработка
программ, которая была нормой в более раннее время, перестала удовлетворять
потребностям практики. Программы становились слишком сложными, чтобы их можно
было нормально сопровождать, поэтому потребовалась какая-то систематизация процесса
разработки и структуры программ.
Наиболее сильной критике со стороны разработчиков структурного подхода к
программирования подвергся оператор GOTO (оператор безусловного перехода),
имевшийся тогда почти во всех языках программирования. Неправильное и необдуманное
использование произвольных переходов в тексте программы приводит к получению
запутанных, плохо структурированных программ (т.н. спагетти-кода), по тексту которых
практически невозможно понять порядок исполнения и взаимозависимость фрагментов.
Следование принципам структурного программирования сделало тексты программ, даже
довольно крупных, нормально читаемыми. Серьёзно облегчилось понимание программ,
появилась возможность разработки программ в нормальном промышленном режиме,
когда программу может без особых затруднений понять не только её автор, но и другие
программисты. Это позволило разрабатывать достаточно крупные для того времени
программные комплексы силами коллективов разработчиков, и сопровождать эти
комплексы в течение многих лет, даже в условиях неизбежных изменений в составе
персонала.
Методология структурной разработки программного обеспечения была признана «самой
сильной формализацией 70-х годов». После этого слово «структурный» стало модным в
отрасли, и его начали использовать везде, где надо и где не надо. Появились работы по
«структурному
проектированию»,
«структурному
тестированию»,
«структурному
дизайну» и так далее. В общем, произошло примерно то же самое, что происходило в 90-х
годах и происходит в настоящее время с терминами «объектный», «объектноориентированный» и «электронный».
Перечислим некоторые достоинства структурного программирования:
1. Структурное программирование позволяет значительно сократить число вариантов
построения программы по одной и той же спецификации, что значительно снижает
сложность программы и, что ещё важнее, облегчает понимание её другими
разработчиками.
2. В структурированных программах логически связанные операторы находятся
визуально ближе, а слабо связанные — дальше, что позволяет обходиться без блоксхем и других графических форм изображения алгоритмов (по сути, сама
программа является собственной блок-схемой).
3. Сильно упрощается процесс тестирования и отладки структурированных программ.
Функциональное программирование
Функциона́льное программи́рование — раздел дискретной математики и методология
программирования, в которой процесс вычисления трактуется как вычисление значений
функций в математическом понимании последних. Противопоставляется парадигме
императивного программирования
Основные принципы
Функциональное программирование рассматривает процесс вычисления как получение
значения (результата) математически описанной функции. При этом вычисление значения
функции описывается как комбинация вызовов функций того же или более низкого
уровня. Каждая следующая функция в этой комбинации описывается аналогичным
образом, до тех пор, пока описание не сведётся к предопределённым функциям,
вычисление которых считается заданным.
Существенной особенностью чистого функционального программирования является
использование только «чистых» функций, то есть тех, чей единственный результат работы
заключается в возвращаемом значении, или другими словами, вычисление которых не
имеет
побочного
эффекта.
Единственными
способами
передачи
значения
в
функциональной программе является получение его как результата вызова функции и
передача его функции в качестве параметра. Чистая функциональная программа не
использует переменных.
В отличие от императивного программирования, в котором исполнителю программы
предписывается
последовательность
выполняемых
действий,
в
функциональном
программировании способ решения задачи описывается при помощи зависимости
функций друг от друга (в том числе возможны рекурсивные зависимости), без явного
указания последовательности шагов.
Функциональное программирование основано на теориях λ-исчисления (Алонзо Чёрч,
1936) и комбинаторной логики (Моисей Исаевич Шейнфинкель и Хаскелл Карри).
Наиболее известными языками функционального программирования являются:


Haskell чистый функциональный. Назван в честь Хаскелла Карри
LISP (Джон МакКарти, 1958, множество его потомков, наиболее современные из
которых — Scheme и Common Lisp)



ML (Робин Милнер, 1979, из ныне используемых диалектов известны Standard ML
и Objective CAML)
Miranda (Дэвид Тёрнер, 1985, который впоследствии дал развитие языку Haskell).
Nemerle — гибридный функционально/императивный язык.
Концепции
Некоторые концепции и парадигмы специфичны для функционального программирования
и
в
основном
чужды
императивному
программированию
(включая
объектно-
ориентированное программирование). Тем не менее, языки программирования обычно
представляют собой гибрид нескольких парадигм программирования, поэтому «большей
частью императивные» языки программирования могут использовать какие-либо из этих
концепций.
Функции высших порядков
Функции высших порядков — это такие функции, которые могут принимать в качестве
аргументов и возвращать другие функции. Примерами таких функций в математическом
анализе являются производная и первообразная.
Функции высших порядков — это скорее математическое понятие, аналогичные функции
в языках программирования обычно называются функциями первого класса.
Функции высших порядков позволяют использовать карринг, процесс превращения
функций многих переменных в функцию одной переменной.
Рекурсия
В функциональных языках итерация (цикл) обычно реализуется в виде рекурсии.
Рекурсивные функции вызывают сами себя, позволяя операции выполняться снова и
снова. Для использования рекурсии может потребоваться большой стек, но этого можно
избежать в случае хвостовой рекурсии. Хвостовая рекурсия может быть распознана и
оптимизирована компилятором в код, получаемый после компиляции аналогичной
итерации в императивном языке программирования.
Рекурсивные функции можно обобщить с помощью функций высших порядков,
используя, например, катаморфизм и анаморфизм.
Схожие парадигмы
Одной из близких парадигм программирования является логическое программирование, в
котором программа представляет собой множество пар (логическое условие, новые
факты).
В
логическом
программировании,
также
как
и
в
функциональном
программировании, программист остается в неведении о методах, применяемых при
вычислении, и последовательности исполнения элементарных действий. Большая часть
ответственности за эффективность вычислений в логическом и функциональном
программировании перекладывается на «плечи» транслятора используемого языка
программирования.
Функциональное
и
логическое
программирование
являют
собой
части
т.
н.
«декларативного программирования», то есть такого стиля программирования, при
использовании которого в программах описывается способ решения поставленной задачи,
а не предписываются шаги для получения результата.
Особенности
Основной особенностью функционального программирования, определяющей как
преимущества, так и недостатки данной парадигмы, является то, что в ней реализуется
модель вычислений без состояний. Если императивная программа на любом этапе
исполнения имеет состояние, то есть совокупность значений всех переменных, и
производит побочные эффекты, то чисто функциональная программа ни целиком, ни
частями состояния не имеет и побочных эффектов не производит. То, что в императивных
языках делается путём присваивания значений переменным, в функциональных
достигается путём передачи выражений в параметры функций. Непосредственным
следствием становится то, что чисто функциональная программа не может изменять уже
имеющиеся у неё данные, а может лишь порождать новые путём копирования и/или
расширения старых. Следствием того же является отказ от циклов в пользу рекурсии.
Сильные стороны
Привлекательная сторона вычислений без состояний — повышение надёжности кода за
счет чёткой структуризации и отсутствия необходимости отслеживания побочных
эффектов. Любая функция работает только с локальными данными и работает с ними
всегда одинаково, независимо от того, где, как и при каких обстоятельствах она
вызывается. Невозможность мутации данных при пользовании ими в разных местах
программы исключает появление труднообнаруживаемых ошибок (таких, например, как
случайное присваивание неверного значения глобальной переменной в императивной
программе). Отсутствие состояний даёт возможность применять к функциональным
программам достаточно сложные методы автоматической оптимизации, которые
непригодны для программ с состояниями и побочными эффектами. Ещё одним
преимуществом функциональных программ является то, что они предоставляют
широчайшие
возможности
для
автоматического
распараллеливания
вычислений.
Поскольку отсутствие побочных эффектов гарантировано, в любом вызове функции
всегда допустимо параллельное вычисление двух различных параметров — порядок их
вычисления не может оказать влияния на результат вызова. Ещё одной, традиционно
упоминаемой
положительной
особенностью
функционального
программирования
является то, что оно позволяет описывать программу в декларативном стиле; программист
может сосредоточиться на описании отношений, в которых результат вычислений
находится с исходными данными. Последовательность операций, приводящая к
вычислению результата, в явном виде не описывается, а получается автоматически.
Недостатки
Недостатки функционального программирования вытекают из тех же самых его
особенностей. Отсутствие присваиваний и замена их на порождение новых данных
приводят к необходимости постоянного выделения и автоматического освобождения
памяти, поэтому в системе исполнения функциональной программы обязательным
компонентом становится высокоэффективный сборщик мусора. Для эффективности
сборки мусора необходимо отслеживать ссылки на данные, что также требует затрат
времени и памяти. Отсутствие циклов для промышленных программ является очень
серьёзным ограничением — далеко не все виды рекурсии могут быть автоматически
преобразованы в цикл.
Для
преодоления
недостатков
функциональных
программ
уже
первые
языки
функционального программирования включали не только чисто функциональные
средства, но и механизмы императивного программирования (присваивание, цикл,
«неявный PROGN» были уже в LISPе). Использование таких средств позволяет решить
некоторые практические проблемы, но это означает отход от идей (и преимуществ)
функционального
программирования
функциональных
языках.
функциональной
программы
и
Естественно,
—
при
написание
императивных
при
теряется
этом
описании
и
программ
на
декларативность
функциональных
зависимостей
программист оказывается вынужден учитывать и задавать порядок исполнения
программы.
Процедурное программирование
Процеду́рное программи́рование — это парадигма программирования, основанная на
концепции вызова процедуры. Процедуры, также известны как подпрограммы, методы
или функции (это не математические функции, но функции, подобные тем, которые
используются в функциональном программировании). Процедуры просто содержат
последовательность шагов для выполнения. В ходе выполнения программы любая
процедура может быть вызвана из любой точки, включая саму данную процедуру.
Процедурное программирование — это лучший выбор, чем просто последовательное или
неструктурированное программирование во многих ситуациях, которые вызываются
умеренной сложностью, или тех, которые требуют значительного упрощения поддержки.
Возможные выгоды:

Возможность повторного использования одного и того же кода из нескольких мест
программы без его копирования.


Легче отследить поток выполнения программы, чем в случае использования
инструкций GOTO или JUMP, которые могут сделать из большой, сложной
программы так называемый «спагетти-код».
Возможность поддержки модульности и структурности.
Процедурные языки программирования











Ада (язык общего назначения)
Бейсик (версии начиная с Quick Basic до появления Visual Basic)
Си
КОБОЛ
Фортран
Модула-2
Глагол (русский аналог Оберона)
Паскаль
ПЛ/1
Рапира
REXX
Объектно-ориентированное программирование
Объе́ктно-ориенти́рованное
программи́рование
(ООП)
—
парадигма
программирования, в которой основными концепциями являются понятия объектов и
классов (либо, в менее известном варианте языков с прототипированием — прототипов).
Класс — это тип, описывающий устройство объектов — экземпляров. Класс можно
сравнить с чертежом, согласно которому создаются объекты. Обычно классы
разрабатывают таким образом, чтобы их объекты соответствовали объектам предметной
области.
Прототип — это образцовый объект, по образу и подобию которого создаются другие
объекты.
Объектное и объектно-ориентированное программирование (ОПП) возникло в результате
развития идеологии процедурного программирования, где данные и подпрограммы
(процедуры, функции) их обработки формально не связаны. Кроме того, в современном
объектно-ориентированном программировании часто большое значение имеют понятия
события (так называемое событийно-ориентированное программирование) и компонента
(компонентное программирование).
Объектно-ориентированное программирование в настоящее время является абсолютным
лидером в области прикладного программирования (языки Java, C#, C++, JavaScript,
ActionScript и др.). В то же время в области системного программирования до сих пор
лидирует
парадигма
процедурного
программирования,
и
основным
языком
программирования является язык C. Хотя при взаимодействии системного и прикладного
уровней операционных систем заметное влияние стали оказывать языки объектно-
ориентированного программирования. Например, мультиплатформенным стандартом
стала система Qt, написанная на языке C++.
Первым языком программирования, в котором были предложены принципы объектной
ориентированности, была Симула. В момент своего появления (в 1967 году), этот язык
программирования предложил поистине революционные идеи: объекты, классы,
виртуальные методы и др., однако это всё не было воспринято современниками как нечто
грандиозное. Тем не менее, большинство концепций были развиты Аланом Кэйем и
Дэном Ингаллсом в языке Smalltalk. Именно он стал первым широко распространённым
объектно-ориентированным языком программирования.
Главные понятия и разновидности
Структура данных «класс», представляющая собой объектный тип данных, внешне
похожа на типы данных процедурно-ориентированных языков, такие как структура в
языке Си или запись в Паскале или QuickBasic. При этом элементы такой структуры
(члены класса) могут сами быть не только данными, но и методами (то есть процедурами
или функциями).
Такое объединение называется инкапсуляцией.
Наличие инкапсуляции достаточно для объектности языка программирования, но ещё не
означает его объектной ориентированности — для этого требуется наличие наследования.
Но даже наличие инкапсуляции и наследования не делает язык программирования в
полной мере функциональным с точки зрения ООП. Основные преимущества ООП
проявляются только в том случае, когда в языке программирования реализован
полиморфизм.
Язык
Self,
соблюдая
многие
исходные
положения
объектно-ориентированного
программирования, ввёл альтернативное классам понятие прототипа, положив начало
прототипному программированию, считающемуся подвидом объектного.
Основные понятия
Абстракция данных
Объекты представляют собою упрощенное, идеализированное описание реальных
сущностей предметной области. Если соответствующие модели адекватны
решаемой задаче, то работать с ними оказывается намного удобнее, чем с
низкоуровневым описанием всех возможных свойств и реакций объекта.
Инкапсуляция
Инкапсуляция — это принцип, согласно которому любой класс должен
рассматриваться как чёрный ящик — пользователь класса должен видеть и
использовать только интерфейсную часть класса (т. е. список декларируемых
свойств и методов класса) и не вникать в его внутреннюю реализацию. Поэтому
данные принято инкапсулировать в классе таким образом, чтобы доступ к ним по
чтению или записи осуществлялся не напрямую, а с помощью методов. Принцип
инкапсуляции (теоретически) позволяет минимизировать число связей между
классами и, соответственно, упростить независимую реализацию и модификацию
классов.
Наследование
Наследованием называется возможность порождать один класс от другого с
сохранением всех свойств и методов класса-предка (прародителя, иногда его
называют суперклассом) и добавляя, при необходимости, новые свойства и
методы. Набор классов, связанных отношением наследования, называют
иерархией. Наследование призвано отобразить такое свойство реального мира, как
иерархичность.
Полиморфизм
Полиморфизмом называют явление, при котором один и тот же программный код
(полиморфный код) выполняется по-разному в зависимости от того, объект какого
класса используется при вызове данного кода. Полиморфизм обеспечивается тем,
что в классе-потомке изменяют реализацию метода класса-предка с обязательным
сохранением сигнатуры метода. Это обеспечивает сохранение неизменным
интерфейса класса-предка и позволяет осуществить связывание имени метода в
коде с разными классами — из объекта какого класса осуществляется вызов, из
того класса и берётся метод с данным именем. Такой механизм называется
динамическим (или поздним) связыванием — в отличие от статического (раннего)
связывания, осуществляемого на этапе компиляции программы.
Основные концепции





Система состоит из объектов
Объекты некоторым образом взаимодействуют между собой
Каждый объект характеризуется своим состоянием и поведением
Состояние объекта задаётся значением полей данных
Поведение объекта задаётся методами
Традиционный подход
Данный подход реализован в огромном количестве языков программирования; из
промышленно используемых языков программирования на развитие идей объектного
программирования наибольшее влияние оказали языки C++ и Java. Очень часто под
объектно-ориентированным подходом понимаются именно модели, реализованные в этих
языках.
Обмен сообщениями
Этот подход предложен Аланом Кэйем в языке Smalltalk.


Управление объектами (вызов методов) производится не напрямую, как это
принято в современных языках объектного программирования, а через посылку
объектов-сообщений.
В литературе, посвящённой объектному программированию (особенно C++) вместо
правильного термина вызов метода до сих пор иногда встречается неправильный
термин посылка сообщения (заимствованный из Smalltalk, где он совершенно
правилен) .
Прототипное программирование
Примерами языков программирования, где используется прототипное программирование,
являются Self и JavaScript.


Создание новых объектов через клонирование прототипов.
Повторное использование кода достигается не через наследование, а с помощью
делегирования.
Реализационный подход
Каждый объект в ООП имеет свой тип (класс). Класс представляет собой тип данных,
имеющий в составе:
Поля данных
Параметры объекта (конечно, не все, а только необходимые в программе),
задающие его состояние (свойства объекта предметной области). Иногда возникает
терминологическая путаница, когда поля данных объекта называют свойствами
объекта.
Методы
Действия, которые можно выполнять над объектом такого типа, или которые сам
объект может выполнять.
Свойства объекта
Значения, доступные по чтению и/или записи через методы, называемые
аксессорами (от англ. access — доступ). Эти методы часто называют геттерами
(чтение) и сеттерами (запись). Они обеспечивают чтение и установку значений
полей данных, связанных со свойствами. Свойства можно рассматривать как
«умные» поля данных, которые сопровождают доступ к полю данных какими-либо
дополнительными действиями (например, когда изменение координаты объекта
сопровождается его перерисовкой на новом месте).
Концептуальный подход
Каждый объект является экземпляром некоторого класса объектов. Один класс
отличается от других именем и, обычно, набором полей данных, методов и свойств.
Критика ООП
При чтении данного раздела следует иметь в виду, что ООП является в настоящее время
основой всей индустрии прикладного программирования благодаря выигрышу в
конкурентной
борьбе
с
альтернативными
технологиями
программирования.
В
промышленном программировании только в системном программировании позиции ООП
еще не очень сильны. Поэтому, с одной стороны, теоретические рассуждения о
непригодности ООП не соответствуют наблюдаемой на практике ситуации. С другой
стороны, нельзя считать, что ООП во всех случаях является наилучшей из методик
программирования.
Процедурное
программирование
лучше
подходит
для
случаев,
когда
важны
быстродействие и потребляемые ресурсы, объектное — когда важна управляемость
проекта и его модифицируемость, а также безопасность программ. Процедурное
программирование обычно лучше подходит для небольших проектов, объектное — для
больших.






Исследование Thomas E. Potok, Mladen Vouk и Andy Rindos [1] показало отсутствие
значимой разницы в продуктивности разработки программного обеспечения между
ООП и процедурным подходом.
Кристофер Дэйт указывает на невозможность сравнения ООП и других технологий
во многом из за отсутствия строгого и общепризнанного определения ООП (C. J.
Date, Introduction to Database Systems, 6th-ed., Page 650)
Александр Степанов, в одном из своих интервью, указывал на то, что ООП
«методологически неправильно» и что «… ООП практически такая же
мистификация как и искусственный интеллект…» ([2]).
Фредерик Брукс (Frederick P. Brooks, Jr.) в своей статье «No Silver Bullet. Essence
and Accidents of Software Engineering» (Computer Magazine; April 1987) указывает
на то, что наиболее сложной частью создания программного обеспечения является
« … спецификация, дизайн и тестирование концептуальных конструкций, а отнюдь
не работа по выражению этих концептуальных конструкций…». ООП (наряду с
такими технологиями как искусственный интеллект, верификация программ,
автоматическое программирование, графическое программирование, экспертные
системы и др), по его мнению, не является «серебряной пулей», которая может
снизить сложность разработки программных систем. По его мнению «…ООП
позволяет сократить только привнесённую сложность в выражение дизайна.
Дизайн остаётся сложным по своей природе…». ([3])
Эдсгер Дейкстра указывал: «… то о чём общество в большинстве случаев просит
— это змеиное масло. Естественно, „змеиное масло“ имеет очень впечатляющие
имена, иначе будет очень трудно что-то продать: „Структурный анализ и Дизайн“,
„Программная инженерия“, „Модели зрелости“, „Управляющие информационные
системы“ (Management Information Systems), „Интегрированные среды поддержки
проектов“, „Объектная ориентированность“, „Реинжиниринг бизнес-процессов“…»
— EWD 1175: The strengths of the academic enterprise
Патрик Киллелиа в своей книге «Тюнинг веб-сервера» писал: «… ООП
предоставляет вам множество способов замедлить работу ваших программ …»
Объектно-ориентированные языки
Многие
современные
языки
специально
созданы
для
облегчения
объектно-
ориентированного программирования. Однако следует отметить, что можно применять
техники ООП и для необъектно-ориентированного языка и наоборот, применение
объектно-ориентированного языка вовсе не означает, что код автоматически становится
объектно-ориентированным, и т. д.
Прототипное программирование
Прототипное
программирование
—
стиль
объектно-ориентированного
программирования, при котором отсутствует понятие класса, а повторное использование
(наследование) производится путём клонирования существующего экземпляра объекта —
прототипа.
Каноническим примером прототип-ориентированного языка является язык Self. В
дальнейшем этот стиль программирования начал обретать популярность и был положен в
основу таких языков программирования, как JavaScript, Cecil, NewtonScript, Io, Slate,
MOO, REBOL, Kevo и др.
Сравнение с класс-ориентированным подходом
В языках, основанных на понятии «класс», все объекты разделены на два основных типа
— классы и экземпляры. Класс определяет структуру и функциональность (поведение),
одинаковую для всех экземпляров данного класса. Экземпляр является носителем данных
— то есть обладает состоянием, меняющимся в соответствии с поведением, заданным
классом.
Сторонники прототипного программирования часто утверждают, что языки, основанные
на классах, приводят к излишней концентрации на таксономии классов и на отношениях
между ними. В противоположность этому, прототипирование заостряет внимание на
поведении
некоторого
(небольшого)
количества
«образцов»,
которые
затем
классифицируются как «базовые» объекты и используются для создания других объектов.
Многие прототип-ориентированные системы поддерживают изменение прототипов во
время выполнения программы, тогда как лишь небольшая часть класс-ориентированных
систем (например, Smalltalk) позволяет динамически изменять классы.
Хотя подавляющее большинство прототип-ориентированных систем основаны на
интерпретируемых языках с динамической типизацией, технически возможно добавить
прототипирование и в языки со статической проверкой типов. Язык Omega является
одним из примеров такой системы.
Конструирование объектов
В класс-ориентированных языках новый экземпляр создаётся через вызов конструктора
класса (возможно, с набором параметров). Получившийся экземпляр имеет структуру и
поведение, жёстко заданные его классом.
В прототип-ориентированных системах предоставляется два метода создания нового
объекта: клонирование существующего объекта, либо создание объекта «с нуля». Для
создания объекта с нуля программисту предоставляются синтаксические средства
добавления свойств и методов в объект. В дальнейшем, с получившегося объекта может
быть получена полная копия, клон. В процессе клонирования копия наследует все
характеристики своего прототипа, но с этого момента она становится самостоятельной и
может быть изменена. В некоторых реализациях копии хранят ссылки на объекты-
прототипы, делегируя им часть своей функциональности; при этом изменение прототипа
может затронуть все его копии. В других реализациях новые объекты полностью
независимы от своих прототипов. Рассмотрим оба этих случая.
Делегирование
В прототип-ориентированных языках, использующих делегирование, среда исполнения
способна выполнять диспетчеризацию вызовов методов (или поиск нужных данных)
просто следуя по цепочке делегирующих указателей (от объекта к его прототипу), до
совпадения. В отличие от отношения «класс—«экземпляр», отношение «прототип»потомки» не требует, чтобы объекты-потомки сохраняли структурное подобие со своим
прототипом. С течением времени они могут адаптироваться и улучшаться, но при этом
нет нужды переделывать прототип. Важно, что добавлять/удалять/модифицировать можно
не только данные, но и функции, при этом функции тоже оказываются объектами первого
уровня. Вследствие этого большинство прототип-ориентированных языков называют
данные и методы объекта «слотами» (ячейками).
Каскадирование
При «чистом» прототипировании — именуемым также каскадным и представленым в
Kevo — клонированные объекты не хранят ссылок на свои прототипы. Прототип
копируется один – в – один, со всеми методами и атрибутами, и копии присваивается
новое имя (ссылка). Это напоминает митоз биологических клеток.
В число преимуществ данного подхода входит тот факт, что создатель копии может
менять её, не опасаясь побочных эффектов среди других потомков своего предка. Также
радикально снижаются вычислительные затраты на диспетчеризацию, так как нет
необходимости обходить всю цепочку возможных делегатов в поисках подходящего слота
(метода или атрибута).
В число недостатков можно включить трудности с распространением изменений в
системе: модификация прототипа не влечёт за собой немедленное и автоматическое
изменение всех его потомков. Тем не менее, Kevo предоставляет дополнительные
средства для публикации изменений среди множества объектов, причём на основании их
подобия («семейного сходства»), а не по наличию общего предка, что типично для
моделей с делегированием.
Другой недостаток в том, что простейшие реализации этой модели приводят к
увеличенному (по сравнению с моделью делегирования) расходу памяти, так как каждый
клон, пока он не изменён, будет содержать копию данных своего прототипа. Однако эта
проблема разрешима оптимальным разделением неизменённых данных и применением
«ленивого копирования» — что и было использовано в Kevo.
Критика
Сторонников класс-ориентированных объектных моделей, критикующих прототипный
подход, часто беспокоят те же проблемы, какими обеспокоены сторонники статической
типизации в отношении к языкам с динамической типизацией. В частности, обсуждения
вращаются вокруг таких тем, как правильность, безопасность, предсказуемость и
эффективность программы.
Что касается первых трёх пунктов, то классы часто рассматриваются как типы (и
действительно, в большинстве объектно-ориентированных языков со статической
типизацией так оно и есть), и предполагается, что классы предоставляют определённые
договорённости и гарантируют, что экземпляры будут вести себя вполне определённым
образом.
В части эффективности, объявление классов значительно упрощает компилятору задачу
оптимизации, делая более эффективными как методы, так и поиск атрибутов в
экземплярах. В случае языка Self немалая часть времени была потрачена на разработку
таких техник компиляции и интерпретации, которые позволили бы приблизить
производительность прототип-ориентированных систем к их класс-ориентированным
конкурентам.
Наконец,
возможно
наиболее
общим
местом
критики
против
прототипного
программирования является то, что сообщество разработчиков ПО недостаточно хорошо
знакомо с ним, несмотря на популярность и распространённость JavaScript. Вдобавок, так
как прототип-ориентированные системы сравнительно новы и всё ещё немногочисленны и
редки, приёмы разработки с их использованием до сих пор не получили большого
распространения.
Языки
















Actor-Based Concurrent Language, ABCL: ABCL/1, ABCL/R, ABCL/R2, ABCL/c+
Agora
Cecil
Cel
ECMAScript, ActionScript, DMDScript, JavaScript, JScript
Factor
Io
Lua
MOO
NewtonScript
Obliq
OpenLaszlo
REBOL
Self
Slate
TADS
Аспектно-ориентированное программирование
Аспектно-ориентированное
программирование
(АОП)
—
парадигма
программирования, основанная на идее разделения функциональности, особенно сквозной
функциональности, для улучшения разбиения программы на модули.
Методология контекстно-ориентированного программирования была предложена группой
инженеров исследовательского центра Xerox PARC под руководством Грегора Кикзалеса
(Gregor Kiczales). Ими же был разработан первый, и наиболее успешный до сих пор,
контекстно-ориентированный язык программирования AspectJ.
Существующие парадигмы программирования, такие как процедурное программирование
и объектно-ориентированное программирование, предоставляют некоторые способы для
разделения и выделения функциональности, например, функции, объекты, классы, пакеты,
но некоторую функциональность с помощью предложенных методов невозможно
выделить в отдельные сущности. Такую функциональность называют сквозной, так как её
реализация разбросана по различным модулям программы. Сквозная функциональность
приводит к рассредоточенному и запутанному коду. Запутанным называется такой код, в
котором одновременно реализована различная функциональность.
Трассировка — типичный пример сквозной функциональности. Другие примеры:
контрактное программирование, в частности проверка пред- и пост-условий, обработка
ошибок, реализация систем безопасности. Если рассматривать программу написанную с
помощью ООП, то любая функциональность, по которой не происходила декомпозиция
программы, является сквозной.
Все языки АОП предоставляют способы для выделения сквозной функциональности в
отдельную сущность. Различие между ними заключается в удобстве, безопасности и
области применения средств, которые они предоставляют. Наиболее популярный на
данный момент язык АОП — AspectJ. Используемые в нем понятия распространились на
большинство языков АОП.
Основные понятия AspectJ:





Точка выполнения (англ. JoinPoint) — определенная точка выполнения
программы.
Срез (англ. PointCut) — набор точек выполнения программы.
Применение (англ. Advice) — состоит из условий применения и реализации
функциональности. Условия применения определяют до, после или вместо какого
среза надо вставить требуемую функциональность.
Аспект (англ. Aspect) — модуль AspectJ.
Представление (англ. Introduction) — метод изменения структуры класса путем
введения новых полей и методов, а также изменения иерархии наследования.
Реализации




Для C#/VB.NET:
o PostSharp
o Aspect.NET
o LOOM.NET
o Puzzle.NAspect
o AspectDNG
o Aspect#
o Encase
o Compose*
o Seasar.NET
o DotSpect (.SPECT)
o Как чаcть функциональности
The Spring.NET Framework
Для Java:
o AspectJ
o Spring Framework
o AspectWerkz (Now merged with
AspectJ)
o Byte Code Engineering Library
o CaesarJ
o Dynaop
o JAC
o Jakarta Hivemind
o Javassist Home Page
o JAsCo
o JAML
o JBoss AOP
o Object Teams
o PROSE
o Reflex
o The AspectBench Compiler for
AspectJ (abc)
o Как чаcть функциональности
The Spring Framework
o Seasar
o The JMangler Project
o InjectJ
Для JavaScript:
o Ajaxpect
o AOP
Fun with JavaScript
(замещено проектом Ajaxpect)
o Dojo — Dojo Toolkit
o Aspectes
Для C/C++:
o AspectC++
o XWeaver project
o FeatureC++

Для Lua:
o AspectLua

Для Python:
o Lightweight Python AOP
o Logilab’s aspect module
o Python/Transwarp
AOP
Tutorial
o PEAK
o Pythius
o PyPy

Для Ruby:
o AspectR

Для ActionScript 2/3:
o Fling
o AIoC

Для PHP:
o PHPaspect
o Aspect-Oriented PHP
o Seasar.PHP
o AOP API for PHP
o AspectPHP
o APKframework

Для Perl:
o The Aspect Module

Для Common Lisp:
o AspectL

Для Cocoa:
o AspectCocoa

Для XML:
o AspectXML

Для Squeak Smalltalk
o AspectS

Для ColdFusion:
o ColdSpring

Для Flash ActionScript 2.0
o as2lib
Таблица развития языков программирования
Год Язык (идея)
46
Плюнкалкюль
Создатель ЭВМ
Заметки о языке
Цузе
Немецкий инженер Цузе разработал этот
Z4
язык для ЭВМ Z4, но ни компилятора, ни
интерпретатора для него написано не было
(поскольку и язык, и ЭВМ он разрабатывал
в одиночку).
49
"Краткий код"
Мочли
Юнивак По
своей
сути,
это
была
система
обозначений для быстрого ввода в ЭВМ
алгебраических выражений.
Так,
например,
выражение
A=B+C
кодировалось следующей фразой: S0 07 S1
13 S3.
"Краткий код" работал как примитивный
интерпретатор.
49
Идея
Хоппер
Марк-1 Программисты под руководством Хоппер
подпрограммы
впервые во всем мире реализовали идею
подпрограмм
как
многократно
используемую последовательность команд.
color=#000000
Тогда
они
просто
переписывали куски машинного кода друг у
друга из блокнотов.
50
Ассемблер
Хоппер
Эдсак
Первый ассемблер представлял из себя
систему
мнемонических
обозначений,
объединённую с библиотекой подпрограмм
52
АВТОКОД
Гленн
Марк-1 Автокод
был
первым
полноценным
транслятором
(компилятором),
т.е.
он
транслировал
мнемоническую
схему
в
машинные коды. Автокод
не получил
распространения, т.к. его создатель работал
на закрытом проекте.
52
А-0
Хоппер
Юнивак А-0 был первым полноценным ассемблером,
получившим
широкую
известность.
Он
предоставлял услуги как компилятора, так и
компоновщика.
По
сути,
А-0
промышленное
представлял
средство
для
первое
создания
других программ.
Компоновщик
по
идентификатору
указанному
выполнял
загрузку
заданной подпрограммы с магнитной ленты
в
указанный
адрес
настраивал
памяти. Затем он
адреса
загруженной
подпрограмму на адрес загрузки.
А-0
п
оложил
начало
целой
серии
ассемблеров, разработанных Хоппер для
больших
ЭВМ.
Впоследствии
этот
ассемблер улучшался и расширялся, были
выпущены ассемблеры А-1, А-2 и А-3.
56
B-0
Хоппер
Юнивак Хоппер создала первый ассемблер, который
понимал мнемонические команды.
В рекламных целях он понимал команды на
трёх языках ( английском, немецком и
французском ).
58
ФОРТРАН
Бэкус
IBM-
Был первым языком программирования
704
высокого уровня.
Разрабатывался компанией IBM для её
новой ЭВМ.
Коллектив
под
руководством
Бэкуса
разработал не только спецификацию языка,
но и создал компилятор для него. Это
обеспечило достаточно быструю и широкую
распространенность языка.
Кроме того, Фортран был первым языком,
для
которого
компиляторы
для
были
разработаны
разных
ЭВМ
(т.е.
программа могла выполняться на различных
ЭВМ).
Лучше
всего
Фортран
подходит
для
решения инженерных и расчетных задач.
58
АЛГОЛ – 58
Первая спецификация Алгола была рождена
европейским международным комитетом.
59
“CSC”
–
первая
компания
по
В 59 году в США появилась первая
компания,
разработке ПО
59
БНФ
занимающаяся
созданием
промышленных программ.
Бэкус,
Для описания спецификации Алгола Бэкус
Наур
создал
специальную
“нормальную
систему
–
форму”. Чуть позже эта
система была уточнена Науром.
59
CODASYL
Министерство
обороны
организацию
face="Times
color=#000000
США
создало
New
Roman"
CODASYL,
главным
назначением которой было создание нового
языка,
ориентированного
на
бизнес
–
приложения.
60
АЛГОЛ – 60
Бэкус
Новая
спецификация
Алгола,
которую
отличали следующие идеи:



60
КОБОЛ
CODASYL
Блочная структура
Возможность рекурсии
Описание с использованием БНФ
Стандарт языка, принятый для создания
коммерческих приложений
60
АПТ
Дуглас
Первый язык для управления станками, был
Росс
создан
в
МТИ
(Массачусетском
Технологическом Институте).
60
ИПЛ
Аллен
Первый
Ньюэл
интеллекта.
Позволял
язык
для
манипулировать
искусственного
словами
и
выражениями на естественном языке (был
создан в МТИ).
В этом языке впервые появилось понятие
списка.
60
ЛИСП
Маккарти
Язык
для
исследований
в
искусственного
области
интеллекта,
предназначенный для работы со списками и
лямбда – выражениями (был создан в МТИ).
64
ПЛ/1
Рэдин
Универсальный язык программирования,
(IBM)
разрабатывавшийся
для
системы
System/360.
64
БЭЙСИК
Кемени,
Был разработан в Дартмундском колледже
Курц
как
язык
для
обучения
компьютером
работе
студентов
специальностей
(и
с
всех
технических,
и
гуманитарных). Начал разрабатываться в
59-60х годах, когда существовал только
Фортран.
Отличия от Фортрана:


операторы ввода/вывода
единая система чисел (без различия
на целые/вещественные)
Одновременно с разработкой языка велась
разработка ЭВМ, которая работала бы не в
пакетном режиме, а в режиме разделения
времени
(отсюда
операторов
Дейкстра
–
ввода).
необходимость
Когда
опубликовал
в
свою
68
году
статью
о
структурном программировании, Кемени и
Курц пересмотрели язык и выбросили “без
всякого колебания и сожаления” оператор
GOTO. Результатом стал новый стандарт
TrueBASIC.
65
АЛГОЛ – W
Хоар,
Новый
стандарт
языка,
который
был
Вирт
предложен
Хоаром
и
Виртом
как
альтернатива существующей спецификации
(буква W – face="Times New Roman" от
фамилии Вирт).
67
ЛОГО
Пейперт
Язык для управления черепашкой (был
разработан в МТИ)
68
АЛГОЛ – 68
Этот вариант Алгола очень не понравился
Вирту.
68
Статья
о Дейкстра
В
этой
структурном
вредность
программировании
GOTO”
статье
Дейкстра
оператора
(т.к.
“
доказывал
color=#000000
он
последовательность
нарушает
операторов)
и
показывал, что любая программа может
быть
написана
с
использованием
3-х
структур:



69
AПЛ
Последовательность
Альтернатива
Повторение
Кеннет
Очень компактный универсальный язык
Айверсон
программирования
( IBM)
синтаксисом.
с
очень
широким
Именно для этого языка была организация
ACM face="Times New Roman" открыла
первую SIG(Software Interest Group).
70
ПАСКАЛЬ
Вирт
Был
разработан
Виртом
как
противопоставление Алголу-68.
face="Times New Roman" color=#000000
Язык с высокой структурированностью.
До сих пор – лучший язык для обучения
программированию.
71
ФОРТ
Мур
Самый
компактный
язык
программирования.
Обладает
высокой
степенью
расширяемости.
face="Times New Roman" color=#000000
Первое
промышленное
применение
–
управление радиотелескопами.
72
С
Ричи,
Язык
был
разработан
Bell Lab.
операционной
для
системы
написания
color=#000000
UNIX.
В рекламных целях UNIX face="Times New
Roman"
color=#000000
в
университетах
распространялся почти бесплатно, вместе с
UNIX’
face="Times
New
Roman"
color=#000000 ом распространялся и С.
До сих пор С – один из лучших языков для
системного программирования.
72
ПРОЛОГ
Логический
язык
программирования,
в
котором описываются факты и отношения
между ними.
75
HOLWG
Уайтекер
HOLWG – рабочая группа по управлением
Уайтекера, была создана Пентагоном для
получения
языка,
использоваться
на
который
всех
мог
бы
компьютерах
министерства обороны США.
Результатом в 79 году стал язык Ада.
79
АДА
Жан
Универсальный язык программирования,
Ихбиа
был разработан по заказу МО США.
Разработка велась в два этапа:
1. Определение требований к языку.
Список требований прошёл через
несколько этапов утверждения – от
“Соломенного” до “Стального”.
2. После того, как поняли, что ни один
существующий язык полученным
требованиям не удовлетворяет, за
разработку
языка
параллельно
принялось 4 группы программистов –
“Зелёная”, “Жёлтая”, “Красная” и
“Синяя”. На финиш вышли две
группы - “Зелёная” и “Красная”.
Победила “Зелёная”. Руководителем
этой группы был француз Жан
Ихбиа.
После
создания
вышло
требование
переписать все существующие приложения
на Аде.
80
Первый
SmallTalk
и
единственный
объектно-ориентированный
полностью
язык
программирования.
81
Modula – 2
Вирт
Был разработан Виртом после того, как
выяснилось, что Паскаль не годится для
разработки промышленных приложений.
Обзор некоторых языков программирования
Ada
Русское название: Ада
Дата создания: 1983
Создан под влиянием:



ALGOL
C++
Pascal
Тьюринг-полнота: да
Парадигма: императивная мультипарадигма обобщённая объектно-ориентированная
процедурная строгая структурная
Типизация: безопасная статическая строгая



Диалекты и реализации (свернуть все | развернуть все):
Ada 2005
Ada 83
Ada 95
Принятые расширения файлов: .adb .ads .ada
Язык программирования
Ада — мощнейший объектно–ориентированный язык общего назначения,
ориентированный на разработку надёжного программного обеспечения. В язык включены
механизмы поддержки параллельного исполнения, обработки исключений, настраиваемых
модулей, поддержки распределённых вычислений, стандартные интерфейсы к другим
языкам и библиотекам. Ада имеет компиляторы под практически любую операционную
систему плюс Java и .NET байткод.
Ада — язык программирования, созданный в 1979–1980x годах в результате проекта,
предпринятого Министерством Oбороны США с целью разработать единый язык
программирования для так называемых встроенных систем (то есть, систем управления
автоматизированными комплексами, работающими в реальном времени). Имелись в виду,
прежде всего, бортовые системы управления военными объектами . Перед
разработчиками не стояло задачи создать универсальный язык, поэтому решения,
принятые авторами, нужно воспринимать в контексте особенностей выбранной
предметной области.
Ада
—
это
структурный,
модульный,
объектно-ориентированный
язык
программирования, содержащий высокоуровневые средства программирования
параллельных процессов. Синтаксис унаследован от языков типа ALGOL или Pascal, но
расширен, а также сделан более строгим и логичным. Ада — язык со строгой типизацией,
в нём исключена работа с объектами, не имеющими типов, а автоматические
преобразования типов сведены к абсолютному минимуму.
Для удовлетворения требованиям надёжности язык построен таким образом, чтобы как
можно большее количество ошибок обнаруживалось на этапе компиляции. Кроме того,
одним из требований при разработке языка была максимально лёгкая читаемость текстов
программ, даже в ущерб лёгкости написания. Результатом такого подхода стал несколько
«тяжеловесный» синтаксис и множество ограничений, часто воспринимаемых
непрофессиональными программистами как «глупые» и «ненужные».
Язык Ада используется в США и Европе при разработке сложных больших проектов,
главным образом, встроенных систем, причём, далеко не только в военных приложениях.
ALGOL
Русское название: АЛГОЛ
Дата создания: 1958
Повлиял на:






Ada
Oberon
PL/I
Pascal
Тьюринг-полнота: да
Парадигма: императивная
Типизация: статическая
Диалекты и реализации (свернуть все | развернуть все):
ALGOL 58
Algol 60
Язык программирования
Алгол (англ. ALGOL от англ. algorithmic — алгоритмический и англ. language — язык),
название семейства императивных языков программирования, применяемых при
составлении программ для решения научно-технических задач на ЭВМ.
Алгол был первым языком программирования, использующим пары begin end для
выделения блоков выражений.
Из истории языка
Поскольку FORTRAN оказался весьма успешным языком, в Европе возникли опасения,
что IBM будет доминировать в компьютерной отрасли. Немецкое общество прикладной
математики (German society of applied mathematics — GAMM) создало комитет по
разработке универсального языка. В то же время Association for Computing Machinery
(ACM) организовала похожий комитет в США. Несмотря на то, что у европейцев было
некоторое беспокойство по поводу господства американцев, оба этих комитета слились в
один. Под руководством Питера Наура (Peter Naur) этот комитет разработал IAL
(International Algorithmic Language). Предлагавшееся название ALGOL (ALGOrithmic
Language) было вначале отвергнуто. Но поскольку оно стало общеупотребительным,
официальное имя IAL пришлось впоследствии изменить.
Assembler
Тьюринг-полнота: да
Принятые расширения файлов: .asm
Язык программирования
Assembler — язык программирования низкого уровня, представляющий собой формат
записи машинных команд, удобный для восприятия человеком.
Команды языка ассемблера один в один соответствуют командам процессора и,
фактически, представляют собой удобную символьную форму записи (мнемокод) команд
и их аргументов. Также язык ассемблера обеспечивает базовые программные абстракции:
связывание частей программы и данных через метки с символьными именами и
директивы.
Директивы ассемблера позволяют включать в программу блоки данных (описанные явно
или считанные из файла); повторить определённый фрагмент указанное число раз;
компилировать фрагмент по условию; задавать адрес исполнения фрагмента, менять
значения меток в процессе компиляции; использовать макроопределения с параметрами и
др.
Каждая модель процессора, в принципе, имеет свой набор команд и соответствующий ему
язык (или диалект) ассемблера.
Достоинства и недостатки

vминимальное количество избыточного кода (использование меньшего количества
команд и обращений в память). Как следствие — большая скорость и меньший
размер программы

большие объемы кода, большое число дополнительных мелких задач
плохая читабельность кода, трудность поддержки (отладка, добавление
возможностей)
трудность реализации парадигм программирования и любых других скольконибудь сложных конвенций, сложность совместной разработки
меньшее количество доступных библиотек, их малая совместимость
непосредственный доступ к аппаратуре: портам ввода-вывода, особым регистрам
процессора







возможность
написания
самомодифицирующегося
кода
(т.е.
метапрограммирования, причем без необходимости программного интерпретатора)
максимальная «подгонка» для нужной платформы (использование специальных
инструкций, технических особенностей «железа»)
непереносимость на другие платформы (кроме двоично совместимых).
Синтаксис
Общепринятого стандарта для синтаксиса языков ассемблера не существует. Однако,
существуют стандарты де-факто — традиционные подходы, которых придерживаются
большинство разработчиков языков ассемблера. Основными такими стандартами
являются Intel-синтаксис и AT&T-синтаксис.
Общий формат записи инструкций одинаков для обоих стандартов:
`[метка:] опкод [операнды] [;комментарий]`
Опкод — непосредственно мнемоника инструкции процессору. К ней могут быть
добавлены префиксы (повторения, изменения типа адресации и пр.). В качестве операндов
могут выступать константы, названия регистров, адреса в оперативной памяти и пр..
Различия между стандартами Intel и AT&T касаются, в основном, порядка перечисления
операндов и их синтаксиса при различных методах адресации.
Используемые мнемоники обычно одинаковы для всех процессоров одной архитектуры
или семейства архитектур (среди широко известных - мнемоники процессоров и
контроллеров Motorola, ARM, x86). Они описываются в спецификации процессоров.
Например, процессор Zilog Z80 наследовал систему команд Intel i8080, расширил ее и
поменял мнемоники (и обозначения регистров) на свой лад. Например, сменил
интеловские mov на ld. Процессоры Motorola Fireball наследовали систему команд Z80,
несколько её урезав. Вместе с тем, Motorola официально вернулась к мнемоникам Intel. и в
данный момент половина ассемблеров для Fireball работает с интеловскими мнемониками,
а половина с мнемониками Zilog.
Директивы
Кроме инструкций, программа может содержать директивы: команды, не переводящиеся
непосредственно в машинные инструкции, а управляющие работой компилятора. Набор и
синтаксис их значительно разнятся и зависят не от аппаратной платформы, а от
используемого компилятора (порождая диалекты языков в пределах одного семейства
архитектур). В качестве набора директив можно выделить:

определение данных (констант и переменных)

управление организацией программы в памяти и параметрами выходного файла
задание режима работы компилятора


всевозможные абстракции (т.е. элементы языков высокого уровня) — от

оформления процедур и функций (для упрощения реализации парадигмы
процедурного программирования) до условных конструкций и циклов (для
парадигмы структурного программирования)
макросы
Происхождение и критика термина «язык ассемблера»
Данный тип языков получил свое название от названия транслятора (компилятора) с этих
языков — ассемблера (англ. assembler — сборщик). Название последнего обусловлено
тем, что на первых компьютерах не существовало языков более высокого уровня, и
единственной альтернативой созданию программ с помощью ассемблера было
программирование непосредственно в кодах.
Язык ассемблера в русском языке часто называют «ассемблером» (а что-то связанное с
ним — «ассемблерный»), что, согласно английскому переводу слова, неправильно, но
вписывается в правила русского языка. Однако, сам ассемблер (программу) тоже
называют просто «ассемблером», а не «компилятором языка ассемблера» и т. п.
Использование термина «язык ассемблера» также может вызвать ошибочное мнение о
существовании единого языка низкого уровня, или хотя бы стандарта на такие языки. При
именовании языка, на котором написана конкретная программа, желательно уточнять, для
какой архитектуры она предназначена и на каком диалекте языка написана.
BARSIC

Тьюринг-полнота: нет
Диалекты и реализации (свернуть все | развернуть все):
BARSIC
Язык программирования
BARSIC (Business And Research Scientific Interactive Calculator) является
интерпретируемым языком программирования с псевдокомпиляцией исходного кода в
brc-файл (сокращение от BARSIC Compiled). Первоначально возник как надстройка над
библиотеками управления научными и учебными установками. В том числе со средствами
отображения графиков и проведения вычислений по формулам, задаваемым
пользователем. В дальнейшем были добавлены средства визуального проектирования
пользовательского интерфейса. Это объектный язык с развитыми средствами
процедурного программирования (функции-выражения, подпрограммы с различными
модификаторами видимости внешних элементов внутри подпрограмм, модули,
структуры) и элементами объектности (набор встроенных предопределённых классов как
способ организации удобного доступа к библиотекам). Предполагается добавление
пользовательских классов по модели прототипирования.
Среди интерпретируемых языков отличается наличием жёсткой статической проверки
типов во всех синтаксических конструкциях за исключением нескольких, специально
предназначенных для интерпретации. Динамическая проверка также ведётся. При этом
синтаксические конструкции языка выбраны таким образом, чтобы транслятору удалось
максимально точно локализовать место синтаксической ошибки. Благодаря этому резко
повышается скорость разработки программ и нахождения ошибок.
В настоящее время наиболее широко используемыми приложениями BARSIC являются
учебные модели по физике и математике:

доступная
в
открытом
доступе
виртуальная
лаборатория
barsic.spbu.ru
(первоначально необходимо инсталлировать на компьютере среду BARSIC с
данной странички

модели и тесты Интернет-олимпиады по физике по СПб и Северо-Западному
региону РФ . К настоящему времени через Интернет-олимпиады по физике на
основе тестов и моделей, выполняемых в среде BARSIC, прошло около 5000
человек (только в ноябре 2007 года 1083 человек по 10-м классам и 1246 человек
по 11-м классам).
Состав программного комплекса BARSIC

бесплатная свободно распространяемая исполняющая среда
сопровождающие файлы) - 'проигрыватель' файлов BARSIC
barsic.exe
(и

среда barsicIDE.exe разработки программ-приложений, свободно доступная для
некоммерческого использования
Основные особенности языка и среды BARSIC
Программный комплекс BARSIC предназначен для разработки и использования
прикладных программ-приложений, работающих под управлением исполняющей среды
BARSIC. Основными областями применения комплекса являются разработка программ
учебного назначения в области физики, математики, информатики и других областях, а
также программ для научных численных математических расчетов и математического
моделирования, преимущественно в области физики. Кроме того, комплекс
специализирован
для
создания
программ
интерактивного
управления
компьютеризированными экспериментальными установками на основе персональных
компьютеров, а также обработки и визуализации получаемых экспериментальных данных
и сравнения их с теоретическими зависимостями.
Язык BARSIC, с помощью которого осуществляется программирование программприложений, является универсальным объектным языком программирования и содержит
развитые средства построения двумерных и трехмерных графиков, анимации
изображений, математической обработки данных, управления экспериментом. Среда
разработки содержит развитые средства визуального проектирования интерфейса
приложений.
Относительная независимость приложений от конкретной версии исполняющей среды
дает важное преимущество: добавление новых возможностей в среде автоматически
расширяет возможности программы-приложения. Например, работа с файлами,
графиками, базами данных, компьютерными сетями и т.д. Самой важной особенностью
языка BARSIC является надежность программирования. В BARSIC предусмотрены
специальные средства повышения надежности.
Во-первых, выбран такой синтаксис языка программирования, чтобы из-за случайных
опечаток во время набора программы минимизировать вероятность возникновения
недиагностируемых ошибок. В отличие от BARSIC, такие языки, как FORTRAN,
JavaScript, BASIC в очень сильной степени подвержены этим ошибкам из-за правил
автоматического приведения типов, а также свободной типизации (для JavaScript и Visual
BASIC). В несколько меньшей степени эти ошибки характерны для C и C++, а в еще
меньшей степени – для Java (за исключением работы со строками, где такие ошибки для
Java типичны) и Object PASCAL (Delphi).
Во-вторых, синтаксис языка программирования BARSIC построен на принципе
максимальной понятности для человека и принципе автодокументирования программного
кода. Это означает, что сам текст программы в подавляющем большинстве случаев дает
возможность понять, что имел в виду программист. Поэтому в программах, написанных
на BARSIC, почти не надо вставлять комментарии, что не только экономит время, но и
избавляет от неприятной нетворческой работы, которую так не любит большинство
программистов. Во всех других известных нам языках программирования этот принцип не
выполняется.
В-третьих, в BARSIC на уровне среды встроена система перехвата и обработки так
называемых исключительных ситуаций. При этом если программист заранее не
предусмотрел действий при возникновении деления на ноль, ввода вместо числа другого
символа и т.п., программа не завершит работу в аварийном режиме, как бывает в
большинстве программ, написанных на других языках программирования. Среда BARSIC
выдаст диагностику ошибки, после чего можно будет повторить ввод с исправлением
неправильно введенных значений или символов и продолжить работу. Обработка
исключительных
ситуаций
имеется
в
большинстве
современных
языков
программирования, но BARSIC обеспечивает дополнительную защиту от исключений на
уровне исполняющей среды даже в тех случаях, когда программы, написанные на C++ или
Object PASCAL, окажутся неработоспособны.
В-четвертых, в интегрированную среду BARSIC встроена поддержка работы с
пользовательским интерфейсом методом визуального проектирования. Это делает
BARSIC средой RAD (Rapid Application Development) —средством сверхбыстрой
разработки программ.
Языки программирования и интегрированные среды
По словам создателя первой интегрированной среды FRAMEWORK, интегрированная
среда —это такая прикладная программа, что пользователь, запустив ее в начале рабочего
дня, находит в ней все необходимые для работы ресурсы и поэтому не выходит из
интегрированной среды до самого конца рабочего дня. Конечно, это определение не очень
корректно и несколько идеализирует ситуацию, но его общий смысл достаточно ясен.
Основная особенность интегрированных сред —высокая степень интерактивности. Она
достигается за счет интеграции в единое целое различных программных ресурсов, отсюда
и происходит название. Так, интегрированная среда какого-либо компилятора языка
программирования (программы, которая из текста данного языка программирования
создает исполняемую программу) обычно содержит текстовый редактор и собственно
компилятор с системой диагностики ошибок компиляции. Кроме того, в ней обычно
имеется также отладчик —интерпретатор данного языка, выполняющий программу
строчка за строчкой и имеющий ряд других специальных возможностей.
Одно из активно развивающихся направлений, визуальное проектирование —полностью
основано на использовании возможностей интегрированной среды. Пользователь в
интерактивном режиме выбирает необходимые для его программы объекты языка
программирования и устанавливает между ними связи. Популярность таких языков как
Visual BASIC (Microsoft), а также Object PASCAL (среды Delphi и Kylix, Borland), не
случайна. Даже неопытный программист, не знающий кроме BASIC других языков
программирования и никогда не программировавший под Windows, может за два-три дня
с помощью Visual BASIC создать прикладную программу, работающую под Windows. А
вот программисту высокого класса, не программировавшему до того под Windows, с
помощью C++ зачастую приходится для создания такой же программы затратить недели, а
то и месяцы. Правда, Visual BASIC обладает рядом существенных ограничений. С
помощью сред визуального проектирования можно создавать весьма сложные программы,
не набрав с клавиатуры ни строчки кода.
Однако у всех программ, созданных на основе традиционных языков программирования
процедурного типа, имеется один и тот же недостаток. Для них исполняемый код —это
одно, а обрабатываемые программой данные —совсем другое. Действительно, код
программы содержится в файле с расширением EXE, а данные —либо в специальных
файлах данных (как правило, в текстовом либо двоичном виде во внутреннем
представлении компьютера), либо вводятся с клавиатуры или с какого либо другого
внешнего устройства.
А теперь зададим вопрос: как быть, если пользователь должен дать исполняемой
программе информацию, которую можно рассматривать как "добавку" к тексту
программы? Например, мы хотим, чтобы на экране был построен график функции, и в
подобной программе обеспечиваем все необходимые сервисные возможности. Однако
формулу для функции должен задать сам пользователь, и заранее неизвестно, какая она
будет.
Совершенно очевидно, что подобного рода задачи можно решать только с помощью
системы-интерпретатора. Но "за все приходится платить". Компилятор переводит текст
программы в исполняемый код, который может работать и без программы-компилятора.
Программы же, созданные на основе языков интерпретирующего типа, могут исполняться
только под управлением программы-интерпретатора. Кроме того, они работают
медленнее скомпилированных, так как интерпретация занимает дополнительное время.
Однако во многих случаях это несущественно.
BASIC






Дата создания: 1963
Тьюринг-полнота: да
Типизация: бестиповая
Диалекты и реализации (свернуть все | развернуть все):
Applesoft BASIC
Commodore BASIC
GW-BASIC
MSX BASIC
Microsoft BASIC
Visual Basic
Язык программирования
Бе́йсик (BASIC — сокращение от англ. Beginner's All-purpose Symbolic Instruction Code —
универсальный код символических инструкций для начинающих; англ. basic — основной,
базовый) — семейство высокоуровневых языков программирования.
Бейсик был придуман в 1963 году преподавателями Дартмутского Колледжа Джоном
Кемени и Томасом Куртцом, и под их руководством был реализован командой студентов
колледжа. Со временем, когда стали появляться другие диалекты, этот «изначальный»
диалект стали называть Dartmouth BASIC.
Бейсик был спроектирован так, чтобы студенты могли писать программы, используя
терминалы с разделением времени. Он создавался как решение для проблем, связанных со
сложностью более старых языков, предназначался для более «простых» пользователей, не
столько заинтересованных в скорости программ, сколько просто в возможности
использовать компьютер для решения своих задач.
При проектировании языка использовались следующие восемь принципов:



быть простым в использовании для начинающих
быть языком программирования общего назначения
предоставлять возможность расширения функциональности, доступную опытным
программистам

быть интерактивным

предоставлять ясные сообщения об ошибках
быстро работать на небольших программах
не требовать понимания работы аппаратного обеспечения
быть посредником меду пользователем и операционной системой



Язык был основан частично на Фортран II и частично на Алгол-60, с добавлениями,
делающими его удобным для работы в режиме разделения времени, обработки текста и
матричной арифметики. Первоначально Бейсик был реализован на GE-265 с поддержкой
множества терминалов. Вопреки распространённому убеждению, в момент своего
появления это был компилируемый язык.
Всеобщую же популярность язык получил с его появления на микрокомпьютере Altair
8800. Многие языки программирования были слишком громоздкими, чтобы умещаться в
небольшой памяти. Для машин с таким медленным носителем как бумажная лента,
аудиокассета и без подходящего текстового редактора такой небольшой язык как Бейсик
был отличной находкой.
В 1975 году Майкрософт (тогда это были лишь двое — Билл Гейтс и Пол Аллен, при
участии Монте Давидова) выпустила Altair BASIC. Для операционной системы CP/M был
создан диалект BASIC-80, надолго определивший развитие языка.
В этот период было создано несколько новых версий Бейсика. Майкрософт продавала
несколько версий BASIC для MS-DOS/PC-DOS, включая BASICA, GWBASIC и Quick
BASIC (QBASIC).Компания Borland в 1985 выпустила Turbo BASIC 1.0 (его наследники
впоследствии продавались другой компанией под именем PowerBASIC). На домашних
компьютерах появились различные расширения Бейсика, обычно включающие средства
для работы с графикой, звуком, выполнением DOS-команд, а также средства структурного
программирования. Некоторые другие языки использовали хорошо известный синтаксис
Бейсика в качестве основы, на которой строилась совершенно иная система (см. например,
GRASS).
Однако, начиная с конца 80-х, новые компьютеры стали намного более сложными и
предоставляли возможности (такие как графический интерфейс пользователя), которые
делали Бейсик уже не столь удобным для программирования. Бейсик начал сдавать свои
позиции, несмотря на то, что огромное количество его версий ещё использовалось и
продавалось.
Вторую жизнь Бейсик получил с появлением Visual Basic от Microsoft. Он стал одним из
наиболее часто используемых языков на платформе Microsoft Windows. Позже был создан
вариант под названием WordBasic, используемый в MS Word до появления Word 97.
Вариант Visual Basic for Applications (VBA) был встроен в Excel 5.0 в 1993 году, затем в
Access 95 в 1995-ом, а после и во все остальные инструменты, входящие в пакет Office —
в 1997-ом. Internet Explorer 3.0 и выше, а также Microsoft Outlook включали интерпретатор
языка VBScript. В полный вариант пакета OpenOffice.org также включён интерпретатор
Бейсика.
Элементы синтаксиса:
Комментарий до конца строки
'
Регистрозависимость
Нет
Регулярное
переменной
выражение
Регулярное
функции
выражение
идентификатора
[_a-zA-Zа-яёщА-ЯЁЩ][_a-zA-ZаяёщА-ЯЁЩ0-9]*
идентификатора
[_a-zA-Zа-яёщА-ЯЁЩ][_a-zA-ZаяёщА-ЯЁЩ0-9]*
Присваивание значения переменной
=
Объявление переменной
Dim variable
Группировка выражений
()
Равенство
= или ==
Неравенство
<> или ><
Сравнение
= < > <= =< >= => <>
Вызов функции
Call f(a,b...)
Если - то
if condition then ... end if
Если - то - иначе
if condition then ... else ... end if
Бесконечный цикл
while condition ... wend
Цикл for - next для диапазона чисел с
инкрементом на 1
FOR i= 1 TO 10 STEP 1 ... NEXT i
Цикл for - next для диапазона чисел с
декрементом на 1
FOR i= 10 TO 1 STEP -1 ... NEXT i
C
Русское название: Cи
Дата создания: 1969
Повлиял на:

Alef

C++
D
ECMAScript
Java
Nesla
Objective-C
PHP
Perl
Python








Тьюринг-полнота: да
Парадигма: процедурная
Типизация: статическая
Диалекты и реализации (свернуть все | развернуть все):



ANSI C
C99
K&R C
Принятые расширения файлов: .c .h
Язык программирования
Си (англ. C) — стандартизованный процедурный язык программирования, разработанный
в начале 1970-х годов сотрудниками Bell Labs Кеном Томпсоном и Денисом Ритчи как
развитие языка Би.
Си был создан для использования в операционной системе UNIX. С тех пор он был
портирован на многие другие операционные системы и стал одним из самых
используемых языков программирования.
Си ценят за его эффективность; он является самым популярным языком для создания
системного программного обеспечения. Его также часто используют для создания
прикладных программ. Несмотря на то, что Си не разрабатывался для новичков, он
активно используется для обучения программированию.
В дальнейшем синтаксис языка Си стал основой для многих других языков.
Элементы синтаксиса:
Комментарий до конца строки
нет
Комментарии, могущие быть вложенными
#if 0 ... #endif
Комментарии, не могущие быть вложенными
/* ... */
Регистрозависимость
Регулярное
переменной
да
выражение
идентификатора
[_a-zA-Z][_a-zA-Z0-9]*
Присваивание значения переменной
=
Объявление переменной
type variable
Блок
{ ... }
Равенство
==
Неравенство
!=
Сравнение
< > <= >=, для строк strcmp
Определение функции
returntype f(type1 p1, type2
p2, ...)
Вызов функции
f(a, b, ...)
Вызов функции без параметров
f()
Если - то
if (condition) ...
Если - то - иначе
if (condition) ... else ...
Цикл с предусловием
while (condition) ...
Цикл с постусловием
do ... while (!condition)
Цикл for - next
инкрементом на 1
для
диапазона
чисел
с
Цикл for - next
декрементом на 1
для
диапазона
чисел
с
C#
Русское название: Си-шарп
Создан под влиянием:

C++

Eiffel
Java

Повлиял на:
for (int i = 1; i <= 10; i++) ...
for (int i = 10; i >= 1; i--) ...




D
Scala
Тьюринг-полнота:
нет
Парадигма:
аспектно-ориентированная
объектно-ориентированная
Типизация: статическая строгая
Диалекты и реализации (свернуть все | развернуть все):
ECMA-334
ISO/IEC 23270:2003
Принятые расширения файлов: .cs
Язык программирования
C# (произносится си-шарп) — язык программирования, сочетающий объектноориентированные и контекстно-ориентированные концепции. Разработан в 1998—2001
годах группой инженеров под руководством Андерсa Хейлсбергa в компании Microsoft
как основной язык разработки приложений для платформы Microsoft .NET. Компилятор с
C# входит в стандартную установку самой .NET, поэтому программы на нём можно
создавать и компилировать даже без инструментальных средств вроде Visual Studio.
C# относится к семье языков с C-подобным синтаксисом, из них его синтаксис наиболее
близок к С++ и Java. Язык имеет строгую статическую типизацию, поддерживает
полиморфизм, перегрузку операторов, указатели на функции-члены классов, атрибуты,
события, свойства, исключения, комментарии в формате XML. Переняв многое от своих
предшественников — языков С++, Delphi, Модула и Smalltalk — С#, опираясь на практику
их использования, исключает некоторые модели, зарекомендовавшие себя как
проблематичные при разработке программных систем: так, C# не поддерживает
множественное наследование классов (в отличие от C++) или вывода типов (в отличие
Haskell).
Элементы синтаксиса:
Комментарий до конца строки
//
Комментарии, могущие быть вложенными
нет
Комментарии, не могущие быть вложенными
/* ... */
Регистрозависимость
да
Регулярное
переменной
выражение
идентификатора
Присваивание значения переменной
[_a-zA-Z][_a-zA-Z0-9]*
=
Объявление переменной
Объявление
значения
переменной
type variable
с
присваиванием
type variable = value
Группировка выражений
( ... )
Блок
{ ... }
Тождественное равенство
==
Тождественное неравенство
!=
Сравнение
< > <= >=
Определение функции
returntype f (type1 p1, type2 p2,
... ) { ... }
Вызов функции
f(a, b, ...)
Вызов функции без параметров
f()
Последовательность
;
Если - то
if (condition) ...
Если - то - иначе
if (condition) ... else ...
Бесконечный цикл
while (!0) ...
Цикл с предусловием
while (condition) ...
Цикл с постусловием
do ... while (!condition)
Цикл for - next для диапазона чисел с
инкрементом на 1
for (int i = 1; i <= 10; i++) ...
Цикл for - next для диапазона чисел с
декрементом на 1
for (int i = 10; i > 0; i--) ...
FORTRAN
Дата создания: 1957
Повлиял на:

PL/I
Тьюринг-полнота:
да
Парадигма: императивная мультипарадигма объектно-ориентированная процедурная
структурная








Типизация: статическая строгая
Диалекты и реализации (свернуть все | развернуть все):
FORTRAN 66
FORTRAN 77
FORTRAN не стандартизованные реализации
Fortran 2003
Fortran 2008
Fortran 90
Fortran 95
High Performance Fortran
Язык программирования
Фортра́н (Fortran) — первый реализованный язык программирования высокого уровня,
правда, с одной небольшой оговоркой — для машин, построенных по классической схеме
фон Неймана. Создан в период с 1954 по 1957 год группой программистов под
руководством Джона Бэкуса (John Backus) в корпорации IBM. Через пару лет начались его
коммерческие поставки. До этого программирование велось либо непосредственно в
машинных кодах, либо на символических ассемблерах. Собственно, эту деятельность и
называли не программированием, а кодированием; только с появлением Фортрана
возникла профессия «программист». Название Fortran является аббревиатурой от
FORmula TRANslator, то есть, переводчик формул.
Фортран широко используется в первую очередь для научных и инженерных вычислений.
Одно из преимуществ современного Фортрана — большое количество написанных на нём
программ и библиотек подпрограмм. Среди учёных, например, ходит такая присказка, что
любая математическая задача уже имеет решение на Фортране, и, действительно, можно
найти среди тысяч фортрановских пакетов и пакет для перемножения матриц, и пакет для
решения сложных интегральных уравнений и многие, многие другие. Ряд таких пакетов
создавались на протяжении десятилетий и популярны по сей день (главным образом в
научной среде).
Большинство таких библиотек является фактически достоянием человечества: они
доступны в исходных кодах, хорошо документированы, отлажены и весьма эффективны.
Поэтому изменять, а тем более переписывать их на других языках программирования
накладно, несмотря на то, что регулярно производятся попытки автоматического
конвертирования FORTRAN-кода на современные языки программирования.
Современный Фортран (Fortran 95 и Fortran 2003) приобрёл черты, необходимые для
эффективного программирования для новых вычислительных архитектур; позволяет
применять современные технологии программирования, в частности, ООП.
История
В конце 1953 Джон Бэкус предложил начать разработку эффективной альтернативы
ассемблеру для программирования на ПК IBM 704. Уже к середине 1954 была закончена
черновая спецификация языка Fortran. Первое руководство для Fortran появилось в
октябре 1956 вместе с первым компилятором, поставленным в апреле 1957. Компилятор
был оптимизирующим, потому что клиенты отказывались использовать язык
программирования высокого уровня, который был не в состоянии генерировать код с
производительностью ниже, чем у ассемблера.
В то время сообщество относилось скептически к новому способу программирования и не
верили в то, что Fortran позволит программировать быстрее и эффективнее. По словам
самого Джона Бэкуса большая часть его работы была направлена на то чтобы «быть
ленивым». Ему жутко не нравилось писать программы под IBM 701 на ассемблере.
Язык был широко принят учеными для написания программ с интенсивными
вычислениями. Включение комплексного типа данных сделало его особенно подходящим
для технических приложений.
К 1960 году существовали версии Fortran для компьютеров IBM 709, 650, 1620, 7090. Его
большая популярность побуждала конкурирующих изготовителей компьютеров создавать
компиляторы Fortran для своих компьютеров. Таким образом, уже к 1963 существовало
более 40 компиляторов для разных платформ. Именно по этому Fortran считают первым
широко используемым языком программирования.
Поскольку FORTRAN оказался столь успешным языком, в Европе возникли опасения, что
IBM будет доминировать в компьютерной отрасли. Немецкое общество прикладной
математики (German society of applied mathematics — GAMM) создало комитет по
разработке универсального языка. В то же время Association for Computing Machinery
(ACM) организовала похожий комитет в США. Несмотря на то, что у европейцев было
некоторое беспокойство по поводу господства американцев, оба этих комитета слились в
один. Под руководством Питера Наура (Peter Naur) этот комитет разработал IAL
(International Algorithmic Language). Предлагавшееся название ALGOL (ALGOrithmic
Language) было вначале отвергнуто. Но поскольку оно стало общеупотребительным,
официальное имя IAL пришлось впоследствии изменить на ALGOL 58. Новая версия
появилась в 1960 г., и ALGOL 60 (с небольшими изменениями, сделанными в 1962 г.) с
60-х и до начала 70-х гг. прошлого века был стандартом академического языка
программирования.
Фортран в СССР
Фортран в СССР появился позже, чем на Западе, поскольку поначалу у нас более
перспективным языком считался Алгол. Во внедрении Фортрана большую роль сыграло
общение советских физиков со своими коллегами из CERN, где в 1960-х годах почти все
расчёты велись с использованием программ на Фортране.
Первый советский компилятор с Фортрана был создан в 1967 г. для машины «Минск-2»,
однако он не получил большой известности. Широкое внедрение Фортрана началось
после создания в 1968 г. компилятора ФОРТРАН-ДУБНА для машины БЭСМ-6. Машины
ЕС ЭВМ, появившиеся в 1972 г., уже изначально имели транслятор Фортрана
(«позаимствованный» с IBM/360 вместе с другим программным обеспечением).
Стандарты
Фортран — жёстко стандартизированный язык, именно поэтому он легко переносится на
различные платформы. Существует несколько международных стандартов языка:

FORTRAN IV (позже положенный в основу FORTRAN 66 (1966))

FORTRAN 77 (1978)
o множество улучшений: строковый тип данных и функции для его
обработки, блочные операторы IF, ELSE IF, ELSE, END IF, оператор
включения фрагмента программы INCLUDE и т. д.
Fortran 90 (1991)
o значительно переработан стандарт языка. Введён свободный формат
написания кода. Появились дополнительные описания IMPLICIT NONE,
TYPE, ALLOCATABLE, POINTER, TARGET, NAMELIST; управляющие
конструкции DO … END DO, DO WHILE, CYCLE, SELECT CASE, WHERE;
работа с динамической памятью (ALLOCATE, DEALLOCATE, NULLIFY);



программные компоненты MODULE, PRIVATE, PUBLIC, CONTAINS,
INTERFACE, USE, INTENT. Появились новые встроенные функции, в
первую очередь, для работы с массивами
o в языке появились элементы ООП
o отдельно объявлен список устаревших черт языка, предназначенных для
удаления в будущем
Fortran 95 (1997)
o коррекция предыдущего стандарта
Fortran 2003 (2004)
o дальнейшее развитие поддержки ООП в языке. Взаимодействие с
операционной системой
Компиляторы
До 1997 основным производителем компиляторов Fortran для IBM PC совместимых
компьютеров была корпорация Microsoft. Впоследствии она отказалась от их разработки в
связи с низкой прибыльностью. На данный момент компиляторы поставляет фирма DEC,
вошедшая в 1998 г. в состав Compaq и вместе с последней в 2002 г. слившаяся с HP.
Компания DEC поставляет компилятор, интегрированный в среду разработки Digital
Visual Fortran, основанную на Microsoft Visual Studio. Наиболее известными продуктами
этой линейки являются FPS 4.0 (Microsoft Fortran Power Station), DVF 5.0 и 6.0. Каждый
компилятор может поддерживать несколько стандартов Фортрана. Слияния компаний
явились причиной того, что последующие продукты появлялась на рынке под торговыми
марками Compaq и HP. В настоящее время HP продаёт среду разработки версии 6.6 для
Intel/win32. Поддержка Fortran реализована также для всех высокопроизводительных
платформ HP.
Другим крупным поставщиком систем разработки на Fortran является фирма Lahey,
предлагающая интегрированные решения для Windows и Linux.
Долгое время лучшим компилятором Fortran считался компилятор фирмы Watcom,
который был выделен в отдельный проект Open Watcom развивающий компилятор на
открытой основе.
Известен и развивается также компилятор фирмы Intel — Intel Fortran Compiler, который
позволяет оптимизировать код под платформу Intel ia32 и ia64.
Среди бесплатных компиляторов Fortran следует выделить компилятор от Sun
Microsystems, входящий в состав Sun Studio, который генерирует эффективный код под
SPARC, x86 и x86_64 и доступен как для ОС Solaris, так и GNU/Linux.
Фонд свободного программного обеспечения GNU выпускает открытый компилятор
Fortran-77 g77, доступный практически для любой платформы и полностью совместимый
с GCC, но не поддерживающий всех языковых конструкций современных стандартов
Fortran. Также существует проект g95 по созданию на основе GCC компилятора Fortran 95.
Возможности и структура программы
Fortran имеет достаточно большой набор встроенных математических функций,
поддерживает работу с целыми, вещественными и комплексными числами высокой
точности. Выразительные средства языка изначально были весьма бедны, поскольку
Fortran был одним из первых языков высокого уровня. В дальнейшем были добавлены
многие лексические конструкции, характерные для структурного, функционального и
даже объектно-ориентированного программирования.
Структура программ изначально была ориентирована на ввод с перфокарт и имела ряд
удобных именно для этого случая свойств. Так, 1-я колонка служила для маркировки
текста как комментария (символом C), с 1-й по 5-ю располагалась область меток, а с 7-й
по 72-ю располагался собственно текст оператора или комментария. Колонки с 73-й по 80ю могли служить для нумерации карт (чтобы восстановить случайно рассыпавшуюся
колоду) или для краткого комментария, транслятором они игнорировались. Если текст
оператора не вписывался в отведённое пространство (с 7-й по 72-ю колонку), в 6-ой
колонке следующей карты ставился признак продолжения, и затем оператор продолжался
на ней. Расположить два или более оператора в одной строке (карте) было нельзя. Когда
перфокарты ушли в историю, эти достоинства превратились в серьёзные неудобства.
Именно поэтому в стандарт, начиная с Fortran 90, в добавление к фиксированному
формату исходного текста появился свободный формат, который не регламентирует
позиции строки, а также позволяет записывать более одного оператора на строку.
Введение свободного формата позволило создавать код, читабельность и ясность которого
не уступает коду, созданному при помощи других современных языков
программирования, таких как C или Java.
Своего рода «визитной карточкой» старого Fortran является огромное количество меток,
которые использовались как в операторах безусловного перехода GOTO , так и в
операторах циклов, и в операторах описания форматного ввода/вывода FORMAT.
Большое количества меток и операторов GOTO часто делало программы на Фортране
трудными для понимания.
Именно этот негативный опыт стал причиной, по которой в ряде современных языков
программирования (например, Java) метки и связанные с ними операторы безусловного
перехода вообще отсутствуют.
Однако современный Fortran избавлен от избытка меток за счет введения таких
операторов, как DO … END DO, DO WHILE, SELECT CASE. Также к положительным
чертам современного Fortran стоит отнести большое количество встроенных операций с
массивами и гибкую поддержку массивов с необычной индексацией.
Взаимодействие с другими языками
Многие системы программирования позволяют компоновать полученные в результате
трансляции программы на Fortran объектные файлы с объектными файлами, полученными
от компиляторов с других языков, что позволяет создавать более гибкие и
многофункциональные приложения. Для языка Фортран также доступно большое
количество библиотек, содержащих как подпрограммы решения классических
вычислительных задач (LAPACK, IMSL, BLAS), задач организации распределенных
вычислений (MPI, pvm), так и задач построения графических интерфейсов (Quickwin,
FORTRAN/TK) или доступа к СУБД (Oracle).
Наследие Fortran
Fortran использовался более пятидесяти лет и существует огромная часть принадлежащая
ему и по сей день. Fortran — основной язык для некоторых задач требующих огромных
вычислений, таких как моделирование погоды и климата, гидрогазодинамика,
вычислительная химия, квантовая хромодинамика, моделирование динамики солнечной
системы, вычисление орбит искусственных спутников и многие другие задачи.
Особенности языка
Языковые особенности Fortran предназначены для всестороннего развития языка,
описание их можно найти в любом учебнике по Fortran. Однако в них зачастую
описываются лишь часть языковых особенностей, которая наиболее часто используется в
современных программах. При этом он обладает рядом уникальных особенностей,
которые сохранены для поддержки «вниз».
Переносимость
Поначалу переносимость для Fortran была весьма насущной проблемой, потому что не
существовало ни одного единого стандарта и даже справочной информации от IBM. И
компьютерные фирмы соперничали между собой, обеспечивая несовместимость для
разных компиляторов. Исправило дело появление стандартов. Стандарт 1966 года
устанавливал синтаксис и семантику, но продавцы продолжали внедрять несовместимые
расширения.
Осмотрительные
программисты
понимали,
что
использование
несовместимых расширений вызовет проблемы переносимости и зачастую использовали
программы наподобие «The PFORT Verifier» для выявления несовместимых расширений.
Несовместимые расширения были не единственной проблемой. Существовал ряд проблем
с численными вычислениями. Позже была развита и внедрена практически универсальная
идея двоичной арифметики с плавающей запятой.
Доступ к исполняемой среде (например, к командной строке, переменным среды) был
весьма затруднителен, пока на это не обратили на это внимание в стандарте 2003 года.
Сейчас относительно просто реализовать полностью переносимую программу на Fortran.
Свободно распространяемые программы на Fortran












Программы, написанные Alan J. Miller, полностью совместимые с ELF90 и
компиляторами Fortran 90/Fortran 95
BLAS — программы для работы с линейной алгеброй
DISLIN — высокоуровневая библиотека для отображения кривых, поверхностей и
т.д.
EISPACK — коллекция подпрограмм, которые вычисляют собственные значения и
собственные векторы для девяти классов матриц
Программы на Fortran 9, написанные Michel Olagnon
FLOPPY — анализирует программу на Fortran 77 и преобразует ее в улучшенный
вид
FXDR
LAPACK — пакет для работы с линейной алгеброй
LINPACK — пакет для работы с линейной алгеброй
MINPACK — пакет для решения нелинейных систем
MUDPACK — пакет для решения дифференциальных уравнений
MDBNCH — пакет изучения молекулярной динамики

Программы для высокоточных вычислений

Открытые исходные коды на Fortran используемые NASA
PSPLOT — библиотека для работы с PostScript
slatec — библиотека общей математики
ODEPACK — пакет для решения линейных систем, обыкновенных
дифференциальных уравнений и т.д.
STARPAC — библиотека для обработки статистических данных
StopWatch — модуль для вычисления времени исполнения сегментов программ
toms — коллекция алгоритмов на Fortran






Элементы синтаксиса:
Комментарий до конца строки
!
Регистрозависимость
Нет
Регулярное
переменной
выражение
идентификатора
[a-zA-Z][_a-zA-Z0-9]{0-n}
Присваивание значения переменной
=
Объявление переменной
type :: variable
Объявление
значения
переменной
с
присваиванием
type :: variable = value
Группировка выражений
()
Блок
do ... end do
Сравнение
== < > <= >= <>
Вызов функции
CALL f(a,b...)
Вызов функции без параметров
CALL f
Если - то
if condition then ... end if
Если - то - иначе
if condition then ... else ...
endif
Цикл с постусловием
DO ... WHILE (condition)
Download