Курс «История информатики» Лекция

Главная страница
Контакты

    Главная страница


Курс «История информатики» Лекция



страница15/17
Дата04.11.2017
Размер2,09 Mb.


1   ...   9   10   11   12   13   14   15   16   17


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




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


  • низкоуровневое программирование;

  • программирование на языках высокого уровня;

  • подготовка программ на базе языков сверх высокого уровня.


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

Языки высокого уровня разнообразнее – это языки стандартного программирования, такие как Fortran, Pascal, C и Java. В середине 70-х годов Э. Дейкстра развернул яркую полемику относительно структурного программирования, идеи которой значительно повлияли на учебное программирование. Языки функционального программирования дали инструментарий искусственному интеллекту. Программирование наших дней связано с объектно-ориентированным стилем решения задач. Декларативное (логическое) программирование легализовало для программистов недетерминизм. Языки Prolog и Haskell находят признание при решении задач в математическом стиле.
Еще более интересны идеи языков сверхвысокого уровня. Практическую значимость сейчас обретают языки параллельного программирования. Языки Apl, БАРС, Sisal приспособлены к выражению естественного параллелизма на уровне природы решаемых задач, что упрощает выделение совмещаемых процессов для многопроцессорных конфигураций.

Setl – язык сверхвысокого уровня, созданный в начале 70-х годов Дж. Шварцем, представляет собой попытку активного использования теоретико-множественных понятий в практике программирования. Согласно концепции этого языка, понятие “функция” обладает двойственной природой. Функция может быть представлена в алгоритмическом стиле – определением процедуры, выполнение которой сопоставляет результат допустимому аргументу. Но столь же правомерно представление функции в виде графика, отображающего аргументы в результаты. Оба представления могут существовать одновременно – это всего лишь две реализации одной функции. Графическое понимание функции включает в себя и табличную реализацию подобно математическим таблицам Брадиса. Кроме того график функции не обязан быть линией – это может быть фигура произвольных очертаний. Следовательно, аргументу может соответствовать множество результатов, лежащих на пересечении вертикали с этой фигурой – графиком функции. При такой трактовке нет ничего удивительного в постепенном накоплении или построении графика функции. Можно задать небольшое множество точек графика, а потом постепенно его пополнять. По замыслу Дж. Шварца, автора языка SETL, такая методика может выполнять роль оптимизации особо сложных вычислений.


Исторически первая парадигма программирования, появившаяся вслед за ассемблером более пятидесяти лет назад (Бекус), основана на императивном управлении и операторном (автоматном) стиле построения программ. Язык Фортран - лишь в последнее десятилетие стал несколько уступать в этой области Паскалю-Си, а на суперкомпьютерах - языкам параллельного программирования.
Появление в 70-х годах микропроцессорных средств с малым объемом памяти и сравнительно невысоким быстродействием вызвало очевидные трудности в применении привычных языков высокого уровня. Не удивительно, что поиск подходящих средств программирования сменил приоритеты в оценке свойств языков и систем программирования. На передний план вышли машинно-ориентированные языки-оболочки, поддерживающие достижение эффективности и компактности программ при достаточном уровне абстрагирования от конкретики процессоров, сравнимом с абстрагированием в языках высокого уровня. Особо ярким явлением в эти годы стал язык Forth, сохранивший многочисленных приверженцев и в наши дни, когда пресс технических характеристик изрядно помягчал.
Наиболее убедительное применение Forth получил как средство разработки специализированных систем, создаваемых по методике раскрутки, начиная с тщательно минимизированного ядра с рядом последовательных шагов расширения в рамках единой оболочки. Сам язык устроен по такому же принципу, так что такая технология пошагового программирования впитывается при изучении идей и средств системы программирования на базе Forth-а.

Программирование на Форте требует вдумчивости и аккуратности. Достижимость лаконичных форм дается ценой нестандартных индивидуальных решений, мало приспособленных к передаче программ в чужие руки. Лозунги “Программируйте все сами!” и “Не бойтесь все переписывать заново!” правильно отражают подход к программированию на Форте. Успех достигается явным максимализмом в тщательной отладке и способностью видеть задачу программирования в развитии. Активный популяризатор Форта Мур отметил: “Форт не уравнитель, а усилитель!”


Язык Форт предложен Чарльзом Маури в 1968 году. К середине 70-х Форт стал третьим по популярности после Бейсика и Паскаля, завоевавшим свои позиции при освоении микропроцессоных средств. По технике программирования Форт весьма похож на макроассемблер, только вместо системы команд над машинными словами в нем используется система операций на стеком.
Система программирования для языка Форт содержит пару интерпретатор-компилятор, причем техника компиляции весьма эффективна. Система использует единый порядок представления данных и команд в программе – все это последовательности слов. Данные располагают перед операциями по их обработке. Операция – это известное системе слово. Данные просто загружаются на стек, из которого операция их берет в соответствии с ее числом параметров.
Макропроцессоры – мощный инструмент повышения емкости действий, образующих процессы информационной обработки. Главное предназначение макросов в системах программирования – достижение гибкости и переносимости текстов программ, применяемых в разных условиях. Современные информационные системы как правило содержат макропроцессоры как инструмент настройки на различные стандарты подготовки и обработки данных.

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

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




  • макрос меняет текст программы,

  • подпрограмма меняет данные программы и логику процесса исполнения программы.

Техника выполнения макропреобразований достаточно разнообразна. Так, например, язык GPM всю работу с макросами сводит к маровызову.

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

Концептуально макротехника близка продукционному стилю программирования, языкам разметки и системам переписывания текстов, в настоящее время активно развивающимся как языки гипертекстов для разработки сайтов и информационных сервисов. Макротехника обладает родством с методами конструирования регулярных выражений, техникой сопоставления данных с образцом (Snobol, Prolog), системами переписывания и современными языками разметки (xml, TeX и др.).

Любой класс макропреобразований может использовать локальные или глобальные переменные, вложенность областей действия определений, рекурсию. Макропроцессор может быть встроен в компилятор, быть автономным инструментом системы программирования, таким как текстовый редактор, оптимизатор или отладчик, или существовать самостоятельно как универсальный инструмент общего назначения.
Значительное влияние на современное программирование оказали парадигмы функционального, декларативного и объектно-ориетнтированного программирования.
Функциональное программирование (ФП) сложилось в практике решения задач символьной обработки данных в предположении, что любая информация для компьютерной обработки может быть сведена к символьной. Слово “символ” здесь близко понятию “знак” в знаковых системах. Информация представляется символами, смысл которых может быть восстановлен по заранее известным правилам. Методы функционального программирования основаны на формальном математическом языке представления и преобразования формул, восходящим к идеям А. Чорча. Можно дать точное, достаточно полное описание основ функционального программирования и специфицировать систему программирования для поддержки и разработки разных парадигм программирования, моделируемых с помощью функционального подхода к организации деятельности.
От большинства подходов к программированию ФП отличается тремя важными принципами:

1) Природа данных

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



2) Самоописание обработки символьных выражений

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



3) Подобие машинным языкам

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



Многие реализационные находки ФП, такие как ссылочная организация памяти, “сборка мусора” для повторного использования памяти, частичная компиляция программ с интерпретацией промежуточного кода, полиморфизм, длительное хранение атрибутов объектов в период их использования и т.д. перекочевали из области исследований и экспериментов на базе Лиспа в практику реализации операционных систем и систем программирования.
В нашей стране программирование мало соприкоснулось функциональным программированием, хотя знакомство с Лиспом состоялось из первых рук. Джон Мак-Карти в конце 1968 года познакомил Москву и Новосибирск с Лиспом, что побудило к реализации отечественных версий языка.
К середине семидесятых годов именно на Лиспе решались наиболее сложные в практике программирования задачи из области дискретной и вычислительной математики, системного, экспериментального и теоретического программирования, лингвистики, химии, биологии, медицины и инженерного проектирования. Пример - AutoCAD - система автоматизации инженерных расчетов, дизайна и комплектации изделий из доступного конструктива.
Функциональные языки программирования достаточно разнообразны. Существует и активно применяется более трехсот диалектов Лиспа и родственных ему языков.
Примеры:
CMUCL - свободно-распространяемая реализация стандарта common lisp с эффективной компиляцией, осуществляемой как в объектный код, так и в байт-код.
Рефал. В отличие от ЛИСПа, основу РЕФАЛа составляет сопоставление с образцом. Благодаря этому типовая программа на РЕФАЛе вдвое-втрое короче по объему, чем аналогичная программа на языке ЛИСП, и более удобочитаема. От ПРОЛОГа РЕФАЛ отличает концептуальная простота. Его сопоставление с образцом работает в прямом направлении (в ПРОЛОГе в обратном - начиная от цели).
ML (Meta Language, изначальное предназначение - метаязык для представления систем автоматизации доказательств) имеет важную особенность: полиморфную систему типов данных, разработанную Робином Милнером. Подобная система была раньше предложена Роджером Хиндли и сейчас часто называется системой типов Хиндли-Милнера. Наличие механизма вывода типов позволило избавить программиста от необходимости явно описывать типы функций и в то же время производить строгий контроль типов. ML не чисто функциональный язык, он включает и императивные инструкции. ML развивался и включил в себя многие особенности других функциональных языков. Появилось несколько диалектов, наиболее известные из которых StandardML, CAML и чисто функциональный LazyML.
Haskell. В конце 80-х не было стандарта на чисто функциональный, ленивый язык. Haskell был создан с целью занять эту нишу. Haskell “ленивый”, чисто функциональный язык. Основан на лямбда-исчислении. В функциональном стиле выражен ввод и вывод, для реализации которого использована концепция монад. В языке широко используется сопоставление с образцом, что приближает его к декларативным языкам.
Dylan. Dylan является попыткой компромисса между функциональным и ОО-подходом. Вследствие чего центральным объектом являются обобщенные функции (generic functions). Язык обладает предопределенной библиотекой, включающей в себя систему исключений, набор функций высшего порядка, средства самоанализа и др.



Erlang. Создан отделением компании Erricson, однако, является продуктом с открытым кодом. Этот функциональный язык специально создан для поддержки распределенной обработки, параллельности и обработки ошибок. Язык предназначен для систем реального времени и активно используется Erricson при создании телекоммуникационных систем.
В рамках проекта .Net выполнено большое число реализаций весьма различных функциональных языков программирования, в их числе Haskell, Sml, Scheme, Mondrian, Mercury, Perl, Oberon, Component Pascal, разрабатывается F# - новый язык функционального программирования. Еще большее разнообразие предлагает проект DotGNU, пытающийся отстоять приоритет в области разработки переносимого ПО. Развиваются линии учебного и любительского программирования и методично осваивается техника выстраивания иерархии абстрактных машин при определении языков программирования.
1   ...   9   10   11   12   13   14   15   16   17

  • Парадигмы программирования
  • Машинно-ориентированное
  • Языки высокого уровня
  • Макропроцессоры
  • Функциональное программирование (ФП)
  • CMUCL