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

редактировать
Грамотное программирование Дональда Кнута - это основополагающая книга по грамотному программированию

Грамотное программирование парадигма программирования, представленная Дональдом Кнутом, в которой компьютерной программе дается объяснение ее логики на естественном языке, например Английский, с вкраплениями фрагментов из макросов и традиционного исходного кода, из которого может быть сгенерирован компилируемый исходный код. Этот подход используется в научных вычислениях и в науке о данных обычно для воспроизводимых исследований и открытого доступа. Инструменты грамотного программирования используются сегодня миллионами программистов.

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

Инструменты грамотного программирования (LP) используются для получения двух представлений из грамотного исходного файла: одно пригодное для дальнейшей компиляции или выполнение компьютером, "запутанный" код, а другое для просмотра как форматированная документация, которая считается «сотканной» из грамотного источника. В то время как первое поколение инструментов грамотного программирования было специфичным для компьютерного языка, более поздние версии не зависят от языка и существуют выше языков программирования.

Содержание
  • 1 История и философия
  • 2 Концепция
    • 2.1 Преимущества
    • 2.2 Контраст с созданием документации
    • 2.3 Критика
  • 3 Рабочий процесс
  • 4 Латекс
    • 4.1 Создание макросы
    • 4.2 Программа как веб-макросы - это не просто названия разделов
    • 4.3 Порядок человеческой логики, а не логики компилятора
    • 4.4 Запись хода мыслей
    • 4.5 Замечательные примеры
  • 5 Практика грамотного программирования
  • 6 См. Также
  • 7 Ссылки
  • 8 Дополнительная литература
История и философия

Грамотное программирование было впервые представлено Кнутом в 1984 году. Основная цель этого подхода заключалась в том, чтобы относитесь к программе как к литературе, понятной людям. Этот подход был реализован в Стэнфордском университете в рамках исследования алгоритмов и цифровой типографики. Эта реализация была названа Кнутом «WEB », так как он считал, что это было одно из немногих трехбуквенных слов английского языка, которые еще не применялись в вычислениях. Однако это правильно напоминает сложную природу программного обеспечения, деликатно собранного из простых материалов.

Концепция

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

A препроцессор используется для замены произвольных иерархий или, скорее, «взаимосвязанных« паутины »макросов», для создания компилируемого исходного кода с помощью одной команды («клубок»), а документации - другой («переплетение»). Препроцессор также предоставляет возможность записывать содержимое макросов и добавлять к уже созданным макросам в любом месте текста грамотного исходного файла программы, тем самым избавляя от необходимости учитывать ограничения, накладываемые традиционными языками программирования. или чтобы прервать течение мысли.

Преимущества

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

Кнут также утверждает, что грамотное программирование может приводит к легкому переносу программного обеспечения в несколько сред и даже приводит в качестве примера реализацию TeX.

В отличие от генерации документации

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

Это заблуждение привело к утверждениям, что инструменты для извлечения комментариев, такие как Perl Plain Old Documentation или Java Javadoc системы, являются «инструментами грамотного программирования». Однако, поскольку эти инструменты не реализуют «паутину абстрактных концепций», скрывающуюся за системой макросов естественного языка, и не предоставляют возможность изменять порядок исходного кода с последовательности, навязанной машиной, на последовательность, удобную для человеческого разума., их нельзя должным образом назвать инструментами грамотного программирования в том смысле, который задал Кнут.

Критика

В 1986 году Джон Бентли попросил Кнута продемонстрировать концепцию грамотного программирования с помощью написание программы в WEB. Кнут составил 8-страничный монолитный список, который был опубликован вместе с критикой Дугласа Макилроя из Bell Labs. Макилрой похвалил сложность решения Кнута, его выбор структуры данных (hash trie Фрэнка М. Ляна), но отметил, что более практичное, гораздо более быстрое в реализации, отладке и изменении решение проблемы занимает всего шесть строки сценария оболочки путем повторного использования стандартных Unix утилит. Макилрой заключил:

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

Макилрой позже признал, что его критика была несправедливой, поскольку критиковал программу Кнута по техническим причинам, в то время как цель Кнута заключалась только в том, чтобы продемонстрировать грамотную технику программирования. В 1987 году Communications of the ACM опубликовала следующую статью, в которой проиллюстрировано грамотное программирование с помощью программы C, сочетающей художественный подход Кнута с инженерным подходом Макилроя с критикой Джона Гилберта.

Рабочий процесс

Реализация грамотного программирования состоит из двух этапов:

  1. Плетение: создание исчерпывающего документа о программе и ее обслуживании.
  2. Запутывание: создание исполняемого кода машины

Плетение и запутывание - это сделано из одного источника, чтобы они согласовывались друг с другом.

Латекс

Классическим примером грамотного программирования является грамотная реализация стандартной программы подсчета слов Unix wc . Кнут представил версию этого примера CWEB в главе 12 своей книги «Грамотное программирование». Позже тот же пример был переписан для инструмента грамотного программирования noweb. Этот пример дает хорошую иллюстрацию основных элементов грамотного программирования.

Создание макросов

Следующий фрагмент программы wcliterate показывает, как произвольные описательные фразы на естественном языке используются в грамотной программе для создания макросов, которые действуют как новые «операторы» на грамотном языке программирования и скрыть фрагменты кода или другие макросы. Обозначение разметки состоит из двойных угловых скобок («<<...>>»), обозначающих макросы, и символа «@», обозначающего конец раздела кода в файле noweb. Символ «<<*>>» обозначает «корневой», самый верхний узел, с которого грамотный инструмент программирования начнет расширять сеть макросов. Фактически, записать расширенный исходный код можно из любого раздела или подраздела (т.е. фрагмента кода, обозначенного как «<>=» со знаком равенства), поэтому один грамотный программный файл может содержать несколько файлов с машинным исходным кодом.

Цель wc - подсчитывать строки, слова и / или символы в списке файлов. Количество строк в файле........ / дополнительные пояснения / Итак, это обзор файла wc.c, который определяется программой noweb wc.nw: <<*>>= <
><><><><>@ Мы должны включить стандартные определения ввода-вывода, так как мы хотим отправлять форматированный вывод на stdout и stderr. <
>= #include @

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

Программа как веб-макросы - это не просто имена разделов

Макросы - это не то же самое, что «имена разделов» в стандартной документации. Макросы грамотного программирования могут скрывать за собой любой фрагмент кода и использоваться внутри любых операторов машинного языка низкого уровня, часто внутри логических операторов, таких как «if», «while» или «дело». Это иллюстрируется следующим фрагментом программы wcliterate.

Существующий блок, который производит подсчет, на самом деле был одним из самых простых для написания. Мы смотрим на каждый символ и меняем состояние, если он начинается или заканчивается словом. <>= в то время как (1) {<>c = * ptr ++; if (c>'' c < 0177) { /* visible ASCII codes */ if (!in_word) { word_count++; in_word = 1; } continue; } if (c == '\n') line_count++; else if (c != ' ' c != '\t') continue; in_word = 0; /* c is newline, space, or tab */ } @

На самом деле, макросы могут означать любой произвольный фрагмент кода или другие макросы и, таким образом, являются более общими, чем "фрагменты" сверху вниз или снизу вверх, или чем подразделение. Кнут говорит что, когда он понял это, он начал думать о программе как о паутине из различных частей.

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

В неграмотной программе, помимо бесплатной В порядке их отображения фрагменты за макросами, когда-то введенные с помощью «<<...>>=», могут быть увеличены позже в любом месте файла, просто написав «<>=» и добавив к нему дополнительное содержимое, как показано в следующем фрагменте ( "Плюс" добавлен модулем форматирования документа для удобства чтения и отсутствует в коде).

Общие итоги должны быть инициализированы нулем в начале программы. Если бы мы сделали эти переменные локальными для главной, мы бы имели чтобы выполнить эту инициализацию явно; однако глобальные переменные C автоматически обнуляются (или, скорее, `` статически обнуляются ''. (Получили?) <>+ = long tot_word_count, tot_line_ count, tot_char_count; / * общее количество слов, строк, символов * / @

Запись хода мыслей

Документация для грамотной программы создается как часть написания программы. Вместо комментариев, представленных в виде примечаний к исходному коду, грамотная программа содержит объяснение понятий на каждом уровне, при этом понятия более низкого уровня отложены до соответствующих мест, что позволяет лучше передавать мысли. Фрагменты грамотного wcвыше показывают, как переплетаются объяснение программы и ее исходного кода. Такое изложение идей создает поток мысли, подобный литературному произведению. Кнут написал "роман", в котором объясняется код интерактивной фантастики игры Colossal Cave Adventure.

Замечательные примеры

  • Axiom, созданной с помощью блокнота, системы компьютерной алгебры разработан IBM. Сейчас ее разрабатывает Тим ​​Дейли, один из разработчиков блокнота, Axiom полностью написана как грамотная программа.
Практика грамотного программирования

Первой опубликованной средой грамотного программирования была WEB, представленный Кнутом в 1981 году для его системы набора текста TeX ; он использует Pascal в качестве основного языка программирования и TeX для набора документации. Полный комментированный исходный код TeX был опубликован в книге Knuth's TeX: The program, том B его 5-тома Computers and Typesetting. Кнут в частном порядке использовал грамотную систему программирования под названием DOC еще в 1979 году. Его вдохновили идеи Пьера-Арнуля де Марнеффа. Бесплатная CWEB, написанная Кнутом и Сильвио Леви, является WEB-адаптированной для C и C ++, работает в большинстве операционных систем и может создавать TeX и Документация в формате PDF.

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

ИмяПоддерживаемые языкиНаписано наязыке разметкиКомментарии
WEB Паскаль Паскаль TeX Первый опубликованный грамотный среда программирования.
CWEB C ++ и C C TeX Is WEB адаптировано для C и C ++.
NoWEB AnyC, AWK и Icon LaTeX, TeX, HTML и troff Он хорошо известен своей простотой и он позволяет форматировать текст в HTML, а не в системе TeX.
Грамотный ЛюбойD Markdown Поддерживает уравнения TeX. Совместимость с Vim (literate.vim )
FunnelWeb AnyC HTML и TeX Он имеет более сложную разметку, но имеет гораздо более гибкие параметры
NuWEB ЛюбойC ++ LaTeX Он может преобразовывать один источник LP в любое количество файлов кода. Он делает это за один вызов; в нем нет отдельных команд переплетения и запутывания. В нем нет расширяемость noweb
pyWeb AnyPython ReStructuredText Уважает отступы, которые позволяют использовать такие языки, как Python, хотя вы можете использовать его для любых язык программирования.
Молли ЛюбойPerl HTML Стремится модернизировать и масштабировать его с помощью «складывающегося HTML» и «виртуальных представлений» в коде. Он использует разметку «noweb» для грамотных исходные файлы.
CodnarRuby Это инструмент обратного грамотного программирования, доступный в виде Ruby Gem. Вместо машиночитаемого исходного кода, извлекаемого из источников грамотной документации, извлекается грамотная документация из обычных машиночитаемых файлов исходного кода.
Emacs org-mode ЛюбойEmacs Lisp Обычный текст Требуется Babel, который позволяет встраивать блоки исходного кода из нескольких языков программирования в один текстовый документ. Блоки кода могут обмениваться данными друг с другом, отображать изображения в строке или анализироваться в чистый исходный код с использованием справочного синтаксиса noweb.
CoffeeScript CoffeeScript CoffeeScript, JavaScript Markdown CoffeeScript поддерживает «грамотный» режим, который позволяет компилировать программы из исходного документа, написанного на Markdown, с отступами блоков кода.
Maple рабочие листы Maple (программное обеспечение) XML Рабочие листы Maple представляют собой платформо-независимую среду программирования, которая объединяет текст и графику с живым кодом для символьных вычислений. «Рабочие листы Maple». www.maplesoft.com. Проверено 30 мая 2020 г.
Блокноты Wolfram Язык Wolfram Language Язык Wolfram Language Блокноты Wolfram - это не зависящий от платформы метод грамотного программирования, сочетающий текст и графику с живым кодом.
Playgrounds Swift (язык программирования) Предоставляет интерактивную среду программирования, которая оценивает каждый оператор и отображает результаты в реальном времени при редактировании кода. Игровые площадки также позволяют пользователю добавлять язык разметки вместе с кодом, который обеспечивает заголовки, встроенное форматирование и изображения.
Jupyter Notebook, ранее IPython Notebook Python и любой с ядром JupyterHTML Работает в формате блокнотов, которые объединяют заголовки, текст (включая LaTeX), графики и т. д. с написанным кодом.
Julia (язык программирования) Поддерживает режим разработки iJulia, вдохновленный iPython.
Agda (язык программирования) Поддерживает ограниченную форму грамотного программирования из коробки.
Язык программирования Eve Программы - это в первую очередь проза. Eve сочетает варианты Datalog и Markdown с живой графической средой разработки.
R Markdown Notebooks (или R Notebooks)R, Python, Julia и SQL PDF, Microsoft Word, LibreOffice и форматы презентаций или слайд-шоу плюс интерактивные форматы, такие как HTML-виджеты
Sweave R PDF
Knitr R LaTeX, PDF, LyX, HTML, Markdown, AsciiDoc и reStructuredText
Codebraid Pandoc, Rust, Julia, Python, R, Bash
Pweave R PDF

Другие полезные инструменты, включая

  • The is редактор структуры, который поддерживает необязательную разметку noweb и CWEB. Автор Leo смешивает два разных подхода: во-первых, Leo - это редактор-контурный редактор, который помогает управлять большими текстами; во-вторых, Лео включает в себя некоторые идеи грамотного программирования, которые в чистом виде (т. е. в том виде, в котором они используются веб-инструментом Knuth или такими инструментами, как «noweb») возможны только при определенной степени изобретательности и использовании редактора. способом, не совсем предусмотренным его автором (в модифицированных узлах @root). Однако это и другие расширения (узлы @file) делают структурное программирование и управление текстом успешным и простым и в некотором смысле похожи на грамотное программирование.
  • Язык программирования Haskell имеет встроенную поддержку полуфабрикатов. -грамотное программирование. Компилятор / интерпретатор поддерживает два расширения имен файлов: .hsи .lhs; последний означает грамотный Haskell.
Грамотные скрипты могут быть полным исходным текстом LaTeX, в то же время он может быть скомпилирован без изменений, поскольку интерпретатор компилирует текст только в кодовой среде, например
% здесь текст, описывающий функцию: \ begin {code} fact 0 = 1 fact (n + 1) = (n + 1) * fact n \ end {code} здесь еще текст
Код также может быть отмечен в Стиль Ричарда Берда, начинающий каждую строку с символа «больше чем» и пробела, предшествующий и завершающий фрагмент кода пустыми строками.
Пакет LaTeX listingsпредоставляет lstlistingокружение, которое можно использовать для украшения исходного кода. Его можно использовать для определения среды codeдля использования в Haskell для печати символов, например:
\ newenvironment {code} {\ lstlistings [language = Haskell]} {\ endlstlistings} \ begin { code} comp :: (beta ->gamma) ->(alpha ->beta) ->(alpha ->gamma) (g `comp` f) x = g (fx) \ end {code}
может быть сконфигурирован так, чтобы выдавать что-то вроде этого:
comp :: (β → γ) → (α → β) → (α → γ) (g comp ⁡ f) x = g (fx) {\ displaystyle {\ begin {align } comp :: (\ beta \ to \ gamma) \ to (\ alpha \ to \ beta) \ to (\ alpha \ to \ gamma) \\ (g \ operatorname {comp} f) x = g (fx) \ end {align}}}{\ displaystyle {\ begin {align } comp :: (\ beta \ to \ gamma) \ to (\ alpha \ to \ beta) \ to (\ alpha \ to \ gamma) \\ (g \ operatorname {comp} f) x = g (fx) \ конец {выровнено}}}
Хотя пакет не предоставляет средств для организации фрагментов кода, исходный код LaTeX можно разделить на разные файлы. Для обзора см. руководство по листингу.
  • Система грамотного программирования Web 68 использовала Algol 68 в качестве основного языка программирования, хотя в препроцессоре не было ничего, что могло бы принудительно использовать этот язык.
  • Механизм настройки Text Encoding Initiative, который позволяет ограничивать, изменять или расширять схему TEI, позволяет пользователям смешивать прозаическая документация с фрагментами спецификации схемы в их формате One Document Does-it-all. Из этой прозаической документации можно сгенерировать схемы и конвейеры моделей обработки, и парадигма грамотного программирования Кнута цитируется как источник вдохновения для этого способа работы.
См. Также
  • Sweave и Knitr - примеры использования инструмента Literate Programming в стиле "noweb" внутри языка R для создания динамических статистических отчетов
  • Самодокументируемый код - исходный код, который легко понять без документации
Ссылки
Дополнительная литература
Последняя правка сделана 2021-05-28 03:26:52
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте