История развития программного обеспечения

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

Доклад посвящен исследованию парадигм программирования. Проанализированы особенности языков программирования разного уровня от ассемблера до языков параллельного программирования. Дано сравнительное описание реализационной семантики основных парадигм и ряда известных языков программирования. Предложена схема описания и выявления прагматических аспектов при определении семантики языка программирования. В качестве иллюстрации использованы фрагменты языков программирования разного уровня, относящиеся к парадигмам машинно-ориентированного, системного, императивного, функционального, логического, объектно-ориентированного и высокопроизводительного программирования.
Работа поддержана грантом РФФИ № 08-01-00899-а.

1. Введение

Первые парадигмы автоматного и императивного стандартного программирования  (СП) сформировались как кодирование готовых алгоритмов, разработанных и отлаженных в докомпьютерную эпоху. Расширение класса задач, требующих разработки и отладки новых алгоритмов и приведения их в удобную для применения форму, привело к функциональному программированию (ФП). Затем пришло время языков представления знаний и соответственно логического программирования (ЛП) на основе частных рецептов для решения новых задач, где факт существования решений важнее их эффективной реализации. Профессионализация  программирования приводит к объектно-ориентированному программированию (ООП), поддерживающему повторное использование готовых решений в разных системах. На повестке дня – создание удобных языков параллельного программирования [1, 7, 14–17, 21].

Парадигмы программирования (ПП) различаются нишей в жизненном цикле программ (ЖЦП), приоритетами при оценке качества программ, выбором инструментов и методов обработки данных. Значимость используемых при этом критериев по существу зависит от условий применения программируемых решений [3, 4]. Упорядочение критериев нередко претерпевает изменения по мере развития сферы применения программ, роста квалификации пользователей, модернизации оборудования, информационных технологий (BN) и программотехники, что и приводит к появлению новых ПП. Современные возможности компьютерных сетей, суперкомпьютеров, общедоступных баз данных, массовое распространение мобильных устройств – все это меняет сферу применения ИТ и влечет кристаллизацию новых и более общих парадигм компьютерных языков (КЯ) [11–13].

В докладе представлен результат аналитического обзора ПП, и рассмотрены особенности применения ЯП, отражающие методы их реализации и класс решаемых на их основе задач [8,9]. Отмечены ключевые моменты развития ПП и закономерности реализационного освоения новых методов обработки данных. Определен ряд опорных языков для сравнительного анализа ЯП при определении их соответствия конкретным ПП [2, 5, 10, 18–20].

2. Прагматика реализационной семантики

Развитие средств и методов программирования отражает расширение сферы применения ИТ. Произошло расслоение ПП в зависимости от глубины и общности технических решений по организации процессов обработки данных. Обнаружились явные сложности классификации ЯП и определения их принадлежности конкретной ПП. [21]

При отработке методики проявления парадигматической характеристики ЯП в виде взаимодействия семантических систем1 выделены три уровня парадигм, отражающие расширение языковой поддержки ЖЦП и рост реализационной сложности определения ЯП:

  • языки низкого уровня (ЯНУ);
  • программирование на языках высокого уровня (ЯВУ);
  • подготовка программ на базе языков сверхвысокого уровня (ЯСВУ).

Проблемой является неоднозначность семантической декомпозиции сложных определений и трудоемкость определения реализационных особенностей полных интерпретаторов и компиляторов. [13]

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

Декомпозиция учебного концентра, объединенного с реализационным ядром,  определения ЯП на основные семантические системы дает не слишком сложные параметры для сравнительного анализа и установления парадигматических отношений между ЯП. Относящиеся к одной парадигме подъязыки разных языков легко сравнить на уровне структурированной таким образом операционной семантики, анализируя определения их абстрактных машин и интерпретаторов. Это позволяет с каждой парадигмой связать варианты реализационных особенностей основных семантических систем и правил их взаимодействия, что можно назвать реализационной семантикой. К основным системам реализационной семантики отнесены выполнение вычислений, работа с памятью, управление вычислениями и организация структур данных. Выделение таких систем обусловлено различиями в схеме применения операций к операндам, связанными с методами реализации систем программирования и их поддержкой на уровне аппаратуры. [3, 4]

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

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

3. Жизненный цикл программ

Первые ЯП обладали машинной ориентированностью и поддерживали  принципиально важную, но небольшую по длительности  и трудозатратам часть ЖЦП, заключающуюся в кодировании готовых алгоритмов в терминах автоматов. Появление ЯВУ расширило языковое покрытие ЖЦП для хорошо поставленных задач, имеющих алгоритмы решения над типовыми структурами данных, приспособленные для нисходящих методик программирования. Парадигма ФП посягнула на ЖЦП для задач с исследовательским компонентом и существенно расширила его языковое покрытие благодаря автоматизации работы с памятью и механизмам хранения и накопления информации о свойствах информационных объектах, полезной при отладке и модификации программ, составленных из небольших универсальных компонент, допускающих как нисходящую, так и восходящую методику разработки. ЛП распространило эти механизмы на не вполне определенные постановки задач, что дает языковую поддержку предварительному сбору фактического материала, созданию демонстрационных версий, пробному прототипированию, отчасти тестированию, что дополняет общее языковое покрытие ЖЦП при восходящей методике разработки. Появление ООП преодолело итеративность ЖЦП для задач, связанных с развивающимися областями приложения (см. Приложение).

Далее расширение языкового покрытия ЖЦП обеспечивается КЯ, возникающими в связи с ИТ, телекоммуникациями, распределенными информационными системами, электронным общением, автоматизацией и самоорганизацией управления проектами, а также специализированными языками для решения конкретных классов задач. Анализ концепций и классификация представительного свода КЯ в контексте профессиональной речевой практики в настоящее время стихийно разворачивается при формировании открытых онтологий и энциклопедий, что ставит на реальную почву решение проблемы глубинного анализа содержания обучения информатике, программированию и ИТ [1,13]

4. Языки низкого уровня

Низкоуровневое кодирование ассоциируется с одноуровневыми структурами данных, обусловленными архитектурой и оборудованием (см. [7]). При хранении данных и программ используется глобальная память. Обработка данных сводится к императивной машинно-ориентированной модели управления процессом выполнения действий, порожденных программой. Кодирование осуществляется на фоне применения вспомогательных средств, таких как блок-схемы и документирование, отчасти компенсирующих отсутствие в ЯНУ понятий уровня программистской фразеологии, а в естественных языках понятий, возникающих при такой «сверхточкой» детализации программ. В принципе достижима предельная эффективность программ, но их отладка осложнена сочетанием «низкий старт – высокий финиш» – легко достичь успеха в первых упражнениях, но трудно создать программный продукт и обеспечить его квалифицированное сопровождение.

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

5. Машинно-ориентированное программирование. Forth

При появлении микропроцессоров повысилась роль компактности программ, что обеспечило популярность стековых языков, таких как Forth [2]. Для языка  Forth основа работы с памятью – стек. Средства управления вычислениями обогащены средствами блокировки и кодирования программ, что позволяет повышать эффективность информационной обработки. Используется механизм замкнутых процедур с неявными – стековыми – параметрами. Стек реализован как указатель на текущий элемент в предположении, что перед ним расположены предшествующие элементы по порядку.

Программа – отдельный поток, использующий расширяемый словарь. Принята постфиксная запись, удобная для стековой обработки данных. Стек-ориентированная дисциплина обработки освобождает от необходимости в понятии «переменная», хотя оно при необходимости м.б. смоделировано. Интерпретатор языка Forth сортирует слова по принадлежности словарю. За корректность воздействий на стек отвечает программа.

6. Языки управления заданиями

На уровне операционной системы (ОС) информационная обработка выглядит как семейство взаимодействующих процессов, выполняемых по отдельным программам – заданиям или сценариям, размещенным в файлах. [20] Языки для ОС работают с очередями, которые могут быть представлены как строки или файлы. В памяти хранится контекст задания и его сценарий. Контекст содержит перечень доступных файлов. При управлении процессами выполнения заданий используются условия готовности и вырабатываются сигналы, символизирующие успех выполнения действий. Сигналы также хранятся в контексте. Действия могут быть организованы в конвейеры или последовательности и обусловлены успехом предшествующих действий. Очередь может быть пополнена.

Функционирование ОС обеспечивает следующие явления и критерии:

  • порождение новых файлов и процессов по ходу дела;
  • время жизни файлов и процессов произвольно – нет гарантий их существования;
  • не ограничена динамика событий.
  • содержание контекста может быть незавершенным.
  • очередь процессов с условиями готовности может перестраиваться.

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

7. Языки высокого уровня

Программирование на ЯВУ приспособлено к представлению иерархии понятий, отражающей природу понимания человеком решаемых задач и организации процессов их решения.  Используются сложные структуры данных, стереотипы техники программирования, локализуемые области видимости имен объектов и процедур их обработки, подчиненные структурно-логической модели управления, допускающей сходимость пошагового процесса отладки программ. В центре внимания – интеграция с библиотеками процедур, эффективная компиляция программ, контроль типов данных, соответствие стандартам области применения программ и технологиям быстрой разработки удобно сопровождаемых программ. Ряд проблем решается включением в ЯВУ низкоуровневых средств. Практически исчезает необходимость в блок-схемах, а методика самодокументирования и реализации справочных подсистем смягчает нагрузку на документирование.

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

Обычно высокий уровень языка обеспечивается программными средствами, но с появлением программаторов и микропрограммирования разница между программой и аппаратурой стала условной. Lisp, Pascal, Smalltalk, Algol и другие ЯВУ были реализованы как входные языки на правах машинного кода. Ассемблер Эльбрус – яркий пример отечественной реализации ЯВУ аппаратными средствами.

При анализе парадигм ЯВУ необходимо учитывать следующие их особенностями:

  • практикуются неявные формы представления отдельных понятий ради лаконизма записи программ;
  • типы данных конструируются по фиксированным в ЯП правилам;
  • взаимодействие и соответствие средств и методов, относящихся к разным семантическим системам, при их реализации в системе программирования определено по традиции и прецедентам, причем в коде оно скрыто – не структурировано;
  • эффективность программирования базируется на знании методов реализации значений и обработчиков структур данных в памяти.

При анализе парадигм ЯВУ следует отметить их обусловленность эволюцией технологий программирования: Первый ЯВУ Fortran  связан с появлением раздельной компиляции, снизившей трудозатраты на отладку благодаря выделению техники сборки модулей, что обеспечило формирование общих библиотек, а заодно и устойчивость позиций языка Fortran до наших дней. Универсальный язык Lisp дал ход машинно-независимому стилю обработки данных, рассматриваемых как символьные списки или строки – ФП. Популярность языка Си связана с технологией машинно-зависимого переноса программ путем выделения  в двухслойном языке компактного машинно-ориентированного ядра и самоописания Си-компилятора, что одновременно  обеспечило перенос программ на множество архитектур и стыковку с близкими языками, компилируемыми на тот же уровень сборки модулей. ЛП на языке Prolog показало возможности накопления и наследования частных рецептов. Появление С++ и ООП сопряжено с расширением сферы приложения информационных систем, при конструировании которых необходимо минимизировать объем повторного программирования. Представление специфических деталей парадигм при сравнении ЯВУ можно выразить в форме нормализованной предикатной формы интерпретатора, различающего сквозные понятия сравниваемых языков.

8. Стандартное, императивное программирование

Стандартное программирование (СП) рассматривает процесс обработки информации как конечную  последовательность локальных изменений состояния памяти – императивно-процедурный стиль. Для СП характерно четкое разделение понятий “программа” и “данное” с учётом статических методов контроля типов данных и оптимизации программ при компиляции. Общий механизм интерпретации стандартной программы естественно представить как автомат с отдельными таблицами имен для переменных, значения которых подвержены изменениям, и для меток и процедур, определения которых неизменны.

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

  • дисциплина логики управления с исключением переходов по меткам (goto_less_style);
  • минимизация использования глобальных переменных в пользу формальных параметров процедур (global_variable_harmful);
  • полнота условий в ветвлениях, отказ от отсутствия ветви “else”;
  • однотипность результатов, полученных при прохождении через разные пути.

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

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

Язык программирования Лисп и сложившееся на его основе ФП  реально показали свои сильные стороны более чем убедительно как инструментарий исследования и освоения новых областей применения вычислительной техники. [19]

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

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

Логическое программирование (ЛП) сводит обработку данных к выбору произвольной композиции определений (уравнений, предикатных форм), дающей успешное получение результата. Именно обработка формул является основой – вычисления рассматриваются как операция над формулой. Перебор вариантов выглядит как обход графа в глубину. [6] Имеются средства управления перебором с целью исключения заведомо бесперспективного поиска.

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

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

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

Связь методов с классами объектов позволяет вводить одноименные методы над разными классами объектов  (полиморфизм), что упрощает логику управления: на уровне текста программы можно не распознавать принадлежность классу, это сделает система программирования. Подобным образом обычно реализовано сложение 4, одинаково изображаемое для чисел, строк, векторов, множеств и т.п.

Следует обратить внимание на появление учебных ЯП (A++), поддерживающих четыре основных ПП, что показывает их взаимодополнительность и образовательное значение.

12. Языки сверхвысокого уровня

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

Для простоты изучения ЯСВУ могут выглядеть как расширение привычных ЯВУ, возможно со средствами низкоуровневого управления процессами. Появляются языковые средства поддержки полного ЖЦП, совмещенного с процессом изучения класса решаемых задач.

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

При создании языка Setl базовым ЯВУ был Fortran, конструкции которого определили вид семантических систем вычислений и управления процессами, с тем изменением, что основная структура данных не вектора, а множества, причем предельно приближенные к математической традиции классического понимания множеств. Семантика эффективной работы с памятью на уровне указателей (pointer-oriented) сопряжена с весьма абстрактной логической схемой выбора структур данных в зависимости от результатов анализа программы. Параллелизм программируется как обработка элементов множеств. Программы обработки множеств не зависят от разных методов их представления в памяти. Выразительная сила языка достаточна для его применения в качестве теоретико-множественной спецификации программ.

Программирование на языке БАРС нацелено на обеспечение высокопроизводительных вычислений и организацию асинхронных параллельных процессов. При создании языка БАРС базовым ЯВУ был язык Pascal, в те годы перерастающий из учебного в производственный язык СП. Были существенно обобщены средства структуризации данных на основе понятия комплекс, приспособленного к именованию элементов структур данных и учета кратности их использования. [11] Радикальное продвижение в повышении уровня программирования, предложенное в языке БАРС, заключается в переносе идеи типизации данных на проблему типизации схем управления.

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

Параллельное программирование на языке Sisal опирается на парадигму ФП. Замысел языка нацелен на создание конкуренции вечно живому языку Fortran и кроме того в качестве базового языка был использован язык VAL, в свою очередь многое унаследовавший от языка Pascal. От языка Fortran унаследован ряд идей по обработке и представлению векторов.

Система вычислений в языке Sisal использует понятие «мультизначение», позволяющее подобно языку APL распространять скалярные действия на данные любой структуры, а их обработку осуществлять на многопроцессорных конфигурациях. Программа строится из участков с однократными присваиваниями, что упрощает технику оптимизационных и распараллеливающих оптимизаций. Основное продвижение по технике программирования – развитие структуры циклов для их реализации на параллельных архитектурах. Введено понятие – «пространство итераций» и предложена специальная конструкция для фильтрации мультизначений, получаемых при совмещенном исполнении итераций и участков повторяемости. [5]

13. Заключение

В настоящее время актуальность проблемы классификации языков программирования и вообще компьютерных языков и информационных систем существенно возросла.

Определитель парадигмы языка программирования может содержать следующие процедуры:

  • определение уровня языка  и его ниши в жизненном цикле программ и деятельности программистов (цели и задачи), базовых языков, использованных при его создании и реализации;
  • декомпозиция семантического базиса языка на основные семантические системы с минимизацией их сложности и возможно их описание относительно базовых языков;
  • определение АМ языка и интерпретатора, формально достаточного для построения  расширений, эквивалентных исходному языку – нормализованное определение;
  • сравнение полученного определения с описаниями известных парадигм.

Примечания

1. Понятие «семантическая система» предложено С.С. Лавровым.

2.Согласно Венской методике определения ЯП эквивалентными считаются языки, сводимые к одному абстрактному синтаксису. Термин «концентр» использовал Г.А. Звенигородский при упорядочении учебных материалов. Термин «слой» предложен А.Л. Фуксманом в его технологии вертикального слоения программ.

3. Венский метод (ВМ) определения языков программирования был разработан в 1968 году в Венской лаборатории IBM под руководством П. Лукаса на основе идей, восходящих к Дж. Маккарти [18, 19].

4. И другие операции.

5. Понятие «основные семантические системы» и их состав были предложены В.Е. Котовым при разработке языка БАРС.

Приложение

Схема языкового покрытия фаз ЖЦП для задач разного уровня изученности

Изученность и сложность задач Фаза ЖЦП Поддержка ЖЦП языками программирования
  Парадигмы языков высокого уровня  
Многоуровневое абстрагирование для особо важных и сложных задач со специальными методами решения Обоснование целесообразности            
Постановка задачи           ЯСВУ
Спецификация требований            
Проектирование     ФП     ЯСВУ
Реализация ЯНУ   ФП      
Тестирование ЯНУ   ФП      
Сопровождение            
Бизнес-приложения, зависящие от динамики производственной деятельности человека Обоснование затрат            
Постановка задачи         ООП  
Спецификация требований     ФП      
Проектирование процессов   СП ФП   ООП  
Программирование и отладка   СП ФП   ООП  
Тестирование и отладка   СП     ООП  
Сопровождение            
Развитие         ООП  
Сбор фактов и накопление знаний для не вполне определенных задач Постановка задачи            
Представление СД     ФП ЛП    
Тестирование и отладка       ЛП    
Сопровождение       ЛП ООП  
Исследование и разработка новых алгоритмов и структур данных, включая создание новых КЯ Постановка исследования           ЯСВУ
Спецификация критериев           ЯСВУ
Проектирование алгоритмов     ФП      
Программирование   СП ФП      
Тестирование и отладка     ФП      
Сопровождение            
Развитие     ФП   ООП  

Реализация хорошо изученных алгоритмов для корректных задач

 

Постановка задачи           ЯСВУ
Проектирование СД   СП ФП      
Кодирование ЯНУ СП        
Отладка     ФП      
Сопровождение            

Литература

  1. Андреева Т.А., Ануреев И.С., Бодин Е.В., Городняя Л.В., Марчук А.Г., Мурзин Ф.А., Шилов Н.В.. Компьютерные языки как форма и средство представления, порождения и анализа научных и профессиональных знаний //Труды XV Всероссийской научно-методической конференции «Телематика-2008», Санкт-Петербург. 2008. – С. 77–78
  2. Баранов С.Н., Колодин М.Ю. Феномен Форта. с. 193-271 Системная информатика. Вып 4. Методы теоретического и системного программирования. - Новосибирск: "Наука". Сиб. изд. фирма, 1995. - 361 с.
  3. Городняя Л.В. Подход к ограничению новизны в программистских экспериментах. - Препринт N 357. Надзаг ВЦ СО АН СССР, Новосибирск, 1982, с.29
  4. Городняя Л.В. Функциональный подход к описанию парадигм программирования.
  5. Евстигнеев В.А., Городняя Л.В., Густокашина Ю.В. "Язык функционального программирования SISAL",  // Интеллектуализация и качество программного обеспечения, Новосибирск, 1994, с. 21-42
  6. Евстигнеев В.А., Касьянов В.Н. Графы в программировании: обработка, визуализация и применение. - С-Пб.: "ЕХП-Петербург", 2003, - 1104 с.
  7. Ершов А.П., Кожухин Г.И., Поттосин И.В. Руководство к пользованию системой АЛЬФА. Новосибирск: "Наука", 1968, 179 с.
  8. Ершов А.П. Смешанные вычисления: потенциальные приложения и проблемы исследования.- Тезисы докладов и сообщений. Всесоюзная конференция "Методы математической логики в проблемах искусственного интеллекта и систематическое программирование", ч.2, Вильнюс, 1980, с. 26-55
  9. Захаров Л.А., Покровский С.Б., Степанов Г.Г., Тен С.В. Многоязыковая транслирующая  система. Новосибирск, 1987. 151 с.
  10. Структурное проектирование и конструирование программ. - М. «Мир» , 1979. - 409 с.
  11. Котов В.Е. МАРС: архитектуры и языки для реализации параллелизма. с.174-194 Системная информатика. Вып 1. Проблемы современого программирования. -  Новосибирск: Наука. Сиб. отд-ние, 1991. - 293 с.
  12. Лавров С.С. Использование вычислительной техники, программирование и  искусственный  интеллект (перспективы развития). - М.: Микропроцессорные средства и системы.  N.3, 1984, - с. 3-9
  13. Марчук А.Г., Городняя Л.В., Мурзин Ф.А., Шилов Н.В. Классификация компьютерных языков: состояние, проблемы, перспективы // Труды международной конференции “Космос, астрономия и программирование" (Лавровские чтения). //Санкт-Петербургский государственный университет, Санкт-Петербург, 2008.С. 15-22.
  14. Мейер Б. Основы объектно-ориентированного проектирования.  – М.: Интернет-Университет Информационных технологий. -: http://www.intuit.ru, 2007
  15. Новосибирская школа программирования. (Перекличка времен) /Под ред. проф.  И.В.Поттосина и к.ф.-м.н. Л.В.Городней. -  Новосибирск, 2004. 243 с.
  16. Поттосин И.В. Система СОКРАТ: Окружение программирования для встроенных систем.-Новосибирск, 1992.-20с. (Препр./РАН. Сиб. отд-ние. ИСИ; N11)
  17. Становление Новосибирской школы программирования. /Под ред. проф. И.В.Поттосина. Новосибирск, 2001, 195 с.
  18. Lucas P., Lauer P., Stigleitner H. Method and Notation for the Formal Definition of Programming Languges. IBM Laboratory, Venna, TR 25.087, 1968
  19. McCarthy J. LISP 1.5 Programming Mannual.- The MIT Press., Cambridge, 1963, 106p.
  20. Ritchie D.M., Tompson K. The UNIX Time-Sharing System, Bell System Technical Journal,     v.57, N 6, 1978, pp. 1905-1929. http://en.wikipedia.org/wiki/Programming_paradigms

Об авторе: Институт систем информатики им. А.П. Ершова СО РАН, Новосибирск, lidvas@ngs.ru
Статья опубликована в материалах семинара "История информатики в Сибири", прошедшего в рамках VII международной конференции памяти академика А.П.Ершова "Перспективы систем информатики", Новосибирск, 15-19 июня 2009 г.
Статья помещена в музей 14.10.2009 года.