- 1. Ссылки на законченные статьи
- 2. О чём хотелось бы написать, если дойдут руки
- 3. Ссылки на полезные темы на форуме
3.1. Ассемблерные вставки, низкоуровневое программирование, работа аппаратуры
3.2. Готовые программы и примеры
3.2.1. Самопальный интерпретатор с BASIC'а
3.3. Базовые конструкции языка C
3.3.1. Базовые конструкции языка C. Функции printf и scanf
3.4. Базовые конструкции языка C++
3.5. Различия между языками C и C++
3.6. Примеры ошибочных кодов
3.7. Неотсортированное
- 4. Ссылки по прикладному программированию
- 5. Полезная информация для начинающих
- 6. Полезные советы
На форуме часто кому-то что-то приходится объяснять и часто возникает необходимость найти уже однажды сделанное пояснение. Вариант с закладками браузера давно меня перестал устраивать, т.к. постоянно синхронизировать закладки дома и на работе надоело. Встроенные средства форума для закладок не понравились. Со всякими облачными сервисами связываться не хочется. Поэтому ссылки начал сваливать на форум, а потом это дело перекочевало из форума в блог. Здесь ссылки не только на мои посты, но и на чужие. В случае чего, свои посты мне обычно найти проще в случае повторной необходимости, а вот чужие найти сложнее, но если я про них вспоминаю и нахожу, то добавляю сюда
Подобная коллекция ссылок является типичной свалкой, для которой всегда есть проблема сортировки или классификации. По возможности попробую хотя бы часть этих ссылок классифицировать, но всё равно какая-то часть пойдёт как неотсортированное
В тех статьях, которые есть в блоге, обычно присутсвуют полезные ссылки, где велось обсуждение по тематике статьи. Поэтому данные ссылки я здесь дублировать не буду. Список статей можно посмотреть в содержании
1. Ссылки на законченные статьи
2. О чём хотелось бы написать, если дойдут руки
- Раздувание исходного кода программы с целью её ускорения. На мысль натолкнула очень полезная статья http://habrahabr.ru/post/182356. Я бы подошёл немного с другой стороны. Для начала объяснил бы навороченную реализацию strlen'а из glibc (через __builtin_constant_p). Такой простой пример показал бы, как получается более быстрый код за счёт увеличения нагрузки на компилятор в момент сборки программы. Затем привёл бы пример с сортировкой массивов: шаблонная функция для сортировки массива плюс её специализации для размеров массива 2, 3, 4, 5, 6 и т.п. (для задач, где сортировка преимущественно делается для коротких массивов, а потому алгоритмы типа qsort будут неэффективными). Можно ещё придумать примеров.
- Отличие ссылки и указателя
Сравнение указателей и ссылок.
Ссылки и указатели
Ссылки vs Указатели
Можно ли для стд::вектор'а взять адрес и-го элемента?
Указатели или ссылки (в качестве аргументов функции) ?
Ссылки vs указатели - в чем разница?
- Про this
раз (пост 11) и два (пост 23)
чем отличается вызов объекта через "." и через "->"
- Тонкие моменты при работе с функциями с переменным числом параметров (передача char'ов, short'ов, float'ов, битовых полей длинных типов, но коротких размеров)
- Технический приём для реализации экземпляров структуры с переменным размером (переменный размер экземпляров, а не структуры)
bool + int + char в одну переменную
- Технический приём для сравнения плавающих чисел через аппаратное целочисленное сравнение
Преобразование типов
- Что такое EOF
"я" это EOF?!
Существует ли EOF или это миф?
10 вопросов по С. part1
Существует ли EOF или это миф?
- Как правильно разбивать программу на несколько файлов. Очень часто возникают затруднения у начинающих
С++ .h файли
Объявление глобальных переменных для всего проекта
- Как устроен поэтапно процесс компиляции
Процесс компиляции
Почему gcc использует аж трехцикловую компиляцию?
3. Ссылки на полезные темы на форуме
По многим вопросам законченную статью или заметку написать навряд ли получится, а потому просто приведу ссылки на темы, где обсуждался тот или иной вопрос. Думаю, что и в такой форме оно окажется полезным. Если приведены ссылки на конкретный пост, то этот пост является неким обобщённым заключением по обсуждаемому вопросу, но всё равно полезно было бы прочитать всю тему. Я не сторонник выкладывать готовые решения для халявщиков. Но так или иначе какие-то из программ я уже выкладывал на форуме, а потому включу их тоже в этот список, чтобы не потерялись
3.1. Ассемблерные вставки, низкоуровневое программирование, работа аппаратуры
- https://gcc.gnu.org/onlinedocs... d-Asm.html
- http://www.ibiblio.org/gferg/l... HOWTO.html
- Низкоуровневое программирование с использованием компилятора
Речь идёт о том, что при определённых навыках компилятором языка Си с ассемблерными вставками можно писать практический такой же код, как и на чистом ассемблере, только с гораздо более эффективной отдачей. В данном случае под эффективностью в первую очередь понимаются затраты на реализацию и поддержку программы. На примере использования компилятора gcc на платформе i386-linux
- Почему использование ассемблерных вставок более эффективно (с точки зрения производительности), чем написание отдельных кодов на ассемблере в отдельных файлах
Здесь опять всё делается на примере компилятора gcc для платформы i386-linux. Но здесь уже речь идёт под углом получения производительного кода
- Ещё одна портянка, связанная с gcc'шными ассемблерными вставками
- Пояснение на пальцах о принципе работы операционной системы
Человек захотел самостоятельно написать простейшую однозадачную операционную систему (а точнее, её прототип). Попытался на пальцах изобразить принцип взаимодействия ядра операционной системы и пользовательского приложения. По ссылке приведена первая часть пояснений, вторая - двумя постами ниже. В конце-концов ТС отказался от этой затеи, ибо она показалось слишком сложной
До кучи ещё одна ссылка: http://habrahabr.ru/post/129176/
- Пара слов о различных синтаксисах ассемблера под linux и windows
- Количество операций НЕ является показателем скорости работы кода
Надо поменять значение переменных местами
Написать strlen() путем считывания групп из 8ми байтов строки
- Попытки помочь в решении частных проблем
inline assembler в СИ
https://www.cyberforum.ru/asse... 97888.html
Есть ли в нотации AT&T аналог dos-овского прерывания 02h?
FreeBSD пример cgi
- Работа кэша в многопроцессорных системах и небольшое описание, как на однопроцессорной системе реализуется многозадачность
- Hyperthreading
Hyper-threading, нюансы что это и с чем его "едят"...
https://www.cyberforum.ru/prog... 22523.html
- Пояснение на пальцах, что двухядерный процессор это НЕ эквивалент одноядерного процессора с удвоенной частотой
- Ещё одно пояснение про двухядерный процессор
- На каких языках программирования пишут операционные системы
- Болтовня про процессоры
Примерно с того поста, куда указывает ссылка, идёт фрагмент разговора, который может кому-то показаться полезным
- Что делать с ассемблерным файлом, полученным из-под компилятора
- Работа кэша
- Работа атомарных операций
- Выровненные и невыровненные обращения в память
- Спор про виртуальную память
- Про уязвимости Spectre и Meltdown
- В каких случаях пишут на ассемблере
3.2. Готовые программы и примеры
3.2.1. Самопальный интерпретатор с BASIC'а
- Версия с поддержкой графики - реализовано через SDL
- Версия с отрезанной графикой - чтобы с ходу заработало на любом компиляторе без дополнительных телодвижений
Наиболее полезные посты с теоретическими выкладками:
- Грамматический анализ, часть 1
- Грамматический анализ, часть 2
- Синтаксический анализ, часть 1
- Таблица констант
- Типы переменных
- Переменные их значения - тут есть небольшая ошибка, связанная с операциями над переменными разных типов
- Синтаксический анализ, часть 2
- Синтаксический анализ, часть 3
- Промежуточное представление, часть 1
- Пользовательские функции и их локальные переменные, часть 1
- Промежуточное представление, часть 2
- Промежуточное представление, часть 3
- Промежуточное представление, часть 4
- Первая версия моего интерпретатора (аттач в следующем посте) - тем, кто собирается ковыряться в исходниках, проще будет ковыряться сначала в недоделанных версиях
- Вторая версия моего интерпретатора (пример использования в следующем посте)
- Процесс интерпретации условных переходов
- Трассировка интерпретации
- Реализация встроенных функций и сложных операторов, часть 1
- Реализация встроенных функций и сложных операторов, часть 2
- Реализация встроенных функций и сложных операторов, часть 3
- Прикручивание IDE, часть 1
- Прикручивание IDE, часть 2
- Пользовательские функции и их локальные переменные, часть 2
- Пользовательские функции и их локальные переменные, часть 3
- Отладчик
- Третья версия моего интерпретатора заметил её только когда втыкал ссылки по теории, судя по всему, она более продвинутая, чем та, которую я позиционировал в ссылках как основную
3.3. Базовые конструкции языка C
- Передача многомерного массива в качестве параметра функции
- Про модификатор register
- Несколько вопросов начинающего по части указателей и ответы на вопросы
- Функции с переменным числом параметров (vararg)
Лично у меня были небольшие замечания касаемо данной статьи, а потому для полноты понимания данных конструкций полезно было бы прочитать нашу дальнейшую перепалку в постах 27, 28, 70, 73, 76 и заключительный пример в посте 92 плюс модификация теста в посте 98. Для полноты картины в посте 105 описан правильный вариант
- Promotion для неспецифицированных аргументов при передаче через vararg:
Для целочисленных типов
Для плавающих типов
- Тонкости работы с vararg'ами при множественном использовании
- Promotion для арифметических операций
- Арифметические операции над короткими типами:
Переменные более короткого типа могут провоцировать более медленный код
Знаковые и беззнаковые операции
- Про указатели на массив
Полезно было бы просмотреть всю тему, а не только этот пост
- Одно из полезных применений на практике указателя на массив
- Про implementation defined, unspecified и undefined behaviour
- Про указатель на неименованную структуру и ещё одна похожая тема
Практически из той же оперы: Про typedef для указателя на структуру
- Как трактуется имя массива в выражениях
- Про квалификатор volatile:
Инициализация статического массива
Пример использования спецификатора volatile
Что такое void и volatile?
- Одновременное использование квалификаторов const и volatile
[Задача] const volatile
const volatile
- Про модификатор restrict:
https://www.cyberforum.ru/cpp/... ost1592152
Квалификатор указателя restrict: Назначение? Когда применять?
- Использования typedef для описания процедурного типа
- Про разыменование (dereference) указателя и про преобразование типов из целое в указатель
- Объяснение на пальцах про указатель на указатель (двойная звёздочка)
- Как обнулить массив, являющийся полем структуры
- Кривая конструкция "целое[указатель]"
- Преобразования "целое -> логическое" и "логическое -> целое"
- Использование операции присваивания как условие для цикла
- Оператор !
- Идентичность указателя и массива при описании параметра функции
- Ключевое слово static при описании размерности массива при описании параметра функции
- Правила размещения полей структуры
- Ещё раз про размещение полей структуры
- Правила упаковки битовых полей структуры
- Про написание приведения типа после вызова malloc'а
- static-переменная в заголовочном файле
- flexible array
- Идеология функций типа strncpy
- Логическое время жизни переменной:
[C++] Взятие адреса конструктора. Физическое время существование объекта.
На сколько корректен этот код?
- Про union:
Приведение указателя базового типа - в контексте strict-aliasing
Union что из себя представляет?
Перевести биты int в unsigned int - в C99 узаконили запись в одно поле и чтение из другого, там же ссылка на описание того, что такое trap representation
- Про setjmp/longjmp
- Про тип возвращаемого значения функцией main
- Почему в языке Си появился избыточный оператор -> (обсуждали здесь)
- Про функции в стиле Кернигана-Ритчи (K&R functions)
3.3.1. Базовые конструкции языка C. Функции printf и scanf
3.4. Базовые конструкции языка C++
3.5. Различия между языками C и C++
3.6. Примеры ошибочных кодов- Коллекция типовых ошибок начинающих программистов
общие для языков C и C++
язык C++
- Некорректный пример: параметр передаём как float, а читаем как int
Какие эффект можно наблюдать, если в точке вызова компилятор видит прототип функции совсем не таким, каким он является на самом деле
- Некорректный пример: пример трудноуловимой ошибки на C++, который проявляется в unix-системах
- Некорректный пример: несогласованное описание и декларация переменной
- Даже не знаю, как коротко описать
- Некорректный пример: адресная арифметика
- Некорректный пример: работает печать std::string через printf. Пример и объяснение, а так же дополнительное объяснение
- Некорректный пример: сдвиг на размер, бОльший, чем размер аргумента
- Некорректный пример: извлечение параметров в функции с эллипсом (функции с переменным числом параметров):
Как перенести параметры из ф-ции printf() в самодельную - здесь предлагается вариант извлечения параметров "вручную" и утверждается, что он эквивалентен "правильному" варианту через va_arg
Как перенести параметры из ф-ции printf() в самодельную - здесь пример того, что вариант с ручным извлечением параметров в общем случае не будет работать на платформах, отличных от x86-32
- Печать char'а и unsigned char'а через printf. Правильная печать двумя постами ниже данной ссылки
- printf не может контролировать правильность передачи параметров
3.7. Неотсортированное
- Первые шаги по работе с svn
По svn есть очень много хорошей литературы. Но так или иначе все эти книги являются подробными и описывают очень много сведений. Людям с практическим складом ума зачастую гораздо проще для начала хоть как-то поработать "вживую", пощупать, и только после этого, поимев некое представление на практике, начать читать теорию. В данном посте я привёл самые первые шаги по самой примитивной работе, после которой станет хоть как-то понятен смысл всего этого дела
- Пояснение на пальцах про системы контроля версий
- Автоматическое построение зависимостей от файлов *.h при написании Makefile под компилятор gcc
- Описание на пальцах, как при помощи gcc собирать программу, состоящую из нескольких исходных файлов
- Описание на пальцах, как при помощи gcc реализовать библиотеку функций (или методов класса, не суть)
- Обсуждение gcc'шной опции -fPIC, которое переросло в обсуждение динамических библиотек (*.so)
- Технический приём по перехвату обращения к системным вызовам и некоторым функциям при использовании библиотеки glibc
- Как осуществляется запись битового поля
- Копирование кода функции в runtime
У человека появилась неординарная постановка задачи. В момент исполнения программы скопировать код функции в динамически выделенную память и запустить этот код. Зачем - неизвестно. Но при такой постановке задачи есть некоторая тонкость, связанная с реализацией операции вызова функции в процессоре (сие касается большинства современных процессоров, а не только i386). Пример работал под linux'ом, но при доработке напильником можно исполнять под любой операционкой
- Одна из областей применения typedef'а, связанная с переносимостью кодов
- Небольшое пояснение на тему того, как запустить в потоке функцию с произвольным прототипом
- Буферизация ввода-вывода:
Несколько уровней буферизации при записи данных на файл
Почему работу с файлом надо буферизировать
Cout не сразу отображает данные
Отключение буферизации stdout'а в linux'е
- Граница между терминалом и командным интерпретатором
- Разница между unix'овым и windows'овым терминалом
- Граница между системой команд и конвейером
- Пример исходников на взаимодействие кодов на Си и кодов на Lua
- Обсуждение построения взаимодействия между кодами на Си++ и Lua
- Пояснение про то, как осуществляется программное управление аппаратными ресурсами компьютера
- Попытка объяснить на пальцах природу атрибутов типа __stdcall, __fastcall (программные соглашения)
- Про безымянные параметры в C++
Разговор от высокоуровневого понятия "безымянного параметра" перешёл на более низкий уровень из разряда программных соглашений
- Базовые принципы построения плагинов (plugins)
- Про конструкцию #pragma pack
- Пример примитивной системы тестирования консольного приложения
- Как сделать портабельный (portable) gcc
- Про устройство malloc'а:
И снова malloc...
https://www.cyberforum.ru/cpp-... ost1671703
- В некотором смысле продолжение "Про устройство malloc'а", но уже "Про устройство new[]/delete[]":
Можно ли обойти динамический массив не зная его размер?
Можно ли обойти динамический массив не зная его размер?
- Пояснение на пальцах различия между статически и динамически слинкованными приложениями
- Вызов из кода на Си кодов, написанных на Си++
Подключение С библиотеки (.so) к проекту С++
- Получение времени в Linux
- Компиляция программы, чтобы при исполнении были каждый раз различные адреса
- Примеры непереносимых кодов на Си/Си++
- Товарищ задал целый паровоз интересных вопросов. На какие-то ответили, на какие-то нет. Но начинающим это было бы полезно:
10 вопросов по С. part1
10 вопросов по С. part2
12 в опросов по C /C++. part3
- Для чего обращения к полям класса или глобальным переменным накрывают Set'ами и Get'ами
- Формирование негативных тестов
- Иногда приходится писать коды, которые по стандарту формально являются некорректными. Обсуждение начинается с 10-го поста
- Заполнение массива одинаковыми значениями (аналог C++'ного std::fill)
- Про объявление локальных переменных внутри лексических блоков
- Последствия того, что intel'овские компиляторы не соблюдают строго стандарт ieee-754
- Казус с указателями на функции, которые приходится описывать, как указатель на void
- Почему для парсеров http-страниц лучше использовать внешние скрипты, а не встроенные в программу парсеры
- Как собрать gcc под linux'ом из исходников
- Грамотно разжёванное объяснение того, как устроено представление отрицательных чисел в дополнительном коде
- Полезные ссылки по subversion (svn), git, mercurial
- Про unicode и преобразование кодировок
Пример преобразования utf8 -> win1251
- Замеры скорости работы malloc'а на Windows и Linux
- Самодельная упрощённая реализация printf'а
- Frontend и backend
- Про перевод строки:
Под DOS/Windows перевод строки в текстовых файлах кодируется двумя байтами 10 и 13 (0xa и 0xd)
Как при достижении определенного размера файла закрыть его
- Пример для генерации inf и nan
- Имена, начинающиеся с символа "подчерк":
Что означают префиксы "_" и "__"?
"Имена, начинающиеся с подчеркивания, зарезервированы для специфических нужд" - что Страуструп имел ввиду?
- Задачи для тренировки и лучшего понимания
- Работа с файлами через всякие абстрактные конструкции (дескриптор файла, FILE*, Handle и т.п.)
- Почему пустая программа, скомпилировання Borland'ом (и не только), имеет большой размер исполняемого файла
- Про strict aliasing
Внешняя ссылка про strict aliasing в gcc
- Побитовое копирование: правильно через memcpy, неправильно через union или через преобразование указателей
- При копировании больших файлов на внешний flash долго висит на 99%
- Пустые класс/структура
- Программная абстракция "поток вывода"
- Начиная с этого поста имеется полезная информация о том, что такое квантовый компьютер
- Что такое "загрузка процессора"
- Есть ли смысл создавать потоки количество которых больше чем количество ядер процессора?
- Про синхронизацию (в довольно общем виде):
Std::atomic. Реализация свободного от блокировок стека - здесь в том числе на пальцах объяснено, что такое memory_order (семантика атомарного обращения в память)
Синхронизация доступа к разделяемой памяти
- Есть ли смысл создавать многопоточное приложение на одноядерной машине
- Что такое thread safe (потокобезопасность)
- Memory ordering на intel'е
- Разница между статической библиотекой *.a и набором объектных файлов *.o
- Turbo-boost на самом деле является автоторможением, а не авторазгоном
- Двухканальный режим работы памяти НЕ удваивает скорость работы
- Про swap (файл подкачки)
- Построение графика функции в текстовой консоли
- Для чего нужна инкапсуляция
- Интересные задачи на знание языка Си
- Кодировки и консоль
- Вещественное деление на ноль
- Пример на работу с аргументами командной строки (argc, argv)
- Сокрытие реализации (сокрытие данных)
- Как под Linux узнать количество физических процессоров и количество ядер
- Про адресацию битов и байтов (включая последующие посты)
- Попытки объяснить человеку, как устроены стек и куча (heap) внутри виртуального адресного пространства
- Про идеологию заголовочных файлов (header) в языках Си и Си++ и сравнение с идеологией модулей (module) в других языках
- Пример на связывание static vs weak в Си и const vs extern inline const в Си++
- Пример работы из-под отладчика gdb с образом памяти упавшей программы (core)
4. Ссылки по прикладному программированию
Выше ссылки представляют собой информацию по основам программирования (фундаментальные основы). Сюда попробую свалить ссылки на более обширные статьи: либо по каким-то конкретным направлениям прикладного программирования, либо учебники. В первую очередь эту свалку делаю для себя, потому как часто через мои руки проходят полезные ссылки, потом они попадают либо в закладки, либо куда-то ещё записываются, после чего возникает проблема с тем, чтобы их найти (например, в браузере я не знаю, как делать поиск по закладкам)
Свалки из полезных ссылок:
5. Полезная информация для начинающих
На форуме часто можно услышать одни и те же вопросы вида "с чего начинать". Для порядку свалил в кучу некоторые подобные обсуждения
6. Полезные советы
Здесь просто свалил мнения отдельных участников форума, с которыми я согласен на все 100%. Это ни в коем случае не рассматривается как истина в последней инстанции, но прислушаться было бы полезно
|