Файл: Машинно-ориентированные языки.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 12.03.2024

Просмотров: 64

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

С середины 60-х годов программисты начали осознавать роль подпрограмм как важного промежуточного звена между решаемой задачей и компьютером. Использование подпрограмм как механизма абстрагирования имело три существенных последствия. Во-первых, были разработаны языки, поддерживавшие разнообразные механизмы передачи параметров. Во-вторых, были заложены основания структурного программирования, что выразилось в языковой поддержке механизмов вложенности подпрограмм и в научном исследовании структур управления и областей видимости. В-третьих, возникли методы структурного проектирования, стимулирующие разработчиков создавать большие системы, используя подпрограммы как готовые строительные блоки. Архитектура языков программирования этого периода, как и следовало ожидать, представляет собой вариации на темы предыдущего поколения. В нее внесены кое-какие усовершенствования, в частности, усилено управление алгоритмическими абстракциями, но остается нерешенной проблема программирования "в большом" и проектирования данных. [3, с. 33]

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

Потребность облегчить проектирование систем и приблизить структуру программ к структуре решаемых задач стало почвой для появления языков третьего поколения, поддерживающих абстракцию данных. Разработчики получили возможность описывать свои собственные виды данных, то есть создавать пользовательские типы. Значение абстрактных типов данных в разрешении проблемы сложности систем хорошо выразил Шанкар: «Абстрагирование, достигаемое посредством использования процедур, хорошо подходит для описания абстрактных действий, но не годится для описания абстрактных объектов. Это серьезный недостаток, так как во многих практических ситуациях сложность объектов, с которыми нужно работать, составляет основную часть сложности всей задачи».


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

Разрастание программных проектов требовало увеличения коллективов разработчиков и появления механизмов, позволяющих этим коллективам независимо работать над разными частями проекта. Так появились модули.

Модуль отдельно компилируемая часть программы, состоящая из наборов данных и подпрограмм. В модули, как правило, собирались подпрограммы, которые, как предполагалось, должны разрабатываться и изменяться совместно. Туда же собирались и данные, которые использовались этими подпрограммами. Постепенно модули стали новым, более крупным механизмом абстракции программных систем.

Первоначально языки программирования не имели достаточно развитых механизмов защиты данных одного модуля от использования их процедурами другого. Во многом эта задача ложилась на коллективы разработчиков. Появившиеся различные подходы в разработке программных систем благоприятствовали возникновению огромного количества языков, имеющих те или иные сильные и слабые стороны в реализации этих принципов. Одним из наиболее развитых представителей языков третьего поколения стал язык ALGOL-68. Будучи универсальным и реализуя почти все разработанные к тому времени механизмы в алгоритмических языках, он был достаточно труден для первоначального освоении, однако позволял разрабатывать системы корпоративного масштаба для больших ЭВМ. [7, с.11]

Благодаря распространению малых ЭВМ, огромную популярность приобрели более простые потомки ALGOL-60 — язык Pascal, до сих пор наиболее широко используемый в академический и учебной среде, и появившийся во второй половине 70-х годов язык C, который приобрел наибольшую популярность среди профессиональных программистов. Язык C был разработан для написания операционной системы Unix.

Классическим потомком языка Pascal, предназначенным для профессионального написания сложных программных комплексов, стал язык Ada, имеющий встроенную поддержку модульности и абстрактных типов данных.[7, с. 13]

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


Процедурно-ориентированные языки мало подходили для написания программных систем, где центральным место занимали не алгоритмы, а данные. С определенного момента возникла острая необходимость в языковой поддержке описания произвольных объектов окружающего мира. В оборот вошли абстрактные типы данных. На смену языкам программирования высокого уровня, или языкам третьего поколения пришли проблемно-ориентированные языки программирования; декларативный подход к программированию; языки визуального (графического) программирования; использование в программировании подмножеств естественного языка; объектно-ориентированные языки, о которых пойдет речь далее.[2, с. 12]

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

2. История и развитие методологии ООП


2.1 Предпосылки возникновения ООП

Объектно-ориентированное программирование часто называют новой парадигмой программирования. Другие парадигмы программирования: директивное (языки типа Pascal или C), логическое (языки типа Prolog) и функциональное (языки типа Lisp, FP или Haskell) программирование.

Несмотря на то, что техника организации вычислений и данных, составляющая сущность объектно-ориентированного программирования является новой, предпосылки ее зарождения можно отнести как минимум к временам Линнея, если не Платона. Стиль решения задач, воплощенный в объектно-ориентированной технике, нередко используется в повседневной жизни. Это парадоксально, но поэтому зачастую новички в информатике способны воспринять основные идеи объектно-ориентированного программирования сравнительно легко, в то время как люди, более осведомленные, бывает становятся в тупик из-за своих представлений. К примеру, Алан Кей обнаружил, что легче обучать языку Smalltalk детей, чем профессиональных программистов. [1, с. 9]

На заре информатики, большинство программ писалось на ассемблере. Они не соответствуют сегодняшним стандартам. По мере того как программы становились все сложнее, разработчики обнаружили, что они не в состоянии помнить всю информацию, необходимую для отладки и совершенствования их программного обеспечения. Появление таких языков программирования высокого уровня, как Fortran, Cobol и Algol, разрешило некоторые проблемы (было введено автоматическое управление локальными переменными и неявное присваивание значений). Одновременно это возросла вера пользователей в возможности компьютера. По мере того как предпринимались попытки решить все более сложные проблемы с его использованием, возникали ситуации, когда даже лучшие программисты не могли удержать все в своей памяти. Привычными стали команды программистов, работающих совместно. По мере того как программные проекты становились все сложнее, было замечено, что задача, для решения которой одному программисту требовалось два месяца, не решалась двумя программистами за месяц. Причиной такого нелинейного поведения является сложность. В частности, взаимосвязи между программными компонентами стали сложнее, и разработчики вынуждены были постоянно обмениваться между собой значительными объемами информации от другого. Порождает сложность не просто большой объем рассматриваемых задач, а уникальное свойство программных систем, разработанных с использованием традиционных подходов, — большое число перекрестных ссылок между компонентами. [1, c. 17]


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

Все это и многое другое стало причиной необходимости развития программирования в направлении большей абстракции: от процедур к модулям, далее к абстрактным типам данных и наконец к объектам. [1, c. 20]

Объектно-ориентированные методы программирования обеспечили механизм для отделения существенной информации от специализированной. Тем самым при использовании объектно-ориентированной техники мы можем создавать большие программные компоненты, пригодные для повторного использования. Многие коммерческие пакеты программных компонентов, пригодных для многократного использования, уже имеются, и разработка повторно используемых программных компонентов становится быстро развивающейся отраслью индустрии программного обеспечения. [1, c. 21]

2.2. История развития методов ООП

Норвежцев Оле Джохана Дала и Кристена Нюгорта принято считать основоположниками объектного подхода в программировании. В 1952 г. Нюгорт решил заняться моделированием крупных и сложных систем реального мира, в 1957 получил возможность компьютерной реализации своих замыслов на машине Ferranti MERCURY, но быстро осознал ограниченность машинных языков и Фортрана.

Ferranti MERCURY – версия, созданная Манчестерским университетом в содружестве с компанией Ferranti в ходе работ над компьютером Mark 2. Она отличалась поддержкой операций с плавающей точкой. Память компьютера составляла 1024 слова по 40 бит с временем доступа 10 мкс к 10-битовому слову. Устройство адресации могло работать с 10-, 20- и 40-битовыми словами. Долговременная память насчитывала 4096 40-битных слов и обрабатывала их со скоростью 17,28 мс. Для выявления сбоев выполнялась проверка четности. Программисты решали задачи с помощью языка Mercury Autocode.[9]

История Симулы началась в 1962 г. с проекта Simulation Language, предназначенного для программного моделирования метода Монте-Карло. Нюгорт, занимавший в то время должность директора по науке Норвежского компьютерного центра (NCC), приступил к созданию языка дискретного моделирования. Он привлек к сотрудничеству Оле Джохана Дала, коллегу по экспериментальной группе Министерства обороны Норвегии, которую возглавлял Йан Гэрвик, основатель информатики в этой стране. Одновременно готовились две версии Симулы. Первая, Симула I, формировалась по контракту с подразделением Univac корпорации Sperry Rand для машины UNIVAC 1107. Американские заказчики желали видеть этот язык фортраноподобным, от чего, впрочем, авторы категорически отказались; в результате прародителем Симулы стал Алгол 60. Последний был выбран благодаря блочной архитектуре, хорошим средствам сокрытия данных, а также вследствие высокой популярности в европейских научных центрах. А работы над вторым вариантом спонсировал NCC.


В 1965 г. авторам пришла в голову идея объединить данные с процедурами, их обрабатывающими. После успешного обсуждения возможностей Симулы I на саммите НАТО в 1966 г. решено было продолжить его совершенствование. В язык вошли новые средства моделирования и имитации мультипроцессной работы. Авторы также придумали термины "класс" и "объект". Тогда же возникла и технология наследования – создатели Симулы ввели в язык возможность использования разными классами общих свойств путем указания названия класса в виде префикса. После публичного анонса новая технология вызвала интерес в Дании, Германии и СССР. У нас в конце 60-х появилась реализация Симулы для УРАЛа-16.

Новая версия языка поддерживала проектирование “сверху вниз” с помощью виртуальных процедур и технологии статического и динамического связывания. Якоб Палме, специалист Шведского института оборонных исследований добавил в Симулу механизм сокрытия переменных. Первый законченный компилятор обновленной Симулы 67 увидел свет в 1969 г. и работал на машинах Control Data. Затем последовали реализации для UNIVAC 1108 и IBM, но все они, к сожалению, стоили очень дорого, что, вероятно, помешало активному распространению этого прекрасного языка. Однако с его помощью были спроектированы, например, первые СБИС-чипы Intel.[9]

Тем временем Алан Кей (человек, придумавший первый персональный компьютер; см. PC Week/RE, N 39/98, с.25) внимательно изучал идеи, заложенные в Планшет, Симулу и еще два оригинальных языка – LISP, применявшийся для задач искусственного интеллекта, и LOGO, предназначенный для обучения базовым понятиям программирования. В ходе ознакомления с этими языками Кей придумал новую концепцию разработки, в соответствии с которой набор последовательно выполняющихся инструкций мог быть заменен на многомерную среду взаимодействия объектов, общающихся друг с другом путем асинхронного обмена сообщениями. В результате появлялась возможность поддержки подобной среды не одним, а множеством компьютеров, объединенных в сеть. Правда, для своего времени эта идея оказалась слишком революционной.

В конце 50-х годов Кей работал на Денверской военно-воздушной базе “Рандольф” (Randolph), где писал на машинном коде программы для ЭВМ Burroughs 220. Тогда он столкнулся с проблемой передачи сформированных на этой машине данных на компьютеры других баз. Стандартных форматов и ОС в современном понимании для тех ЭВМ не существовало, поэтому Кею пришлось создавать микропрограммы, которые содержали в себе всю необходимую информацию и после запуска на других машинах через простой пользовательский интерфейс самостоятельно разворачивали нужные данные. Такие программы Кей первоначально назвал "модулями", объединявшими данные и код. В 1966 г. он занялся научной деятельностью в области молекулярной биологии в Университете шт. Колорадо, где к нему пришло понимание важности этой идеи. Кей задумал создание системы модулей (возможно, уже тогда он дал им название "объекты"), объединяющих данные и алгоритмы их обработки, способные взаимодействовать друг с другом через определенные разработчиком интерфейсы, но не имеющие представления о том, что происходит за их пределами. При этом он активно использовал аналогии с биологическими объектами и механизмами взаимодействия клеток в живом организме.[9]