Literate Programming

Presenter Notes

Literate Programming

Алексей Пирогов (@alex_pir)

Kazan Python DevDay 2014

Presenter Notes

LP - что это, собственно?

LP / Грамотное программирование:

  • Методология разработки ПО
  • Придумана Д.Кнутом в 1981г.
  • Применима на любом уровне абстракции
  • language agnostic

Presenter Notes

Суть

Presenter Notes

Суть

Вкратце:

  • Пишем
    • Структурированный документ
    • На псевдокоде
  • Получаем
    • Нормальные исходники
    • Понятную документацию
    • Готовую научную работу ;)

Presenter Notes

Документ

Документ

  • Строится согласно логике повествования
  • Внешне похож на эссе по CS
  • Никак не зависит от структуры исходного кода
  • Представляет собой "взаимозависимую сеть концепций" (Web)

Presenter Notes

Псевдокод

Описание кода программы строится из

  • Терминов, которые
    • Понятны внешне
    • Объясняются в том месте текста, где это наиболее уместно
  • Собственно, кусков кода на целевом языке

Presenter Notes

Исходники

Исходники

  • Компонуются так, как это принято для целевого языка
  • Распределяются по файлам/папкам так, как...
  • Никак не ограничены структурой документа

Presenter Notes

Документация

Документация

  • Актуальна, т.к. изменения в коде
    1. Вносятся в документ
    2. Появляются в регенерированном исходнике
  • Понятна - в этом и цель подхода!
  • Никак не ограничена структурой программы
  • Не представляет собой справочник по коду (обычно)

Presenter Notes

Глоссарий

Web = Tangle + Weave

  • Исходный код - запутывается (tangle)
  • Документация - связывается (weave)

Presenter Notes

Применение

Presenter Notes

Реализации

  • Классические LP-системы:
    • WEB: Pascal + TeX
    • CWEB: C/C++/Java + TeX/HTML
    • noweb: любой ЯП + TeX/HTML
    • PyWeb: Python + LaTeX/rST/HTML

Presenter Notes

Реализации

  • "Обратные" LP-системы:
    • Codnar: Ruby + HTML
  • "Сочувствующие":
    • Leo Editor: outline-редактор с поддержкой LP
    • плагины для Vim
    • режимы для Emacs

Presenter Notes

Примеры

Presenter Notes

noweb

 1 @\section{Hello world!}
 2 Напишем простейшую программу на \texttt{Python}:
 3 
 4 <<hello.py>>=
 5 <<header>>
 6 def main():
 7     <<приветствие>>
 8 <<execution code>>
 9 
10 @Текст будем писать так:
11 <<приветствие>>
12 print "Hello!"

Presenter Notes

PyWeb

 1 Hello
 2 -----
 3 Наша программа будет иметь вид
 4 @o hello.py @{#!/usr/bin/env python
 5 # coding: utf-8
 6 @<main function@>
 7 @}
 8 
 9 _Главная_ функция:
10 @d main function @{
11 def main():
12     print "Hello!"
13 @}

Presenter Notes

Leo Editor

live demo

Presenter Notes

Question Time!

Presenter Notes

Fin

Presenter Notes