4760

Парадигмы и стили программирования

Реферат

Информатика, кибернетика и программирование

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

Русский

2012-11-25

133.5 KB

53 чел.

Парадигмы и стили программирования

  1.  Исторический очерк.
  2.  Стили программирования.
  3.  Понятия парадигмы программирования.
  4.  Основные виды парадигм.
  5.  Особенности функционального и  логического программирования.

Исторический очерк

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

Как известно, первый микропроцессор появился на свет в 1970 году - Intel 4004. Его спроектировал Маршиан Эдвард Хофф - один из инженеров фирмы Intel, которая и по сей день является лидером производства чипов, процессоров и контроллеров. Фактически это устройство обладало возможностями, присущими сейчас каждому "калькулятору", и не более. Судите сами: он мог обрабатывать только 4 бита информации, да и команд у него было немного, а значит, программирование под него было достаточно простой задачей, и потребность в языках высокого уровня не возникала. Но всего через четыре года, в 1973, был создан процессор 8008, который работал с восьмиразрядными машинными словами, а также, чуть позже - 8080, который позволял подключать память объемом до 64 килобайт.

В 1978 появился 16-разрядный микропроцессор 8086 c памятью до 1 мегабайта, а с ним и современный ассемблер, который до сих пор в той или иной мере поддерживается во всех микропроцессорах x86 при работе в реальном времени. И если с предыдущими процессорами автор этих строк знаком скорее понаслышке, то первый опыт программирования он получил, работая именно с 8086. Собственно, большинство современных процессоров базируются как раз на его основе. Небольшие размеры самого процессора и также основных компонентов компьютера в те годы привели к тому, что появились так называемые PC - Personal Computer, или, проще говоря, "персоналки", то есть машины, рассчитанные на использование одним человеком. Они занимали немного места, могли помещаться на обычном письменном столе и при этом обладали значительной вычислительной мощностью. Все это ускорило обширное распространение PC, особенно в США.

Однако это вовсе не означает, что до появления PC не было потребности в средствах программирования. Еще в середине 50-х годов вычислительные машины получили широкое распространение в университетах и научно-исследовательских институтах США и Западной Европы, и тогда же наступило время стремительного прогресса в области программирования. И новые разработки не отрицают всего того, что было сделано прежде. Компиляторы и интерпретаторы для языков ассемблера остались важным средством программирования для любого компьютера. Но, несмотря на возможность использовать эти средства, программисты решили облегчить себе работу.

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

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

mov AL,0
mov AH,0Ch
int 21h

не говоря уже о том, что ассемблеры были аппаратно зависимы - то есть, если планировалось использовать программы на компьютере от Dec, а не Intel, их приходилось переписывать заново. Поэтому программисты сами для себя старались упростить жизнь и пытались создавать все более и более совершенные языки. С появлением языков нового уровня, они получили возможность производить разработку алгоритма решения задачи, не тратя усилий на программную реализацию. Кроме того, появление этих языков ознаменовало первый шаг на пути создания программ, которые вышли за пределы научно-исследовательских лабораторий. Но языки программирования, вместе с тем, становились все более и более сложными. Если в ассемблере основная проблема заключалась в постоянном запоминании ненужных, по сути, сведений по ходу написания программы и утомляющем кодировании мельчайших подробностей работы программы, чему еще можно было научить среднего человека, то в современном C++ содержится такое количество лексем, что далеко не каждый может освоить этот язык, а это, в свою очередь, приводит к появлению пакетов типа Visual Basic (именно Visual Basic, а не VBS), которые, по сути, бесполезны, так как в них за счет сильного уменьшения возможностей и общей гибкости языка упрощается интерфейс. В результате, изучающий их человек, если он не умеет толком программировать, так и не научится это делать, всю жизнь пользуясь плодами творчества других программистов, втиснутый в те рамки, которые они ему отвели.

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

Итак, первым был Fortran. Он появился, как уже упоминалось, в 1957 году. Но работы по его разработке начались намного раньше. С 1954 годов группа инженеров всем известной компании IBM под руководством Джона Бекуса занималась созданием компилятора для Fortran. Эти работы велись более 2-х лет и, в конце концов, привели к созданию нового языка. Fortran - это сокращение от двух английских слов FORmula TRANslator - что переводится как "транслятор формул". Как видно из названия, первоначально язык создавался с целью использования при математических расчетах. Он предназначался для написания программ, используемых при решении прикладных технических задач. Основу языка составляли арифметические операторы, соответствующие по своему синтаксису традиционной записи математических выражений. В дополнение к этому в языке имелись средства разбиения сложных алгоритмов на более простые за счет явного определения подпрограмм (SUBROUTINE) и функций (FUNCTION). Описания данных в Fortran были ориентированы на представление главным образом числовой информации, поэтому и типы данных были просты: это целые и действительные числа, а также массивы из таких чисел.

Однако программирование на Фортране представляло собой задачу непростую. К примеру, оператор DO 150 I=1,10 определяет начало цикла выполнения команд, идущих непосредственно за ним вплоть до строки с отметкой 150, причем параметр I при каждом новом начале цикла увеличивается на 1, и так до 10. А если вместо запятой между 1 и 10 поставить точку, то вместо цикла мы получим присвоение переменной DO150I значения 1.10. Но поскольку Fortran обладает хорошо развитым математическим аппаратом, и под него за время его существования было написано множество удобных и полезных библиотек, он до сих пор иногда используется при программировании сложных вычислений. Первая версия была предназначена специально для компьютера IBM-704, который работал на лампах (!). Позднее появились более проработанные версии: Фортран II позволял присоединять куски кода на ассемблере, Фортран III и Фортран IV, который вышел в свет в 1962 году, а также Фортран V, который умел работать с комплексными числами. Большим неудобством было то, что на разных машинах стояли Fortran"ы разных версий и между ними не было никакой совместимости, поэтому в 1966 году решено было принять единый стандарт.

Следующая стандартизация была проведена в 1977, и версия стандарта Fortran77 стала особенно популярна. Стоит заметить, что это был первый пример коммерчески успешного языка. Fortran не умер и сегодня, как думают многие, хотя область его применения остается достаточно специфической. Появились даже пакеты Visual Fortran, позволяющие писать программы с графическим интерфейсом пользователя под среду Windows. К тому же Fortran до сих пор продолжают изучать при подготовке по некоторым физико-математическим специальностям во многих университетах, где он остается профилирующим языком программирования.

Но Fortran приносил радость и утешение лишь ученым, которые решали с его помощью свои специфические научные и инженерные задачи. ЭВМ между тем развивались, и становилось понятным, что с их помощью можно решать самые разнообразные проблемы, зачастую не связанные с научными приложениями. Поэтому постепенно разрабатывались и компиляторы других языков программирования. Так в конце 1959 года в США группа разработчиков представила совершенно новый универсальный язык программирования COBOL - это аббревиатура от Common Business-Oriented Language - универсальный язык, ориентированный на задачи бизнеса. В Коболе, в отличие от большинства других языков, все данные описываются в отдельной секции, которая не совпадает с секцией команд. Это позволяет использовать одни и те же описания данных в различных программах. COBOL был аппаратно независим, и это также способствовало его потрясающей популярности в 60-х - 70-х годах, особенно после выхода в 1962 году его новой версии. Особенно эффективно программы, написанные на COBOL"е, производят простые арифметические операции с большими массивами данных, что довольно часто приходится делать в бухгалтерских расчетах. В нашей стране этот язык тоже достаточно широко использовался, причем он, один из немногих, был переведен на русский язык.

Тем не менее, языков программирования было все еще мало, да и те, что были, не всегда устраивали привередливых разработчиков. Поэтому ряд ведущих программистов в Цюрихе представили в 1958 году свое новое детище - Алгол (сокращение от ALGOrithmic Language - алгоритмический язык программирования). Первая версия языка так и называлась - Алгол 58, а позднее, в 60 году, уже в Париже, был принят стандарт Алгол 60, который и стал основным на долгие годы, и хотя несколько раз вносились новые поправки и дополнения, это название оставалось неизменным до 1968 года.

Язык приняли неоднозначно, как удачно заметила Грейс Хоппер - один из крупнейших специалистов по языкам высокого уровня (если не сказать "крестная мать" языков программирования) - "Алгол похож на большую поэму: простой и ясный с точки зрения математики, но отнюдь не практичный". В США Алгол не получил широкого распространения, зато европейцы сразу приняли Алгол. Он дал возможность европейской компьютерной индустрии обрести независимость от американской технологии и распространился от Великобритании до Советского Союза. В начале 80-х множество советских программистов работали на Алголе-60. Но основная заслуга этого языка в другом - он заложил базу для дальнейшего развития программистской мысли, и многие языки программирования, разработанные впоследствии и получившие широкое распространение как в кругу профессионалов, так и среди любителей, содержат многие идеи и решения, взятые из Алгола.

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

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

Отцы-основатели BASIC"а (расшифровывается как Basic Beginner"s All-purpose Symbolic Instruction Code - универсальный код символических инструкций для начинающих) - два ярких представителя программистов старшего поколения, сотрудники математического факультета Дармутского колледжа Томас Курц и Джон Кемени. Курц имел степень доктора по математической статистике. Впервые с компьютерами он познакомился в 1951 году в Калифорнийском университете. Кемени был на два года младше Курца. С компьютерами он был, что называется, "на ты". Еще во время учебы в Принстоне, он ездил в 1945 году в Лос-Аламос, где принимал участие в работе над особо секретным "Манхэттенским проектом" по созданию атомной бомбы. Наставником Кемени был сам Джон фон Нейман, чьи идеи в области компьютерных вычислений оказали серьезное влияние на все дальнейшие разработки в этом направлении.

После войны Кемени работал ассистентом у Альберта Эйнштейна в Принстонском институте перспективных исследований, одновременно заканчивая докторантуру. Так как получить место преподавателя математики не удалось, он преподавал логику. В 1953 году ему предложили возглавить математический факультет в Дартмутском колледже. В то время ему было всего 27 лет.

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

В первое время Кемени и Курц были вынуждены работать со своими математическими программами за 215 км от Дармутского колледжа. Ближайший доступный им вычислительный центр находился в Массачусетском технологическом институте. Это был новейший компьютер IBM-704, который имел феноменальный по тем временам объем памяти 8192 слова по 365 разрядов каждое. Но, даже проделав долгий путь, Курц и Кемени не могли самостоятельно работать на машине, из-за существовавшей тогда системы пакетной обработки (batch processing). Так как компьютеры были немногочисленны и страшно дороги, доступ к ним имели только избранные. Программисту требовалось подготовить задание на перфокартах и передать его в вычислительный центр оператору. Он вводил карты в машину в большом пакете, который содержал сотни программ, принадлежащих различным пользователям.

Потом происходило ожидание, в течение нескольких дней. Причем не всегда данные, выданные машиной, оправдывали эти ожидания. Малейшей описки было достаточно, чтобы машина прекратила выполнение программы. Исправив ошибку, программист должен был заново отправить программу оператору и опять ждать результатов. Даже хорошие программисты тратили много времени на исправления ошибок в своей программе. Для Курца, а именно он отвозил программы в МТИ, это оборачивалось бесконечными поездками из Дартмута в Бостон и обратно.

Но проблемы не ограничивались лишь неудобствами пакетной обработки. Помимо этого первые программы для машины IBM-704 приходилось писать на языке ассемблера. И если программа начинала вести себя "странно", то единственным способом исправления ошибки было изучение дампа памяти - длинной бумажной ленты, содержащей числовые коды. Свое программистское мастерство Кемени и Курц оттачивали, изучая язык ассемблера и разбираясь с бесконечными дампами, лелея надежду об установке компьютера в Дартмуте. Не представляли они себе лишь того, как научить программированию коллег и студентов, ведь сам процесс программирования был чрезвычайно сложным.

К началу 60-х годов Кемени и Курц добились некоторых успехов. Вначале Дармутский колледж получил собственный маленький компьютер LGP-30 с объемом памяти вдвое меньше, чем у IBM-704. Курц возглавил новоиспеченный вычислительный центр, и на протяжении нескольких лет два молодых профессора занимались разработкой простых языков, предназначенных для работы на машине LGP-30. Один студент, не занимавшийся до этого программированием, разработал язык "ДАРТ". Успехи студента подтвердили убеждение Курца и Кемени - работа с компьютером вполне по силам студентам. Наконец настала пора выдвинуть идею, которую они вынашивали многие годы. Их предложение было очень смелым: обучать азам программирования всех студентов, независимо от специальностей, будь то гуманитарные или естественные науки. Поставленная цель уже сама по себе была весьма необычной, но намерения Кемени и Курца этим не ограничивались. В отличие от своих коллег, которых вполне устраивала методика обучения студентов программированию путем чтения лекций, Кемени хотел, чтобы студенты работали с машиной "вживую", создавая для нее реальные программы. Но студентов много, а компьютер только один, и, хотя студентам не приходилось путешествовать в другой город, утомительность работы с пакетной обработкой несла с собой разочарования. Будущих инженеров и математиков необходимо было заставить смириться с многочасовым и даже многодневным ожиданием результатов.

Перспектива пакетной обработки создавала определенные трудности, но они были не такими пугающими, как сам процесс обучения студентов языкам программирования. Но никакими препятствиями невозможно было остановить пытливые умы "дармутской команды". Для начала они попытались устранить неудобства пакетного режима, и решили использовать систему разделения времени (time sharing), предложенную МТИ в конце 50-х годов.

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

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

Некоторые идеи Кемени и Курца отличались от существовавших тогда "принципов". Например, введение в язык оператора INPUT, позволяющего вести некое интерактивное взаимодействие. Это позволяло изменять программу в процессе ее работы. Кроме того, язык, разработанный Кемени и Курцом, не предусматривал разделения чисел на целые и вещественные, как в языке Фортран. Бейсик оказался универсальным языком в отличие от, например, COBOL"а. А его простота позволяла использовать преимущества ЭВМ как математикам и инженерам, так и филологам и социологам.

Летом 1963 года Кемени начал разрабатывать первую версию компилятора для языка Бейсик. Осенью того же года студенты приступили к проектированию и кодированию операционной системы для машин, на которых Кемени и Курц планировали реализовать свои идеи. Это были машины General Electric-225 и Datanet-30. В феврале 1964 года оборудование было доставлено в колледж, и работа закипела с удвоенной силой. Наконец, 1 мая 1964 года в 4 часа утра в полуподвале здания колледжа Кемени и его коллеги начали набирать программы, каждый на своем терминале. Наконец-то все заработало! Одновременно родились язык Бейсик и система разделения времени.

Но это было только начало. Долгое время BASIC не имел компилятора или интерпретатора, который бы позволял создавать полноценные исполняемые exe-файлы. И лишь в конце 1975 году был создан первый его интерпретатор. Он был создан двумя программистами-любителями - Диком Уипплом и Джоном Арнольдом. В том же 1975 году фирма Micro Instrumentation and Telemetry Systems выпустила свою версию языка BASIC. Ее создатели - кто бы вы думали? - никому не известные программист фирмы "Хониуэл" (Honeywell) и студент младших курсов Гарвардского университета Пол Аллен, а также его нерадивый приятель Билл Гейтс.

Одно время популярность BASIC"а была столь велика, что PC выпускались с его интерпретатором, прошитым прямо в ПЗУ компьютера. Самым популярным стал М-Бейсик, первый коммерческий успех молодой компании Microsoft Corporation. Но, несмотря на все свои достоинства, и он скоро стал сдавать свои позиции, уступая их объектно-ориентированным языкам программирования. Не помогли даже пересмотры стандарта языка и исключение вечного камня преткновения - оператора безусловного перехода GOTO, который запутывал программу, делая из нее нечто похожее на блюдо спагетти. К слову сказать, Microsoft до сих пор продвигает своего первенца - теперь это уже хорошо разросшийся Visual Basic - целый пакет визуального программирования, который вряд ли кто-нибудь обвинит в "объектной неориентированности", и его аналог для программирования в Internet - VBScript. Несмотря на практически полностью измененный интерфейс, этот язык и сейчас остается простым в изучении и отлично подходит для написания небольших, нетребовательных к ресурсам программ.

Еще один очень интересный пример языка, сошедшего с пути исторического развития, о котором сегодня помнят разве что специалисты, - PL/1. Все началось с того, что уже упоминавшаяся ранее фирма IBM в 1961 году решила начать разработку новой ЭВМ. Это должна была быть совершенно новая машина, одинаково хорошо обрабатывающая большие массивы данных и обсчитывающая сложные математические задачи; проект получил название "Система-360". Вместе с новой машиной разрабатывался и язык: он совмещал особенности трех лидеров данного сектора рынка - Фортрана, Кобола и Алгола. Главой проекта стал Джорж Рэдин. Менее чем за год все необходимые работы были проведены, и появился первый компилятор. Свое название язык получил как аббревиатуру от Programming Language One PL/1. Возникает резонный вопрос: почему же мы сегодня ничего не знаем об PL/1, раз он такой хороший и так много всего в себе совмещает? Оказалось, что разработчики далеко не всегда брали от его "родителей" все самое лучшее, как следствие, язык получился перегруженным возможностями и концепциями.

Но вернемся к началу 60-х годов. Все основные языки программирования все еще можно было пересчитать по пальцам, но вскоре их число начало резко возрастать. Поэтому были предприняты попытки создать универсальный язык программирования, но ни одна из этих попыток не увенчалась успехом. Среди десятка наиболее распространенных на тот период времени языков программирования каждый был ориентирован на решение определенных задач. Бейсик употреблялся для написания простых программ. Фортран - с его четко определенными правилами выполнения арифметических операций - являлся классическим языком программирования для решения математических и физических задач. Язык программирования COBOL был задуман как основной язык для массовой обработки данных в сферах управления и бизнеса. Другие языки программирования были также специализированы. Еще один заслуживающий внимания язык программирования - Алгол - предназначался для записи алгоритмов, которые строятся в виде последовательности процедур, применяемых для решения поставленной задачи. Программисты далеко неоднозначно приняли Алгол, широкого одобрения он не получил. Но все же влияние Алгола на развитие других языков программирования оказалось значительным.

Среди языков, целью создания которых было улучшение Алгола, следует особо отметить Паскаль, разработанный в конце 60-х годов швейцарским ученым Никлаусом Виртом. Pascal был назван в честь французского философа и математика XVII века Блеза Паскаля. Как известно, история повторяется, и вся новизна лишь в том, что на каждом новом витке - она делает это на более высоком уровне. Мы уже отмечали, что BASIC появился как побочный продукт преподавательской деятельности у Кемени и Курца, когда они пытались обучать студентов программированию. Нечто похожее произошло и с Паскалем. Некоторое время Никлаус Вирт был профессором информатики в Федеральном техническом университете в Швейцарии и нуждался в языке, с помощью которого относительно легко можно было бы обучать студентов навыкам программирования на хорошем уровне. Базовая концепция Паскаля была разработана Виртом примерно в 1970 году, и Паскаль очень быстро начал повсеместно распространяться, прежде всего, благодаря легкости в изучении и наглядности написанных на нем программ.

Язык Паскаль требовал от программиста определения всех переменных в отдельной секции в начале программы. Так как эти определения задавались явным образом, то в программах появлялось сравнительно немного ошибок, и их было проще понять и исправить разработчику. Это сделало Паскаль популярным при создании больших программ. В 1962 году он был объявлен официальным языком программирования для учащихся средних школ, которые намерены специализироваться в области вычислительной техники и программирования в американских университетах.

В то же время, стандартный Паскаль обладал рядом существенных недостатков. Поэтому Вирт продолжил развивать свое детище, так через девять лет, в 1979 году, появилась Модула-2, прежде всего от Паскаля она отличалась тем, что давала возможность использовать модульное программирование, а значит, с ее помощью уже можно было создавать достаточно большие проекты. К середине 70-х годов назрела необходимость разработать международный стандарт на Паскаль. В результате, в 1982 году появился стандарт ИСО 7185. Но Вирт не останавливался на достигнутом, и немного позднее появились Ада и Оберон, которые позволяли использовать типы и объекты, что уже давало кардинально новые возможности для разработчиков.

Язык Ада был создан фактически по заказу Министерства обороны США и, соответственно, при его активной поддержке. Был проведен конкурс среди разработчиков, и его выиграла некая фирма Honeywell в лице ее подразделения Cii-Bull с руководителем Ж. Ишбиа. Язык был назван в честь Августы Ады Лайвейс - дочери английского поэта Дж. Байрона, которая считается первой программисткой. Окончательная версия спецификаций языка Ада появилась в феврале 1983 году, она и стала основной. Ада до сих пор считается современным языком с традиционной структурой управления, возможностями определения типов и подпрограмм. Удовлетворяет язык и требованиям модульности. В дополнение к классическим свойствам язык обеспечивает программирование задач реального времени, а также возможности моделирования параллельного решения задач и обработку прерываний.

Поскольку Ада морфологически произошла от Pascal, у них есть очень много общего, хотя наблюдаются и некоторые аналогии с Модулой. С самого начала Ада предназначалась для разработки больших программных пакетов. Учитывая то, какую серьезную (моральную и не только) поддержку предоставляли правительство и Министерство обороны США, неудивительно, что язык очень быстро развивался и без особых проблем распространялся.

Здесь нужно заметить, что стандартный Паскаль был действительно очень простым языком. В то же время в сознании большинства людей (особенно молодого поколения, тех, кому еще нет 30), Паскаль обычно ассоциируется с Turbo Pascal от фирмы Borland - это не верно! Ведь Turbo Pascal включает в себя многие положительные качества как Модулы, так и Oberon"a, и является гораздо более сложным и мощным языком, чем Паскаль Вирта. Судите сами: он позволяет использовать и модули, и типы, и даже объекты, давая всю мощь объектно-ориентированного программирования в руки разработчика. Как же он возник? Никлаус Вирт здесь совсем не при чем, а при чем - Андерс Хейлсберг, которого и следует считать отцом-создателем Турбо Паскаля, вскоре вытеснившего с рынка все другие спецификации. Это победоносное шествие началось в 1984 году с появлением версии Turbo Pascal 2.0, ее распространение шло стремительными темпами. Версии 3.0, 4.0 и 5.0 выходили соответственно в 1985 и 1988 годах (последние две). В них появилось несколько революционных нововведений: возможность разбивать программу на несколько файлов (модулей), интерфейс взаимодействия с MS-DOS и встроенный отладчик. Отладчик (debugger) - это очень полезное средство, позволяющее в период выполнения программы просматривать содержимое регистров процессора, текущие значения переменных и последовательность выполнения программы. От версии к версии оптимизировалась работа компилятора, который генерировал исполняемый код на основе текста программы. Даже достаточно простые программы, перенесенные с других языков программирования, не использующие всех возможностей, которые давал Паскаль, после компиляции начинали работать существенно быстрее. Так, основной из причин, по которой автор этих строк еще очень давно решил отказаться от Бейсика и использовать Паскаль, - явилась наглядная демонстрация скорости работы компилятора Turbo Pascal 2.0. Компиляция происходила в полтора раза быстрее, ехе`шник получался во много раз меньше (несколько килобайт для простенького приложения против 40-50 у Бейсика), а скорость выполнения полученного кода просто впечатляла. Сейчас, когда машины оснащаются сотнями мегабайт оперативной памяти и быстродействующими процессорами, мало кто обращает внимание на такие, казалось бы, мелочи, а тогда, при работе на 8088 процессоре со всего 640 кб оперативной памяти, это было очень важно.

Последующее развитие Pascal привело к появлению таких библиотек, как Turbo Vision, с использованием которой написан, наверное, всем известный, Dos Navigator, а также языка Object Pascal, который впоследствии стал основой для создания Delphi.

Delphi - компилятор языка Object Pascal. Delphi 1 был первым инструментарием разработки Windows-приложений, объединившим в себе оптимизирующий компилятор, визуальную среду программирования и мощные возможности работы с базами данных. Годом позже Delphi 2 предложил все то же, но на новом уровне современной 32-битной операционной системы Windows 95 и Windows NT. Кроме того, Delphi 2 предоставил программисту 32-битовый компилятор, создававший более быстрые и эффективные приложения, мощные библиотеки объектов.

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

Современный Delphi 6 является очередным шагом в эволюции компиляторов Паскаля, первый, как вы помните, был сделан более 16 лет назад Андерсом Хейлсбергом. Пожалуй, мало найдется языков, которые бы жили так долго, при этом оставаясь актуальными. Действительно, Delphi позволяет даже самому неискушенному в программировании человеку после сравнительно небольшого времени, потраченного на его изучение, создавать профессионально выглядящие программные продукты с графическим интерфейсом пользователя в стиле Windows. Особенно удобно на Delphi работать с базами данных. Естественно, эта легкость работы с Delphi оборачивается некоторыми минусами языка. Основной недостаток Delphi - скорость работы, она очень и очень невысока. Да и генерируемый компилятором код получается увесистым и неуклюжим. Так, создание пустого окна даст ехе-файл размером почти в полмегабайта, на С++ - такое же займет 15-30 килобайт, в зависимости от ваших стараний (или 1 Кб при совсем творческом подходе к проблеме). Тем не менее, для некоторых сфер применения Delphi является идеальным решением, поэтому сейчас он достаточно популярен.

Я рассмотрел одну из классификаций языков программирования, в ее основе лежит выразительная мощность языка. Однако существуют и другие разделения, произведенные по совершенно другим признакам. Одна из них - классификация, согласно которой все языки делятся на вычислительные и языки символьной обработки. Можно сказать, что все вышеперечисленные языки относились к первому типу. Что же касается языков обработки символьной информации, то следует хотя бы упомянуть о ЛИСП`е (сокращение от List Processing Language), ПРОЛОГ`е (сокращение от Programming in Logic) и РЕФАЛ`е (алгоритмический язык рекурсивных функций).

Язык ЛИСП разработан Дж. Маккарти в США. Он стал основой ряда программных реализаций интеллектуальных систем и дал толчок к разработке множества специализированных языков искусственного интеллекта и языков представлений знаний.

Гораздо интереснее Пролог, появившийся в 1972 году. Он стоит особняком в ряду тех языков программирования, о которых мы успели рассказать. Пролог - это сокращение от PROgramming LOGic. Можно сказать, что он появился "на пустом месте", так как фактически при его создании ни один из известных языков не был взят за основу. Пролог разрабатывался Аланом Колмари - сотрудником университета в Лумини, и в отличиe от ЛИСП`а - это европейский язык. В чем же его особенность? А вот в чем: это первый и, пожалуй, единственный язык программирования, основанный на логическом выводе и решении поставленной задачи. Это роднит его с искусственным интеллектом. Фактически, на основе ряда начальных данных (аксиом, фактов) в соответствии с правилами логики, указывающими рамки поиска пути к решению, язык самостоятельно приходит к некоторым выводам. То есть, вы описываете не то, как надо решать некоторую задачу (как это делается в подавляющем большинстве других языков), a лишь ставите ее перед Прологом, и он уж сам ищет решение. Из-за необычности своей структуры он использовался при решении достаточно нестандартных задач, поэтому оказался распространен не так широко, как другие языки.

Наконец, третьим языком символьной обработки, с появлением которого в эту область были внесены интересные идеи, стал язык РЕФАЛ, созданный В. Турчиным. Подобно ЛИСП"у, этот язык активно использует мощные средства преобразования списков на основе концепции распознавания по образу.

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

Стили программирования

Стиль программирования — набор правил и соглашений, используемых при написании исходного кода на некотором языке программирования.

Императивными называются такие языки программирования, в которых описываются в основном "инструкции" по пошаговому выполнению алгоритмов. Все внимание в них отводится лишь реализации этой последовательности действий, а данным и их структуре отводится второстепенная роль. Примером такого рода языков может служить языки создания драйверов устройств: Assembler и C++. При использовании этих языков мы не знаем, какие данные будет отправлять/получать устройство, но зато мы знаем, какие действия нужно осуществить над данными.

Декларативными называются языки программирования, в которых алгоритм работы с данными "зашит" в языке программирования, а сама программа представляет собой данные, упорядоченные и структурированные таким образом, что их легко обрабатывают "стандартные" алгоритмы вывода. В декларативных языках как бы "нет разницы" между данными и алгоритмом, их обрабатывающим. От "значения" данных, подаваемых на вход программы, зависит дальнейшее направление расчетов. Примерами декларативных языков могут служить языки: LISP и Prolog. И программа, и данные на языке ЛИСП представляют собой "списки" вместе с функциями, выполняемыми над ними. На языке ПРОЛОГ есть условное разделение программы на данные ("факты") и код ("правила", "продукции"). Но это разделение достаточно условно: и факты, и правила имеют одну и ту же форму записи.

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

Понятия парадигмы программирования и основные их виды

Парадигма программирования — это комплекс концепций, принципов и абстракций,

определяющих фундаментальный стиль программирования.

Общие сведения о парадигмах программирования

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

  •  1957г., процедурная парадигма, язык ФОРТРАН, создатель Бэкус;
  •  1967г., функциональная парадигма, язык ЛИСП, создатель Маккарти;
  •  1970г., структурированная парадигма, язык ПАСКАЛЬ, создатель Вирт;
  •  1974г., логическая парадигма, язык ПРОЛОГ;
  •  1983г., объектно-ориентированная парадигма, пример - язык C++, создатель Страуструп.

В процессе своего развития эти парадигмы "мутировали", "отпочковывались", "объединялись" (так, язык Си объединил в себе процедурную и структурированную парадигму). В результате этих "мутаций" по состоянию на 01.06.2008 года оформились следующие парадигмы программирования:

  1.  Процедурная (или модульная) парадигма;
  2.  Логическая парадигма;
  3.  Объектно-ориентированная парадигма.

Эти три совершенно разные по подходу парадигмы составляют основу современного программирования. Хотя в настоящее время наиболее "модной" является объектно-ориентированная парадигма, остальные парадигмы также используются на практике и изучаются в ВУЗах. .

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

Императивное программирование

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

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

Императивное программирование является противоположностью декларативного программирования; второе описывает, что необходимо сделать, а первое — как именно это сделать.

Функциональное программирование

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

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

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

Функциональное программирование основано на теориях λ-исчисления (Алонзо Чёрч, 1936) и комбинаторной логики (Моисей Исаевич Шейнфинкель и Хаскелл Карри).

Логическое программирование

Логическая парадигма программирования предусматривает использование математической логики для разработки программ. В более узком смысле, логическое программирование представляет программу в виде набора декларативных утверждений вида чтобы доказать/решить H, следует доказать/решить B1 и ... и Bn. Этот набор утверждений рассматривается как процедуры по упрощению целей, которые разбивают одну общую задачу на несколько подзадач, так что процесс поиска доказательства/решения для основной цели программы получает вычислительный смысл.

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

Объектно-ориентированное программирование

Объектно-ориентированная парадигма (ООП) представляет программу как набор объектов и их взаимодействий. Основными понятиями ООП являются следующие:

  •  объект — элементарная сущность, описываемая определенными свойствами (хранящимися в виде атрибутов объекта) и поведением (реализованным в виде методов);
  •  класс описывает структуру свойств и поведения одного типа объектов. Каждый объект программы является экземпляром некоторого класса;
  •  классы могут наследовать атрибуты и методы их родительских классов, в то же время добавляя свои собственные. Иерархия классов позволяет моделировать сущности решаемой задачи на нескольких уровнях детализации и в дальнейшем использовать класс, отвечающий уровню детализации, необходимому для решения конкретной подзадачи.
  •  инкапсуляция подразумевает, что некоторые детали реализации класса скрыты от взаимодействующих с ним объектов. У каждого класса есть интерфейс, описывающий взаимодействие объектов этого класса с прочими объектами, и реализация, описывающая то, как это взаимодействие отражается на объекте этого класса.
  •  Многие современные языки поддерживают ООП, хотя и в разной степени:
  •  чисто объектно-ориентированные языки, например, Smalltalk и Ruby, разработаны для того, чтобы поддерживать и даже навязывать объектно-ориентированный стиль разработки, и не поддерживают другие стили программирования;
  •  преимущественно объектно-ориентированные языки, например, Java, C++ и Python, разработаны в основном для поддержки ООП, но позволяют использовать элементы процедурного программирования;
  •  исторически процедурные языки, например, Perl и Fortran 2002, были доработаны и в них была добавлена поддержка некоторых элементов ООП;
  •  экзотические языки, например, Modula-2 и Oberon, реализуют некоторые черты и принципы ООП, но в оригинальной форме.

ООП можно противопоставить модульному или процедурному программированию: как объекты, так и модули/подпрограммы являются самодостаточными (в некоторой степени) единицами, но объекты фокусируются на содержащихся в них данных, а модули/подпрограммы — на сгруппированных в них действиях.

Особенности функционального и  логического программирования

Преимущества функционального программирования

  •  Программа представляет собой множество вычисляемых функций
  •  Отсутствует операция присваивания (осн. Императивный оператор)
  •  Порядок выполнения программы (вычислений) несущественен
  •  Быстродействие (по сравнению с аналогичными императивными вычислениями)
  •  Компактность кода (особенно для списков и вариантных типов)
  •  Суперпозиции/склеивания функций: из простых – сложные, редукция
  •  Суперпозиция моделей: склеивание программ, ленивые вычисления
  •  Численное дифференцирование/интегрирование (в т.ч. модульное)
  •  Алгоритмы искусственного интеллекта (эвристический поиск и т.п.)
  •  Распараллеливание вычислений (Haskell)
  •  Интерактивная отладка, Unit-тестирование, карринг
  •  Сопоставление с образцом

Преимущества логического программирования

  •  Задача программиста – описание логической модели предметной области в терминах объектов, их свойств и отношений между ними (без деталей): описание данных и логики их обработки ~ аналогия с ООП
  •  Удобство описания отношений между объектами (реляционная модель)
  •  Компактность кода (обработка структурированных данных, лог. правила)
  •  Возможность перебора и поиска различных решений, заложенная в язык
  •  Легкость понимания (описание отд. правил), отладки программ (trace)
  •  Легкость описания сложных структур данных (деревья, списки и т.п.)
  •  Эффективный метод вычислений – рекурсия
  •  Отсутствие указателей, операторов присваивания и безусловного перехода
  •  Множество областей для применения: автоматический перевод, обработка текстов, экспертные системы, САПР, Data-minig системы, автоматическое управление, СУБД, символьные вычисления


 

А также другие работы, которые могут Вас заинтересовать

45413. Понятие уголовного права 37.5 KB
  Нет преступления нет наказания без точного указания на то в законе. Тем не менее принцип равенства перед уголовным законом не означает что все лица совершившие преступления в том числе и тождественные подлежат одинаковой ответственности и им назначается одинаковое наказание например к несовершеннолетним не может быть применена смертная кара и т. соответствовать характеру и степени общественной опасности преступления а также личности виновного. Понятие и признаки состава...
45414. Принципы уголовного права 25 KB
  Принципы уголовного права Принцип законности ст. 3 УК конституционный принцип уголовного права. Данный принцип определяет что преступность и наказуемость деяния определяется только уголовным законом Российской Федерации. Данный принцип запрещает применение уголовного закона по аналогии ч.
45415. Строение и система уголовного права 29 KB
  Особенная часть уголовного права изучает конкретные преступления по их родам и видам: преступления против жизни здоровья личности; против свободы чести и достоинства личности; против половой неприкосновенности и половой свободы личности; против конституционных прав и свобод человека и гражданина; против семьи и несовершеннолетних; против собственности; преступления в сфере экономической деятельности; против интересов службы в коммерческих и иных организациях; против общественной безопасности; против здоровья населения и общественной...
45416. Понятие уголовной ответственности 26 KB
  Понятие уголовной ответственности Уголовная ответственность разновидность юридической ответственности. 8 УК РФ указывает что является основанием уголовной ответственности. Наибольшее распространение имеют три подхода к определению уголовной ответственности: обязанность лица совершившего преступление отвечать за содеянное в соответствии с уголовным законом; применение к виновному лицу мер уголовноправового характера; судимость как правовое последствие назначения наказания. Момент начала и окончания уголовной ответственности...
45417. Виды наказаний 23 KB
  44 УК РФ предусмотрены следующие виды наказаний: штраф; лишение права занимать определенные должности или заниматься определенной деятельностью; лишение специального воинского или почетного звания классного чина и государственных наград; обязательные работы; исправительные работы; ограничение по военной службе; ограничение свободы; арест; содержание в дисциплинарной воинской части; лишение свободы на определенный срок; пожизненное лишение свободы; смертная казнь. 45 УК РФ к основным видам наказания относятся: ...
45418. Умысел и его виды 31 KB
  Прямой умысел характеризуется тем что лицо совершившее преступление осознавало общественно опасный характер своих действий бездействия предвидело возможность или неизбежность наступления общественно опасных последствий интеллектуальный признак и желало их наступления волевой признак ч. Косвенный умысел характеризуется тем что лицо совершившее преступление осознавало общественно опасный характер своих действий бездействия предвидело возможность наступления общественно опасных последствий интеллектуальный момент не желало но...
45419. Действие уголовного закона во времени. Обратная сила уголовного закона 44.5 KB
  9 УК РФ; временем совершения преступления признается время совершения соответствующих действий бездействия независимо от времени наступления последствий ч. В зависимости от законодательной конструкции состава преступления время его совершения будет различным. Это может быть например групповой способ совершения преступления тяжесть наступивших последствий определённые социально значимые характеристики потерпевшего например совершение преступления в отношении несовершеннолетнего и т. Так к преступлениям с материальным составом...
45420. Необходимая оборона 28 KB
  Необходимая оборона Необходимая оборона это правомерная защита лицом своих прав и интересов других лиц общества или государства от общественно опасного посягательства путем вынужденного причинения вреда нападающему если при этом не было допущено превышение пределов необходимой обороны. Уголовный закон устанавливает условия правомерности необходимой обороны которые делятся на условия относящиеся к посягательству и на условия относящиеся к защите. Признак действительности нападения позволяет отграничить его от мнимого нападения и...