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)

К слову, начать писать что-то свое(сперва добейся, ага) мне посоветовал Croco Вышел первый том книги А. В. Столярова «Программирование: введение в профессию» (комментарий) но все с нуля мне просто лень писать, и ставить копирастические ограничения на копирование и распространение измененных и неизмененных копий я в любом случае не намерен, так что меня ничто не ограничивает в плане использования свободных материалов

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

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

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

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

А вот знания X11

Ну тут да, может быть иксы и не нужно разбирать, сейчас уже какой-то Wayland на подходе. Просто не одной же консоли учить? Например, если надо вывести графический файл, что делать? В фреймбуфер рисовать? А обработка движений мышки? К тому же иксы сами по себе интересны, как клиент-серверная штука, которая к тому же может работать по сети. Можно кстати попробовать подергать X Window System core protocol голыми системными вызовами, только это скорее всего будет крайне сложным и бесполезным занятием.

SZT ★★★★★
() автор топика

Первые хеллоуворды будут написаны вообще в особом стиле, без использования printf() и вообще без библиотеки Си

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

curufinwe ★★★★★
()

Как общеобразовательный учебник не прокатит, но как с фокусом на low-level вполне себе годно было бы. Не всем же сайты воять, кто то и в embedded захочет пойти.

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

По-моему, это гнездец для новичка.

Да, и в каком же месте?

#include <unistd.h>

int main(void)
{
  const char n[] = "Hello World!\n";
  write(STDOUT_FILENO, n, sizeof(n));  
  return 0;
}
По-моему все предельно ясно

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

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

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

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

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

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

Полезность минимального дёргания «X Window System core protocol голыми системными вызовами» очень даже имеется. Она даёт просто отличное понимание того, «как оно работает». Но. Это понимание как правило нужно тому, кто занимается системными библиотеками, оптимизацией и кроссплатформенностью. И рискует оказаться лишним шумом в голове тому кто занимается сложными и нужными вещами, но в другой области: проектирует сетевые P2P-протоколы, логические концепции того или иного DSL или алогритмы сжатия.

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

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

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

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

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

Примерно так:

#include <unistd.h>
#include <inttypes.h>
int main(void)
{
  const uint8_t a = 123;
  uint8_t b[3] = {(a/100)+'0', (a/10)%10+'0', a%10+'0'};
  write(STDOUT_FILENO, b, sizeof(b));  
  return 0;
}
Потом это можно оформить в виде функции, заодно пояснить за десятичную, двоичную, шестнадцатеричную и восьмеричную систему счисления, про то как из одной в другую перегонять, как сделать алгоритм перевода из n-ричной системы счисления в k-ричную и проч. Приведенный пример не лишен недостатка(например там будут в начале выводиться нули если число не трехзначное), но объяснить его по-моему несложно, если рассказать про ASCII таблицу. Еще можно рассказать, как не выводить начальные нули, если они есть. Задача решаемая.

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

И этот пример точно проще printf(«Hello world!»); ?

По-моему они почти равнозначны

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

Просто не одной же консоли учить?

А почему бы и нет? Я бы почитал о том, как писать под линуксовую консоль на escape-кодах без ncurses.

Например, если надо вывести графический файл, что делать? В фреймбуфер рисовать? А обработка движений мышки?

Слишком сложно это всё. Если ограничитесь клавиатурой и текстом, читатель сможет уделить больше внимания программированию.

Как-то уж слишком дофига, не находите?

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

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

Задача решаемая.

Я не спорю, но это именно то, что я подразумеваю под словом «гнездец».

Хотя в образовательных целях выглядит очень полезно, но как-то сильно по-джедайски.

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

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

а ты кто такой, собственно, дядя? ну-ка представься.

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

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

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

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

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

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

Но зачем? Иксы - это же тоже не сисколлы (вот где Kolibri OS рулит с fasm для образовательных целей). Почему нужно отказываться от WinAPI, намертво вмурованного в систему?

Кстати, почему бы не включить в книгу GTK и графический интерфейс именно на нем? Там же чистый C.

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

Но зачем? Иксы - это же тоже не сисколлы (вот где Kolibri OS рулит с fasm для образовательных целей).

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

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

А зачем?

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

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

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

ссылки на источники делать не забудь

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

а если из википедии то дату и время ещё

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

winapi - это и есть аналог системных вызовов для offtopic. Ниже только то, что не документировано (аналогия: ниже - только свой X-сервер писать).

С другой стороны я размышлял над уровнями, на которых можно реализовывать графику. В общем-то они все «не самые низкие» за исключением модуля ядра, который взаимодействует с gpu. Поэтому Framebuffer, X11, Qt, Gtk или вывод в файл с отображением в другом приложении все далеки от низкого уровня.

И более того наиболее низкие ступени реализации этих API меняются даже более часто чем высокие (X11 shared memory, dri3, wayland и прочее).

Так что ещё один вариант - найти какую-нибудь живую, высокоуровневую и малофункциональную (для простоты) библиотеку типа tk или wxwidgets.

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

пусть пишет, своё «не нужно» мы скажем потом.

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

Кстати, почему бы не включить в книгу GTK и графический интерфейс именно на нем?

Опять таки тут мы используем какие-то непонятные абстракции, работа с иксами через Xlib/XCB намного ниже по уровню. GTK например предполагает использование каких-то там виджетов, там есть какая-то своя объектная система GObject на языке Си. Чтобы начать писать про GObject надо написать про ООП (притом не только про ООП вообще, а про конкретную реализацию ООП на Си в конкретно этом GObject, которая более нигде не встречается). У меня нет такого желания. А вообще, про ООП конечно же можно написать

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

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

GPFault ★★
()

Критика

Человек изучающий, как работает оператор if/else явно не сможет осилить ни то, как работают иксы, ни ассемблеровские вставки.

В Вас говорит графоман. Прежде чем писать книгу определитесь,

1) какой аудитории будет адресована книга?

2) чему книга должна научить (понять глубже стандарты, обращаться с технологиями программирования в среде unix или же получить основны алгоритмического программирования)

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

Также от себя посоветую как можно меньше писать собственного кода в примерах, т.к. не всегда он будет самым качественным и лучшим для понимания (не хочу оскорбить ТС в некомпетентности). просто чем больше своего кода в примерах, тем больше вероятность, что там «что-то» не так.

Из языка я считаю нужно брать современные языки, которые будут привлекать читателей: Си - оптимальный вариант, имхо. Некоторые люди услышав один раз что-то негативное о Delphi\Pascal, пытаются избегать материалов с ними в будущем. Ещё было бы, наверное, неплохо сразу опускать устаревшие вещи в стандартах языка и приучать новичка сразу к правильному подходу.

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

Спасибо, если прочитали до конца.

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

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

А какая вообще разница, кто я? Вам важно содержание книги, или тот, кто ее написал(личность автора)? Кроме того, как я уже сказал, книга не будет 100% моим творением

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

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

Вам важно содержание книги, или тот, кто ее написал(личность автора)?

читать неизвестно кого очень немногие могут себе позвоилить.

как, кстати, правильно указывать авторство текста из википедии?

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

Ответь сначала на вопрос - чем принципиально отличается обработка движений мышки от обработки другого i/o ?:)

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

pon4ik ★★★★★
()

Это будет очень узкоспециальный, на грани бесполезности, учебник. И, судя по ОП, нудный.

Еще это смахивает на Programming from the ground up.

anonymous
()

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

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

anonymous
()
Ответ на: Критика от g3nt00

Человек изучающий, как работает оператор if/else явно не сможет осилить ни то, как работают иксы, ни ассемблеровские вставки.

Со временем сможет.

1) какой аудитории будет адресована книга?

Адресована тем, кто желает научиться программировать, понимать компьютер на низком уровне. А если же захочется идти к более высокоуровневым вещам, вроде PHP, Java, не ковыряясь во всяких непонятных ассемблерах — для этого другие книги есть.

2) чему книга должна научить (понять глубже стандарты, обращаться с технологиями программирования в среде unix или же получить основны алгоритмического программирования)

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

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

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

Поиск в ширину, глубину, волновой алгоритм, всякие там алгоритмы на графах, сортировки разных видов — это должно быть безусловно.

Про 2D-3D графику, аффинные преобразования, квантерионы, матрицы поворота — вряд ли. 2D разве что на совсем базовом уровне.

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

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

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

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

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

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

Ответь сначала на вопрос - чем принципиально отличается обработка движений мышки от обработки другого i/o ?:)

А я говорил что отличается? Просто там в XCB это все очень хорошо можно показать, что вот нажимаем мышей в такую-то область, приходит событие с координатами мышки в момент нажатия, мы его обрабатываем. https://paste.fedoraproject.org/332708/91779145/ вот например очень «жесткий» код, который был «рожден» в процессе обучения одного человека Си и этому XCB. Там крестики-нолики, притом можно поменять дефайны, и размер поля станет другим, можно менять размер самих клеток, можно даже поменять условие победы (количество крестиков в ряд для того, чтобы выиграть). Было б еще интересно уломать его написать ИИ для этой вот игры, но он видимо ниасилит.

Хотя не, осилит, просто ему придется очень много чего узнать, чтобы понять, как это сделать

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

Это как с Д.Кнутом: новичку - сложно, программисту-математику - нудно.

30+ лет назад буквально пятиклассникам рекомендовали к прочтению

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

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

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

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

По-моему все предельно ясно

Ты выводишь \0, а из кода прямо так сходу это не понятно. Не обрабатываешь код возврата write(), прививая плохие привычки.

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

1. язык программирования си, стандарты, работа с отладкой и компилятором

2. ассемблер и базовые понятия работы системы/ядра

3. программирование в среде unix

4. алгоритмическое программирование (идёт совершенно ортогонально с технологиями)

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

Ты выводишь \0, а из кода прямо так сходу это не понятно.

ну значит добавим там -1 или strlen вместо sizeof.

Не обрабатываешь код возврата write(), прививая плохие привычки.

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

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

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

Что не мешало на Turbo Pascal пользоваться динамическим выделением памяти, указателями и ассемблерными вставками с db 66h;. Хотелось графику побыстрее, а на Am386 особо не разгонишься.

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

1. язык программирования си, стандарты, работа с отладкой и компилятором
2. ассемблер и базовые понятия работы системы/ядра

Это должно быть одним пунктом т.к. Си я хочу объяснять через ассемблер, и ассемблер через Си, они будут идти рука об руку. И отладка будет касаться как Си, так и ассемблера.

3. программирование в среде unix

А что туда надо писать? Ну т.е. если я использую ассемблер и Си под GNU/Linux, там уже будет(должно быть!) про программирование в среде unix т.к. используются позикс-совместимые системные вызовы и Unix-like OS.

4. алгоритмическое программирование (идёт совершенно ортогонально с технологиями)

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

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

ну значит добавим там -1 или strlen вместо sizeof.

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

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

write() теоретически может вывалиться по EINTR, а printf() — нет.

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

Turbo Pascal устарел, и распространенным его уже никак не назовешь(да и запускать его выйдет разве что в каком-нибудь досбоксе). Есть Free Pascal. Но я не вижу смысла тратить время на изучение паскаля ввиду его практически полной ненужности на практике

SZT ★★★★★
() автор топика

В любом случае — дерзай!

Сказать традиционное «фи» мы всегда успеем.

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

из книги 1985 г., ориентированной на учеников 5-8 классов:

Что читать дальше? Если ты хочешь научиться составлять программы на различных языках программирования, советуем тебе прочитать материалы Заочной школы программирования, которые опубликованы в журнале «Квант» с № 9 за 1979 г. На уроках Заочной школы ты сможешь познакомиться с языками Рапира (№№ 1-3, 1980 г.) и паскаль (№№ 10-12, 1981 г.; 1-4, 1982 г.), с одной из версий системы Шпага (№ 1, 1980 г.) и с различными приемами решения задач на ЭВМ. В журнале № 9 за 1980 г. рассказывается о применении циклического оператора, в номере II за тот же год обсуждаются задачи, связанные с обработкой текстов на ЭВМ. В других номерах журнала ты прочтешь о решении геометрических задач на ЭВМ с примене- нием полярной системы координат (№ 10, 1980 г.), об ассоциа- тивном поиске (№1, 1981 г.), решении уравнений (№ 2, 1981 г.), работе с графами (№ 3, 1981 г.) и о других задачах. Обзор языков программирования опубликован в № 9 за 1981 год.

Свойства различных конструкций, используемых в языках программирования, обсуждаются в книге Д. Баррона «Введение в языки программирования» (М.: Мир, 1980). О разных структу- рах блоков памяти можно прочитать в книге П. Холла «Вычис- лительные структуры. Введение в нечисленное программирова- ние» (М.: Мир, 1978). Интересные примеры рекурсии приводят- ся в книге Д. Баррона «Рекурсивные методы в программирова- нии» "(М.: Мир, 1974). О языке паскаль можно прочитать, помимо «Кванта», в книге Н. Вирта «Систематическое програм- мирование. Введение» (М.: Мир, 1977) или в книге П. Грогоно «Программирование на языке паскаль» (М.: Мир, 1982).

Общие методы и приемы программирования, способы со- ставления алгоритмов и программ описываются в следующих книгах:

1. Нивергельт Ю., Фаррар Дж., Рейнголд Э. Машинный подход к решению математических задач.— М.: Мир, 1977; •

2. Гудман С, Хидетниеми С. Введение в разработ- ку и анализ алгоритмов.—М.: Мир, 1981;

3. Кнут Д. Искусство программирования для ЭВМ.—М.: Мир, 1976, т. 1; 1977, т. 2; 1978, т. 3;

4. Е р ш о в А. П. Введение в теоретическое программиро- вание. Беседы о методе.—М.: Наука, 1977.

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

Об устройстве вычислительных машин и принципах их ра- боты можно прочитать в статьях Ю. Первина и А. С a i - товского «Память ЭВМ» (Квант, 1980, № 4) и «Как работает процессор» (Квант, 1980, № 3); А. Салтовского «Организа- ция ввода и вывода в ЭВМ» (Квант, 1980, № 6); Ю. Первина «Трехадресные, одноадресные и... безадресные машины» (Квант, 1981, № 4) и в других материалах раздела «Искусство программирования» в журнале «Квант». Можно порекомендо- вать и книгу Л. Н. Королева «Структуры ЭВМ и их мате- матическое обеспечение» (М.: Наука, 1978). О применениях ЭВМ рассказывается в книгах А. Н. Тихонова и Д. П. Косто- марова «Рассказы о прикладной математике» (М.: Наука, 1984); Н. Н. Моисеева «Математика ставит эксперимент» (М.: Наука, 1979); В. М. Глушкова и В. Я. Валаха «Что такое ОГАС» (М.: Наука, 1981.—Библиотечка «Квант», вып. 10); в статье А. П. Ершова «Программирование — вто- рая грамотность» (Квант, 1982, № 2). Созданию и применению микропроцессоров посвящена статья «Пришла пора оставить счеты» (Наука и жизнь, 1981, № 3,4).

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

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

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

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

write() теоретически может вывалиться по EINTR, а printf() — нет.

Может, но для хеллоуворда это прямо скажем несущественно.

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