powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Субботний литературный код.
25 сообщений из 34, страница 1 из 2
Субботний литературный код.
    #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
Субботний литературный код.
    #39973788
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если развернуть определение, вместо: "в текстовом файле записан не исходный код программы, а поясняющий ее текст, при этом сама программа определенным образом вставлена в таком файле", - скажем: "в текстовом файле записан исходный код программы, а поясняющий еге текст, при этом определенным образом вставлена в таком файле" - то мы получаем практически любой язык в котором доступны комментарии.
А теперь вспоминаем что есть утилиты умеющие вытягивать из исходников текст комментария оформленного специальным образом и вот тебе готовое ЛП.

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

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

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

...
Рейтинг: 0 / 0
Субботний литературный код.
    #39973879
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кнут конечно это "О-го-го!" и "Ух!", но эти его идеи слишком далеки от реальности. Литераутрно писать так чтобы "компилятор" мог собрать программу... Это будет возможным когда изобретут полноценный ИИ. А до тех пор, для перевода с литературного языка на строгий нужен человек.
Да мы (программисты) до сих пор мучаемся с техническими заданиями написанными на почти литературном языке и то далеко не всегда понимаем что заказчик хотел сказать. А ты ждешь что кто-то использовал методы о которых Кнут мечтал?
...
Рейтинг: 0 / 0
Субботний литературный код.
    #39973895
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там не про ИИ насколько я понял. А про DSL , и написание кода человеком для человека.
...
Рейтинг: 0 / 0
Субботний литературный код.
    #39973903
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дональд Кнудт - и швец и жнец и на дуде игрец.
А вот какой процент программистов в состоянии создать литературный текст, если проблемы начинаются с элементарной грамотности?
Это я даже молчу, что далеко не всегда получается просто техническая документация - какой-то мутный вал акын-сказаний: что у себя вижу, то вам и пою.
...
Рейтинг: 0 / 0
Субботний литературный код.
    #39973940
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно в качестве источника литературного текста будет выступать user story
...
Рейтинг: 0 / 0
Субботний литературный код.
    #39973948
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Возможно в качестве источника литературного текста будет выступать user story
"Оно" так не работает: кто-то должен вставить в сценарий использования реальный код.
...
Рейтинг: 0 / 0
Субботний литературный код.
    #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
Субботний литературный код.
    #39973996
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я принципиально не открывал спойлеры и не смотрел солюшены по проблемам. Мне не хотелось
замутнять свой взгляд чужим и хорошим отшлифованным решением. Мне хотелось пройти
через шаги этой самой литературы.
...
Рейтинг: 0 / 0
Субботний литературный код.
    #39974073
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Там не про ИИ насколько я понял. А про DSL , и написание кода человеком для человека.


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

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

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

Такие вещи как комментарии тоже являются инструментом ЯП.
...
Рейтинг: 0 / 0
Субботний литературный код.
    #39974079
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Литературное программирование" оно, всё-таки, про другое: из одного текста генерируется и программа и документация к ней.
...
Рейтинг: 0 / 0
Субботний литературный код.
    #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
Субботний литературный код.
    #39974232
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да в output, gcd-lcm.w надо заменить на gcd-lcm.c
...
Рейтинг: 0 / 0
Субботний литературный код.
    #39975497
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
ну я
...
Рейтинг: 0 / 0
Субботний литературный код.
    #39975506
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingiz, шикарно. Поделись как используете.
...
Рейтинг: 0 / 0
Субботний литературный код.
    #39975516
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по прямому назначению
пытаюсь пояснительную записку вместе с кодом делать

в архиве

http://agp1.adr.com.ua/software/args.zip
пояснительная записка args.2.10.chm
...
Рейтинг: 0 / 0
Субботний литературный код.
    #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
Субботний литературный код.
    #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
Субботний литературный код.
    #39975551
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мог бы и маршрутом поделиться
https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1198977&msg=22137342
...
Рейтинг: 0 / 0
Субботний литературный код.
    #39975552
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingiz, а я там что-до должен? ХЗ. Ладно почитаю. Забыл уже или стало неактуально.
...
Рейтинг: 0 / 0
Субботний литературный код.
    #39975559
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
tchingiz, а я там что-до должен? ХЗ. Ладно почитаю. Забыл уже или стало неактуально.

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

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

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


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