Участник:IvanZakharyaschev/Виртуальные машины как цели в make: различия между версиями

Материал из ALT Linux Wiki
м (ссылку на критику поставил после сообщения о пользе)
м (более явно сказал про ошибку во время выполнения)
 
Строка 85: Строка 85:
допустит построить некую конструкцию/программу (на основе вашей
допустит построить некую конструкцию/программу (на основе вашей
библиотеки), а оно не будет соответствовать "правильным", допустимым
библиотеки), а оно не будет соответствовать "правильным", допустимым
действиям в модели.
действиям в модели, а значит, будет приводить к ошибке во время выполнения.


Хочу рассказать о денотационном подходе на примере своего небольшого
Хочу рассказать о денотационном подходе на примере своего небольшого

Текущая версия от 14:21, 25 сентября 2018

title
Работа с виртуальными машинами как с целями-файлами в make. (Небольшой рассказ о денотационном подходе к программированию на примере этой задачи.)
keywords
  • денотационный подход к программированию
  • денотативное программирование
  • функциональное программирование
  • Makefile
  • виртуальные машины qemu
  • автоматизация тестирования
annotation

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

URL (рабочие материалы)

http://git.altlinux.org/people/imz/public/puppetry2-Rules.git (vm-for-roles.mk)

Введение

make

make -- широко известное средство программирования с давней историей, специально предназначенное для записи правил наподобие правил сборки программ. Программа для make обычно помещается в Makefile.

Денотационный подход к проектированию библиотек и программ

Денотационный подход к проектированию (denotational design) библиотек и программ известен из практических работ и сообщений "функционального" программиста Conal Elliott (...). Также задолго до него Peter Landin (1966) описывал похожую идею и называл это "денотативным программированием".

По мнению Conal Elliott денотационный подход помогает в написании хороших программ. (См. также критическое обсуждение, начатое Roman Cheplyaka -- https://www.reddit.com/r/haskell/comments/2qvbhp/denotational_design_does_not_work/ .)

Также формулировки касательно "денотативного программирования" из Landin (1966) рассматриваются некоторыми как уточнение расплывчатого понятия "функционального программирования", другими словами -- как формулировка того хорошего, что люди ожидают от чистого "функционального программирования". (John Backus (1977) made a similar observation in section 9 of his seminal Turing award lecture.)

Мой небольшой опыт

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

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

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

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

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

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