LINUX.ORG.RU

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

 , , ,

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

4

6

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

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

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

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

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

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

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

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

★★★★★

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

Ты не читаешь, что пишут, или не можешь понять, что написано?

Это чуваки грубо нарушили самые базовые правила программирования и вместо glibc’ишного <errno.h> самостоятельно определили библиотечные символы.

Если ты делаешь ошибку при разработке своего ПО - результат его работы не гарантирован.

Так в старой версии был этот символ

Нет, в публичном API не было. И быть не могло: errno по стандарту - это нёх, имеющий значение типа int.

Обе библиотеки соответствуют задекларированному API, но работают по-разному.

Да. Стандартная библиотека определяет интерфейсы и корректные инварианты их использования, но НЕ определяет реализацию. В программировании это называется "публичный интерфейс библиотеки". В рамках этого интерфейса glibc обратно совместима.

Если ты нарушил описанные инварианты (пояснение для тебя - сделал ошибку в своём коде) - гарантий работоспособности (как и гарантий сбоя) нет. Приведённые тобой примеры - это явные ошибки программистов прикладных программ.

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

Нет, в публичном API не было. И быть не могло: errno по стандарту - это нёх, имеющий значение типа int.

Было. Я же ссылку на содержимое /usr/include/errno.h привёл. При линковке с той версией с современными glibc не работает. Надо перекомпилировать. Совместима только для статической линковки.

Ещё одна проблема динамической линковки: может работать, но глючить, даже если разработчик не нарушал требования API (как с memcpy).

Например

$ cat >libfoo.c <<EOF
#include <stdio.h>
#include <time.h>

void foo(int a, time_t b, int *c) {
   printf("a = %d\n", a);
   printf("b = %lld", (long long) b);
   printf("%s", ctime(&b));
   printf("c = %d\n", *c);
}
EOF
$ cat >foo.c <<EOF
#include <stddef.h>
#include <time.h>

extern void foo(int a, time_t b, int *c);

int main() {
    int three = 3;
    foo(1, time(NULL), &three);
    return 0;
}
EOF

Если foo скомпилирована со старой glibc, где time_t 32-битный, а libfoo уже скомпилирован с новой glibc, то foo вместо

a = 1
b = 1727154919
Tue Sep 24 07:15:19 2024
c = 3

будет выводить

a = 1
b = -34556652301432063
Thu Jul 20 06:16:17 -1095054749
c = 771539841

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

В рамках этого интерфейса glibc обратно совместима.

В рамках этого интерфейса и musl с ней совместима.

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

Нет, не сможешь. Особенно это видно по @Xenius.

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

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

Я на паскале, бейсике, ассемблере и Си мог писать задолго до чтения книг Столярова.

Видимо, после чтения его книг уже не можешь, лол.

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

Ну что ты такое несёшь? Тебя никогда не учили, что персональные выпады в дискуссии — это плохой тон?

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

Несу констатацию неприятной для тебя реальности.

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

Другой твой излюбленный аргумент - отсылка к авторитету столярова. Помимо того, что нет никаких других «авторитетов», которые бы имели схожую с ним точку зрения, сам по себе столяров никаким авторитетом в IT вообще и в области разработки в частности не является, как бы тебе этого не хотелось. Он просто местячковый клоун с преподавательскими реалиями и вагоном заблуждений, не способный, к тому же, в аргументацию своей позиции.

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

Доступно? Вполне.

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

Было.

Нет, не было.

Я же ссылку на содержимое

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

...
#ifndef	__need_Emath
#define	_ERRNO_H	1
#include <features.h>
#endif
...
* Get the error number constants from the system-specific file.
   This file will test __need_Emath and _ERRNO_H.  */
#include <bits/errno.h>
...

?

Очевидно, что нет, поэтому и пишешь чепуху.

При линковке с той версией с современными glibc не работает. Надо перекомпилировать. Совместима только для статической линковки.

Зачем ты обманываешь людей в интернете? Это не хорошо.

$ uname -a
Linux debian 2.2.17 #1 Sun Jun 25 09:24:41 EST 2000 i?86 unknown
$ apt-cache show libc6
Package: libc6
Version: 2.1.3-10
Priority: required
Section: base
Maintainer: Joel Klecker <debian-glibc@lists.debian.org>
Pre-Depends: ldso (>= 1.9.11-2.1)
Recommends: locales
Suggests: glibc-doc
Conflicts: libc5 (<< 5.4.33-7), libpthread0 (<< 0.7-10), timezone, timezones, libwcsmbs, libc6-doc, libtricks, apt (<< 0.3.0), libglib1.2 (<< 1.2.1-2), libc6-bin, gconv-modules
Provides: gconv-modules
Replaces: timezone, timezones, libc6-dev (<< 2.0.110-1), libc6-bin, locales (<< 2.1.3-5), gconv-modules
Architecture: i386
Filename: dists/potato/main/binary-i386/base/libc6_2.1.3-10.deb
Size: 1903934
MD5sum: b7f709541651beca67aec8ea21512fa6
Description: GNU C Library: Shared libraries and Timezone data
 Contains the standard libraries that are used by nearly all programs on
 the system. This package includes shared versions of the standard C library
 and the standard math library, as well as many others.
 Timezone data is also included.
source: glibc
installed-size: 9568
 
$ gcc --version
2.95.2
$ gcc monk.c -o monk
$ ldd monk
        libc.so.6 => /lib/libc.so.6 (0x40015000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
$ ./monk
Hello, Monk!
Errno was: 2
$ cat monk.c
#include <errno.h>
#include <string.h>
#include <stdio.h>
 
int main(void)
{
    enum {SIZE = 256};
    int errno_copy;
    FILE* no_file;
    char data[SIZE] = "Hello, Monk!";
    char buffer[SIZE] = {0};
 
    memmove(buffer, data, SIZE);
    no_file = fopen("dont_exists.txt", "r");
    errno_copy = errno;
 
    printf("%s\n", buffer);
    printf("Errno was: %d\n", errno_copy);
 
    return 0;
}
$ ldd monk 
        linux-gate.so.1 (0xf7f7f000)
        libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7d1d000)
        /lib/ld-linux.so.2 (0xf7f81000)
$ nm -D monk 
         w __deregister_frame_info@GLIBC_2.0
         U __errno_location@GLIBC_2.0
         U fopen@GLIBC_2.1
         w __gmon_start__
0804860c R _IO_stdin_used
         U __libc_start_main@GLIBC_2.0
         U memmove@GLIBC_2.0
         U memset@GLIBC_2.0
         U printf@GLIBC_2.0
         w __register_frame_info@GLIBC_2.0
$ ./monk 
Hello, Monk!
Errno was: 2
$ uname -a
Linux computer 6.12.85+deb13-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.85-1 (2026-04-30) x86_64 GNU/Linux
$  apt show libc6:i386
Package: libc6:i386
Version: 2.41-12+deb13u2
Priority: optional
Section: libs
Source: glibc
Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org>
Installed-Size: 12.7 MB
Provides: libc6-i686
Depends: libgcc-s1
Recommends: libidn2-0 (>= 2.0.5~)
Suggests: glibc-doc, debconf | debconf-2.0, libc-l10n, locales, libnss-nis, libnss-nisplus
Conflicts: libc6-i686
Breaks: base-files (<< 13.3~), chrony (<< 4.2-3~), dhcpcd (<< 1:10.1.0-7~), fakechroot (<< 2.19-3.5), firefox (<< 91~), firefox-esr (<< 91~), gnumach-image-1.8-486 (<< 2:1.8+git20210923~), gnumach-image-1.8-486-dbg (<< 2:1.8+git20210923~)>
Replaces: libc6-i386, libc6-i686
Homepage: https://www.gnu.org/software/libc/libc.html
Tag: role::shared-lib
Download-Size: 2,721 kB
APT-Manual-Installed: no
APT-Sources: http://deb.debian.org/debian trixie/main i386 Packages
Description: GNU C Library: Shared libraries
 Contains the standard libraries that are used by nearly all programs on
 the system. This package includes shared versions of the standard C library
 and the standard math library, as well as many others.

Больше четверти века обратной совместимости с более ранними версиями glibc, да ещё и на архитектуре другой разрядности.

С более ранними мне лень заморачиваться - нет ни iso-шек, ни образов для podman / docker. Можешь попробовать сам доказать свой тезис, но пока что он выглядит как ложный.

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

Больше четверти века обратной совместимости с более ранними версиями glibc, да ещё и на архитектуре другой разрядности.

Да, нашёл. По крайней мере до 1996 года errno_location есть. Дальше переименования файлов, отследить сложно.

Вот только вроде в 2000 я компилировал qmail без патчей… странно…

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

Вот только вроде в 2000 я компилировал qmail без патчей

Именно. Ошибка была в коде qmail. Вместо корректного

#include <errno.h>
...
int val = errno;
...

Там был захардкожен extern int errno;, чего делать, конечно же, нельзя.

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

даже если разработчик не нарушал требования API (как с memcpy)

Щито? API memcpy требует (кроме всего прочего), чтобы диапазоны не пересекались.

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

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

Заставлять не может, может только предлагать...

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

Это понятно. Непонятно, почему этот extern int errno работал, а с ошибкой стал падать при компиляции позже.

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

Так я это и пишу. Если разработчики Shockwave нарушили API memcpy и из-за этого их программа сломалась при обновлении библиотеки, то есть варианты, при которых никакого нарушения API нет, но программа ломается, так как новая версия библиотеки имеет другой размер time_t.

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

Может обуславливать продажу подписанием. Например, если продажа по договору купли-продажи и продавец отказывается вносить любые изменения в предлагаемый им договор (не нравится, не покупай, как с ПО).

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

Может обуславливать продажу подписанием

Незаконно.

Например, если продажа по договору купли-продажи

Не «играет»: любая продажа всегда «по договору купли-продажи», даже если «на бумаге» он (договор) и не подписывается...

и продавец отказывается вносить любые изменения в предлагаемый им договор (не нравится, не покупай, как с ПО)

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

P.S. Я живу в России, этот сайт - российский (ну, вроде бы), и я пишу, подразумевая и предполагая, что речь идёт о России, а не какой-нибудь «Центрально-Альфа-Центаврийской Республике»...

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

Незаконно.

С чего вдруг? Свобода договора же. Особый случай только для розничной продажи.

Не «играет»: любая продажа всегда «по договору купли-продажи», даже если «на бумаге» он (договор) и не подписывается…

Разумеется. Но можно продавать только по бумажному договору. И в нём можно написать нужные пункты.

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

Вот! С договором на ПО абсолютно то же самое. Особенно, если покупатель физическое лицо.

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

С определением побочных эффектов он что-то мутное навертел

Что напутал с побочными эффектами сам Андрей Викторович, и что – автор Новости?

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

Непонятно, почему этот extern int errno работал

Это понятно. Потому что в старых реализациях был экспортирован символ extern int errno. Не в подключаемых файлах, а в динамических символах бинарника.

, а с ошибкой стал падать при компиляции позже.

Не при компиляции, а при компоновке. Потому что символ extern int errno перестали экспортировать.

Надо просто понимать разницу между видимостью символов на уровне исходного кода и видимостью символов на уровне компоновки - это две разные видимости.

r--r--r--
()
Ответ на: комментарий от Parthen

Людей с улицы можно начинать учить программированию хоть с вождения черепашки (aka Logo). Хотя-бы базовые знания можно дать и на нём.

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

Что напутал с побочными эффектами сам Андрей Викторович, и что – автор Новости?

Само определение побочного эффекта у Столярова нормальное (пар. 2.3.6, стр. 98 т.1 издания 2.92)

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

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

А вообще интересно, что сейчас решил покопаться в интернете и надо сказать, что есть серьёзные сторонники Столярова на предмет того, что хотя сейчас языки C#, C++, Java, Python и др. не разделяют функции и процедуры, но логически оно имеется. Особенно похоже для британского (не американского) computer science https://www.bbc.co.uk/bitesize/guides/zb33rwx/revision/4 https://www.bbc.co.uk/bitesize/guides/zqh49j6/revision/1

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

Ты делаешь заявления о разработке ПО

Только те, которые могу сделать.

программировать, фактически, не умея

Это ты сделал необоснованный вывод. Не уметь программировать — это не мочь написать даже небольшой программы.

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

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

не способный, к тому же, в аргументацию своей позиции.

У него есть статьи и книги с аргументацией. Например эта (rebuildworld.net).

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

языки C#, C++, Java, Python и др. не разделяют функции и процедуры

В ФОРТРАНе, кажется, никто и не пытался их объединить.

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

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

r--r--r--
()
Ответ на: комментарий от vM

В фортране функция также может возвращать значения в переменных. Более того, в относительно совремённых версиях языка есть директива intent(in) для предотвращения случайного изменения.

Но в принципе, действительно это ещё фортрановское разделение на FUNCTION и SUBROUTINE

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

Только те, которые могу сделать.

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

Это ты сделал необоснованный вывод.

Этот вывоб основан на твоем собственном призании.

Не уметь программировать — это не мочь написать даже небольшой программы.

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

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

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

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

У него есть статьи и книги с аргументацией. Например эта (rebuildworld.net).

По ссылке полторы умные мысли (раз в год и палка стреляет) в перемешку с бредом и заблуждениями. Еще раз повторяю тебе: столяров не программист. Код он писать не умеет. Он объективно безграмотен, судя по его опусам. Именно инженерного подхода в разработке, на который он плюется за который хочет дать в рожу, кичась математикой, ему и не хватает.

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

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

Так я уже возразил.

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

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

Что конкретно? Что тот, кто начинал с питона потом не может осилить указатели и структуры данных? Написать одно/двухсвязный список и что-нибудь с ним сделать — это как раз пара-тройка экранов кода.

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

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

Код он писать не умеет.

Однако пишет же. А не ошибается только тот, кто ничего не делает.

Если бы у тебя были какие-то аргументы исходящие из фактов, а не вида «мне не нравится определение, которое дал Столяров», был бы другой разговор.

Вот я тебе предлагал уже вопрос по факту и ты тут же слился.

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

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

Я могу увидеть какой-то реальный пример?

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

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

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

Причём ещё и с логическими ошибками

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

Что тот, кто начинал с питона потом не может осилить указатели и структуры данных?

Из какой ноздри ты выковырял этот бред?

Написать одно/двухсвязный список и что-нибудь с ним сделать — это как раз пара-тройка экранов кода.

Учебные примеры не показательны.

Один из моих проектов как раз около 2 тысяч строк кода размером.

Только что его придумал?

Однако пишет же. А не ошибается только тот, кто ничего не делает.

Он говнокодит. Видишь ли, каша в голове = каша в коде, и это наглядно подтверждается историей с XSS на его сайте, которая стала возможной потому, что этот клоун с регалиями ни в зуб ногой даже в базовые принципы обработки данных. Ему засунили XSS через тег скрипта в HTML-элементе разметки. Здесь было столько всего не так, что просто мрак.

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

  2. Окей, ты труъ и хочешь HTML. Сесть почитать спецификации? Нет! Наш гуру и так всё знает, а спецификацию писали комитетчики. Ну хорошо, можно было бы написать парсер/санитайзер HTML, который разбирает данные, удаляет всё непонятное, а остальное сохраняет.

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

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

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

Если бы у тебя были какие-то аргументы исходящие из фактов

Так они есть. Просто ты их все пропустил мимо ушей.

«мне не нравится определение, которое дал Столяров

Еще раз для особо тупых: мне не «не нравится». Я считаю его некорректным, и обосновываю это. А вот от тебя, кроме нытья о том, что я незаслуженно отказываюсь от определения столярова и вообще так нельзя, я не слышал вообще ничего.

Вот я тебе предлагал уже вопрос по факту и ты тут же слился.

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

Мы с тобой уже проходили примеры, где ты просил обосновать, почему какой-то код плохой. Я тебе дал простое объяснение, которое в том числе работает и для твоих примеров выше. Но включить свою башку ты не хочешь, ты просто продолжаешь забрасывать меня частными случаями в надежде на то, что мне просто надоест отвечать. И мне таки надоело по причине твоей полной необучаемости и сектантства. Ты отрицаешь любые объяснения не по-столярову как неуниверсальные, а его объяснения возводишь в абсолют, хотя многократно было доказано, что столяров бредит.

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

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

Слился я только в твоих собственных фантазиях.

Конкретно на этот, технический, вопрос ты не ответил. Если ты «устал спорить», то почему продолжаешь на нетехнические?

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

Вот он-то статью написал. Потом на хабре кто-то ответил на одно из утверждений, но остальные так и остались. А ты не только статьи не пишешь, ты даже на простой вопрос поленился ответить. Или просто не можешь?

Еще раз для особо тупых: мне не «не нравится». Я считаю его некорректным

Ещё раз для особо особо тупых: это определение.

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

Ну насчёт «убедительно» спорно, но ладно, показал.

а не от того, процедура это или функция.

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

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

Конкретно на этот, технический, вопрос ты не ответил.

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

Видишь ли, придумывать всё новые и новыё бредни - это ваша со столяровым прерогатива. У меня же нет других ответов для тебя, потому что мой правдивый ответ себя не исчерпал на одном твоем примере.

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

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

Ещё раз для особо особо тупых: это определение.

Еще раз для особо тупых: определение некорректное. Оспаривать определения можно и нужно, потому что это суть постулат. Я уже много раз говорил: прочитай рассказ Азимова «Логика»: здорово прочищает мозги от заблуждений, типа твоего.

Ну насчёт «убедительно» спорно, но ладно, показал.

Совершенно не важно, убедило ли оно лично тебя, потому что ты сектант и не объективен.

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

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

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

в самых ранних версиях Паскаля было очень строгое разделение и в function не допускались параметры var.

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

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

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

что чем меньше семантических фишечек языка нужно помнить для чтения кода - тем он лучше.

вы явно опустили контекст https://ru.wikipedia.org/wiki/URISC ваше минимум семантики - как раз очень «облегчился» при чтение кода любой читатель

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

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

Ну ладно, предположим. Тогда получается что у Столярова и у тебя эквивалентные обоснования одного и того же. И чем ты в этом случае недоволен?

Мы будем дискутировать в системе моих и общепризнанных определений.

По общепринятому определению побочный эффект — это дополнительный, как правило нежелательный, эффект действия. Если у какой-нибудь writeln(n); вывод значения n на stdout — это единственный, причём ожидаемый эффект, каким боком он может являться побочным? Вот вычисление выражения — это другое дело. У него основной эффект — это получение результата. Значит всё кроме получения результата будет побочным. Неужели так трудно понять?

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

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

у Столярова и у тебя эквивалентные обоснования одного и того же. И чем ты в этом случае недоволен?

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

это единственный, причём ожидаемый эффект, каким боком он может являться побочным?

Потому что в реальном мире writeln будет иметь еще и возвращаемое значение. И вот на этом месте столяровский манямирок с делением на процедуры и функции сразу же сыпется.

Неужели так трудно понять?

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

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

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

В реальном мире почти не бывает действий без результата, в таких случаях всё вырождается в функции с возвращаемым значением. Каждое действие должно быть проверено, а ошибка - обработана. Ты можешь использовать procedure и возвражать значение в var, но по сути это всё равно будет функция, просто с корявой семантикой и костылями.

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

Потому что в реальном мире writeln будет иметь еще и возвращаемое значение.

Не будет. Посмотри спецификацию паскаля.

В любом случае, если что подход Столярова, что твой даёт одинаковый результат для оценки хороший код или плохой, то это очередная война тупоконечников с остроконечниками. А если не одинаковый, то приведи примеры кода, который по твоим критериям будет ОК, а по Столяровским плохим и наоборот.

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

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

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

Если у какой-нибудь writeln(n); вывод значения n на stdout — это единственный, причём ожидаемый эффект.

В некоторых реализациях Паскаля – не единственный. ( и stdout есть не везде )

Какие Вы видите побочные (или непобочные) эффекты выражения nine + ( six + seven ), функций и процедур в следующей бессмысленной «программе»?

И каким в целом может быть наблюдаемый эффект выполнения «программы»?

program a(output);
label 666;
function six: real;
begin
	six := 6;
	writeln( 'six')
end;

function seven: real;
begin
	seven := 7;
	writeln ('seven')
end;

function nine: real;
begin
	goto 666;
	nine := 9;
	writeln ('unreachable')
end;

begin
	writeln( nine + ( six + seven ): 3 : 0 );
666:
end.
vM ★★★
()
Ответ на: комментарий от liksys

Еще раз для особо тупых: определение некорректное. Оспаривать определения можно и нужно, потому что это суть постулат. Я уже много раз говорил: прочитай рассказ Азимова «Логика»: здорово прочищает мозги от заблуждений, типа твоего.

Вообще-то определение у Столярова схоже с обычным. У него (2.92 v1. стр.98):

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

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

В английской вики https://en.wikipedia.org/wiki/Side_effect_(computer_science) :

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. Example side effects include modifying a non-local variable, a static local variable or a mutable argument passed by reference; performing I/O; or calling other functions with side-effects.

Правда с очень важным уточнением: any observable effect other than its primary effect Которого у Столярова нет. Но есть слова про контринтуитивность.

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

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

Я могу увидеть какой-то реальный пример?

Было давно и неправда =) Хотел что-то скаченное из интернета скомпилировать под Rust, cargo сразу полез скачивать зависимости. Далее я почитал про cargo vendor, что вроде можно всё упаковать, чтобы не требовался доступ в интернет, но в целом это выглядит сложнее,чем при разработке на C++ и как бы по умолчанию подразумевает наличие интернета во время работы.

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

в Паскале goto изнутри процедуры/функции недопустим, будет ошибка компиляции.

В стандартном Си нет goto между функциями.

Но в Паскале все процедуры и функции вложены либо в главный блок программы, либо в блок другой процедуры или функции. И, если это не реализация урезанного подмножества паскаля для микроЭВМ, а Паскаль удовлетворяющий хотя бы неодобряемому самим Андреем Викторовичем ISO 7185, из блока можно выполнить goto ко всем меткам, видимым из этого блока.

https://standardpascal.org/iso7185.html#6.8.1%20General

выполнение процедуры или функции, выполняющей goto «наружу», естественно, прекращается

https://standardpascal.org/iso7185.html#6.8.2.4%20Goto-statements

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

https://standardpascal.org/iso7185.html#6.7.3%20Function-designators

vM ★★★
()
Ответ на: комментарий от vM
fpc side.pas 
Free Pascal Compiler version 3.2.2+dfsg-20 [2023/03/30] for x86_64
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling side.pas
side.pas(17,10) Error: Goto statements are not allowed between different procedures
side.pas(26) Fatal: There were 1 errors compiling module, stopping
Fatal: Compilation aborted
Error: /usr/bin/ppcx64 returned an error exitcode
anonymous_incognito ★★★★★
()
Ответ на: комментарий от anonymous_incognito
fpc -Miso side.pas
Free Pascal Compiler version 3.0.4+dfsg-23 [2019/11/25] for x86_64
Copyright (c) 1993-2017 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling side.pas
Linking side
/usr/bin/ld.bfd: warning: link.res contains output sections; did you forget -T?
24 lines compiled, 0.1 sec
./side
six
seven
vM ★★★
()
Ответ на: комментарий от anonymous_incognito

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

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

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

Не будет. Посмотри спецификацию паскаля.

Это у паскаля не будет - он игрушечно-теоретический. А в реальности посмотри man write.

приведи примеры кода, который по твоим критериям будет ОК, а по Столяровским плохим и наоборот

Таласса - один сплошной пример.

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

вы возможно правы в частностях

при этом вы не арбитр в своём деле

следовательно - вы явно возгордились

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

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

следовательно

Не следовательно.

и аргумент всё так же валиден

Аргумент всё еще софистика. Ты просто доводишь его до абсурда.

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

Далее я почитал про cargo vendor, что вроде можно всё упаковать, чтобы не требовался доступ в интернет,

Он вообще не требуется. Для компиляции. Для скачивания - требуется, но исходники можно и на флоппе-диске принести.

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

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

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

будь мужыком - опровергай а не отвергай :)

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