LINUX.ORG.RU

Написание свободной(Free as in Freedom) книги-самоучителя по программированию: планы, цели, задачи

 , , ,


17

9

Итак, я решил написать(или как вариант, собрать из кусочков) книгу-самоучилель по программированию, в которой бы не было глупых и нелепых ограничений на распространение. Однако копилефт я все же считаю приемлемым в данном случае. Общественным достоянием это не будет т.к. вполне могут найтись желающие использовать результат в своих проприетарных книгах, а проприетарные книги — плохо. Лицензия самого текста книги-учебника будет или Creative Commons Attribution-ShareAlike (что позволит без каких-либо проблем переиспользовать текст из википедии) или что-то вроде GNU Free Documentation License (без неизменяемых разделов естественно).

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

Теперь к теме того, на кого книга ориентирована, какие начальные знания предполагаются, чему книга будет учить, какой первый ЯП взять и каков будет авторский самысел: С этим моментом я пока что не определился окончательно, и тут есть что обсудить. В частности, я не вижу особого смысла объяснять какие-то базовые понятия комбинаторики, об этом можно доступным языком прочитать из школьных учебников. Системы счисления(СС), перевод из одной СС в другую - вот это еще можно. One's и two's complement представления знаковых чисел — про это тоже можно написать. Если же человек не понимает комбинаторику, он ее быстро поймет на примере кода, который будет достаточно наглядно это показывать, и который всенепременно будет.
Пока что в качестве первого языка я склоняюсь к Си, и тому есть причины. Все прочие распространенные языки (кроме ассемблера, хотя его трудно назвать распространенным) не настолько близки к аппаратному уровню. Про нужность понимания на низком уровне написано тут http://russian.joelonsoftware.com/Articles/BacktoBasics.html https://habrahabr.ru/company/piter/blog/271347/ , не вижу смысла повторяться. Приведу лишь цитату:

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

Притом еще один важный момент: Си будет изучаться параллельно с ассемблером. Если речь идет об изучении ассемблера, необходимо четко зафиксировать то, на какой архитектуре это все происходит и в какой ОС. Так вот, ОС будет GNU/Linux а архитектура x86-64. Будут постоянно проводиться параллели между тем, что из себя представляет код на Си в текстовом виде, и тем, в какой текст на ассемблере его превращает компилятор. В связи с этим, первым делом будет рассказано о goto и конструкции if(условие) goto метка;. Про конструкции вида

if(условие)
{
  что-то_делаем;
}
else
{
  что-то_другое_делаем;
}
Будет рассказано немного позже, притом это будет рассказано и словами, и через написание эквивалентного кода через if(условие) goto метка;. Циклы, for(){} while{}, do{}while(), конструкция switch-case и break continue внутри них будут так же объясняться через все тот же if(условие) goto метка; притом будет делаться явный акцент на том, что намного лучше использовать нормальные циклы, чем лепить всюду этот условный goto. Кроме того, будет так же рассказано про Labels as Values. Почему так важна эта странная штука, if(условие) goto метка;? Потому что она имеет наипрямейшее отношение к тому, как работают ЭВМ, а всякие циклы СКРЫВАЮТ это. Рекурсия в Си будет объясняться только после того, как будет объяснено, что такое стекфрейм и соглашения вызова, будет сказано про оптимизацию хвостовой рекурсии, и о проблеме забивания стека, если такая оптимизация не происходит, притом это будет наглядно показано в ассемблере. Учиться отлаживать код надо будет тоже «с пеленок», притом отлаживать и ассемблер, и всякие там Си. Будет и про асм-вставки в Си, clobber list. В качестве ассемблера будет рассматриваться GAS, а никакой не NASM т.к. GCC умеет выплевывать ассемблер именно в GAS синтаксисе. Насчет выбора Intel или AT&T синтаксиса - тут я склонюсь пожалуй к тому, что надо ЗНАТЬ И УМЕТЬ ПОНИМАТЬ ОБА. Кроме того, GAS давно уже умеет в оба синтаксиса, так что проблем с этим не будет. Единственная проблема с GAS в том, что это однопроходной ассемблер, так что можно освоить и какой-нибудь NASM, YASM.

Первые хеллоуворды будут написаны вообще в особом стиле, без использования printf() и вообще без библиотеки Си; Будут использованы куски на ассемблере, которые делают системный вызов write и read, и с ними можно(нужно) будет линковаться, чтоб что-то вывести на экран. Будет рассказано и про printf естественно, но только когда будет совершенно четко ясно, что такое вообще va_list. Будет куча отсылок к драфту стандарта Си (недрафт почему-то платный). Будет так же рассказано про устройство ОС. В конце скорее всего будет дано задание сделать свою игрушечную ОС так что предполагается что человек к тому моменту должен уже отлично понимать всякие там связные списки, графы, очереди, спинлоки-аллокаторы свои уметь делать на асме при желании. Алгоритмы сортировки, обхода графов, хеш-таблицы, все это будет объяснено на языке Си, и плюсов вообще касаться я не буду.

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

Кроме того, после моей книги предполагается, что человек должен уметь заниматься такими ненужными (в GNU/Linux) на первый взгляд вещами, как крякинг, реверсинг, исправление ошибок в бинарниках, не обладая исходным текстом. Восстановление логики работы программы по дизасму. Ну и программирование в машинных кодах (без ассемблера, одним HEX редактором).

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

cast ASM be_nt_all mister_VA

UPD: Программирование и отладка на C/ASM - Первые программы. Знакомство с C и ассемблером. Компиляция, линковка, код возврата. Вывод текста.

★★★★★

Последнее исправление: CYB3R (всего исправлений: 6)

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

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

anonymous
()

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

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

Все это весьма интересно, но с точки зрения педагогики выстроено не очень. Много новой информации сразу, новичек в этом просто утонет. Самое главное, у новичка будет 2 вопроса: зачем это нужно (отладчик, strace, ltrace, листинги ассемблера) на начальных этапах не понятно. Потому что умные дяди так сказали - это не ответ. В итоге информация усваиваться не будет. Тут как минимум нужно перейти к более сложным, не очевидным для новичка примерам и их на отладчике прогнать.

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

Как читать ассемблерный листинг находясь на уровне helloworld по первому и единственному пока языку С, тоже не очень понятно. Выходит, нужно первые примеры начинать с ассемблера, а не С. Возможно, каждый новый шаг имеет смысл сначала разобрать на ассемблере, дать читателю подумать, как это лучше сделать, а потом показать, как делает gcc и что написать на C чтобы получить соответствующий результат.

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

Просто потому что мне не хватает знаний lowlevel на достаточно глубоком уровне.

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

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

Понимание, что круто именно то что Вы предлагаете, у ЦА отсутствует. «Дядя застрял в прошлом веке и предлагает какую-то парашу/ программирование сложное и непонятное».

На самом деле это не далеко от правды.

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

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

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

Что касается высокурового ЯП, вы проигнорировали, видимо мой вариант в помойку. Пусть так, мне не жалко.

Жду предложений и адекватной критики

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

Лично мне было бы понятнее, если бы вы выложили содержание книги, как это делал я. Написание свободной(Free as in Freedom) книги-самоучителя по программированию: планы, цели, задачи (комментарий)

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

зачем это нужно

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

отладчик, strace, ltrace

Не нужно.

листинги ассемблера

Так же.

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

Это вызывает какие-то проблемы?

как это лучше сделать

Ни ты, ни данный адепт на это не ответите.

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

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

Это изначально любому школьнику понятно, что примитивные языки и системы комманд можно заменить человеческими. Т.е. сходить в сортир - это сходить в сортир, а не «вправо->влево->влево->прямо». И язык - это и есть определение уже абстрактных понятий и конпелятор занимается переводом их в надо «право/лево». Как наваигатор. А процессор - это такой же школьник, которому мамка рассказывает как дойти до школы.

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

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

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

Если коротко, то «системное программирование».

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

Вот скажем я могу писать на си на уровне студента и знаю во что трансформируется всякая фигня с указателями на x86. Могу что-то предельно простое реверсить.

Хочу - уметь дебажить сложные низкоуровневые приложения. Легко находить источник проблем и быть способным написать патч с четким пояснением в чем была проблема, вместо «если я делаю Х, то оно иногда падает, а иногда нет, хз по чему. Можно вопросить у гугла, или на каком-нибудь форуме».

Хорошая книга с наглядными примерами, и годными упражнениями, как мне кажется, должна способствовать этим целям.

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

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

Условно сюда можно отнести форматы исполняемый файлов, линковку/загрузку в память.

Вот только я несколько сомневаюсь, что объяснять, что такое if then else fi end имеет смысл в такой книге.

Собственно то, о чём вы говорите я бы отнёс к bare-metal. Прочитав какую-нибудь литературу на эту тему всё станет понятно. Из первой же ссылки в гугле вылезли главы «Startup code and low level initialization.» и «The Linker Script.». Правда это под ARM, но то и лучше.

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

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

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

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

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

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

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

Условно сюда можно отнести форматы исполняемый файлов, линковку/загрузку в память.

Что конкретно тут не понятно? Конкретные форматы? Зачем они тебе, если ты их не пишешь. Это знание ничего не даёт.

Программирование не в виртуальной памяти,

Ничем не отличается.

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

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

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

Оно дебажиться пониманием приложения и его архитектуры. «сложные» - слишком сильно, скорее «сложное».

Легко находить источник проблем и быть способным написать патч с четким пояснением в чем была проблема, вместо «если я делаю Х, то оно иногда падает, а иногда нет, хз по чему. Можно вопросить у гугла, или на каком-нибудь форуме».

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

Хорошая книга с наглядными примерами, и годными упражнениями, как мне кажется, должна способствовать этим целям.

Нет. Этому способствует конкретные действия. Хочешь искать - ищи.

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

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

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

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

В чём она будет написана, в LaTeX?

LaTeX прекрасен только для создания бумажных книг. PDF-ужасный формат, примеры исходного кода из него не возможно скопировать не потеряв отступы и не смешав его с нумерацией строк (если только не использовать расширения для одного единственного pdf-reader-а).

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

Хороший результат для отображения можно получить в HTML, это: и подсветка синтаксиса, и математические формулы, и «информационные блоки»

Я долгое время использовал LaTeX для набора лабораторных, но теперь мой текущий выбор Markdown+pandoc из которого можно получить html/tex/docx в зависимости от выбора.

Вот небольшой пример: https://bitbucket.org/AlexVRud/labexample/src

Результат: https://bitbucket.org/AlexVRud/labexample/downloads/LabExample_v_0_01.tar.gz

З.Ы.: Недобраузеры идут лесом, я не css-верстальщик

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

Книга и не должна отвечать

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

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

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

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

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

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

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

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

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

Но ты не рассуждаешь о системах и взаимодействии в них - ты рассуждает просто о «птичках». Это разные понятия.

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

В этом и проблема, почему все вокруг пустышки.

Некоторым может книга для этого и не нужна и достаточно школьной математики

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

но сейчас не те школы, поэтому книга не помешала бы.

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

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

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

кое-какие предварительные наброски.

Почитал и увидел кашу.

  1. «hello world» - тут недавно был анонс Вышел первый том книги А. В. Столярова «Программирование: введение в профессию». С автором согласен, что первым языком Си и C++ не должны быть. На первом этапе надо изучать основы программирования, простые алгоритмы и структуры данных с удобной экосистемой ввода/вывода, хранения строк и прочей мелкой лабудой без всяких километровых обёрток в виде класса приложения или вечными проблемами утечки памяти.
  2. Следующий этап: основы Си для постановки проблемы управления памятью и C++ с классами автоматизирующими этот процесс. С последующим переходом к ООП.
  3. Ассемблер - это уже курс «Архитектура компьютера». В котором уже можно посмотреть как собираются приложения, как они транслируются в бинарный код, что такое «соглашение о вызовах» и т.д.. Хорошим примером в рамках этого курса может быть, например, оптимизация функции умножения матрицы 4x4 на вектор с использованием SSE3 инструкций, которая потом используется в программе на Си/C++.
  4. valgrind, read, write - это из курса «Операционные системы и системное программирование». Когда у слушателей уже есть достаточный опыт. Хорошие примеры такого курса: http://illinois-cs.github.io/ https://courses.engr.illinois.edu/cs241/fa2012/ https://cs162.eecs.berkeley.edu/ https://github.com/angrave/SystemProgramming/wiki
AlexVR ★★★★★
()
Ответ на: комментарий от anonymous

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

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

И кстати, тут пинали X11 - кто-нибудь может подсказать по его архитектуре хорошую книгу, желательно в русском издании?

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

PDF-ужасный формат,

Цель его была одна, получить документ который будет везде выглядеть одинаково. Он открытый и его можно прочесть почти везде. Ну примерно так-же как байткод от java...

Формат не предполагает дальнейших правок (ну не считая исключений типа pdf forms)

LaTeX прекрасен только для создания бумажных книг.

Ну какбэ LaTeX можно конвертнуть почти куда угодно. Причём тем-же pandoc-ом. А самое важное, то что это ЯП, там можно оптимизировать всё что угодно по самые не балуй.

Но соглашусь он очень неудобен именно для написания текста, для простых работ возможно тот-же markdown окажется проще. Особенно если туда ruby ebr прикрутить....

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

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

Нет. Этому способствует конкретные действия. Хочешь искать - ищи.

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

Оно дебажиться пониманием приложения и его архитектуры. «сложные» - слишком сильно, скорее «сложное».

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

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

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

Каких-то чудес от неё я и не жду.

Вы пытаетесь мне объяснить, что «такая книга ненужна, и настоящий мужик сам со всем разберется, если ему надо, а если нет, то он сосунок и ему не надо»

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

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

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

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

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

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

Из собственного опыта - пока не прочитал книжку про ассемблер

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

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

Какие ошибки? gitbook — это утилита, которая превращает набор специальным образом сформированных Markdown-файлов в книгу в виде статического сайта, который можно хостить где угодно, хоть на Github Pages. gitbook.com — это просто companion-хостинг, им пользоваться никто не заставляет.

theNamelessOne ★★★★★
()

Можешь не писать - не пиши!

А если не можешь не писать - тогда фигли тут спрашиваешь?

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

Психически больное чмо с интеллектом на уровне пня смеет рассуждать о том, как надо учить людей думать? Оригинально-с!

anonymous
()

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

Вот она, квинтэссенция фанатизма. Не важно как написано, не важно выполняет ли основную задачу, важно под какой лицензией!

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

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

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

Нет, тогда это должна быть не одна книга. По определению.

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

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

Если тебя заинтересовала история появления вычислительной техники, почитай книгу Р. С. Гутера и Ю. Л. Полунова «От абака до компьютера» (М.: Знание, 1981)

О, помню, где-то в 5-6 классе была одна из моих любимых книг! Очень удачное сочетание исторического и технического аспектов.

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

Какие ошибки?

Видимо я не вовремя туда залез. У меня минуты по 2 открывались странички и лезли какие-то ошибки. Толком даже не понял что это.

Спасибо за разъяснения, попробую ещё раз.

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

И кстати, тут пинали X11 - кто-нибудь может подсказать по его архитектуре хорошую книгу, желательно в русском издании?

http://dfe.petrsu.ru/koi/posob/X/ - «Программирование в среде X Window на основе библиотеки Xlib»

Лучше этого на русском не попадалось. (А что такое «по архитектуре» ?)

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

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

В том то и беда что посоветовать почти никакую не могу... То что читал N лет назад:

Самая толковая книга - Чарльз Петцольд, Код (гуглится pdf). Но там много всего до ассемблера - сумматоры и прочее, а самого ассемблера минимальный для понимания минимум. Затрудняюсь оценить то, какие она даёт знания, так как нашёл и читал её последней.

В. Н. Пилыциков Программирование на языке ассемблера IBM PC (гуглится pdf). Очень сухо, далеко от реальности (16-битные сегменты, DOS) и именно что предлагается использовать для программирования. Но вначале книги базовые понятия ассемблера даны неплохо.

И уже упомниавшийся в этой теме «Юров. Assembler. Учебник для вузов.» (гуглится pdf). Информации много, но именно что учебник для вузов - информация дана так, что «прочитал и через месяц забыл».

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

Зубков Ассемблер для DOS, Windows, Unix.

+1 очень хорошая книжка у мужика получилась.

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

Много новой информации сразу, новичек в этом просто утонет.

Ну а я это все поразбиваю на разделы, подразделы.

Самое главное, у новичка будет 2 вопроса: зачем это нужно (отладчик, strace, ltrace, листинги ассемблера) на начальных этапах не понятно.

Это нужно для полного понимания того, как там все работает. Через strace можно посмотреть на то, как делаются системные вызовы, можно рассказать, что для вывода текста в консоль надо сделать некий системный вызов write. Рассказать потом про файловый десктриптор, как его создать(как открыть файл через open, получив соответствующий файловый десктриптор), и как вывести текст в файл вместо стандартного вывода. И потом все это надо позапускать через strace, что вот у нас тут дергается open с путем к файлу, возвращается файловый дескриптор, потом мы его используем чтобы записать что-то в файл. Будут сcылки на всякие документации вроде man 2 open http://pubs.opengroup.org/onlinepubs/009695399/functions/open.html и советы и почитать там.

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

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

Легко. Я просто буду предельно сильно все комментировать, и давать попробовать это поотлаживать в GDB. У меня есть опыт в этом деле. Я в свое время через какой-то TeamViewer в OllyGDB тыкал студентов под виндой в ассемблер, подробно рассказывая про регистры, стек, соглашения вызовов, писали какие-то сортировки на асме, всякие там JE JNE и прочую ерунду. Я знаю как это объяснять, чтобы это было понятно

#include <unistd.h>
#include <string.h>

int main(void)
{
  const char *n = "Hello World!\n";
  write(STDOUT_FILENO, n, strlen(n));  
  return 0;
}
        .file   "h1.c"
        .section        .rodata.str1.1,"aMS",@progbits,1
.LC0:    # метка
        .string "Hello World!\n" # Нуль-терминированная строка
        .section        .text.startup,"ax",@progbits
        .p2align 4,,15
        .globl  main
        .type   main, @function
main:
.LFB35:
        .cfi_startproc      # это директива GAS что начало процедуры
        subq    $8, %rsp    # отмотать стек (стек растет снизу вверх)
        .cfi_def_cfa_offset 16
        # Дать сcылку https://stackoverflow.com/questions/7534420/gas-explanation-of-cfi-def-cfa-offset
        # и документацию GAS
        # https://sourceware.org/binutils/docs/as/CFI-directives.html
        # Пока что этот момент можно особо не разжевывать, важно понять про соглашения вызова, принятые в GNU/Linux
        
        # надо сказать про System V AMD64 ABI соглашение вызовов.  https://en.wikipedia.org/wiki/X86_calling_conventions#List_of_x86_calling_conventions
        movl    $13, %edx     # 13 это размер строки  (3-й аргумент в edx)
        movl    $.LC0, %esi   #  .LC0 это адрес (указатель) строки (2-й аргумент в esi)
        movl    $1, %edi      # 1 это STDOUT_FILENO (1-й аргумент в edi)
        call    write         # Вызов write
        xorl    %eax, %eax    # Зануление eax потому что return 0

        addq    $8, %rsp      # Стекпоинтер вернуть на место

        .cfi_def_cfa_offset 8 # Это уже объяснено
        ret                   # Возврат из main
        .cfi_endproc          # Конец процесса

https://github.com/j123123/GAS_SORT_COUNT_WIN32/blob/master/src/sort.s вот кстати еще один жесткий код, полученный в процессе обучения одного человека асму, сортировка подсчетом. Конечно же он написан крайне непрофессионально и кривой, не спорю.

Еще можно лазить отладчиком вовнутрь уже откомпилированных бинарников, в которых специально делать баги, и потом показывать, как этот баг можно поймать за руку при пошаговой отладке!

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

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

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

Я и не позиционирую то, что буду писать, как книгу для всех. В конце концов есть всякие «Освой самостоятельно PHP за 24 часа», вот пусть и идут туда

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

С автором согласен, что первым языком Си и C++ не должны быть. На первом этапе надо изучать основы программирования, простые алгоритмы и структуры данных с удобной экосистемой ввода/вывода, хранения строк и прочей мелкой лабудой без всяких километровых обёрток в виде класса приложения или вечными проблемами утечки памяти.

У меня не совсем обычные цели. Задача стоит «дать полное понимание всей этой лабуды на низком уровне» и смесь Си и ассемблера для этого подходит просто идеально. Алгоритмы, структуры данных, все это несомненно будет. Но будет дано объяснение на низком уровне. Про стекфреймы, соглашения вызовов, указатели, про те самые утечки памяти, MMU.

Следующий этап: основы Си для постановки проблемы управления памятью и C++ с классами автоматизирующими этот процесс. С последующим переходом к ООП.

C++ я вообще касаться не буду. Все будет объясняться через Си и ассемблер. Можно будет кстати написать про обобщенное программирование через callback-и. inline callback-функций как способ метапрограммирования вот кстати некие рассуждения на эту тему.

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

Мне важно показать связаность ассемблера с Си. Показать то, какой код на Си в какой код на ассемблере превращается. Если рассматривать ассемблер не в связке с Си, как это показывать? Важно еще наглядно показать и дать понять, что компилятор GCC не делает какую-то неведомую магию, что он выполняет преобразование кода на Си в код на асме, потом код на асме превращается в объектный файл, в котором содержатся уже опкоды(т.е. там внутри уже не какие-то человекочитаемые слова, а бинарные нечитаемые простым способом данные, которые предназначены для «прожевывания» процессором)

valgrind, read, write - это из курса «Операционные системы и системное программирование». Когда у слушателей уже есть достаточный опыт.

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

http://illinois-cs.github.io/ https://courses.engr.illinois.edu/cs241/fa2012/ https://cs162.eecs.berkeley.edu/ https://github.com/angrave/SystemProgramming/wiki

Да, спасибо. Буду туда ссылаться.

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

стоило царю ненормально нормально ответить так ночной_сторож вачдог анонимус указал по царски на ненормальность царского ответа.

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

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

на примере любой годной реализации vector<>

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

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

что всякие printf

from http://minnie.tuhs.org/cgi-bin/utree.pl?file=V2/lib/printf.c

printn(n,b) {
	extern putchar;
	auto a;

	if(a=n/b) /* assignment, not test for equality */
		printn(a, b); /* recursive */
	putchar(n%b + '0');
}

printf(fmt,x1,x2,x3,x4,x5,x6,x7,x8,x9)
	char fmt[];
	{
	extern printn, putchar;
	char s[];
	auto adx[], x, c;

	adx = &x1; /* argument pointer */
loop:
	while((c = *fmt++) != '%') {
		if(c == '\0')
			return;
		putchar(c);
	}
	x = *adx++;
	switch (c = *fmt++) {

	case 'd': /* decimal */
	case 'o': /* octal */
		if(x < 0) {
			x = -x;
			if(x<0) {  	/* is - infinity */
				if(c=='o')
					printf("100000");
				else
					printf("-32768");
				goto loop;
			}
			putchar('-');
		}
		printn(x, c=='o'?8:10);
		goto loop;

	case 'c': /* char */
		putchar(x);
		goto loop;

	case 's': /* string */
		s = x;
		while(c = *s++)
			putchar(c);
		goto loop;
	}
	putchar('%');
	fmt--;
	adx--;
	goto loop;
}

имхо в хорошем учебнике по программированию охватывающее на сквозь от прикладного через шел через компилируемый_язык(С) через использование сервисов ОС и кончая ассемблерными пипхолами - вот вышеприведённая цитата из второЮникса очень пользительна в обучении.

qulinxao ★★☆
()

Рэндал Э. Брайант, Дэвид Р. О'Халларон - Компьютерные системы: архитектура и программирование (в оригинале у книги уже три издания, последнее весьма свежее)

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

зачем?

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

printf(fmt,x1,x2,x3,x4,x5,x6,x7,x8,x9)

Там сколько угодно этих самых аргументов может быть.

auto adx[]

Откуда auto в Си?

adx = &x1; /* argument pointer */
x = *adx++;

Чтооо? А кто дал гарантии, что там эти аргументы передаются чере стек, а не регистры? А кто сказал что у нас стек растет вот в ту сторону, а не в другую? Кто сказал что аргументы передаются в стеке в таком вот порядке, а не в каком-то другом?

if(x < 0) {
x = -x;
if(x<0) {

Этот бред имеет смысл если у нас там INT_MIN торчит. НО если там INT_MIN то этого x = -x; делать нельзя — UB. http://melpon.org/wandbox/permlink/NYC3HrbtjLQirvQ6

Может это какой-то особый Си, в котором это не UB, в котором есть auto, в котором кто-то четко определил, что вот в таком порядке мы аргументы в стек запихиваем и что стек вон в ту сторону растет?

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

наверно это одна из причин Написание свободной(Free as in Freedom) книги-самоучителя по программированию: планы, цели, задачи (комментарий)

The reason for my frequent «no» was that everyone was trying to turn MINIX into a production-quality UNIX system and I didn't want it to get so complicated that it would become useless for my purpose, namely, teaching it to students.

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

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

Рэндал Э. Брайант, Дэвид Р. О'Халларон - Компьютерные системы: архитектура и программирование (в оригинале у книги уже три издания, последнее весьма свежее)

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

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

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

зачем?

Затем.

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

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

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

Чтооо? А кто дал гарантии, что там эти аргументы передаются чере стек, а не регистры?А кто сказал что у нас стек растет вот в ту сторону, а не в другую? Кто сказал что аргументы передаются в стеке в таком вот порядке, а не в каком-то другом?

если уж зубаскалить. Автор этого кода дал таковые гарантии самому себе.

qulinxao ★★☆
()

Нужно! Пиши!

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