powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Субботний литературный код.
34 сообщений из 34, показаны все 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
Субботний литературный код.
    #39975977
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В иностранных и современных течениях я не знаток. Что прочитал здесь смахивает по цельи на автоматическую генерацию прог.
Точнее: имеется формальная грамматика (ограниченный инглиш, ограниченный родной, блок-схемы и т.п.). На ней пишется/рисуется квазитекст, по к-рому создаётся исходный код на ЯП.

Проблема в том, что полный цикл "текст-код-отладка-снова_текст" затруднён. Остаётся применимость для быстрого прототипирования. В мою бытность в п/я у нас была подобная вещчь, достаточно ограниченная в применении.

ИМХО, формальная грамматика здесь ключевое требование.
...
Рейтинг: 0 / 0
Субботний литературный код.
    #39976020
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98
На ней пишется/рисуется квазитекст, по к-рому создаётся исходный код на ЯП

Исходный код на ЯП.. а не лишняя ли это сущность?
...
Рейтинг: 0 / 0
Субботний литературный код.
    #39976026
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
exp98
На ней пишется/рисуется квазитекст, по к-рому создаётся исходный код на ЯП

Исходный код на ЯП.. а не лишняя ли это сущность?

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

Интересно. Нет ли в этом веяний таких языков как ДРАКОН e.t.c.
...
Рейтинг: 0 / 0
Субботний литературный код.
    #39976032
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
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 |            
                      |------>|            
                                          

Интересно. Нет ли в этом веяний таких языков как ДРАКОН e.t.c.

это 65 - 70 год,
а ДРАКОН когда был?
...
Рейтинг: 0 / 0
Субботний литературный код.
    #39976038
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не помню честно. Но эти картинки мне еще напоминают эзотерический ЯП где flow
управлялся такой же декартовой системой указателей и команд к действию. Чуть
сложнее чем Brainfuck по системе команд - но более нагляднее.

Забыл название. Но если пойти в вики по брейнфаку то можно на него выйти.
...
Рейтинг: 0 / 0
Субботний литературный код.
    #39976083
exp98
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор//это выбор индекса максимума из массива а[ASZ] Хотите верьте, хотите нет, а в моей версии МатЛаб (из прошлого 10-летия) нет такой функции. Макс значение есть, а его индекса - нет.
...
Рейтинг: 0 / 0
Субботний литературный код.
    #39976822
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98

Проблема в том, что полный цикл "текст-код-отладка-снова_текст" затруднён. Остаётся применимость для быстрого прототипирования. В мою бытность в п/я у нас была подобная вещчь, достаточно ограниченная в применении.

Мда. Насчет отладки - это удар ниже пояса.

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

Я представил сколько-бы я нажил врагов у себя на проекте если стал-бы внедрять это.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Субботний литературный код.
    #40128897
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эта штука всё таки где-то используется https://hackage.haskell.org/package/CheatSheet-2.9/src/
...
Рейтинг: 0 / 0
34 сообщений из 34, показаны все 2 страниц
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Субботний литературный код.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (9): Анонимы (6), Yandex Bot 1 мин., Bing Bot 1 мин., Google Bot 2 мин.
x
x
Закрыть


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