Concepts, Techniques and Models of Computer Programming / Концепции, Техники и Модели Компьютерного Программирования: Предисловие

← →
Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

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

Charlz_Klug 16.03.14 в 18:27

0

"Язык программирования подобен естественному, человеческому языку в том плане, что позволяет создавать определённые метафоры, образы и способы мышления."
- "Переворот в сознании: дети, компьютеры и плодотворные идеи" [141], Сеймур Пейперт (1980)

Charlz_Klug 17.03.14 в 13:44

0

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

Charlz_Klug 17.03.14 в 13:52

0

Мы сфокусировались на концепциях и техниках программирования, а также на их использовании, а не на языках программирования. Концепции представлены в терминах вычислительных моделей. Вычислительная модель - это формальная система, которая определяет как должны выполняться вычисления. Существует множество способов определения вычислительных моделей. Поскольку эта книга разрабатывалась с учётом на практику, то очень важно чтобы вычислительная модель приносила прямую пользу программисту. Далее мы будем определять её в терминах важных для программистов концепций: типы данных, операции и язык программирования. Термин вычислительная модель уточняет неточное понятие "парадигмы программирования". Во всей книге рассказывается о вычислительных моделях, а не парадигмах программирования. Иногда мы будем использовать фразу "модель программирования". Это относится к тому, что необходимо программисту: техники программирования и принципы проектирования стали возможны благодаря вычислительным моделям.

Charlz_Klug 18.03.14 в 11:19

0

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

Charlz_Klug 18.03.14 в 11:26

0

Каждая вычислительная модель основана на простом центральном языке который называется языком ядра (kernel language). Языки ядра вводятся постепенно, добавляя одну концепцию к другой. Это даёт нам возможность показать глубокую взаимосвязь между различными моделями. Часто простое добавление одной новой концепции переворачивает мир в программировании. Например, добавление разрушающих присваиваний (явное состояние) к функциональному программированию даёт нам объектно-ориентированное программирование.

Charlz_Klug 18.03.14 в 17:30

0

Как мы решаем какую концепцию следует добавить при переходе от одной модели к другой? Мы много раз коснёмся этого вопроса на протяжении этой книги. Главным критерием является принцип творческого расширения. Грубо говоря новая концепция добавляется тогда, когда программы становятся сложными из-за технических причин и тем самым отдаляются от решаемых задач. Добавление концепции к языку ядра позволяет сохранять простоту программы, при условии если концепция была выбрана верно. Более подробно это объясняется в Приложении D. Этот принцип лежит в прогрессии языков ядра, представленных в книге.

Charlz_Klug 18.03.14 в 17:39

0

Приятная особенность в подходе языка ядра в том, что он даёт нам возможность использовать вместе различные модели в одной программе. Обычно это называется мультипарадигменным программированием. Это вполне естественно, поскольку означает просто использование нужной концепции для проблемы, вне зависимости от того, из какой вычислительной модели она появилась. Мультипарадигменное программирование - это старая идея. Например, архитекторы Lisp и Scheme давно придерживаются подобных взглядов. Однако, в этой книге мультипарадигменное программирование применяется более глубже и шире, чем было до сих пор.

Charlz_Klug 18.03.14 в 17:48

0

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

Charlz_Klug 18.03.14 в 17:56

0

Упомянутые языки

Charlz_Klug 18.03.14 в 17:57

0

В этой книге мы упомянули много языков программирования и связали их конкретными вычислительными моделями. Например, Java и Smalltalk основаны на объектно-ориентированной модели. Haskell и Standard ML основаны на функциональной модели. Prolog и Mercury основаны на логической модели. Но не все интересные языки можно классифицировать подобным образом. Отметим некоторые языки имеющие свои особенности. Например, Lisp и Scheme пионеры во многих концепциях, представленных здесь. Erlang - это функциональный, по сути параллельный и поддерживающий отказоустойчивое распределённое программирование язык программирования.

Charlz_Klug 18.03.14 в 18:05

0

Выделим четыре языка как представителей важных моделей вычислений: Erlang, Haskell, Java и Prolog. Мы идентифицируем вычислительные модели каждого языка в терминах единой системы этой книги. Если вы хотите получить более подробную информацию об этих языках, то обратитесь к соответствующей литературе. В связи с ограниченностью объёма книги мы не можем упомянуть здесь все интересные языки. Отсутствие упоминания в этой книге какого-либо языка ни в коем случае не может служить критерием оценки.

Charlz_Klug 18.03.14 в 18:14

0

Цели книги

Charlz_Klug 19.03.14 в 15:45

0

Обучение программированию

Charlz_Klug 19.03.14 в 15:46

0

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

Charlz_Klug 19.03.14 в 15:48

0

Что такое программирование?

Charlz_Klug 19.03.14 в 15:49

0

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

Charlz_Klug 19.03.14 в 15:55

0

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

Charlz_Klug 19.03.14 в 16:11

0

И наука и технология

Charlz_Klug 19.03.14 в 16:11

0

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

Charlz_Klug 19.03.14 в 16:21

0

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

Charlz_Klug 19.03.14 в 16:28

0

Больше чем ремесло

Charlz_Klug 20.03.14 в 10:28

0

Несмотря на многие попытки введения научной базы, программированию почти всегда обучают как ремеслу. Обычно обучение велось в контексте одного (или нескольких) языков программирования (например, Java, дополненная Haskell, Scheme или Prolog). Исторические события происходящие при развитии какого-либо конкретно взятого языка тесно переплетаются с фундаментальными концепциями и их нельзя отделить друг от друга. Возникает путаница между инструментами и концепциями. Что более важно различные школы программирования основываются на различных видениях программирования, называемых "парадигмами": объектно-ориентированное, логическое, функциональное и т.д. Каждая школа обучает своей собственной науке. Программирование было потеряно как единая дисциплина.

Charlz_Klug 20.03.14 в 10:41

0

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

Charlz_Klug 20.03.14 в 10:47

0

В результате программы страдают от бедной архитектуры. Мы даём примеры на основе Java, но подобная проблема существует во всех языках в разной степени. Параллелизм в Java сложен для использования и дорог в плане вычислительных ресурсов. Из-за этих трудностей, программисты обученные на Java делают вывод что параллелизм - это фундаментально сложная и дорогостоящая концепция. Спецификации программ строятся вокруг сложностей, и часто в искажённом виде. Но эти трудности вообще не фундаментальны. Существуют формы параллелизма, которые являются очень полезными и лёгкими в программировании в виде последовательных программ (например, потоковое программирование, на примере Unix pipe). Кроме того, возможно реализовать нити, базовую единицу параллелизма, почти такие же дешёвые, как и вызов процедуры. Если программиста обучили параллелизму правильным способом, то он или она может определять что ему нужно и программировать в системах без ограничений на параллелизм (включая улучшенные версии Java).

Charlz_Klug 20.03.14 в 11:04

0

Подход язык ядра

Charlz_Klug 20.03.14 в 14:29

0

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

Charlz_Klug 20.03.14 в 14:48

0

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

Charlz_Klug 21.03.14 в 14:35

0

Упрощение сложного явления на более простые составные части - характерно для научного метода. Этот результативный подход используется во всех науках. С помощью такого подхода можно достичь глубокого понимания явлений, и этим достигается возможность предсказывать события. Например, с помощью науки мы можем проектировать любые мосты (сделанные из дерева, железа, других материалов или из их сочетаний) и предсказывать их поведение в терминах более простых концепций, таких как сила, энергия, напряжение, и других законов [62].

Charlz_Klug 21.03.14 в 14:44

0

Сравнение с другими подходами

Charlz_Klug 21.03.14 в 14:44

0

Сравним подход язык ядра с тремя другими способами преподавания прочного и широкого научного фундамента программирования:

Charlz_Klug 21.03.14 в 14:46

0

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

Charlz_Klug 21.03.14 в 14:55

0

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

Charlz_Klug 21.03.14 в 15:00

0

Мультипарадигменные языки - это языки, вобравшие в себя несколько программных парадигм. Например, Scheme - это и функциональный и императивный ([38]) язык, а Leda имеет элементы функционального, объектно-ориентированного и логического ([27]) языка. Полезность мультипарадигменного языка зависит от того насколько в него интегрированы различные парадигмы.

Charlz_Klug 21.03.14 в 15:04

0

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

Charlz_Klug 21.03.14 в 15:12

0

Проектирование абстракций

Charlz_Klug 22.03.14 в 17:31

0

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

Charlz_Klug 22.03.14 в 17:41

0

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

Charlz_Klug 22.03.14 в 17:47

0

1 Также абстракциями могут быть карандаши, гайки, болты, провода, транзисторы, корпорации, песни и дифференциальные уравнения. Абстракции - это не обязательно материальные объекты.

Charlz_Klug 22.03.14 в 17:50

0

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

Charlz_Klug 22.03.14 в 17:57

0

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

Charlz_Klug 22.03.14 в 18:08

0

Для достижения второй цели мы следуем такому подходу. Мы начинаем с концепций программирования, являющихся сырым материалом для строительства абстракций. Мы вводим большое количество известных на сегодня концепций, в частности лексическая область видимости, высокоуровневое программирование, композиционность, инкапсуляция, параллелизм, исключения, ленивое выполнение, безопасность, явное состояние, наследование и недетерминированный выбор. Для каждой концепции мы даём техники построения абстракций. Мы даём большое количество примеров для последовательных, параллельных и распределённых абстракций. Мы даём некоторые общие законы построения абстракций. Многие из этих законов имеют свои аналоги в других прикладных науках, поэтому, такие книги как [69], [55] и [62] могут быть источником вдохновения для программистов.

Charlz_Klug 22.03.14 в 18:21

0

Главные особенности

Charlz_Klug 22.03.14 в 18:21

0

Педагогический подход

Charlz_Klug 22.03.14 в 18:22

0

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

Charlz_Klug 22.03.14 в 18:23

0

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

Charlz_Klug 23.03.14 в 09:29

0

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

Charlz_Klug 23.03.14 в 09:37

0

Как и Структура и Интерпретация Компьютерных Программ за авторством Абельсона, Сассмана и Сассмана (Structure and Interpretation of Computer Programs, by Abelson, Sussman, & Sussman) [1, 2], наша книга в основном использует подход основанный на вычислении. Концепции иллюстрируются с помощью программных фрагментов, которые можно запускать на сопутствующем программном пакете, Система Программирования Моцарт [129]. Программы конструируются в стиле строительных блоков, из которых составляются базовые концепции, позволяющие в свою очередь создавать более сложные концепции. Последние главы содержат немного логических рассуждений, использующихся для определения спецификаций и использование инвариантов для рассуждения о программах с состояниями.

Charlz_Klug 23.03.14 в 09:49

0

Используемые формализмы

Charlz_Klug 23.03.14 в 09:50

0

Книга использует единый формализм для представления всех вычислительных моделей и программ, а именно язык Oz и его вычислительная модель. Если более точно, вычислительные модели этой книги - это тщательно отобранное подмножество Oz. Почему мы выбрали Oz? Главная причина - это хорошая поддержка подхода языка ядра. Другая причина - это существование Системы Программирования Mozart.

Charlz_Klug 23.03.14 в 09:56

0
Минутку...

Следующая страница →