Literate Programming

Presenter Notes

Literate Programming

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

PiterPy 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 @
 3 Напишем простейшую программу на \texttt{Python}:
 4 
 5 <<hello.py>>=
 6 <<header>>
 7 def main():
 8     <<приветствие>>
 9 <<execution code>>
10 
11 @
12 Текст будем писать так:
13 <<приветствие>>
14 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