Гость
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Субботний литературный код. / 25 сообщений из 37, страница 1 из 2
27.06.2020, 16:48
    #39973766
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Субботний литературный код.
Привет всем.

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


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


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

gcd.lhs (в данном случае extension .lhs имеет значение)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
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 форматировании типа
Код: sql
1.
2.
3.
\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. И прочее. Я их не буду приаттачивать.
Пока смотрю. И если будет достойно внимания - добавлю.

Вопрос.

Кто из вас на проектах практиковал нечто подобное?
...
Рейтинг: 0 / 0
27.06.2020, 19:39
    #39973788
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Субботний литературный код.
Если развернуть определение, вместо: "в текстовом файле записан не исходный код программы, а поясняющий ее текст, при этом сама программа определенным образом вставлена в таком файле", - скажем: "в текстовом файле записан исходный код программы, а поясняющий еге текст, при этом определенным образом вставлена в таком файле" - то мы получаем практически любой язык в котором доступны комментарии.
А теперь вспоминаем что есть утилиты умеющие вытягивать из исходников текст комментария оформленного специальным образом и вот тебе готовое ЛП.

Насколько часто это используется? Ну....
- Doxygen - пожалуй самое известное из подобных систем. Родилось в Java, но может быть использовано почти с любым языком.
- Perl имеет свою собственную систему POD (Plain Old Documentation), Используется очень часто - практически всегда если есть желание опубликовать свою библиотеку в CPAN (общий репозиторий библиотек). Хотя лично мне не очень удобно писать POD, меня в нем нервирует что практически все старт-стопы для кусков документации надо выделять пустыми строками. В крупных конторах очень рекомендуют (в смысле обязуют) добавлять POD комментарии даже в CGI скрипты.
- QDoc - почти тоже самое что Doxygen, но специально для Qt фреймворка. Довольно удобно, но используется намного реже.
...
Рейтинг: 0 / 0
27.06.2020, 20:31
    #39973795
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Субботний литературный код.
Полностью согласен. Но мне кажется что идеи Кнута идут чуть дальше чем просто форматирование
каментов как книги или документации.

Я опубликую здесь Contents из его книги.
...
Рейтинг: 0 / 0
27.06.2020, 22:06
    #39973809
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Субботний литературный код.
Еще одна цитата и ссылка на 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
...
Рейтинг: 0 / 0
27.06.2020, 23:53
    #39973842
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Субботний литературный код.
Добавлю линк на книжку.

Код: sql
1.
magnet:?dn=Knuth.D.E-Literate.Programming-1992.djvu&xt=urn:ed2k:c97e0b029b3b5f327aaf386ff99e9ad5

...
Рейтинг: 0 / 0
28.06.2020, 01:30
    #39973879
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Субботний литературный код.
Кнут конечно это "О-го-го!" и "Ух!", но эти его идеи слишком далеки от реальности. Литераутрно писать так чтобы "компилятор" мог собрать программу... Это будет возможным когда изобретут полноценный ИИ. А до тех пор, для перевода с литературного языка на строгий нужен человек.
Да мы (программисты) до сих пор мучаемся с техническими заданиями написанными на почти литературном языке и то далеко не всегда понимаем что заказчик хотел сказать. А ты ждешь что кто-то использовал методы о которых Кнут мечтал?
...
Рейтинг: 0 / 0
28.06.2020, 10:04
    #39973895
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Субботний литературный код.
Там не про ИИ насколько я понял. А про DSL , и написание кода человеком для человека.
...
Рейтинг: 0 / 0
28.06.2020, 11:14
    #39973903
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Субботний литературный код.
Дональд Кнудт - и швец и жнец и на дуде игрец.
А вот какой процент программистов в состоянии создать литературный текст, если проблемы начинаются с элементарной грамотности?
Это я даже молчу, что далеко не всегда получается просто техническая документация - какой-то мутный вал акын-сказаний: что у себя вижу, то вам и пою.
...
Рейтинг: 0 / 0
28.06.2020, 16:43
    #39973940
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Субботний литературный код.
Возможно в качестве источника литературного текста будет выступать user story
...
Рейтинг: 0 / 0
28.06.2020, 17:47
    #39973948
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Субботний литературный код.
mayton
Возможно в качестве источника литературного текста будет выступать user story
"Оно" так не работает: кто-то должен вставить в сценарий использования реальный код.
...
Рейтинг: 0 / 0
28.06.2020, 23:08
    #39973994
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Субботний литературный код.
Да. Здесь как будто-бы не хватает какого-то связующего DSL. Может DSL - это английский язык?

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

Первая половина сорца - копипаста с вики. Там - текст задания и модульные тесты.
Вторая (подсвеченная желтым маркером) - моя попытка
переложить assumptions на язык кода.
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
#!/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, но пока суть не в этом а в литературности.
...
Рейтинг: 0 / 0
28.06.2020, 23:18
    #39973996
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Субботний литературный код.
Я принципиально не открывал спойлеры и не смотрел солюшены по проблемам. Мне не хотелось
замутнять свой взгляд чужим и хорошим отшлифованным решением. Мне хотелось пройти
через шаги этой самой литературы.
...
Рейтинг: 0 / 0
29.06.2020, 09:54
    #39974073
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Субботний литературный код.
mayton
Там не про ИИ насколько я понял. А про DSL , и написание кода человеком для человека.


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

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

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

Такие вещи как комментарии тоже являются инструментом ЯП.
...
Рейтинг: 0 / 0
29.06.2020, 10:13
    #39974079
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Субботний литературный код.
"Литературное программирование" оно, всё-таки, про другое: из одного текста генерируется и программа и документация к ней.
...
Рейтинг: 0 / 0
29.06.2020, 16:48
    #39974230
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Субботний литературный код.
Попробовал CTangle. Вот как-то так хреновенько вышло.
Код: sql
1.
2.
3.
4.
#!/bin/bash

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



Input:

gcd-lcm.w
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
@*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
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
/*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
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
\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




Делать дизайн олд-скульных текстовых статей я почти умею. Но КМК должна быть еще какая-то хитрость.
...
Рейтинг: 0 / 0
29.06.2020, 16:50
    #39974232
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Субботний литературный код.
Да в output, gcd-lcm.w надо заменить на gcd-lcm.c
...
Рейтинг: 0 / 0
02.07.2020, 15:28
    #39975497
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Субботний литературный код.
mayton,
ну я
...
Рейтинг: 0 / 0
02.07.2020, 15:42
    #39975506
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Субботний литературный код.
tchingiz, шикарно. Поделись как используете.
...
Рейтинг: 0 / 0
02.07.2020, 15:50
    #39975516
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Субботний литературный код.
по прямому назначению
пытаюсь пояснительную записку вместе с кодом делать

в архиве

http://agp1.adr.com.ua/software/args.zip
пояснительная записка args.2.10.chm
...
Рейтинг: 0 / 0
02.07.2020, 15:58
    #39975520
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Субботний литературный код.
относительно большой проект:
http://agp1.adr.com.ua/docs/elGeo.07.21.01.chm


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

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

потом в нем разочаровался, начал на Z смотреть, но не успел к нему привыкнуть,
перегрузился работой и забросил.
...
Рейтинг: 0 / 0
02.07.2020, 16:09
    #39975527
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Субботний литературный код.
так уже до кучи
В отделе Вельбицкого при СССРе из этой хрени (Р-схема)
генерили программы на фортране или, там, на PL-1:

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
*------>+------------------------------->#
 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 |            
                      |------>|            
                                          
...
Рейтинг: 0 / 0
02.07.2020, 17:01
    #39975551
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Субботний литературный код.
мог бы и маршрутом поделиться
https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1198977&msg=22137342
...
Рейтинг: 0 / 0
02.07.2020, 17:06
    #39975552
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Субботний литературный код.
tchingiz, а я там что-до должен? ХЗ. Ладно почитаю. Забыл уже или стало неактуально.
...
Рейтинг: 0 / 0
02.07.2020, 17:23
    #39975559
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Субботний литературный код.
mayton
tchingiz, а я там что-до должен? ХЗ. Ладно почитаю. Забыл уже или стало неактуально.

Ты там никому ничего не должен.
Я пишу читалку из формата gpx и просил пример другого трека, отличного
от моего навитела.
...
Рейтинг: 0 / 0
02.07.2020, 17:55
    #39975571
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Субботний литературный код.
tchingiz
mayton
tchingiz, а я там что-до должен? ХЗ. Ладно почитаю. Забыл уже или стало неактуально.

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

ОК. Я гляну в бэкапах. Я честно уже лет 5 не пользовался Garmin-ом.
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Субботний литературный код. / 25 сообщений из 37, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]