LINUX.ORG.RU

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

 , , ,

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

4

6

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

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

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

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

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

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

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

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

★★★★★

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

И ломать не надо, просто копируешь в system32 и прописываешь в реестре, а потом выбираешь.

Это и есть ломать. Для каждой программы/библиотеки по системной раскладке делать.

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

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

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

Я про подход. Передаёшь пользователю программу и инструкцию, как заменить раскладку.

Впрочем, у людей принято ради программы всю ОС менять, докер называется…

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

Ну см

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

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

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

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

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

Я был уверен, что libc и gtk придётся подкладывать.

Разработчики GNU libc специально поддерживают обратную двоичную совместимость. Это значит, что любая программа, слинкованная с libc определённой версии должна компоноваться и работать с любой более поздней версией libc.

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

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

Всё дело в том, что есть разные юрисдикции и есть даже такие, в которых в любых соглашениях обязаны быть прописаны компенсации. Потому, как я слышал, у M$ нашлось 2 варианта для обоих случаев, в случае без денежных гарантий она прописывала возврат денег за покупку, а в случае обязательной компенсации за порчу она прописывала денежную компенсацию в размере… $5.

Я даже когда-то (лет 35 назад) читал эти лицензии и ставил галочку «Согласен».

Так что у вас есть шикарная возможность получить за порчу данных на много-много денег в заявительном порядке компенсацию от M$ в размере $5.

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

Ты говорил, что это всё бесполезно, я опроверг.

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

на самом деле это не настолько существенно

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

паскалефанбоями

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

Причём с половины первого тома можно начать параллельно изучать программирование на том же Питоне именно как программирование на Питоне. Или на Луа или даже Go, Пёрле или Котлине, Аде.

Единственная разумная альтернатива Паскалю в качестве иллюстративного ЯП при введении в программирование для будущих программистов не исключительно в web – это блок-схемы плюс ассемблер для базовой базы, а потом Си с переходом к С++.

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

программирование на том же Питоне

Вот насколько же хорошо видно людей, которые никогда не пытались людей с улицы программированию научить

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

Не надо людей с улицы программированию учить.

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

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

Опровергнуто, в любом случае.

Это существенно

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

что в нём можно для иллюстраций взять любой ЯП «общего» назначения

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

После столяровкого первого тома сможешь программировать на Паскале, а после второго – на Си.

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

Единственная разумная альтернатива Паскалю… блок-схемы плюс ассемблер

Да ты же наглухо отбитый!

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

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

Существует как минимум два контрпримера. qmail, слинкованный с libc-2.2, не работает с libc-2.3 и более поздними (нет символа errno). Программы, слинкованные с libc-2.12.1 (и хорошо с ним работающие), работают, но жутко глючат с libc-2.12.90 и выше.

Поэтому я предполагал, что за 16 лет тоже будет какая-нибудь ещё несовместимость.

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

Так что у вас есть шикарная возможность получить за порчу данных на много-много денег в заявительном порядке компенсацию от M$ в размере $5.

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

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

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

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

qmail, слинкованный с libc-2.2, не работает с libc-2.3 и более поздними (нет символа errno).

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

работают, но жутко глючат

Это вообще классика с обосравшимся Торвальдсом - неправильное использование memcpy / memmove.

То есть, во всех этих случаях разрабы сами облажались.

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

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

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

https://github.com/gnutools/glibc/blob/5107cf1d7d27f17c6de68ec15a8e8d9dd5b471c1/include/errno.h#L47

В новой удалили. Поэтому если собрать со старой, а потом предоставить новую, работать не будет.

Это вообще классика с обосравшимся Торвальдсом - неправильное использование memcpy / memmove.

В старой работало? Работало. Обновление библиотеки сломало работающую программу? Сломало. Значит совместимости со старым поведением нет. Обе библиотеки соответствуют задекларированному API, но работают по-разному.

monk ★★★★★
()
Ответ на: комментарий от 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)
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)