LINUX.ORG.RU

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

 , , ,

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

4

4

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

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

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

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

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

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

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

★★★★★

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

Но у этих действий нет эффектов, а следовательно по Столярову это не процедура, не функция, а какой-то ваылдорыувалдомр.

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

И определению это не противоречит. Последовательность действий может быть пустой.

Вот есть типичная функция, которая возвращает id существующей или новый записи в БД. Каждое из ее действий, включая создание записи и возврат результата - строго желаемое и ожидаемое, и никак иначе требуемый функционал сделать нельзя.

Столяров как раз такой пример и приводит как функции с побочными эффектами. Здесь две ответственности на один кусок кода: проверка наличия существующей (и возврат её id) и создание новой, если существующей нет.

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

Приведите тогда определение термину «эффект». Вот есть функция на C++, которая складывает два своих аргумента. У нее нет никаких эффектов? Или нет только побочных?

Если она не «Reading an object designated by a volatile glvalue, modifying an object, calling a library I/O function, or calling a function that does any of those operations», то нет никаких эффектов.

Вы же сами выше утверждали, что тип void у функции дает то же самое, что процедура.

Для меня это так. Но у меня первым языком является Паскаль. Столяров пишет, что в Си процедур нет.

На самом деле SRP значит совершенно другое.

А именно? Насколько я знаю, звучит так: «каждый класс, модуль или компонент кода должен иметь только одну чётко определённую ответственность и быть способным изменяться только по одной причине». То есть, если у тебя компонент кода может изменяться, если по причине «поменялся алгоритм поиска» или «поменялся алгоритм создания» записи, то он нарушает SRP.

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

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

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

Если газ в нефтяной скважине, он попутный. Если в газовой, то не попутный. По твоей логике это значит, что вид скважины зависит от попутного газа.

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

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

И от чего же они тогда, по-твоему, зависят, ну-ка?

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

И, как мы уже выяснили, он заблуждается.

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

И при этом считаешь, что это я и monk сектанты.

с применением простых языков типа питона

Вот уж точно не питона. Почему у него обычное присваивание, без всяких значков указателя делает вот так?

>>> a = [1, 2, 3]
>>> b = a
>>> b[0] = 99
>>> print(a)
[99, 2, 3]

Я вот чего не понимаю, так это почему набравшие популярность языки вроде Python или Lua настолько упоротые. В последней например \123 - это десятичный код, хотя во всех других языках восьмиричный. ~= вместо != или <> и тд.

Паскаль хорош хотя бы тем, что он наименее упоротый из мейнстримных языков.

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

Не так.

А вот @monk утверждает, что так. У вас показания расходятс %)

Столяров определяет побочный эффект по нахождению его в выражении.

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

Никакие у тебя не факты, у тебя субъективщина «определение Столярова мне не нравится» которое ты выставляешь как факт.

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

Занятно кстати, как у тебя вылезает явная логическая ошибка уже не первый раз.

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

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

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

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

мне кажется каждый язык программирования имеет своё определение

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

Построение новой теории всегда начинается с определений

Зачем нужно строить новую теорию в главе по паскалю учебника основ программирования?

Зачем использовать перегруженный термин для своей теории

Оригинальный термин как раз не перегруженный, в отличие от варианта с побочными эффектами.

Я могу придумать двадцать причин.

Можно пожалуйста первые десять, применимые непосредственно к сабжу?

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

При чем тут какие-то рамки новых теорий и математика? Человеку учащемуся на программиста говорят что СУБД это волшебный гномик, а потом он устраивается на работу, где ему нужно работать с настоящей СУБД. Ему правильное определение нужно угадать или самому выдумать? Вроде очевидно, что он должен был его узнать на курсе по базам данных?

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

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

Причём в главе своей книги про параллельные вычисления, в которой он учит писать такие программы %-)

Феномен. Возможно учительская профдеформация что ли.

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

Где-то в другом месте он говорит, что задачи, которые решаются на компьютерах в основном остались теже, что и 30 и даже 40 лет назад. http://rebuildworld.net/manifesto.html

First of all, they are really fond of selling us more and more “powerful” computers, which we actually don't need as we generally use them for the same tasks as 30 or even 40 years ago.

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

С такой точки зрения действительно многоядерные на сотни ватт TDP процессоры - это «вызывающе дебильно».

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

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

Софистика. Так можно почти про что угодно сказать.

Напоминаю, мы находимся в обсуждении произведения преподавателя МГУ. Даже если бы он захотел что-то написать «для выпускников средних школ и учащихся ПТУ», у него бы не получилось. Профессиональная деформация. Вы упорно пытаетесь с математики соскочить на бытовуху. Я вам попытался показать другой подход, и немножко мотивацию. Больше не буду.

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

И от чего же они тогда, по-твоему, зависят, ну-ка?

Функции определяются словом function и могут использоваться в выражениях, а процедуры определяются словом procedure.

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

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

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

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

Почему у него обычное присваивание, без всяких значков указателя делает вот так?

Потому что в питоне нескалярные типы передаются по ссылке. Очень простое базовое правило языка.

Вот уж точно не питона.

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

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

А тебе питон не нравится, потому что ты его просто не знаешь.

он ничего не знает :(

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

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

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

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

Кстати, транспьютеры фирмы INMOS как раз пытались воплотить эти идеи - дешёвые, простые, масштабтрующиеся в сеть… Были достаточно востребованы.

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

Почему у него обычное присваивание, без всяких значков указателя делает вот так?

А зачем здесь значки указателя? Есть объект [1, 2, 3]. Его поместили в переменную a, потом его же поместили в переменную b. Потом изменили его первый элемент. Логично, что через вторую переменную также виден изменённый объект.

В Си также

   a = malloc(3);
   a[0] = 1; a[1] = 2; a[2] = 3;
   b = a;
   b[0] = 99;
   printf("%i, %i, %i\n", a[0], a[1], a[2]);
monk ★★★★★
()
Ответ на: комментарий от monk

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

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

liksys ★★★★
()

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

Лично у меня Столяров уже устойчиво ассоциируется с местным известным шизом, которого периодически вносили в треды. Но тот уже сдулся и ушёл с Rust-ом борцуваться, а этот книги пишет.

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

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

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

Синтаксически, да. Также, как синтаксически структура от класса отличается только тем, что у структуры поля по умолчанию публичны.

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

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

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

Есть. Пройди тест Войнаровского (опубликован в 2005 году впервые) на логическое мышление и скажи результат. Мне реально интересно, у тебя логика сломана или как. Я прошел тест по ссылке которую дал, чтобы убедиться, что работает и что он не пошлёт регистрироваться, чтобы выдать ответ.

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

В Си также

Нет, не так же. Тут у тебя a и b указатели. С указателями всё очевидно. А у питона нет никаких значков указывающих на указатель или ссылку вроде ^ * или &.

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

Это процедура синтаксически

А семантически согласно внутренней реализации компилятора это что? Это процедура согласно каждому первому из десятков/сотен учебников, кроме одного единственного конкретного учебника.

По Столярову, если хочешь выполнить эффект пишешь процедуру

Я хочу выполнить «эффект» и вернуть его результат. Мои действия?

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

Чему эти эффекты побочны? Какая часть этого функционала непобочна?

Здесь две ответственности на один кусок кода: проверка наличия существующей (и возврат её id) и создание новой, если существующей нет.

Хорошо, мы делаем функцию, которая создает новую запись и возвращает нам ее id. Теперь она потенциально опасна, потому что искомая запись уже может существовать. Нам важно другое - мы не можем в общем случае разделить создание записи и получение ее id. Оба действия должны быть выполнены одной операцией с БД, потому что перед выполнением следующей с БД может повзаимодействовать кто-то еще, и API возвращающий id последней операции (если он вообще есть) вернет что-то другое. Итого, у нас обязательны и создание записи в БД, и возвращение id.

Ну или допустим нужна функция которая делает модифицирующий веб-запрос существующему сервису и возвращает результат. Единcтвенный доступный на платформе http API делает это одним блокирующим библиотечным вызовом, и мы не можем написать ничего меньше чем этот один вызов. Что здесь будет «побочно», а что «непобочно»?

Если она не «Reading an object designated by a volatile glvalue, modifying an object, calling a library I/O function, or calling a function that does any of those operations», то нет никаких эффектов.

Согласно какому определению термина «эффект»? На основе чего сделано это утверждение?

Для меня это так. Но у меня первым языком является Паскаль. Столяров пишет, что в Си процедур нет.

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

А именно?

Каноническое определение звучит как «each software module should have one and only one reason to change». А дальше я лучше процитирую книгу Clean Architecture Роберта Мартина, автора SRP:

"Of all the SOLID principles, the Single Responsibility Principle (SRP) might be the least well understood. That’s likely because it has a particularly inappropriate name. It is too easy for programmers to hear the name and then assume that it means that every module should do just one thing.

Make no mistake, there is a principle like that. A function should do one, and only one, thing. We use that principle when we are refactoring large functions into smaller functions; we use it at the lowest levels. But it is not one of the SOLID principles—it is not the SRP.

Software systems are changed to satisfy users and stakeholders; those users and stakeholders are the “reason to change” that the principle is talking about. Indeed, we can rephrase the principle to say this: A module should be responsible to one, and only one, user or stakeholder.

Unfortunately, the words “user” and “stakeholder” aren’t really the right words to use here. There will likely be more than one user or stakeholder who wants the system changed in the same way. Instead, we’re really referring to a group—one or more people who require that change. We’ll refer to that group as an actor. Thus the final version of the SRP is: A module should be responsible to one, and only one, actor. …

Perhaps the best way to understand this principle is by looking at the symptoms of violating it. …

Two different developers, possibly from two different teams, check out the Employee class and begin to make changes. Unfortunately their changes collide. The result is a merge. "

Ну и еще есть целая статья от него же по теме.

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

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

И ты вёл какие-то курсы по питону, взаимодействовал с учениками?

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

Синтаксически, да

Да и фактически: насколько я помню, функция - это тоже процедура в которую неявно первым параметром передаётся ссылка на Result.

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

Нет, не так же. Тут у тебя a и b указатели. С указателями всё очевидно. А у питона нет никаких значков указывающих на указатель или ссылку вроде ^ * или &.

В приведённом куске кода на Си тоже никаких значков указывающих на указатель или ссылку вроде ^ * или & нет.

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

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

Да и фактически: насколько я помню, функция - это тоже процедура в которую неявно первым параметром передаётся ссылка на Result.

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

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

И ты вёл какие-то курсы по питону, взаимодействовал с учениками?

Это вряд ли... «Чукча - не читатель...» :))

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

В приведённом куске кода на Си тоже никаких значков указывающих на указатель или ссылку вроде ^ * или & нет.

Есть, [], они только с указателями используются.

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

Нельзя, потому что оператор a = a + 1;, если бы a было указателем, должно было бы переключить a на следующий адрес с инкрементом равным sizeof(a), а в Python такого не происходит, происходит обычная операция над целыми числами.

Да и в Python много других упоротостей, которые я забыл.

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

Я хочу выполнить «эффект» и вернуть его результат. Мои действия?

Пишешь процедуру. Потому что первичен эффект. Например, запись в БД и возврат количества изменений - это процедура.

Чему эти эффекты побочны? Какая часть этого функционала непобочна?

Основной результат — вернуть id по переданным параметрам (если это функция). Побочный: создать новую запись.

Хорошо, мы делаем функцию, которая создает новую запись и возвращает нам ее id.

По смыслу это процедура. Задача которой: создание новой записи.

Ну или допустим нужна функция которая делает модифицирующий веб-запрос существующему сервису и возвращает результат.

И здесь процедура. Потому что если сделать функцией, то потом крайне сложно отлаживать что-то вроде:

   z = calcWithModification1() + calcWithModification2() * calcWithModification3();

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

Согласно какому определению термина «эффект»? На основе чего сделано это утверждение?

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

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

В смысле? Функции возвращают результат.

Thus the final version of the SRP is: A module should be responsible to one, and only one, actor. …

В такой формулировке любой модуль, разрабатываемый одним разработчиком, который лично принимает решения, или для одного заказчика соответствует SRP. Предпочитаю все-таки буквальное «reason to change», где виртуальным заказчиком является любой другой модуль программы.

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

как чел до сих пор фанатеющий по алгол-дереву языков(схема кста в этом дереве) и уважающий Паскаль и ваще всю ветку языка Вирта ( от эйлера через algol-w и все его пошаговые_улучшения_языка до оберона )

имею утверждать что общераспространённый Паскаль был тот ещё упорыш/

магические write read c произвольной арностью

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

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

Паскаль продукт эпохи больших машин - и при начальной тормазнутости cc и даже pcc у последних при всём Сяшном кракозаберном синтаксисе(особенно по практическим удобствам вот та самая спираль парсинга вызовов и обьявлений) сяшка разрабатывалась на условно-персональной системе и поэтому так удачно зашла на персоналках - форт частично поэтому тож ну и ещё к меньшему размеру памяти заточенный

у эталонного Паскаля ваще кстати отсутсвола модульность - т.е ровно как в Сяшке ожидались текстовые инклюды

более того Паскаль изначально как и все языки той эпохи не предпологает наличия ОСи

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

Есть, [], они только с указателями используются.

Ну тогда в питоне тоже есть.

Нельзя, потому что оператор a = a + 1;, если бы a было указателем, должно было бы переключить a на следующий адрес с инкрементом равным sizeof(a), а в Python такого не происходит, происходит обычная операция над целыми числами.

Число такой же объект. Операция + возвращает новый объект-число, полученный на основании значений аргументов.

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

Чак Мур ваще в одного творил массово-ядерные(на тысячи ядер) процы с микрофортами(меньше чем у риска набор маш команд) — там реально очень интересные показатели количества потребных транзисторов к общей вычислительной мощности и сверхмалому энергопотреблению - и было это уже к середине 90ых

однако «эволюции важней» приспособленное а не сверхоптимальное

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

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

ибо в Питоне имена(которые по инерции называют переменными) это по сути ключи к (неявному)словарю окружения

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

у питона нет переменных в классическом смысле

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

в отличии от этого в Питоне всякое имя это ключ в некотором словаре

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

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

Ячейка. Только в ней не значение, а адрес значения. Зато единообразно, а не так, что массив передаётся по ссылке, а он же как поле структуры по значению.

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

высокоуровнево в Питоне всё на словарях

так то cpython очевидно использует разные «суперкомпиляции» под разные случаи - но на уровне синтаксиса всё есть имя (ключ в некотором словаре) а уж какой там объект («простой» али составной) это неотличимая частность

на уровне семантики в Питоне нет ссылок - можно типо навертеть именующие имена через тот же locals()[someName] для получения «разыименнующего указатель выражение» - но так больше обфустикации чем пользы

зы: основной тэйк что классические переменные это псевдоним адреса (глобального али индекса от вершины стека не суть) - в отличии от этого в Питоне это индекс в словаре

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

Я имел ввиду, как функции реализованы в Паскале. Это также процедура, которой компилятор неявно подсовывает дополнительный параметр - ссылку на результат.

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

Это и называется «соглашение о вызовах функций». В pascal параметры в стек слева-направо, очищает вызываемый (отсюда, кстати, и va_args не было и явное разделение процедур и функций). В cdecl параметры в стек справа-налево, очищает вызывающий, результат в eax.

Там ещё и гибридный stdcall и регистровый fastcall и т.д. и т.п.

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

Я хотел сказать, что ABI диктуется не языком программирования, а парой процессор-компилятор, но я понимаю, что вы хотите сказать. Для конкретной тройки - язык, компилятор, процессор всё что вы говорите возможно и так, но стоит изменить компилятор-процессор, и соглашение о том, как передавать параметры и результат может быть совсем другим. Существует, например, компилятор паскаля для arm? Конечно, например FPC. Где там eax? Там есть R0, который используется для возврата результата, но в принципе, R1,R2 или R3 тоже могут использоваться, а могут и все сразу.

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

Физика: правила Кирхгофа, закон Джоуля-Ленца, комплексное сопротивление, скорость и частота света, уравнения Максвелла, лагранжиан и гамильтониан, квантовая механика

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

Несправедливо забыта лингвистика, кстати.

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

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

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

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

И ты вёл какие-то курсы по питону, взаимодействовал с учениками?

сапог_на_голове.jpg

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

Я прошел тест по ссылке которую дал

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

Мне реально интересно, у тебя логика сломана или как.

https://psytests.org/result?v=logM22&f=1zzzzz

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

В бытовом смысле, если ты строишь свои рассуждения на основе неверной концепции, все рассуждения оказываются ложными. Они истинны внутри системы по отношению к исходному утверждению, но по отношению к объективной реальности - нет. Осознай уже это наконец.

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

Пишешь процедуру. Потому что первичен эффект.

Но сам Столяров на практике в таком случае пишет функцию, и вроде даже другим советует.

Основной результат — вернуть id по переданным параметрам (если это функция). Побочный: создать новую запись.

В требованиях к функции есть оба действия - она должна убедиться что объект есть, и вернуть его id для последующей работы. Отсутствие любого из них делает функцию бесполезной для задуманного применения. По какой причине они вдруг разделились на основной и побочный, да еще и именно так?

И здесь процедура. Потому что если сделать функцией, то потом крайне сложно отлаживать что-то вроде

Зачем нужно умножать структуру с телом ответа и кодом результата на что-то? А чистую функцию с математическим вычислением удобно отлаживать? По такому принципу их тоже процедурами нужно сделать.

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

А что в этом хорошего то? И если это так хорошо, то почему процедуры исчезли из современных языков почти полностью? А в некоторых на возврате результата вообще вся обработка ошибок построена.

Так твоего же

Это определение термина «побочный эффект». Я спрашиваю определение термина «эффект». Желательно со ссылкой на источник. Потому что классически деление происходит на side effect и primary effect, которые вдвоем охватывают все случаи. Соответственно, было бы логично предположить, что «эффект» без уточнения просто включает оба класса. Но это вступает в противоречие с написанным, где «эффект» приравнивается к «побочному эффекту» в C и C++.

Функции возвращают результат

Это не ответ на поставленный вопрос. Полотно вычислений на 300 строк в теле чистой функции это что? Это ведь должно быть чем-то?

В такой формулировке

Что поделать, это единственно правильная формулировка под «брендом» SRP.

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

Причём тут сапог? Я спросил, ты на самом деле что-то преподавал или просто придумал программу курса?

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

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

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

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

Но вообще, можешь прочитать конкретно пункт 4.8.3 Побочные эффекты и 4.8.4 из второго тома, страница 68-71? Ладно, ты не согласен с определением. Но как насчёт выводов?

Кстати там есть ссылка на страницу 33 вот с такими примерами кода:

1:

int string_length(const char *str)
{
    int i;
    i = 0;
    while(str[i] != ’\0’)
        i++;
    return i;
}

2:

int string_length(const char *str)
{
    int i;
    for(i = 0; str[i]; i++)
        {}
    return i;
}

3:

int string_length(const char *str)
{
    const char *p = str;
    while(*p++);
    return p - str;
}

4:

int string_length(const char *str)
{
    const char *p;
    p = str;
    while(*p)
        p++;
    return p - str;
}

5:

int string_length(const char *str)
{
    const char *p;
    for(p = str; *p; p++)
        {}
    return p - str;
}

Как по-твоему, какие из этих вариантов допустимы, а какие нет и почему?

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

Но сам Столяров на практике в таком случае пишет функцию, и вроде даже другим советует.

На Паскале? Есть пример?

По какой причине они вдруг разделились на основной и побочный, да еще и именно так?

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

Зачем нужно умножать структуру с телом ответа и кодом результата на что-то?

Так если его не надо использовать в выражениях, зачем делать функцию?

А чистую функцию с математическим вычислением удобно отлаживать?

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

Этим, кстати, хорош Haskell. Тесты для него писать одно удовольствие (а для инвариантов он их сам генерировать умеет).

А что в этом хорошего то?

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

И если это так хорошо, то почему процедуры исчезли из современных языков почти полностью?

Потому же, почему сейчас из языков исчезает наследование, а из некоторых и обработка исключений. Процедуры требуют дисциплины программирования, которую невозможно проконтролировать компилятором. Поэтому в современных остались там, где дисциплину можно обеспечить административными методами (ABAP, 1С, Ada, …).

Это определение термина «побочный эффект». Я спрашиваю определение термина «эффект».

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

Потому что классически деление происходит на side effect и primary effect, которые вдвоем охватывают все случаи.

И что такое primary effect в C++?

Это не ответ на поставленный вопрос. Полотно вычислений на 300 строк в теле чистой функции это что? Это ведь должно быть чем-то?

Не понимаю вопроса. Тело функции, наверное.

Что поделать, это единственно правильная формулировка под «брендом» SRP.

Хорошо, термин SRP мной применён некорректно. Но в том же тексте есть безымянный принцип, на который я фактически ссылаюсь: Make no mistake, there is a principle like that. A function should do one, and only one, thing.

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

Ты можешь посмотреть на примеры кода и подписать какие по-твоему ОК, какие нет? Ладно, не хочешь читать фиг с тобой.

Ну и про сапог - ты что имел ввиду?

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

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

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

По поводу кода ты отвечал только на затасканный пример с копированием строки. А тут я откопал другой пример. Мне твой ответ нужен был для проверки гипотезы.

Xenius ★★★★★
() автор топика
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)