LINUX.ORG.RU

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

 , , ,

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

4

5

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

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

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

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

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

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

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

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

★★★★★

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

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

Пишется. Была Genera OS, сейчас Mezzano есть. Но драйвера для своего компьютера я заколебусь для них переписывать. Поэтому приходится использовать ОС с сишным интерфейсом, а значит на каком-то уровне лисповой программе придётся с ней взаимодействовать через FFI.

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

А чем плохо? Особенно strlen.

libc’шные в наших тестах были быстрее. Плюс у нас зоопарк машинок, и вот тут ifunc выстреливает в полный рост.

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

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

Но если памяти в систему докинуть, то не падает… Значит не побочный эффект.

Так мы далеко пойдём, главное по пути штаны не порвать, широко шагая.

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

Восторг! Люди боятся ИИ, а я боюсь ЕИ!

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

Собственно, похожесть ограничивается скобками (но в схеме могут быть не только круглые) и парой ключевых слов

Ну да, ну да. S-выражения (префиксная нотация), code as data (и вытекающие отсюда возможности метапрограммирования), read-eval-print, (попытки в) функциональное программирование — это всё херня из-под коня. Главное — ключевые слова чтоб были буковка в буковку! %)

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

Я понял. То есть Haskell лучше, чем Си?

Кстати, а вариант Racket ещё лучше, где (void) это просто значение процедуры, а почти все конструкции, являющиеся в Си синтаксическими, из сферы синтаксиса перенесены в сферу библиотечных макросов?

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

Если брать семантику, то JS больше на лисп похож, чем Схема.

Ничосе) В JS тоже переменные и функции в независимых пространствах имён живут?

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

Я после того как выше увидел откровение про JS и CL, потерял интерес отвечать всерьёз, сорян =)

Слишком много шизы на один тред. Одной книжки Столярова хватает.

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

как это сделано в Haskell. Это тоже хорошо?

Конечно хорошо - чем больше в программе доказуемого вместо «чё-т куда-то в памяти записали, хз - авось не сегфолт», тем безусловно лучше.

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

Я понял.

Наверняка ведь опять врёшь.

То есть Haskell лучше, чем Си?

Конечно. Именно поэтому его никто не заменяет на Rust.

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

Во, можешь же когда хочешь - всё правильно понял.

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

S-выражения (префиксная нотация)

Это как раз те скобки. В обоих языках можно перейти на инфиксную при помощи библиотеки.

code as data (и вытекающие отсюда возможности метапрограммирования)

Там разные data. В лиспах code это списки, а в схемах это синтаксические объекты. Что позволяет в схеме делать надёжное метапрограммирование (в лиспе случайное переопределение символа часто может поломать макрос).

read-eval-print

Он нынче всюду. От питона до JS. Лисповского REPL с сохранением образа в схемах обычно нет. Переопределения произвольных объектов из импортированного модуля тоже нет.

функциональное программирование

Так оно в схеме есть, а в лиспе даже оптимизация хвостового вызова в стандарте отсутствует. И для вызова функции из переменной надо funcall вызывать. Нормального функционального программирования, чтобы цепочка вызовов не создавала промежуточных объектов как в Haskell нет ни там ни там. В том объёме, в котором функциональное программирование в лиспе, оно нынче и в питоне и в JS есть.

Главное — ключевые слова чтоб были буковка в буковку

Главное семантика. Схемовские макросы на лиспе не сделать (нет синтаксических объектов в языке). Схемовский call/cc (и всё, что на нём от корутин до генераторов) не сделать (нет продолжений в языке). И в обратную сторону: в лиспе CLOS интегрирован в компилятор, поэтому достаточно быстрый, в лиспе есть сохранение образа в файл (не в стандарте, но по факту), в лиспе рестарты и интерактивный отладчик с выбором рестарта и REPL часть языка.

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

Ничосе) В JS тоже переменные и функции в независимых пространствах имён живут?

В этом JS и Схема одинаково далеки от лиспа. А вот продолжений одинаково нет ни в CL ни в JS.

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

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

Да это офигенно.

То есть Haskell лучше, чем Си?

Вопрос как-будто с подвохом. Почти что угодно лучше чем си, тем более хаскель

а вариант Racket ещё лучше, где (void) это просто значение процедуры, а почти все конструкции, являющиеся в Си синтаксическими, из сферы синтаксиса перенесены в сферу библиотечных макросов?

А вот это нет, полноценные типы лучше макросов

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

Ну тут, как говорят, на безрыбье…

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

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

Вопрос как-будто с подвохом. Почти что угодно лучше чем си, тем более хаскель

Там выше фанаты сей были, которым паскаль поперёк горла был, и на хаскель тоже наезжали.

monk ★★★★★
()

Что за алгоритм нумерации 2,92? Вот Кнут я знаю TeX к числу Pi нумерует, чем выше патч, тем Pi ближе.

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

Чем слово void хуже слова procedure?

Тем, что в си нет процедур. Они не предусмотрены дизайном языка, в котором почти всё обладает побочными эффектами, как пишет твой любимый столяров.

Нет.

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

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

Значит это побочный эффект.

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

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

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

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

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

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

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

Если же стеком попользовались и вернули как было - то нет.

Если памятью из кучи попользовались и вернулись - то нет. А если вложенность вызовов привела к исчерпанию стека - то будет.

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

liksys ★★★★
()

О нет, очередной столяровский тред. Читать это все я конечно же не буду) Напишу только, вот для чего нужно образование? Чтобы получить профессию -> получить работу -> получать деньги и перестать зависеть от мамки. А студент Столярова в рабочем коллективе будет как Маугли, не хотеть пользоваться благами цивилизации (базами данных например) и говорить на каком-то своем языке (привет побочные эффекты).

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

Вот что было сказано про издание 2,9:

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

Всякие 2,91, 2,92 - незначительные изменения (добавление кликабельного оглавления и корректного текстового слоя, а также исправления найденных на момент публикации опечаток).

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

Извиняюсь, не согласен, до интернета я например basic изучал первым языком, и не просто basic, а gw-basic и БЭЙСИК на МК85, именно на МК85 он был первым

1 программа была, пиксель по диагоналям отскакивал от бортов и паспорт на МК85

все… больше ничего, и мне 10 лет (92 год) и никого..

изучай как хочешь

и только потом ZX SPECTRUM / Z80 и журналы, и ассемблер

а тооооолько потом либо Си, либо Паскаль, я выбрал Си

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

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

так там надо объяснять с начала термина вычисление/Тюринг/Черч/Конечные автоматы/Синтаксис ну то есть полностью переучивать

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

Я считаю, что это очень показательно. @Xenius прямо таки настаивает на том, что именно понимание по столярову дает БАЗУ, и только так можно писать хороший код.

Сам при этом программировать не умеет вообще. Буквально это.

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

Ну или хотя бы лисп-машины.

Emacs запусти - вот тебе и будет lisp-машина.

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

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

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

Было бы неплохо, чтобы упомянутые паскалисты, помимо чтения книжек, писали какой-нибудь полезный код.

Судя по их комментам в треде после создания DoubleCommander они достигли совершенства поэтому написание чего бы то ни было ещё утратило всякий смысл :)

Что само по себе довольно иронично - даже сам Вирт не стал зацикливаться на пасквиле, а двинулся дальше к Modula(-2) и Oberon. Причём в отличии от благополучно загнувшегося фронта пасквиля, для первого даже есть поддержка в GCC: https://gcc.gnu.org/onlinedocs/gm2/ - потому что писать компиляторы это воистину не языком про побочные эффекты на форумах трепать.

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

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

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

Какая разница что говорит дурак

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

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

Здесь речь идет исключительно об операциях и выражениях, о функциях нет ни слова.

Разницу между операцией и функцией я понимаю, а что это опровергает — не очень.

Приведу пример:

print("hello\n"); // returns int
exits(nil); // returns void

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

Во второй же строке возвращения результата нет, значит и побочного эффекта [выражения с возвращающим значением] нет.

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

Интересная философия. Думаю, г-н Столяров не оценит позицию Дэниела Инголлса, что: «Операционная система — это всё, что не поместилось в язык. Быть её вообще не должно».

Via_Sicka
()

Столько тут рекламмировали Столярова почитать, руки недоходили, скачал на телефон, опять не тянет, формат pdf, всё одной простыней.

AZJIO
()
Ответ на: комментарий от Welle

Оно в топ-1 исключительно из-за того, что в комментариях обсуждают психические отклонения авторов опуса. Такое себе достижение.

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

Разницу между операцией и функцией я понимаю, а что это опровергает — не очень.

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

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

вообще что паскаль должен быть первым вообще как то не вижу веских причин

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

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

Вот просто так Паскалю как ЯП учить смысла нет и никто его, окромя школьных училок, не учит, и они учат ему около 20 уроков за всю школьную жизнь человеческой личинки. Паскаль просто УДОБЕН в качестве МЕТОДИЧЕСКОГО НАГЛЯДНОГО материала при ВВЕДЕНИИ в программирование. Удобен он своей ясностью и простотой, возможностью без невнятных для начинающих объяснений начать писать и запускать реальные программульки на реальном компе.

Возьмём для сравнения упомянутый тут Go (пусть будет «живой» Go завместо «мёртвого» Паскаля). Первая прога на Go:

package main
import "fmt"
 
func main() {
    fmt.Println("Hello!")
}

Объяснение к ней: «Программа на языке Go определяется в виде пакетов. Программный код должен быть определен в каком-то определенном пакете. Поэтому в самом начале файла с помощью оператора package указывается, к какому пакету будет принадлежать файл.»

Какой будет первая реакция начинающего? Правильно, «ЧЁ?!» Т.е. что такое пакет и зачем он нужен? В руководстве, которое я цитирую, что такое пакеты объясняют в гл. 6. До этого «пакет», «import» и «fmt.» – это такая магия.

А насколько «удобно» для начинающих ВОСЕМЬ способов объявить переменную?! 12 операторов присваивания? Просто широченное поле наплодить ошибок, которые не выявляются беглым взглядом опытного препода.

Вариант «Давайте учить ограниченное подмножество Go» не имеет смысла, т.к. этот «ограниченный Go» будет этаким уродливым Паскалем, который потом для освоения Go придётся забыть и переучиваться, да и чисто педагогическая проблема, что делать с теми, кто будет при выполнении учебных заданий игнорировать искусственные ограничения, поскольку Go не эзотерические знания?

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

А как определение оно без контекста неполноценное.

Данное определение («Несовершеннолетними признаются лица, не достигшие 18 лет.») полноценно, поскольку «совершеннолетний» и «дееспособный» не тождественные понятия в юриспруденции.

И таки ОПРЕДЕЛЕНИЯ есть область произвола автора опуса. Дурным тоном является давать новые определения устоявшимся терминам или вводить новые термины, тождественные имеющимся.

Так что определения «Несовершеннолетними признаются лица, не достигшие 18 лет.», «Несовершеннолетними признаются лица, не достигшие 13 лет.», «Несовершеннолетними признаются лица, не достигшие 20 лет.» нельзя называть истинными или ложными, это ОПРЕДЕЛЕНИЕ термина в некой юрисдикции.

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

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

Похоже на вольную интерпретацию. Приведу аналогию: дерево — это предмет без эмоций, а эмоции — это что-то, чего нет в деревьях.

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

Так вот, определение из Википедии довольно строго указывает, что речь идёт не о любых операциях или выражениях, а только о тех, которые обладают обоими характеристиками: “its … reading … and returning a value.” Если бы наличие последней было необязательным, то “and” можно было бы заменить на “or” и получилось бы «любой эффект, кроме чтения или возвращения».

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

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

Похоже на вольную интерпретацию.

Нет, это буквально изложение столяровских заблуждений кратко.

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

Я об этом и говорю.

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

☕️☕️ за Go. Хотя это мой любимый язык, для введения он не годится.

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

println задачу бы упростил. Однако, “it is not guaranteed to stay in the language” 1. И переход от println к математическим функциям всё равно должен быть короткий — намного короче введения в модули.

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

Там, где приходится тщательно и неизбежно сглаживать углы (тот же самый импорт)

Пфф, читал книжку по ассемблеру IBM 360, там первые учебные примеры для ввода (с перфокарт) вызывают макрос (не стандартный), типа пока делайте вот так, дальше будет объяснение, что это такое. И позже в книжке автор приводит код своего макроса) Не проблема.

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