LINUX.ORG.RU

Вышло издание 2,92 книги «Программирование: введение в профессию» А. В. Столярова

 , , ,

Вышло издание 2,92 книги «Программирование: введение в профессию» А. В. Столярова

3

4

Тихо и незаметно 30 апреля 2026 года вышло издание 2.92, которое наконец включает в себя читаемый текстовый слой.

Исправлены опечатки и ошибки, обнаруженные в предыдущих изданиях, в частности 2.91 (где введена кликабельная навигация) и 2.9 (первое чисто электронное издание).

Книга предназначена для самообучения основам программирования и в отличии от многих других изданий предполагает фундаментальный подход - вначале основы дискретной математики и использования GNU/Linux или BSD с командной строкой, затем паскаль, потом ассемблер и только потом Си, системное программирование и альтернативные парадигмы (функциональное, логическое и так далее).

Автор книги считает, что только такой порядок обеспечивает полноценное обучение программированию, и обосновывает такой подход в методическом предисловии к первому тому.

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

>>> Ссылка на страницу издания
>>> Альтернативные способы скачивания

>>> Новость на сайте автора

★★★★★

Проверено: dataman ()
Последнее исправление: dataman (всего исправлений: 9)
Ответ на: комментарий от VIT

Грубо говоря, а вам то какое до всего этого дело?

Очень простое. Столяров долгое время был работником сферы образования. Следовательно, он получал зарплату из моих налогов. А я категорически не согласен с тем, чтобы мои налоги тратились на профнепригодных дармоедов, зарастающих пылью на кафедрах. Я имею полное право спрашивать с любого бюджетного работника о качестве его работы. Не хочешь нормально работать? Не в состоянии отредактировать свои двадцатилетние методички? Не можешь обойтись в преподавании без своей религиозной шизы? Вон из профессии, пыль кабинетная.

За время своей работы столяров испортил мозги сотням студентов, которые могли бы стать потенциальными разработчиками СПО. К счастью, больше он в вузе не работает, и его возможности по деструктивной социальной деятельности год от года падают.

liksys ★★★★
()
Последнее исправление: liksys (всего исправлений: 2)
Ответ на: комментарий от liksys

ох ляль эт с ал(ко)гола60

в общем виде реально функция это вычисление и оно (желательно) идемпотентно(ну ты понял)

а процедура это всё остальное

а так как реализации машин Тьюринга были сильно фонНеймоновы то очевидно что функции могли иметь own и прочие глобальности

Сяшка реально прикольный зверёк и копирование нультерминейт строк посредством однострока while в K&R прямо оценено как мы_так_можем - называть сей однострок общеочевидным ну это такое раз такое

qulinxao3 ★☆
()
Ответ на: комментарий от liksys

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

Вот! Так это определение и соответствует Столяровскому.

Но в реальности в большинстве языков всё сводится к функциям, потому что успешность совершения побочного эффекта всё еще требует проверки.

А это проблема программистов на этих языках. Что наткнувшись на функцию в коде нельзя её запустить и посмотреть, так как она может выполнять что-то необратимое.

Успешность обычно проверяется либо через механизм исключений либо через выходной параметр.

monk ★★★★★
()
Ответ на: комментарий от zabbal

Что ты несёшь? Эксперименты разрабатывают для проверки неизвестных теорий.

Верно. А программы пишут для реализации ранее не реализованных алгоритмов. Любая неизвестная теория опирается на известные. Как любая новая программа на уже реализованные алгоритмы.

monk ★★★★★
()
Ответ на: комментарий от zabbal

Это просто характерный маркер интеллектуального уровня «программистов», вечно пытающихся изобрести очередной метапрог

1Сники изобретают метапрог?

Единственный известный метапрог был написан сишником, который не знал 1С.

monk ★★★★★
()
Ответ на: комментарий от liksys

Тебе уже всё доступно объяснили. Если определение некорректное, то дальнейшее оперирование с ним не имеет смысла.

Ты не обосновал, чем оно некорректно. Ты перечислил edge case-ы когда сходу не очевидно, побочный это эффект или нет, но можно придумать их для любых определений.

Некорректность определения невозможно доказать, потому что корректность вообще не применима к определениям. У определений другие проблемы могут быть, например гиперообобщение, когда определение подходит для чего угодно или самопротиворечие, когда определение не подходит вообще ни для чего. В обоих случаях определение бесполезно, хотя и нельзя сказать, что оно «неверно». У Столяровского определения такой проблемы нет.

Если оно тебе не нравится, надо доказывать не «ложность» или «некорректность», а такие свойства, которые в принципе применимы к определениям.

Но в реальности в большинстве языков всё сводится к функциям, потому что успешность совершения побочного эффекта всё еще требует проверки

ОК, но ты знаешь, что во многих языках есть отдельный канал для проверки успешности, который позволяет всё-таки не мешать процедуры с функциями?

Xenius ★★★★★
() автор топика
Ответ на: комментарий от liksys

Просто как пример. Можно было Аду взять или 1С. Или даже Кумир.

monk ★★★★★
()
Ответ на: комментарий от monk

Вот! Так это определение и соответствует Столяровскому.

Нет. Столяров привязывает их к семантике паскаля, а я утверждаю, что всё зависит исключительно от внутренностей, с чем он не согласен:

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

И еще вот тут: Побочные эффекты функций (комментарий)

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

liksys ★★★★
()
Ответ на: комментарий от Xenius

Ты не обосновал, чем оно некорректно.

Обосновал, и не один раз. Ты просто отказываешься всё это воспринимать из-за того, что ты столяровский сектант. В предыдущем комменарии повторил еще раз. Воистину, чтение столярова неокрепшими умами вызывает необратимые изменения в головном мозге.

Некорректность определения невозможно доказать, потому что корректность вообще не применима к определениям.

Демагогия.

ОК, но ты знаешь, что во многих языках есть отдельный канал для проверки успешности, который позволяет всё-таки не мешать процедуры с функциями?

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

liksys ★★★★
()
Последнее исправление: liksys (всего исправлений: 2)
Ответ на: комментарий от liksys

воздерживаемся от написания функций (не процедур, это важно!), производящих ввод-вывод

Ага. Он в своей CMS функциями, которые возвращают флаг успешности операции, свою кустарную БД открывает, то есть производит IO.

Почему-то сам не пишет:

bool ok;
blabla(x, y, &ok);

А почему? Случилось что-то?

wandrien ★★★★
()
Ответ на: комментарий от liksys

ввод-вывод у него превращается в побочный эффект, если происходит из функции, и не является побочным эффектом, если происходит из процедуры

Ору

wandrien ★★★★
()
Ответ на: комментарий от wandrien

Случилось несоответсвие шизофрении реальности.

liksys ★★★★
()
Ответ на: комментарий от liksys

В дополнение напомню, кстати, что я однажды пытался читать труды Столярова и споткнулся именно на определении побочных эффектов. Мне в том треде накидали вариантов 10 определений, потом пришел сам @Croco и еще пару вариантов накинул.

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

Я считаю что морально пострадал от действий Столярова и хотел бы получить компенсацию.

Turbid ★★★★★
()
Ответ на: комментарий от liksys

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

Всё верно. Потому что ты сам пишешь: «У нормальных людей процедура - набор действий для совершения побочного эффекта, а функция - вычисляющая что-то сущность.». То есть для процедуры это не побочный эффект, а основной.

Спор терминологический. Назови «побочный эффект по-Столярову» = «побочный эффект функции» и никакого противоречия не будет. Побочный эффект (по твоему определению) в процедуре не является «побочным эффектом функции».

monk ★★★★★
()
Ответ на: комментарий от liksys

с одновременным привязыванием его к паскалю

Таких языков много. Не только паскаль.

monk ★★★★★
()
Ответ на: комментарий от monk

Побочный эффект (по твоему определению) в процедуре не является «побочным эффектом функции».

!!!

Это гениально в своей бессмысленной логической непротиворечивости.

wandrien ★★★★
()
Ответ на: комментарий от liksys

Понятно. Тогда ваша деятельность не только не продуктивна, а наоборот контр-продуктивна. И для того, чтобы «бороться» с такими как Столяров, лучшн бы не было таких как вы. Я могу и более предметно пояснить свою точку зрения, но не уверен, что вы слушаете оппонентов.

Начните с того, что смешивать личные и профессиональные качества оппонента - прямой путь к обесцениванию своих аргументов.

VIT ★★
()
Последнее исправление: VIT (всего исправлений: 1)
Ответ на: комментарий от monk

А программы пишут для реализации ранее не реализованных алгоритмов.

И что за новаторский алгоритм реализовала твоя FFI обёртка, который ты до сих пор гордишься?

zabbal ★★★★☆
()
Ответ на: комментарий от wandrien

Знаешь, я уж думал что понял, но этот тред равзворошил вьетнамские флешбеки и я опять в смятении (

Turbid ★★★★★
()
Ответ на: комментарий от wandrien

А почему? Случилось что-то?

Одно из двух.

  1. Делайте как я говорю, а не как я делаю.
  2. Он не считает void ...() процедурой.

Цитата:

добравшись во втором томе до изучения Си, мы обнаружим, что там вообще всё выполнение программы состоит из побочных эффектов, вот то есть буквально полностью, на 100%, и это не преувеличение формально это так и есть. Но там, во-первых, нет процедур, ….

monk ★★★★★
()
Ответ на: комментарий от wandrien

Это гениально в своей бессмысленной логической непротиворечивости.

Так суть проблемы именно в этом

Столяров: назовём эффект в функции побочным эффектом. Соответственно, эффект в процедуре не является побочным эффектом.

liksys: побочный эффект — это любой эффект в процедуре или функции. Я отвергаю определение Столярова.

monk ★★★★★
()
Ответ на: комментарий от Turbid

Ну видишь, всё просто оказалось. =)

Побочный эффект присутствует в функции, потому что она является функцией, а он является побочным эффектом функции.

Но когда этот же побочный эффект присутствует в процедуре, он не является побочным эффектом функции, потому что процедура не является функцией.

Гениальная тема.

Есть, короче, такая техника внушения, называется спиральный сюжет по Милтону Эриксону. Походу, Столяров его применяет))

wandrien ★★★★
()
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от monk

Ну считать он может всё что угодно, от этого оно не начнёт соотноситься с реальностью.

wandrien ★★★★
()
Ответ на: комментарий от monk

Назови «побочный эффект по-Столярову» = «побочный эффект функции» и никакого противоречия не будет.

Я не буду называть красное «зеленым по столярову».

liksys ★★★★
()
Ответ на: комментарий от VIT

Я могу и более предметно пояснить свою точку зрения, но не уверен, что вы слушаете оппонентов.

Я не уверен, что мне интересно слушать чужие заблуждения относительно сектантской деятельности столярова.

Начните с того, что смешивать личные и профессиональные качества оппонента - прямой путь к обесцениванию своих аргументов.

Это, разумеется, бред. Личность столярова имеет самое прямое отношение к преподаванию, потому что преподавание - это в первую очередь социальное взаимодействие.

liksys ★★★★
()
Ответ на: комментарий от liksys

Я не вижу смысла с вами дискутировать. Пишу это не для вас, а для других участников обсуждения.

VIT ★★
()
Ответ на: комментарий от Turbid

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

In computer science, an operation or expression is said to have a side effect if it has any observable effect other than its primary effect of reading the value of its arguments and returning a value to the invoker of the operation.

Например, если ты читаешь файл и заполняешь прочитанным какую-то переменную - это прямое действие. Изменение оффсета при чтении - побочный эффект, потому что следующий вызов функции вернет тебе данные по новому оффсету.

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

У всех нормальных людей всё наоборот: не суть побочки определяется функций/процедурой, а процедура/функция определяется побочным эффектом. То есть, если ты делаешь функцию/процедуру, которая принимает две строки и возвращает выделенную память на их склейку, то она может быть как функций, так и процедурой, в зависимости от твоей точки отсчета. Для прикладного софта это будет функция, а для обработчика прерывания - процедура, потому что выделение памяти само по себе нетривиальная операция и может привести к переключению контекста.

Столяров использует свое искуственное разделение, чтобы объяснить, почему непреднамеренные побочные эффекты это плохо, но в итоге всё сводится к тому, что столяров привязывает определение побочного эффекта к паскалю, где разделение на процедуры и функции искуственно, и которое в современных языках давно не встречается (по причине выбора точки отсчета, которую я объяснил выше ^^^). И у него получается рекурсия: процедура - это последовательность действий без побочного эффекта, а побочный эффект - это что-то, чего не бывает в процедурах.

liksys ★★★★
()
Последнее исправление: liksys (всего исправлений: 1)
Ответ на: комментарий от zabbal

И что за новаторский алгоритм реализовала твоя FFI обёртка, который ты до сих пор гордишься?

Там же на титульной странице описано. Работа с свойствами GTK как с родными полями, передача замыканий для обработки событий. Декларативное описание интерфейса.

На Common Lisp на тот момент такого реализовано не было.

monk ★★★★★
()
Ответ на: комментарий от VIT

Пишу это не для вас, а для других участников обсуждения.

Да, всем участникам этого обсуждения просто жизненно необходимо знать о том, что ты не в состоянии дискутировать по предмету обсуждения.

Мог просто покинуть тред и не мучаться.

liksys ★★★★
()
Ответ на: комментарий от liksys

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

Это в любом случае будет процедура, поскольку в софте потом придётся освобождать эту память, даже если это прикладной софт.

Xenius ★★★★★
() автор топика
Ответ на: комментарий от liksys

которое в современных языках давно не встречается (по причине выбора точки отсчета, которую я объяснил выше ^^^)

Это в каких? Рутины без возвращаемого значения встречаются даже в Haskell (там тип IO ()).

И у него получается рекурсия: процедура - это последовательность действий без побочного эффекта, а побочный эффект - это что-то, чего не бывает в процедурах.

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

monk ★★★★★
()
Ответ на: комментарий от monk

Это в каких? Рутины без возвращаемого значения встречаются даже в Haskell (там тип IO ()).

void и около того - это не отдельная языковая сущность, как в паскале.

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

Ты вообще никаких проблем здесь не видишь?

liksys ★★★★
()
Ответ на: комментарий от Xenius

Это в любом случае будет процедура, поскольку в софте потом придётся освобождать эту память, даже если это прикладной софт.

Нет. Ты можешь считать, что выделенная память, заполненная данными - и есть результат твоего вычисления, тогда это не будет побочным эффектом (если тебе не важен факт заполнения кучи).

liksys ★★★★
()
Ответ на: комментарий от liksys

void и около того - это не отдельная языковая сущность, как в паскале.

Чем слово void хуже слова procedure? И то и то отдельная языковая сущность. Разве что на два слова Паскаля (procedure и pointer) в Си один void. Так на function в Си вообще слова нет.

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

Ты вообще никаких проблем здесь не видишь?

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

monk ★★★★★
()
Ответ на: комментарий от zabbal

Для единственного человека, который не отличает метапрог от схемы?

monk ★★★★★
()
Ответ на: комментарий от monk

ранее не реализованных алгоритмов

передача замыканий для обработки событий

Ты собственные сообщения читаешь вообще?

zabbal ★★★★☆
()
Ответ на: комментарий от monk

ну всё же не

например процедура с inout параметром (var) и при этом она использует глобальный счётчик вызовов

изменение inout параметра это часть интерфейса; инкрементация счётчика вызова это побочка

т.е в целом побочный эффект это то что «захватывает» а точнее увеличивает контекст исполнения

поэтому то с побочками сложнее отлаживаться :(

qulinxao3 ★☆
()
Ответ на: комментарий от zabbal

Ты собственные сообщения читаешь вообще?

В Common Lisp на тот момент не было готового алгоритма, позволяющего передать замыкание как обработчик события Gtk.

monk ★★★★★
()
Ответ на: комментарий от VanyaZay

одного, жидко обделавшегося, который писал статью про раст, успели лицезреть все

Не все. Ты о ком?

zabbal ★★★★☆
()
Ответ на: комментарий от qulinxao3

Изменение параметров тоже считается эффектом. Даже без глобального счётчика.

Вот в лиспе есть две функции: reverse и nreverse. Обе возвращают список с элементами переданного в обратном порядке. Отличаются как раз тем, что вторая с побочным эффектом: портит список, переданный аргументом.

monk ★★★★★
()
Ответ на: комментарий от monk

Как ты резво вихлять-то начал сразу же. Попкой налево и «не реализованных» усыхает до «не реализованных в CL», попкой направо и «обработка событий» скукоживается до «обработка событий Gtk». А как пыжился-то по началу :-D

zabbal ★★★★☆
()
Ответ на: комментарий от Xenius

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

s-warus ★★★★
()
Ответ на: комментарий от VIT

Если вы так считаете, то не читайте Столярова.

Дык это ж не ЛОР припёрся в анально-огороженную гостевую к Столярику, а его высеры сюда притащили. До этого про него никто не вспоминал потому что недоумков в мире и так с избытком.

zabbal ★★★★☆
()
Ответ на: комментарий от monk

Чем слово void хуже слова procedure? И то и то отдельная языковая сущность. Разве что на два слова Паскаля (procedure и pointer) в Си один void. Так на function в Си вообще слова нет.

void не хуже, а лучше, чем procedure

а вот почему - предлагаю подумать

wandrien ★★★★
()
Ответ на: комментарий от zabbal

«не реализованных» усыхает до «не реализованных в CL», попкой направо и «обработка событий» скукоживается до «обработка событий Gtk». А как пыжился-то по началу :-D

Так мне нужен был Gtk в CL. Это для тебя всё одно, что Scheme, что CL, что Metaprog, что C. Если в С есть интерфейс, значит он уже реализован и на других языках писать его не надо.

monk ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.