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)

https://lorwiki.ru/wiki/Программирование_и_отладка_на_C/ASM кое-какие предварительные наброски. Это то, о чем в самом начале планируется писать. Все это в процессе доработки. Потом будет разбито на разделы, главы, параграфы. Жду предложений и адекватной критики. Я не против чтобы кто-то начал что-то менять в этой статье-наброске плана, но тут думаю ясно, какой подход к изложению материала я выбрал, так что советую придерживаться этого подхода.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Не нужно.

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

Так же.

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

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

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

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

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

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

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

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

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

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

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

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

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

curufinwe ★★★★★
()
Последнее исправление: curufinwe (всего исправлений: 1)
Ответ на: комментарий от 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 ★★★★★
()
Ответ на: комментарий от registrant27492

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

anonymous
()
Ответ на: комментарий от 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 ★★☆
()
Ответ на: комментарий от 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 ★★☆
()
Ответ на: комментарий от SZT

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

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

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

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

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

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

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

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

Откуда auto в Си?

Л - ламерок. Оно там всегда было.

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

Бородатые года и скол.

А кто сказал что у нас стек растет вот в ту сторону, а не в другую?

Бородатые года и скилл.

Этот бред имеет смысл если у нас там INT_MIN торчит.

Этот бред имеет смысл всегда.

НО если там INT_MIN то этого x = -x; делать нельзя — UB

Пруф.

Там ниже есть проверка:

if(x<0)

Т.е. ты никого не поймал, а перданул в лужу.

Может это какой-то особый Си, в котором это не UB

А можно ссылку на уб?

в котором есть auto

Оно итак есть.

в котором кто-то четко определил, что вот в таком порядке мы аргументы в стек запихиваем и что стек вон в ту сторону растет?

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

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

registrant27492
()
Ответ на: комментарий от SZT
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          # Конец процесса//а, т.е. это конец процесса, а то начало процедуры. Логично.

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

Бинарники - это так мило.

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

Т.е. в учителя идёт не человек,

тут слишком категорично. вон в интервью https://www.youtube.com/watch?v=ZO0PXYMVGSU точнее, что учительству предшествует участие в реальной деятельности по специальности.

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

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

Для этого надо с транзистора начинать.

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

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

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

Ну и да - есть такие люди, которые исключение, но это исключение, а не какой-то там редкий, либо обычный случай. Пройди по всем учителям и задавай вопрос - что сделал этот учитель? Написал хелворд на недоязычке, а после вдруг решил сделать куллкресты? Кое-как что-то там наваял, но никто это не видел и не использовал. А теперь просто говорящая голова. И так куда не возьми - так везде. Что сделал? Ничего, либо хелворд 40лет назад. Но это не интересно.

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

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

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

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

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

если это искренне, то ты тут сильно выдаёшь наличие своих тараканов.

например отчего Страуструп ща совмещает синекуру в морган-стенли С курсами у первокуров в Техаском?(риторический)

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

да вон просто разреши вон очередная цитата:

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

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

и опять же обучение широкий термин.

есть «ускоренные курсы»(и печаль что они длятся 5 лет и узурпировали словосочетание высшее_образование) которые могут давать сами окончившие тока что таковые.

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

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

например отчего Страуструп ща совмещает синекуру в морган-стенли С курсами у первокуров в Техаском?(риторический)

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

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

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

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

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

Пацан - его личность - это его плоды деятельности, а голова - она голова. Это принципиальное отличие.

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

Это хорошо - считать себя, казаться не домохозяйками, имея сознание и понимание домохозяйки.

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

Знаете, вы по моему пытаетесь переписать книгу «Linux. Программирование в примерах» Арнольд Роббинс

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

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

А как работает системный вызов понимать не надо разве? Как строка из памяти программы на экран? Объяснений пока нет. В ваших примерах даже самих вызовов сисколлов нет, вызывается враппер из сишной библиотеки. Что это, откуда и как оно внутри само работает - не объяснено. Кто вызывает функцию main, где этот код? Объяснений нет. Куда возвращает ret в конце main, где тот код который выполняется после и вызывает сисколл выхода из процесса, который виден читателю в strace по вашему совету.

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

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

некий файловый дескриптор

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

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

одна из тех книг которая у мя есть в мёртводеревном виде. ВОТ!

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

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

Если я тебя ни по работе, ни по личности не знаю, то что тогда?

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

Если я тебя ни по работе

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

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

то что тогда?

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

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

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

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

Тем что миниязык форматов функции printf — достаточо специфичный, хотя и зашитый в libc, интерпретатор, и это точно не то, с чего надо начинать изучение языка C и низкоуровневого программирования.

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

Там потом будет написана своя функция на ассемблере(без всяких main и libc, будет через _start), в которой системный вызов write дергается через syscall и все это будет запускаться через strace и gdb.

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

write более байтолюбство - сплошной пересыл куска байтов из памяти в гиперпростанство файлов.

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

Ну пусть puts. Если компилять gcc -O2, puts и будет.

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

puts(«Hello world\n»), исходники puts, исходники write. Попутно объяснить что вообще такое сисколы и ОС хотя бы в общих чертах. Например.

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

А чем вызов libc-шной функции write лучше вызова libc-шной функции printf?

Ну формально, write это всего лишь обёртка для syscall вызова.

Можно сделать так:

#include <linux/unistd.h>
typedef int ssize_t;
typedef int size_t;
static inline ssize_t write(int fd, const void *buf, size_t count) {
	return syscall(__NR_write, fd, buf, count);
}
int main(void) {
	const char msg[] = "Hello World!";
	return write(2, msg, sizeof(msg)-1);
}

Результат (если собрать с флагом -static -Os):

0000000000400ce6 <main>:
  400ce6:       48 83 ec 28             sub    $0x28,%rsp
  400cea:       be 84 35 49 00          mov    $0x493584,%esi
  400cef:       b9 0d 00 00 00          mov    $0xd,%ecx
  400cf4:       48 8d 7c 24 0b          lea    0xb(%rsp),%rdi
  400cf9:       48 8d 54 24 0b          lea    0xb(%rsp),%rdx
  400cfe:       f3 a4                   rep movsb %ds:(%rsi),%es:(%rdi)
  400d00:       64 48 8b 04 25 28 00    mov    %fs:0x28,%rax
  400d07:       00 00 
  400d09:       48 89 44 24 18          mov    %rax,0x18(%rsp)
  400d0e:       31 c0                   xor    %eax,%eax
  400d10:       be 02 00 00 00          mov    $0x2,%esi
  400d15:       bf 01 00 00 00          mov    $0x1,%edi
  400d1a:       b1 0c                   mov    $0xc,%cl
  400d1c:       e8 6f 3c 03 00          callq  434990 <syscall>
  400d21:       48 8b 54 24 18          mov    0x18(%rsp),%rdx
  400d26:       64 48 33 14 25 28 00    xor    %fs:0x28,%rdx
  400d2d:       00 00 
  400d2f:       74 05                   je     400d36 <main+0x50>
  400d31:       e8 7a 63 03 00          callq  4370b0 <__stack_chk_fail>
  400d36:       48 83 c4 28             add    $0x28,%rsp
  400d3a:       c3                      retq   
  400d3b:       0f 1f 44 00 00          nopl   0x0(%rax,%rax,1)

0000000000434990 <syscall>:
  434990:       48 89 f8                mov    %rdi,%rax
  434993:       48 89 f7                mov    %rsi,%rdi
  434996:       48 89 d6                mov    %rdx,%rsi
  434999:       48 89 ca                mov    %rcx,%rdx
  43499c:       4d 89 c2                mov    %r8,%r10
  43499f:       4d 89 c8                mov    %r9,%r8
  4349a2:       4c 8b 4c 24 08          mov    0x8(%rsp),%r9
  4349a7:       0f 05                   syscall 
  4349a9:       48 3d 01 f0 ff ff       cmp    $0xfffffffffffff001,%rax
  4349af:       0f 83 9b 3b 00 00       jae    438550 <__syscall_error>
  4349b5:       c3                      retq   
  4349b6:       66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
  4349bd:       00 00 00 

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

puts(«Hello world\n»), исходники puts, исходники write.

puts уже манипулирует FILE*. Причем со своими буферами, которые находятся в юзерспейсе...

С другой стороны может и верно, стоит сделать на puts и printf, потом рассказать про всю прослойку, а потом уже переходить к lowlevel...

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

Ну формально, write это всего лишь обёртка для syscall вызова.

Ну вообще да, это понятно. Но это все в libc лежит, и write(2), и syscall(2). Так что разницы не так много. А как просто так, без асма, из С сисколы дергать, я с ходу не нашел.

puts уже манипулирует FILE*. Причем со своими буферами, которые находятся в юзерспейсе...

Это да. Но с другой стороны, можно привести упрощенный вариант puts(3) как простой обертки над write(2). Главное написать, что это на самом деле все сложнее и расписать зачем это все.

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

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

Покажи примеры таких книг.

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

ты будешь смеяться но:

Ньютон Начала натуральной Философии.

Автобиография Кардано (тот чувак что уравнения 4 степени)

Астрономический Вестник Г.Галилея.

а вообще см. список в конце книги М.Адлер. Как читать книги.

ззы. История чтения в западном мире от античности до наших дней - вообще бомба -сборник.

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

Ну вообще был интересен ответ registrant27492, а то у него много крикливых слов, а по делу, какой-то конкретики, маловато.

А что касаемо программирования?

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

Ну вообще был интересен ответ registrant27492, а то у него много крикливых слов, а по делу, какой-то конкретики, маловато.

Это же царь. Плебей насмотрелся мультиков и думает, что кто-то ему будет расскрывать свои профессиональные секреты.

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

Ну без конкретики он не царь, а просто чмарь, балабол в общем.

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

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

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

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

Да не, у меня как раз-таки всё по делу. Просто ты врёшь, вернее как - по делу как раз-таки нет у тебя, а не у меня - поэтому у тебя есть убогие придирки не по делу.

Я изобличил конкретную единицу макулатуры, а так же написал, как должна выглядеть нормальная книга, которая может помочь человеку(к вам, конечно, это мало относится, но всё же). Моё изобличение состояло не на противопоставлении «нормального» и «не нормального», поэтому никакие «нормальные» книги я предоставлять не обязан.

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

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

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

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

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

Ну формально, write это всего лишь обёртка для syscall вызова.
Можно сделать так:

Как и syscall - это обёртка для syscall вызова. Толку с этого? Это не имеет смысла.

typedef int ssize_t;
typedef int size_t;

Смешно.

static inline

Не имеет смысла в твоём случае.

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

А чем вызов libc-шной функции write лучше вызова libc-шной функции printf?

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

95% адептов не отличают «вывод» и «форматированный вывод».

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

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

Имелось в виду, ``чем лучше в контексте объяснения сисколов".

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

А с чего я их должен показывать?

Чтобы был образец книги где твои умозрения подтверждаются. Без образца твои высказывания по большей части оторваны. Просто поверхностные слова. Почти как популизм.
Очевидно что хорошие знания учат пониманию. То есть учат не срисовывать, а рисовать самому. Не дают только готовые ответы, не говорят лишь что 2+2=4 и т. п., а учат пониманию что такое «2» что «+» и этим отвечают на вопрос почему совокупность приводит именно к «4», а не к «22».
Проблема в том что каждый видит путь к этому по-разному. Мне стало интересно какая с твоей точки зрения книга отвечает твоим же рассуждениям. Потому что кукарекать вне контекста о правильной книге очень легко, а вот написать её в определённом контексте бывает весьма трудно. Это как школота что частенько заявляет о том как надо делать игры, делать игры это же так просто легко и понятно, но как начинают довольно быстро сдуваются, ибо даже банальная качественная камера для того же платформера или леталки требует определённых усилий и то простое внезапно оказывается не таким простым, а это ведь только камера.
Я увидел что SZT как раз желает сделать книгу для понимания, но ты просто начал его критиковать в большинстве своём общими словами от которых проку мало ибо альтернативы не предоставляешь да и ещё на личность переходишь, а это самая бестолковая критика.

Я где-то разве говорил, что они есть? Или что я знаю какие именно? Меня это не интересует - я их не ищу - мне они не нужны.

Но раз книжки нет, то тебе следует быть менее поверхностным. Хотя от тебя это похоже вряд ли дождёшься, ты же сюда пришёл посрать, а не здраво общаться.

Я изобличил конкретную единицу макулатуры

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

Да не, у меня как раз-таки всё по делу. Просто ты врёшь, вернее как - по делу как раз-таки нет у тебя, а не у меня - поэтому у тебя есть убогие придирки не по делу.

А где я вру? То что у тебя много балабольства это я вру? По делу у тебя есть мысли, но они тонут в потоке чванливого балабольства.
Много бессмысленных переходов на личность с попытками всячески унизить собеседника. Не мало кококонинужно без конкретики. Это всё контрпродуктивно.
1. У тебя плохо с самооценкой что тебе требуется принижать окружающих и себя пытаться выставить выше всех?
2. Тебя никто не учил как общаться в нормальном зрелом обществе, а не в подворотне с опустившимися (то что лор можно считать подвортней оставим без обсуждения), и сам к сожалению не научился?
Так-то такие срачи весело конечно бывает почитать и даже поучаствовать, но когда люди созидают такие перепалки мало уместны. Вместо того чтобы решить проблемы ты добавляешь новых или усугбляешь старые.
Со стороны смотрится как ты питушок павлин перья распустил, но это всё искры в глаза, убрать перья и останется мизер, который за перьями-то может быть и не увиден (тебя просто проигнорируют, как похоже и случилось).
Много воды и выставления желаемого за действительное. Какие-то вещи просто притянуты за уши. Ты теряешь пласт людей которые начали с высокоуровневых языков и захотели спуститься пониже, но низкоуровневый мир их отталкивает сложностью, нет опоры.
Ты делишь людей на чёрное и белое, хотя в жизни мир это градиент, да и ещё с цветами.

Короче говоря твоя критика в большинстве своём говно.

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

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

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

Секретов у тебя никаких нет.

Дурик, я говорю про ноу-хау. Никто тебя в свои конкретные задачи посвящать не собирается.

В целом я рад, что ты следишь за мною, а это значит, что осознание своей никчёмности всё ближе и ближе.

Лол, обратись к врачу, параноя лечится.

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

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

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

Это было бы на порядок полезнее.

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

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

Хотя в целом, возможно на уровни их развития они могут делать то же самое, что и я. Но я не уверен.

Было бы менее оторвано и может быть какая-то реальная альтернатива бы нашлась в твоих словах.

Альтернативу я уже назвал - если человек способен - он способен. Если не способен - не способен.

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

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

Для этого человека нужна не книга, а описание «как работает» - это мануалы. Они итак есть и написаны. Написаны конечно как дерьмо, но адаптировать их никто не будет для 1% аудитории. Этого достаточно.

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

Этим способом человек впитает себя максимум из своих возможностей.

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

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

Дурик, я говорю про ноу-хау.

Борьбой с ветряными мельницами? Либо победа над убогими?

Никто тебя в свои конкретные задачи посвящать не собирается.

А зря. Почему? Ты проверишь себя - я проверю себя. Почему у вас какая-то фобия показать/выкатить/посоревноваться в чём-то реальном? Это потратит немного времени, это поможет кому-то из нас. Это подтвердить правильность твоего направления, если оно окажется сильнее.

Лол, обратись к врачу, параноя лечится.

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

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

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

Почему у вас какая-то фобия показать/выкатить/посоревноваться в чём-то реальном?

Потому что все и так соревнуются, на рынке.

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

Ищи свою нишу, выходи на рынок, соревнуйся.

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

Хоть Вы, уважаемый, тут всех бесите, я пожалуй снизойду и специально ещё раз объясню для Вас, так, как понял бы каждый дебил.

Как и syscall - это обёртка для syscall вызова. Толку с этого? Это не имеет смысла.

В нашем случае syscall, это наитупейшая обёртка, объяснить которую на основе дизассемблированного кода элементарно. Write выглядит мягко сказать посложнее.

static inline

Не имеет смысла в твоём случае.

Раздувать кол-во инструкций, не имеет смысла. Как и Ваш комментарий про «смешно».

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

В нашем случае syscall, это наитупейшая обёртка,

Как и write. Чем от syscall отличается write? write реализуется так же как и syscall, а то, что в данном случая она реализована через обёртку - из этого ничего не следует.

Write выглядит мягко сказать посложнее.

И чем же? movq 1, %rax;syscall;ret? Это ещё проще, чем syscall, ибо даже сдвигать аргументы не надо.

Раздувать кол-во инструкций, не имеет смысла.

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

Как и Ваш комментарий про «смешно».

typedef int ssize_t;//
typedef int size_t;//т.е. это не смешно? Мало того, что int, так ещё и int, дак ещё и тайпдеф мимикрующий под стандартный тип.
//если у тебя он есть, то зачем ты его сюда написал, а если нет - зачем ты написал это "смешно"?
registrant27492
()
Ответ на: комментарий от registrant27492

Ну с write, допустим соглашусь. На всякий мусор cmpl $0x0,0x2acb19(%rip) можно закрыть глаза. С syscall результат мне всё равно показался чище.

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

В данном случае статик сообщает, что функция является локальной, 6.2.2/3 N1570 :

If the declaration of a file scope identifier for an object or a function contains the storage-
class specifier static, the identifier has internal linkage.
Т.е. мы даём явно понять, что кроме как в этом файле, она больше нигде вызываться не будет.

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

inlining failed in call to 'write': call is unlikely and code size would grow [-Winline]

Именно потому, что посчитает, что функцию write могут захотеть дёрнуть из другого модуля.

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

size_t и ssize_t

В этом случае надо было, конечно, делать int mywrite(int, void*, int). Соглашусь вводить size_t и ssize_t, а потом подменять его int-ом для «простоты» может быть и зря. Странно, что никто не забросал меня какашками из-за того что самописная функция write вместо кол-ва скопированных символов вовращает 0 или -1, это явная ошибка.

Что касается конкретно size_t, в стандарте явно указано SIZE_MAX 65535, минимальная разрядность int это 2 байта, так что ничего в этом криминального нет.

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

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

Инлайн это итак предполагает.

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

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

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

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

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

Any function with internal linkage can be an inline function. For a function with external
linkage, the following restrictions apply: If a function is declared with an inline
function specifier, then it shall also be defined in the same translation unit. If all of the
file scope declarations for a function in a translation unit include the inline function
specifier without extern, then the definition in that translation unit is an inline
definition. An inline definition does not provide an external definition for the function,
and does not forbid an external definition in another translation unit. An inline definition
provides an alternative to an external definition, which a translator may use to implement
any call to the function in the same translation unit. It is unspecified whether a call to the
function uses the inline definition or the external definition.140)


138) By using, for example, an alternative to the usual function call mechanism, such as ‘‘inline
substitution’’. Inline substitution is not textual substitution, nor does it create a new function.
Therefore, for example, the expansion of a macro used within the body of the function uses the
definition it had at the point the function body appears, and not where the function is called; and
identifiers refer to the declarations in scope where the body occurs. Likewise, the function has a
single address, regardless of the number of inline definitions that occur in addition to the external
definition.
139) For example, an implementation might never perform inline substitution, or might only perform inline
substitutions to calls in the scope of an inline declaration.
140) Since an inline definition is distinct from the corresponding external definition and from any other
corresponding inline definitions in other translation units, all corresponding objects with static storage
duration are also distinct in each of the definitions.

Что касается конкретно size_t, в стандарте явно указано SIZE_MAX 65535, минимальная разрядность int это 2 байта, так что ничего в этом криминального нет.

Там написаны значения от балды. Там есть пояснения:

Each instance of these macros shall be replaced by a constant expression suitable for use

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

Инлайн это итак предполагает.

Вы сами читали что процитировали? Первые два предложения из вашей цитаты говорят обратное:

Any function with internal linkage can be an inline function. For a function with external linkage, the following: <blablabla> restrictions apply

Означают ровно то, что указав inline функция может быть либо internal либо external linkage. В свою очередь, как я уже цитировал:

If the declaration of a file scope identifier for an object or a function contains the storage-class specifier static, the identifier has internal linkage.

Следовательно, чтобы функцию была встроена в код другой функции проще и правильнее всего (в моём пример) указать static inline.

Он не может выдать это, ибо на инлайн не может быть ссылки - она инлайн.

Ну включите флаг -Winline в компиляторе gcc и откроете для себя много нового.

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

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

Т.е. получается:

  • Если у функции указан только inline, без static она не имеет адреса (уточните, как по вашему, в любом случае?),
  • Если у функции указан static, вы отнекиваетесь, соберитесь, тряпка, уж и дайте явный ответ либо: «Да, обязана иметь адрес» или «Нет, не обязана»,
  • Если у функции указан static inline, по вашему это значит, что она не имеет адреса и в ту-же очередь обязана иметь адрес, т.е. полный бред.

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

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

Там написаны значения от балды. Там есть пояснения:

Тем более, если это действительно так, то и я выставил значения от балды, что в этом смешного? Единственную за что действительно можно зацепится, это, то что size_t должно быть unsigned.

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

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

Есть, как ты писал external и internal linkage. internal - это статик, а external у функций по умолчанию. Ну можно написать - это ничего не даст.

Ну дак в тех пастах, что я тебе выклал написано, что:

Any function with internal linkage can be an inline function. 
Что функция с «internal linkage» может быть инлайном, но не написано, что она и есть инлайн. И для всех функция это так, ибо по умолчанию экстерн.

Но для инлайн сказано, что:

For a function with external
linkage, the following restrictions apply:  If a function is declared with an inline
function specifier, then it shall also be defined in the same translation unit. If all of the
file scope declarations for a function in a translation unit include the inline function
specifier without extern, then the definition in that translation unit is an inline
definition. An inline definition does not provide an external definition for the function,
and does not forbid an external definition in another translation unit.

An inline definition
provides an alternative to an external definition, which a translator may use to implement
any call to the function in the same translation unit.

Тут сказано, что того, чтобы инлайн был external linkage - его надо определить как extern, иначе он не екстерн.

Т.е. по умолчанию инлайн вообще не linkage, а linkage к нему добавляют либо static, либо extern.

Почему тут ничего не написано про статик - написано - я выше это спастил:

Any function with internal linkage can be an inline function. 

internal linkage и есть static относительно функций.

Давай ещё раз, inline может быть external и internal linkage. Про internal здесь ничего не написано(кроме того, что она возможно), ибо это стандартной свойство функции. А вот про external написано по той причине, что не инлайн функции по умолчанию external и именно потому что инлайн по умолчанию НЕ external тут и написано как добиться external.

Далее в этом очень просто убедиться - для этого надо взять конпелятор:

inline void foo(void) {}
extern inline void foo1(void) {}
static inline void foo2(void) {}
int main(void) {
  {
    void(*f)(void) = foo;
    f();
  }
  {
    void(*f)(void) = foo1;
    f();
  }
  {
    void(*f)(void) = foo2;
    f();
  }
}

$ clang main.c -std=c11 -O0 -Winline -pedantic
/tmp/main-cc3087.o: In function `main':
main.c:(.text+0x1a): undefined reference to `foo'
x86_64-pc-linux-gnu-clang-3.9: error: linker command failed with exit code 1 (use -v to see invocation)

$ gcc main.c -std=c11 -O0 -Winline -pedantic
/tmp/ccWHSDZn.o: In function `main':
main.c:(.text+0x1a): undefined reference to `foo'
collect2: ошибка: выполнение ld завершилось с кодом возврата 1

Или подлые конпеляторы тоже сговорились с царём?

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

если это действительно так

Это не если - это действительно так.

то и я выставил значения от балды

Но там написано, что они устанавливаются в имплементациях языка, но ты то к ней отношения не имеешь.

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

Единственную за что действительно можно зацепится, это, то что size_t должно быть unsigned.

Зацепиться можно за всё то за что зацепился я.

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

я постараюсь тебе объяснить нормально.

Очень познавательно, спасибо. Действительно я даже не задумывался о том, что функция может быть не linkage.

Объясните, пожалуйста, ещё вот это:

$ cat main.c                                   
inline void foo(void) {}
int main(void) {
	foo();
	return 0;
}

$ clang main.c -std=c11 -O0 -Winline -pedantic
/tmp/main-c4c40e.o: In function `main':
main.c:(.text+0x10): undefined reference to `foo'
clang: error: linker command failed with exit code 1 (use -v to see invocation)                                                                                        
$ gcc main.c -std=c11 -O0 -Winline -pedantic   
/tmp/ccyjeP4Y.o: In function `main':
main.c:(.text+0x5): undefined reference to `foo'
collect2: error: ld returned 1 exit status         

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

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

Объясните, пожалуйста, ещё вот это:

Ну в стандарте так же написано, что:

For example, an implementation might never perform inline substitution, or might only perform inline
substitutions to calls in the scope of an inline declaration.

Типа может и не заинлайнить. Пацаны наверное по этой причине не заморачивались этим и оставили инлайн как был раньше - оптимизацией.

Шланг(с оптимизацией) вообще вываливается, когда не может инлайнить. У меня была с этим когда-то проблема.

#include <stdint.h>
#include <malloc.h>


#define way_repeat_2(op) op;op
#define way_repeat_4(op) way_repeat_2(way_repeat_2(op))
#define way_repeat_8(op) way_repeat_4(way_repeat_2(op))
#define way_repeat_64(op) way_repeat_8(way_repeat_8(op))
#define way_repeat_100500(op) way_repeat_64(way_repeat_64(op))

inline void foo(volatile char * str) {
  uint64_t i = 0;
  way_repeat_100500({*str = i++;*str = i++;*str = i++;*str = i++;})
}


int main(void) {
  foo(malloc(100500));
}

Что-то похожее было - только по 16раз и много. Шланг отваливается. гцц инлайнит. Но в тех случаях у меня гцц то же не инлайнил, но функцию создавал - хотя я собираю всегда с gnu11.

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

В итоге мы выяснили, что в static как и external inline ничего криминального нет. Аналогично как и определение size_t как int.

Осталось понять, с хрена какого gcc 4.6.4 считает inline функцию как external linkage. Собственно именно на этом компиляторе я собирал тест, из-за чего пришлось добавить static.

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

В итоге мы выяснили, что в static как и external inline ничего криминального нет.

Есть. Это предполагает её linkage. Т.е. когда я, да и любой пацан, вижу static inline - я предполагаю linkage, которого нет, а раз его нет - зачем оно нужно?

Осталось понять, с хрена какого gcc 4.6.4 считает inline функцию как external linkage

Значит он не умеет в с99/11 и воспринимает инлайн как в с89, где его нет, а инлайн - фича конпелятора. Собственно точно так же его воспринимает гцц6 с с89/gnu89.

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

Ладно, вот Вам пример, писали толковые ребята из intel:

http://dpdk.org/browse/dpdk/plain/lib/librte_ring/rte_ring.h

static inline int __attribute__((always_inline))
__rte_ring_mc_do_dequeue(struct rte_ring *r, void **obj_table,
		 unsigned n, enum rte_ring_queue_behavior behavior)

На фига это всё, если достаточно одного inline?

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

Один inline тебе не 100% гарантирует что функция будет встроена. https://en.wikipedia.org/wiki/Inline_function

Firstly, it serves as a compiler directive that suggests (but does not require) that the compiler substitute the body of the function inline by performing inline expansion

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

Да я вижу. Зря время тратите, имхо.

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

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

Ну мне было вполне познавательно.

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

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

Не знал про radare2, действительно полезная штука..... Но книга уже есть на 200 страниц: https://www.gitbook.com/book/radare/radare2book

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

Я не могу уже редактировать свою тему, так что надо об этом модераторов просить.

Ссылка на эту книгу про radare2 у меня в тексте есть, если что.

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

Нашёл таки ссылку, пробежался по тексту, получается ничего так. Имхо, по WTFPL — это детский сад. А ещё есть опечатка: поновеесм

Ну и позанудствую (Вашу позицию знаю, отвечать не обязательно).

user@localhost:~/learn/c/01_hello/puts_hello/0.1$ cd ..
user@localhost:~/learn/c/01_hello/puts_hello$ cp -r 0.1 0.2
user@localhost:~/learn/c/01_hello/puts_hello$ cd 0.2/
user@localhost:~/learn/c/01_hello/puts_hello/0.2$

хуже чем

user@localhost:~/learn/c/01_hello/puts_hello/$ git tag 0.1
ASM ★★
()
Ответ на: комментарий от ASM

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

Хотя я посмотрел:

#ifdef __cplusplus
extern "C" {

Яснопонятно. Про с89 я уже рассказывал.

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

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

compiler directive

Не является. Но ламеркам это знать не надо.

Хотя там есть намёки:

C++, C99, and GNU C each have support for inline functions.

The specification of inline in C99 requires exactly one additional external definition of a function in another compilation unit, when the corresponding inline definition, that can occur multiple times in different compilation units, if that function is used somewhere. That can easily lead to linker errors because such a definition wasn't provided by the programmer. For this reason, inline in C99 often is used together with static, which gives the function internal linkage.

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

Слово directive переводится как «указание», и понимать это надо как как «Во-первых это служит указанием компилятору компилятору...»

лучше сходи на говнокод, там по тебе уже соскучились http://govnokod.ru/19987#comment326851

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

Слово directive переводится как «указание», и понимать это надо как как «Во-первых это служит указанием компилятору компилятору...»

Это не служит «указанием компилятору», ламерок. Это function specifier и его поведение никак от компелятора не зависит, но ламерку это знать не нужно.

лучше сходи на говнокод, там по тебе уже соскучились

Что мне там делать? Сраться с ламерками? Мне это не интересно.

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

лучше сходи на говнокод, там по тебе уже соскучились

Лол. Царь ходит по провинциальным помойкам и «обоссовывает» кодер-работяг. Тупее занятия не найти.

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

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

да, про radare2 с отладчиком, и главное — декомпилятором radeco было бы весьма годно, реквестирую

есть вдохновляющие статейки про крякмисы на radare2 с патченьем шеллкодов вручную, почти рилтайм компо

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

например, до чего техника дошла

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

всякие детские отмазки типа «вот D/rust/go/лисп/борщехаскель был бы отличный недоязычок, кабы у него был встроенный отладчик/IDE/перделки и свистелки/лестплейи ютубовские» — уже нонче не катят:

отладчик должен быть отладчиком (gdb server), ассемблер ассемблером, а unix это IDE через пайпы

ну или накрутить свой IDE в стиле Plan9 acme/sam/willy или brief/grief или Emacs + org-mode + Literate Programming через org-mode babel.

«programming by poking», интерактивно в духе лисперов

кстати, вот тебе ещё идея: писать книжку сразу в org-mode babel, через «блоки кода» связывать примеры и упражнения, и кодогенерировать емаксом блоки кода из других блоков кода и «блоков данных» через командную строку с тем же radare2/radeco/gcc

презентация в тему, повтыкай там именно над этим слайдом

если Literate Programming/ org-mode не очень знаком, см презентацию сначала и например ссылки neilsen Eric Schulte см. pdf про org и на гитхабе, например

плюсы Emacs org-mode babel кроме того в том, что export в HTML/PDF/latex/WTFормат делаются элементарно в полпинка.

также все примеры извлекаются/компилируются/выполняются_тесты простым M-x org-babel-tangle + make all/make test/make pdf (правда Makefile нужно самому написать :-))

в общем, вполне технологично получается книжки писать в org-mode babel.

с примерами про radare2 я бы почитал, было бы весьма годно.

а так да: удачи с книжкой.

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

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

например, до чего техника дошла

С esil я пока особо не работал, да и не совсем представляю, как он будет вести себя, когда дело дойдет до самомодифицирующегося кода и JIT. Может быть XVilka (автор этой статьи на xakep.ru) потом поможет, если я решу эту тему разбирать. Пока что из radare2 я использую только отладчик. Я запланировал разобрать ситуации с переполнениями буфера, return-oriented programming (ROP) и прочие такие вещи, но это только когда будет уверенное понимание Си и ассемблера.

Из дополнительных материалов я нашел например вот это http://course.secsem.ru/lections (https://www.youtube.com/watch?v=4lf2GnwrMTI - тут разбираются некие базовые вещи)

И еще вот http://ocw.cs.pub.ro/courses/cns
Там используются лицензия CC BY-SA 3.0 а в лорвики 4.0 но это не проблема т.к. более раннюю можно перевести в более позднюю версию https://creativecommons.org/licenses/by-sa/3.0/legalcode 4.b:

You may Distribute or Publicly Perform an Adaptation only under the terms of: (i) this License; (ii) a later version of this License with the same License Elements as this License;


отладчик должен быть отладчиком (gdb server), ассемблер ассемблером, а unix это IDE через пайпы

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

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