LINUX.ORG.RU

Переиздание книг Столярова по программированию

 


9

4

Скандально известный на ЛОРе Андрей Викторович Столяров выпустил новое издание своего учебного пособия «Программирование: введение в профессию» и обновил PDF-версии:
«Азы программирования»
«Системы и сети»
«Парадигмы»
В новом издании 4-томник стал 3-томником.

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

>>> Сайт автора

★★★★★

Проверено: Shaman007 ()
Последнее исправление: Zhbert (всего исправлений: 3)

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

Внезапно, живое преподавание отличается от обучения через литературу

Охотно верю. Только, похоже, ты сам очень слабо понимаешь, чем. Мне доводилось читать литературу самого разного уровня, в том числе и уровня «Микрософт ворд для даунов». Так вот, я тебя уверяю. если автор считает, что подробное изложение некоторой информации нужно отложить до более поздней стадии изучения, то у него есть миллион способов это сделать, ограничившись в начале самым необходимым минимумом из этой информации. И если автор так не делает и вываливает 25 страниц сразу же, то это либо очень плохой автор, не понимающий, что новичок к этому моменту способен осознать без протекания крыши и выкидывания книги за непонятность, либо хороший автор, который прекрасно понимает, что читатель вполне способен это усвоить, а раз так, то нет смысла затягивать с этим. Но в обоих случаях при переводе в очную форму у автора просто нет мотивации что-то менять. Особенно во втором случае — если уж человек способен в одиночку усвоить материал, то, имея возможность задать вопрос преподавателю, он уж точно этот материал усвоит.

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

Таненбаум - типичный теоретический теоретик [skip] С обсуждаемым здесь Столяровым имеет много общего

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

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

либо вы скажете студенту «магия», либо будете долго-долго объяснять, что это за ссылки такие.

Как раз в паскале можно сказать «магия» или нормально объяснить — на результат использования ссылочных параметров это не повлияет. А в си без крестов отделаться словом «магия» не получится, потому что программист, даже начинающий, должен чётко понимать, чем отличается *p от p. И если он в своей функции случайно напишет p=100500, а потом *p*=10, то не только не возвратит в вызывающую программу нужного значения, но ещё и испортит рандомный кусок памяти, что, в свою очередь, может иметь не менее рандомные последствия от абсолютно ничего до падения программы. И это, на мой взгляд, одна из главных проблем си в качестве первого языка для обучения. Однако к парадигмам процедура vs функция, побочные эффекты vs их отсутствие и возможности передавать результат по ссылке она не имеет.

А в паскале, где на первом этапе действительно можно сказать «магия» и безопасно пользоваться, ничего больше не объясняя, лучше всё-таки так не делать, а попытаться объяснить разницу между передачей ссылки и значения. Иначе получится как со студентом, который умел пользоваться готовыми реализациями списков в яве, совершенно не понимая, как они устроены.

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

Кто-то прогуливал указатели?

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

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

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

faust@archlinux ~/П/C/РАзная всячина> cat maximum.txt
int maximum(int x, int y)
{
    if (x > y) return x;

    return y;
}⏎                                                                                                                                                                                                                  faust@archlinux ~/П/C/РАзная всячина> cat c_minuc_1.lox 
c--;⏎                                                                                                                                                                                                               faust@archlinux ~/П/C/РАзная всячина> cat 333.c
#include        <stdio.h>

#include        "maximum.txt"

int main()
{
        int a,b,c;

        a=3;
        b=4;

        c = maximum(a,b);

#include        "c_minuc_1.lox"

        printf("%d", c);

        return c;
}
faust@archlinux ~/П/C/РАзная всячина> gcc 333.c
faust@archlinux ~/П/C/РАзная всячина> ./a.out
3⏎                                                                                                                                                                                                                  faust@archlinux ~/П/C/РАзная всячина> 

О чём можно спорить с супер-преподавателем, который не знает предмета спора от слова совсем. Для не го сами слово «Си» - уже «магия» - потому как он его не знал, не знает, и знать никогда не будет - неспособен просто...

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

Ссылка это алиас. То есть тоже «обычная переменная», но с тем же адресом, что и та, на которую ссылается. С ней нельзя творить всякую адресную арифметику. А в твоём случае - идёт взятие адреса, и получаем указатель.

Можно вспомнить ещё и про r-value ссылки (&& в с++) - ещё дальше в лес.

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

И что ты этим хотел сказать? Решил меня «поймать» на том, что я якобы не знаю как работает include? У тебя НЕ получилось. А теперь попробуй найти в stdio.h код функции printf.

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

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

Как я понимаю, ты топишь за лекции типа таких: https://kpolyakov.spb.ru/download/devcpp_1.pdf

Я сам наблюдал такие лекции неоднократно и сам же читал в похожем стиле. Результат получается не таким как мне хотелось бы. Почитав Столярова, я понял почему. Вот ему удалось донести до меня в чем я был не прав, а у тебя пока не получается.

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

а у тебя пока не получается

Потому что я не пишу об этом трактат ;) Идеи заразительны. Вредные идеи - заразительны не меньше, особенно если их подкрепить псевдоавторитетом и трехтомником. Так что ничего удивительного, в общем-то, нет. У Столярова есть цель заниматься образованием других людей и вдалбливать свои маргинальные идеи, у меня - нет.

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

Ну так твоя идея вредная и нерабочая :) Попробовал сослаться на Прата - вышел пшик. А больше доказательств не имеется.

Reset ★★★★★
()
Ответ на: комментарий от Reset
  1. Не знаешь что такое include - потому объяснить первогодкам упрощённо не в состоянии - поэтому тебя так и прёт от «магии include».
  2. Что находится в stdio.h знать на начальном этапе для «hello world» не надо и даже вредно.
  3. код функции printf подключается автоматом, т.к. он внутри libc и никакой магии линковки нет (далее, когда дойдут до написания простейшего драйвераЮ а это совсем иной уровень, под линукс(~3й курс), наоборот придётся объяснять студентам как отключить дефолтную линковку libc)
  4. Регулярно показываешь незнание предмета спора, не только инклюд - одной фразой вы доказали свою некомпетентность, а признавать не хотите.

Вердикт: конструктивный диалог невозможен.

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

Так это одно и то же.

Нет.

ссылка — более узкое понятие, подразумевающее обычно адрес одной единственной переменной

Ссылка и указатель — это две разные абстракции модели исполнителя. Их определение и свойства между языками отличаются и зависят от конкретной модели.

Но называть указатель ссылкой — абсурд.

Одно из основных свойств ссылки — её синтаксическая прозрачность. Если у вас написано a + 1, то по виду выражения вы не знаете, ссылка перед вами или нет.

Могут быть языки со ссылками, но без указателей. (Скриптота.)

Могут быть языки с указателями, но без ссылок. (Си)

Могут быть с обеими абстракциями. (Си++, Паскаль)

И наверное без обеих. (Тут сходу не назову полнофункциональный ЯП… Ну пусть будет shell.)

При этом ссылки могут фигурировать только как аргументы функций (кажется, в Паскале так – поправьте, если ошибаюсь) или свободно (C++, php). Быть неизменяемыми (C++) или иметь возможность перепривязки к другому объекту (php).

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

Не знаешь что такое include - потому объяснить первогодкам упрощённо не в состоянии - поэтому тебя так и прёт от «магии штсдгву»

Это «упрощенное» объяснение будет для них не более чем шумом и заклинанием «так надо».

Что находится в stdio.h знать на [b]начальном этапе[/b] для «hello world» не надо и даже вредно.

С этим я никогда не спорил. Что конкретно там находится знать не нужно, но что такое объявление функции знать все же нужно.

код функции printf подключается автоматом, т.к. он внутри libc и никакой [b]магии линковки[/b] нет

С этим я тоже никогда не спорил. Но заметь, он подключается при линковке, include <stdio.h> тут совсем не причем. И это ты, кстати, выше заявлял, что include подключает функции, а не я.

Регулярно показываешь незнание предмета спора

Пруфы будут или как всегда? Пока обосрался с незнанием include лишь ты.

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

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

Поэтому в библиотеках можно встретить:


typedef _mytype mytype[1];

void foo(mytype a, mytype b);

void bar(void)
{
    mytype x, y;
    foo(x, y); /* Передача по ссылке! */
}

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

Ссылка это алиас.

Ссылка — не алиас, а указатель на память. В первом приближении можно сказать и «алиас». Но это то же самое, что сказать «магия», т. е. по сути ничего не сказать.

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

Нет! Если бы это было так, то передача аргумента по ссылке была бы невозможна. Какая разница, передать n или var p / &p /просто p в синтаксисе си++, если и в том, и в другом случае передаётся значение переменной n, она же p, а не её адрес? Не надо путать ссылки в языках программирования с жёсткими и символическими ссылками в ф/с, которые, кстати, тоже являются указателями на область диска.

С ней нельзя творить всякую адресную арифметику. А в твоём случае - идёт взятие адреса, и получаем указатель.

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

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

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

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

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

См. мой ответ Переиздание книг Столярова по программированию (комментарий).

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

1, 2, 3, 4…

Всё правильно, по всем пунктам.

Как тут неточно подаёт информацию, так и студентам.

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

вышел пшик

И еще одно твое заблуждение. Я подкрепил свой довод обоснованием о разнице между образованием по книге и живым преподавателем. Но ты не осознал.

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

См. мой ответ Переиздание книг Столярова по программированию (комментарий)

См Переиздание книг Столярова по программированию (комментарий) , читай абзац с «Одно из основных свойств ссылки — её синтаксическая прозрачность.» пока не дойдёт.

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

Я тебя может удивлю… но… ВООБЩЕ ВСЯ модель исполнителя является сахаром над электрическими сигналами в проводниках ЭВМ.

Фундаментальное понятие ссылки состоит именно в её синтаксической прозрачности. Это её фундаментальное отличие от указателя.

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

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

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

Ссылка — не алиас, а указатель на память.

Нет, ссылка это ссылка, а указатель - указатель.

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

Это разные сущности. И да, в С нет ссылок. Разве только их имитация через mas[1], как выше написали.

Нет! Если бы это было так, то передача аргумента по ссылке была бы невозможна.

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

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

Ok. У тебя просто мысль не оформилась. Вначале ты думал, что таким преподавателем является Прата, но оказалось не так (хинт: у нас нет никаких оснований думать, что на живых лекциях он упускает что-то из вводной части) :)

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

Вначале ты думал

Пошли очередные домыслы :)

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

имеется в виду ME? нет, лично я спасибо за этот анальный зонд от No Such Agency говорить не буду! да и причина почему именно миникс туда засунули вполне понятны.

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

синтаксическая прозрачность

Я и говорю — «синтаксический сахар».

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

Расскажи это Кернигану и Ритчи, которые в своей книге http://lib.ru/CTOTOR/kernigan.txt порой употребляли эти термины как синонимы либо говорили об указателе как о синтаксической единице языка си, а о ссылке как о более общем понятии, выражаемом этой синтаксической единицей:

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

Еще более удивительным, по крайней мере на первый взгляд, кажется тот факт, что ссылку на A[I] можно записать в виде *(A+I). При анализировании выражения A[I] в языке «C» оно немедленно преобразуется к виду *(A+I); эти две формы совершенно эквивалентны.

Аналогично, поскольку ссылка на массив в любом контексте (в частности в фактическом параметре) рассматривается как указатель на первый элемент массива, описания формальных параметров вила «массив …» приспособлены прочесть: «указатель на …».

@lv, это одновременно ответ и на ваш камент.

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

имеется в виду ME?

Да.

нет, лично я спасибо за этот анальный зонд от No Such Agency говорить не буду!

Как использовать ME и Minix — уже дело Intel и к Таненбауму отношения не имеет. Не нравится — переходи на arm или что-то ещё. Я просто привёл реальный и очень значимый пример использования. Как говорил сам Таненбаум, за счёт ME его ось распространена больше, чем Windows и Linux вместе взятые. Остальное — частные мнения.

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

No Such Agency Watches You

Огада, огороженный и заблоченный патентами и TOS проприетарный шпионский модуль уж точно есть «maximum amount of freedom to potential users» если «потенциальные пользователи» - это спецслужбы и корпорации. Не поспоришь.;-)

И распространёно это только свежих штеуд. На Q35 выпиливалось.

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

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

Ну да, когда в языке не предусмотрена передача по ссылке, то К&Р пишут, как можно получить похожую функциональность.

Например:

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

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

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

А вот если у нас ссылка, то синтаксис с ней другой.

И то и другое - абстракции уровня и синтаксиса и семантики, и различия на этих уровнях говорят о том, что и сущности разные.

Различия в семантике: Интерпретация указателя - значение под меткой - адрес. Антерпретация l-value ссылки - значение под меткой - значение. (А то, что это ссылка означает лишь, что ещё есть метка, которая указывает на то же згачение. И если его изменить по одной из меток, то оно изменится и под другой, то есть это метки одного куска памяти).

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

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

Я вобще слабо представляю язык без l-value :) Но тут речь о ссылках, а не просто о переменных. В С++ добавили и r-value ссылки. Они уже вобще с указателями никак не перекликаются. Просто потому, что уже нет под ними никакого locator-value.

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

К&Р пишут, как можно получить похожую функциональность. [skip] Ведь это именно речь о функциональности [skip] и там и там используется адрес.

Вот и я ровно об этом же.

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

И при этом компилятор не обязан размещать изменяемые объекты в адресуемой памяти.

Явно неадресуемые изменяемые объекты были уже в самых ранних версиях Си (register)

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

Явно неадресуемые изменяемые объекты были уже в самых ранних версиях Си (register)

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

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

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

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

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

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

В 1930-х математики исследовали вычислимость и выводимость. Многие результаты получены конструктивными методами (где это возможно).

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

Хотя не, есть настройка режимов. Правда в gentoo у меня в выпадающем меню только режим 165x48 (при разрешении 1640x1080), но это всё равно намного лучше чем 80x25.

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

может объяснить даже в рамках си.

Когда Си первым языком? Когда при этом 95% всех функций, которые должны быть процедурами, вызываются с обязательной проверкой результата? Да тут хоть в узел завяжись, а слушатели всё равно пропустят мимо ушей, у них других проблем достаточно. Да и у препода проблем тоже хватает. А если ещё учесть, что среди преподавателей Си каждый первый тоже оснащён сишностью головного мозга, картина окончательно приобретает оттенок полной безнадёжности.

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

Так это и есть передача по ссылке

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

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

Последняя версия стандарта

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

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