LINUX.ORG.RU

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

 , , ,

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

4

5

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

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

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

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

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

>>> Ссылка на страницу издания

>>> Альтернативные способы скачивания

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

★★★★★

Проверено: dataman ()
Последнее исправление: CrX (всего исправлений: 10)
Ответ на: комментарий от 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 ★★★★★
()
Ответ на: комментарий от Xenius

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

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

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

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

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

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

столяров иногда правильно и даже очень правильно пишет, но иногда совсем не правильно

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

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

Восторг! Натурально Защита Чубаки из South Park. При том работает - вон впечатлённые 1Сники по треду бегают, восторженно кукарекая :-D

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

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

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

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

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

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

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

Применим тест monk. Предположим твоя функция запускается при отладке в каждом шаге цикла, а шагов там миллион. Результат — всё падает нафиг с OOM. Значит это побочный эффект.

Конкатенация строк не будет побочным эффектом только в нефоннеймановском языке, где строки first class citizen вроде Tcl.

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

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

Если обратиться к трудам преподобного Онания Столпника…

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

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

Это далеко не первый раз же. Всегда одинаково.

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

strcpy наоборот распаковывается иногда

Что не всегда есть хорошо. В своих прод сборках мы целенаправленно отсушили builtin-memcmp и builtin-strlen.

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

очевидно что процедура без изменения среды это вариант sleep

побочное всёж это то что помимо основного

процедуре передаётся либо value «запиcь активации» и она творит что то + меняет своё окружения ( и это оказывается основной побочкой) либо есть передаётся «запись активации» али про простому ононимный(sic!) объект и через изменение его полей процедура очучествляет побочку - но всёж эта побочку не абы где рэндом память портить а чисто конкретно через получение поля и через их var

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

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

Потому переводит предмет рассмотрения из сферы синтаксиса в сферу системы типов.

int -> void - это типологическая запись. Так же как, например, int -> bottom, хотя bottom-типа напрямую в Си нет. А вот void есть, и хорошо, что он есть.

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

FFI-прокладка?

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

Это даже неплохо, кстати. Вот кложа, скажем, с чего началась? С провалившихся попыток Рича Хикки затащить борщелисп в продакшен и экспериментов с интеропом с другими платформами.

Может, прямо у нас тут, на лоре, будущие отцы современных лиспов обитают, кто знает.

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

из сферы синтаксиса в сферу системы типов

Чего в этом хорошего?

Так можно и for/while/if в сферу системы типов перенести, как это сделано в Haskell. Это тоже хорошо?

monk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.