Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Программирование Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Субботний литературный код.  [new]
mayton
Member

Откуда: loopback
Сообщений: 48022
Привет всем.

Тема. Литературное программирование (ЛП). Или, можно встретить в источниках
еще такой термин как грамотное программирование (ГП) в некоторых переводах статей Кнута.
Или - просто литературный код. Всё - синонимы.


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


Пример. Я накопипастил с wiki текст и добавил свои сорцы.

gcd.lhs (в данном случае extension .lhs имеет значение)
In mathematics, the greatest common divisor (gcd) of two or 
more integers, which are not all zero, is the largest 
positive integer that divides each of the integers. 
For example, the gcd of 8 and 12 is 4

> gcd2 :: Int -> Int -> Int
> gcd2 a b = 
>    if  | b /= 0    -> gcd b (mod a b)
>        | otherwise -> a

The greatest common divisor can be used to find the least 
common multiple of two numbers when the greatest common 
divisor is known, using the relation

> lcm :: Int -> Int -> Int
> lcm a b = (a*b) `div` gcd2 a b


Возможен еще вариант с исходником в LaTex форматировании типа
\begin{code}
gcd2 :: Int -> Int -> Int
\end{code}


Меня заинтересовал этот подход. И я стал листать источники. Интересовало какие языки
и технологии практикуют такое. Там оказалось все немного глубже. Некоторые
ссылки меня привели к книге Дональда Кнута

https://www.amazon.com/Literate-Programming-Lecture-Notes-Donald/dp/0937073806/

Еще один линк.

https://www-cs-faculty.stanford.edu/~knuth/lp.html

И еще несколько видосов youtube где эта тема освящалась с разных сторон. Туда-же
до кучи макросы. Редактор emacs. И прочее. Я их не буду приаттачивать.
Пока смотрю. И если будет достойно внимания - добавлю.

Вопрос.

Кто из вас на проектах практиковал нечто подобное?
27 июн 20, 16:48    [22158273]     Ответить | Цитировать Сообщить модератору
 Re: Субботний литературный код.  [new]
White Owl
Member

Откуда:
Сообщений: 12542
Если развернуть определение, вместо: "в текстовом файле записан не исходный код программы, а поясняющий ее текст, при этом сама программа определенным образом вставлена в таком файле", - скажем: "в текстовом файле записан исходный код программы, а поясняющий еге текст, при этом определенным образом вставлена в таком файле" - то мы получаем практически любой язык в котором доступны комментарии.
А теперь вспоминаем что есть утилиты умеющие вытягивать из исходников текст комментария оформленного специальным образом и вот тебе готовое ЛП.

Насколько часто это используется? Ну....
- Doxygen - пожалуй самое известное из подобных систем. Родилось в Java, но может быть использовано почти с любым языком.
- Perl имеет свою собственную систему POD (Plain Old Documentation), Используется очень часто - практически всегда если есть желание опубликовать свою библиотеку в CPAN (общий репозиторий библиотек). Хотя лично мне не очень удобно писать POD, меня в нем нервирует что практически все старт-стопы для кусков документации надо выделять пустыми строками. В крупных конторах очень рекомендуют (в смысле обязуют) добавлять POD комментарии даже в CGI скрипты.
- QDoc - почти тоже самое что Doxygen, но специально для Qt фреймворка. Довольно удобно, но используется намного реже.
27 июн 20, 19:39    [22158329]     Ответить | Цитировать Сообщить модератору
 Re: Субботний литературный код.  [new]
mayton
Member

Откуда: loopback
Сообщений: 48022
Полностью согласен. Но мне кажется что идеи Кнута идут чуть дальше чем просто форматирование
каментов как книги или документации.

Я опубликую здесь Contents из его книги.

К сообщению приложен файл. Размер - 99Kb
27 июн 20, 20:31    [22158353]     Ответить | Цитировать Сообщить модератору
 Re: Субботний литературный код.  [new]
mayton
Member

Откуда: loopback
Сообщений: 48022
Еще одна цитата и ссылка на 3 инструмента для LP.
http://mmix.cs.hm.edu/bin/index.html
Literate Programming

Literate programming means writing programs, as you would write a novel or an essay. You explain to the reader what your program is all about and how it is working. You put this description in a "web" file and if you do this on a sufficient level of detail, the program ctangle, itself written as a literate program (see The CWEB System of Structured Documentation ), can tangle the web and extract a program from it. The program cweave on the other hand will weave the web into a nice book. The program ctie, is an advanced utility. You find more about is on the documentation page.

  • cweave produces .tex files form .w files for documentation
  • ctangle produces .c files from .w files
  • ctie alternative to ctangle for multiple change files

Насколько я понимаю ctangle это конвертер "литературы" в сишные сорцы.

Сообщение было отредактировано: 27 июн 20, 22:04
27 июн 20, 22:06    [22158388]     Ответить | Цитировать Сообщить модератору
 Re: Субботний литературный код.  [new]
mayton
Member

Откуда: loopback
Сообщений: 48022
Добавлю линк на книжку.

+
magnet:?dn=Knuth.D.E-Literate.Programming-1992.djvu&xt=urn:ed2k:c97e0b029b3b5f327aaf386ff99e9ad5
27 июн 20, 23:53    [22158442]     Ответить | Цитировать Сообщить модератору
 Re: Субботний литературный код.  [new]
White Owl
Member

Откуда:
Сообщений: 12542
Кнут конечно это "О-го-го!" и "Ух!", но эти его идеи слишком далеки от реальности. Литераутрно писать так чтобы "компилятор" мог собрать программу... Это будет возможным когда изобретут полноценный ИИ. А до тех пор, для перевода с литературного языка на строгий нужен человек.
Да мы (программисты) до сих пор мучаемся с техническими заданиями написанными на почти литературном языке и то далеко не всегда понимаем что заказчик хотел сказать. А ты ждешь что кто-то использовал методы о которых Кнут мечтал?
28 июн 20, 01:30    [22158489]     Ответить | Цитировать Сообщить модератору
 Re: Субботний литературный код.  [new]
mayton
Member

Откуда: loopback
Сообщений: 48022
Там не про ИИ насколько я понял. А про DSL , и написание кода человеком для человека.
28 июн 20, 10:04    [22158527]     Ответить | Цитировать Сообщить модератору
 Re: Субботний литературный код.  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10422
Дональд Кнудт - и швец и жнец и на дуде игрец.
А вот какой процент программистов в состоянии создать литературный текст, если проблемы начинаются с элементарной грамотности?
Это я даже молчу, что далеко не всегда получается просто техническая документация - какой-то мутный вал акын-сказаний: что у себя вижу, то вам и пою.
28 июн 20, 11:14    [22158540]     Ответить | Цитировать Сообщить модератору
 Re: Субботний литературный код.  [new]
mayton
Member

Откуда: loopback
Сообщений: 48022
Возможно в качестве источника литературного текста будет выступать user story
28 июн 20, 16:43    [22158607]     Ответить | Цитировать Сообщить модератору
 Re: Субботний литературный код.  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10422
mayton
Возможно в качестве источника литературного текста будет выступать user story
"Оно" так не работает: кто-то должен вставить в сценарий использования реальный код.
28 июн 20, 17:47    [22158622]     Ответить | Цитировать Сообщить модератору
 Re: Субботний литературный код.  [new]
mayton
Member

Откуда: loopback
Сообщений: 48022
Да. Здесь как будто-бы не хватает какого-то связующего DSL. Может DSL - это английский язык?

Вот мой еще один литературный (ш)кодинг. Только што написал по мотивам 99-th Haskell problems
https://wiki.haskell.org/99_questions/1_to_10

Первая половина сорца - копипаста с вики. Там - текст задания и модульные тесты.
Вторая (подсвеченная желтым маркером) - моя попытка
переложить assumptions на язык кода.
#!/usr/bin/ghci

(*) Find the last element of a list.
(Note that the Lisp transcription of this problem is incorrect.)
Example in Haskell:

myLast [1,2,3,4]
4
myLast ['x','y','z']
'z'

Assume that input type is list of 'a' type and output is 'a' type.

> myLast :: [a] -> a

Empty input will throws an error.

> myLast []     = error "Unable to get last from []"

Last element will be first when tail is empty

> myLast (h:[]) = h

Otherwise, if tail of tail is empty then get head of tile, Otherwise proceed 'myLast' for tile

> myLast (h:t)  = if (null (tail t)) then (head t) else (myLast t)

Код написан херово. Я пока еще не спец в GHC, но пока суть не в этом а в литературности.
28 июн 20, 23:08    [22158719]     Ответить | Цитировать Сообщить модератору
 Re: Субботний литературный код.  [new]
mayton
Member

Откуда: loopback
Сообщений: 48022
Я принципиально не открывал спойлеры и не смотрел солюшены по проблемам. Мне не хотелось
замутнять свой взгляд чужим и хорошим отшлифованным решением. Мне хотелось пройти
через шаги этой самой литературы.
28 июн 20, 23:18    [22158722]     Ответить | Цитировать Сообщить модератору
 Re: Субботний литературный код.  [new]
hVostt
Member

Откуда:
Сообщений: 18013
mayton
Там не про ИИ насколько я понял. А про DSL , и написание кода человеком для человека.


Да блин, любой ЯП уже является DSL, вы же не пишите инструкции к процессору в машинных кодах?

По сути это лишь философия, по поводу "литературности".
Одна из основных задач исходного кода на ЯП -- это способность быть прочитанной и понятой человеком.

Чем не литературность?

Такие вещи как комментарии тоже являются инструментом ЯП.

Сообщение было отредактировано: 29 июн 20, 09:52
29 июн 20, 09:54    [22158834]     Ответить | Цитировать Сообщить модератору
 Re: Субботний литературный код.  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10422
"Литературное программирование" оно, всё-таки, про другое: из одного текста генерируется и программа и документация к ней.
29 июн 20, 10:13    [22158846]     Ответить | Цитировать Сообщить модератору
 Re: Субботний литературный код.  [new]
mayton
Member

Откуда: loopback
Сообщений: 48022
Попробовал CTangle. Вот как-то так хреновенько вышло.
#!/bin/bash

ctangle gcd-lcm.w gcd-lcm.c
cweave  gcd-lcm.w gcd-lcm.tex


Input:

gcd-lcm.w
@*LCD-LCM

In mathematics, the greatest common divisor (gcd) of two or 
more integers, which are not all zero, is the largest 
positive integer that divides each of the integers. 
For example, the gcd of 8 and 12 is 4

@c*
#include <stdio.h>
int gcd(int a, int b) {
  if (b != 0)
    return gcd(b, a % b);
  else
    return a;
}

@
The greatest common divisor can be used to find the least 
common multiple of two numbers when the greatest common 
divisor is known, using the relation

@c*
int lcm(int a,int b) {
  return (a * b) % gcd(a,b);
}
@* Index.


Output:

Куда-то поползло форматирование. Какие-то непонятные каменты пошли.

gcd-lcm.w
+
/*1:*/
#line 8 "./gcd-lcm.w"
*
#include <stdio.h> 
int gcd(int a,int b){
if(b!=0)
return gcd(b,a%b);
else
return a;
}

/*:1*//*2:*/
#line 22 "./gcd-lcm.w"
*
int lcm(int a,int b){
return(a*b)%gcd(a,b);
}

/*:2*/




И для output для Tex:

gcd-lcm.tex
+
\input cwebmac

\N{1}{1}LCD-LCM

In mathematics, the greatest common divisor (gcd) of two or
more integers, which are not all zero, is the largest
positive integer that divides each of the integers.
For example, the gcd of 8 and 12 is 4

\Y\B${*{}$\6
\8\#\&{include} \.{<stdio.h>}\6
${}}\&{int}{}$ \\{gcd}(\&{int} \|a${},\39{}$\&{int} \|b)\1\1\2\2\6
${}\{{}$\1\6
\&{if} ${}(\|b\I\T{0}){}$\1\5
\&{return} \\{gcd}${}(\|b,\39\|a\MOD\|b);{}$\2\6
\&{else}\1\5
\&{return} \|a;\2\6
\4${}\}{}$\2\par
\fi

\M{2}
The greatest common divisor can be used to find the least
common multiple of two numbers when the greatest common
divisor is known, using the relation

\Y\B${*}\&{int}{}$ \\{lcm}(\&{int} \|a${},\39{}$\&{int} \|b)\1\1\2\2\6
${}\{{}$\1\6
\&{return} ${}(\|a*\|b)\MOD\\{gcd}(\|a,\39\|b);{}$\6
\4${}\}{}$\2\par
\fi

\N{1}{3}Index.
\fi

\inx
\fin
\con



Делать дизайн олд-скульных текстовых статей я почти умею. Но КМК должна быть еще какая-то хитрость.
29 июн 20, 16:48    [22159164]     Ответить | Цитировать Сообщить модератору
 Re: Субботний литературный код.  [new]
mayton
Member

Откуда: loopback
Сообщений: 48022
Да в output, gcd-lcm.w надо заменить на gcd-lcm.c
29 июн 20, 16:50    [22159166]     Ответить | Цитировать Сообщить модератору
 Re: Субботний литературный код.  [new]
tchingiz
Member

Откуда:
Сообщений: 37145
mayton,
ну я
2 июл 20, 15:28    [22160989]     Ответить | Цитировать Сообщить модератору
 Re: Субботний литературный код.  [new]
mayton
Member

Откуда: loopback
Сообщений: 48022
tchingiz, шикарно. Поделись как используете.
2 июл 20, 15:42    [22160999]     Ответить | Цитировать Сообщить модератору
 Re: Субботний литературный код.  [new]
tchingiz
Member

Откуда:
Сообщений: 37145
по прямому назначению
пытаюсь пояснительную записку вместе с кодом делать

в архиве

http://agp1.adr.com.ua/software/args.zip
пояснительная записка args.2.10.chm

Сообщение было отредактировано: 2 июл 20, 15:56
2 июл 20, 15:50    [22161011]     Ответить | Цитировать Сообщить модератору
 Re: Субботний литературный код.  [new]
tchingiz
Member

Откуда:
Сообщений: 37145
относительно большой проект:
http://agp1.adr.com.ua/docs/elGeo.07.21.01.chm


писать коментарии имеет смысл на языках формальных спецификаций
в силу однозначности терминов.

долго смотрел на raise specification language:
http://www.realcoding.net/dn/docs/ClassDesign.pdf

потом в нем разочаровался, начал на Z смотреть, но не успел к нему привыкнуть,
перегрузился работой и забросил.

Сообщение было отредактировано: 2 июл 20, 16:01
2 июл 20, 15:58    [22161016]     Ответить | Цитировать Сообщить модератору
 Re: Субботний литературный код.  [new]
tchingiz
Member

Откуда:
Сообщений: 37145
так уже до кучи
В отделе Вельбицкого при СССРе из этой хрени (Р-схема)
генерили программы на фортране или, там, на PL-1:

//это выбор индекса максимума из массива а[ASZ]

*------>+------------------------------->#
m=0 | |
mInd=-1|ASZ>0 |
|----->+==================+----->|
m=a[0]| |вывод
mInd=0| |m mInd
i=1 |i<ASZ m<a[i] |
|----->+------>+-->|
|m=a[i] |i++
|mInd=i |
|------>|


Сообщение было отредактировано: 2 июл 20, 16:10
2 июл 20, 16:09    [22161029]     Ответить | Цитировать Сообщить модератору
 Re: Субботний литературный код.  [new]
tchingiz
Member

Откуда:
Сообщений: 37145
мог бы и маршрутом поделиться
https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1198977&msg=22137342
2 июл 20, 17:01    [22161070]     Ответить | Цитировать Сообщить модератору
 Re: Субботний литературный код.  [new]
mayton
Member

Откуда: loopback
Сообщений: 48022
tchingiz, а я там что-до должен? ХЗ. Ладно почитаю. Забыл уже или стало неактуально.
2 июл 20, 17:06    [22161071]     Ответить | Цитировать Сообщить модератору
 Re: Субботний литературный код.  [new]
tchingiz
Member

Откуда:
Сообщений: 37145
mayton
tchingiz, а я там что-до должен? ХЗ. Ладно почитаю. Забыл уже или стало неактуально.

Ты там никому ничего не должен.
Я пишу читалку из формата gpx и просил пример другого трека, отличного
от моего навитела.
2 июл 20, 17:23    [22161078]     Ответить | Цитировать Сообщить модератору
 Re: Субботний литературный код.  [new]
mayton
Member

Откуда: loopback
Сообщений: 48022
tchingiz
mayton
tchingiz, а я там что-до должен? ХЗ. Ладно почитаю. Забыл уже или стало неактуально.

Ты там никому ничего не должен.
Я пишу читалку из формата gpx и просил пример другого трека, отличного
от моего навитела.

ОК. Я гляну в бэкапах. Я честно уже лет 5 не пользовался Garmin-ом.
2 июл 20, 17:55    [22161094]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Программирование Ответить