Сообщество - Лига программистов C/C++
65 постов 4 793 подписчика

Популярные теги в сообществе:

12

Книга по C++, которую ты обязан прочитать в 2025 году

Я почему-то уверен, что она у тебя уже есть. Либо в списке литературы для самообразования, либо где-то среди скачанных pdf, а может, даже в печатном виде. Возможно, ты даже начинал её читать, но… работа, таски, собеседования… деньги вроде и так платят… и ты так и не осилил Мейерса "Эффективный и современный С++".

А ведь именно эта книга — ключ, который поможет тебе пробить потолок уровня middle и начать движение к senior.

Да, можно скачать список из 400 популярных вопросов, выучить их и бодро ответить на вопрос: «Расскажи про std::unique_ptr». А потом тебе прилетает дополнительный вопрос: «А как изменится размер std::unique_ptr при использовании пользовательского удалителя?» Иии… Я не буду додумывать твой уровень знаний. Попробуй сам ответить на этот вопрос и поставь себе оценку🙂
И это только один из примеров тонких нюансов, которые описаны в этой книге и которые реально спрашивают на собеседованиях.

Ещё одна сильная сторона книги: почти каждая фича современного C++ иллюстрируется примерами её использования в реальном проде. А это большая редкость для технической литературы.

Хватит откладывать эту книгу на «потом». Поставь цель на этот год и, наконец-то, найди время, чтобы прочитать 300 страниц "Эффективного и современного С++".

Книга по C++, которую ты обязан прочитать в 2025 году
Показать полностью 1
121

Сборка MS-DOS 4.0

Автор текста: dlinyj

Совсем недавно появилась следующая новость: На GitHub опубликован исходный код MS-DOS 4.00 под лицензией MIT. Раз появились исходные коды, стало сразу интересно: а можно ли собрать эту операционную систему?

Задача оказалась нетривиальной и совсем неочевидной. Оказывается, что исходные файлы DOS не так-то уж и легко переносятся в git, и уж как минимум, не как текстовые файлы в кодировке UTF-8. Но, к счастью, в отличие от утечек исходников MS-DOS 6.0, здесь имеется полный комплект файлов и инструментов, достаточный для корректной сборки и тестирования. Остались сущие нюансы, которые попили много крови.

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

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

❯ Инструментарий


Собирать всё буду в Linux Mint (читай Ubuntu). Средой DOS для сборки выбрал dosbox, к сожалению, это не самый лучший вариант, потому что там идёт замедление частоты (чтобы старые программы корректно работали), поэтому сборка идёт достаточно долго. Лучше всего использовать любой удобный DOS, запущенный в виртуальной машине.

Для создания загрузочной дискеты и тестирования полученной сборки буду задействовать виртуальную машину qemu. А чтобы получить дискеты с готовым образом, я буду использовать установочную дискету MS-DOS 4.0 (найденную тут см. 4.00 OEM [Sampo]).

Прежде чем пойдём дальше — важное замечание:

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

❯ В чём сложности сборки?


Проблемы две:

  1. Некорректная инициализация переменных среды (в самом bat-файле SETENV.BAT содержится ошибки или опечатки).

  2. Проблемы с кодировкой при переносе кода с дискеток DOS в GIT с кодировкой UTF-8.


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

Значительно сложнее обстоят дела с тем, что в части кода, при переносе в UTF-8, побились некоторые символы. У меня была попытка сборки, которую я описывал у себя в ЖЖ, и, в конце концов, я получил вот это:

Это достаточно частая и болезненная проблема со старыми исходниками времён DOS. С аналогичной задачей я столкнулся и при попытке собрать программу RAM View. Об этом пути и исправлении проблемы, я подробно написал в статье Правка чужого кода.

Здесь же мы исключим ручной труд и автоматизируем исправление проблем с кодировками.

❯ Подготовительные операции перед сборкой


Итак, шаги по сборке ДОС. Клонируем оригинальный репозиторий:

git clone https://github.com/microsoft/MS-DOS.git

Исправляем проблемы с кодировками:

sed -i -re 's/\xEF\xBF\xBD|\xC4\xBF|\xC4\xB4/#/g' MS-DOS/v4.0/src/MAPPER/GETMSG.ASM
sed -i -re 's/\xEF\xBF\xBD|\xC4\xBF|\xC4\xB4/#/g' MS-DOS/v4.0/src/SELECT/SELECT2.ASM
sed -i -re 's/\xEF\xBF\xBD|\xC4\xBF|\xC4\xB4/#/g' MS-DOS/v4.0/src/SELECT/USA.INF

Переходим в рабочую папку:

cd MS-DOS/v4.0

Перекодируем все текстовые файлы в формат MS-DOS:

find -iname '*.bat' -o -iname '*.asm' -o -iname '*.skl' -o -iname 'zero.dat' -o -iname 'locscr' | xargs unix2dos -f
find -iname '*.BAT' -o -iname '*.ASM' -o -iname '*.SKL' -o -iname 'ZERO.DAT' -o -iname 'LOCSCR' | xargs unix2dos -f


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

$ cat src/e.bat
@Echo off
echo setting up system to build the MS-DOS 4.01 SOURCE BAK...
set CL=
set LINK=
set MASM=
set COUNTRY=usa-ms
set BAKROOT=e:
rem BAKROOT points to the home drive/directory of the sources.
set LIB=%BAKROOT%\src\tools\bld\lib
set INIT=%BAKROOT%\src\tools
set INCLUDE=%BAKROOT%\src\tools\bld\inc
set PATH=%BAKROOT%\src\tools;%PATH%

В принципе этих операций достаточно для сборки, а то что ниже — это лично моё хулиганство, чтобы продемонстрировать, что DOS в действительности собрался, и нет подмены файлов. Я заменяю компанию Microsoft своим ником:

find -name "*.ASM" -type f -exec sed -i 's/Microsoft/Dlinyj/g' {} +
find -name "*.INC" -type f -exec sed -i 's/Microsoft/Dlinyj/g' {} +
find -name "*.H" -type f -exec sed -i 's/Microsoft/Dlinyj/g' {} +
find -name "*.MAC" -type f -exec sed -i 's/Microsoft/Dlinyj/g' {} +
find -name "*.MSG" -type f -exec sed -i 's/Microsoft/Dlinyj/g' {} +
find -name "*.C" -type f -exec sed -i 's/Microsoft/Dlinyj/g' {} +
find -name "*.CLB" -type f -exec sed -i 's/Microsoft/Dlinyj/g' {} +
find -name "*.SKL" -type f -exec sed -i 's/Microsoft/Dlinyj/g' {} +

Всё, теперь исходники подготовлены, для того чтобы их можно было корректно собрать.

❯ Сборка


Собирать буду в dosbox, как показала практика — это не самое лучшее решение, сборка занимает около часа, что, мягко скажем, раздражает.

Запускаю dosbox:

dosbox

Далее в нём монтирую текущую директорию как диск E.

mount e: ./

И переходим на диск e, запускаем в dosbox бат-файл, который инициализирует среду окружения, и начинаем сборку:

e:
cd SRC
e.bat

и запускаем сборку командой nmake:

Если вы делаете это в dosbox, то можно пойти погулять. Окончанием сборки будет выглядеть следующим образом:

После этого надо скопировать все собранные файлы в один каталог. Создаём каталог «4» в корне диска и копируем все бинарники специальным скриптом:

mkdir \4
CPY.BAT \4


Далее самое интересное:проверка того, что файлы запускаются. Для этого надо сделать так, чтобы dosbox прикидывался старым ДОСом. Выполняем следующую команду:

ver set 4.0

После переходим в каталог\4и можно выполнить в нёмcommand.com:

Хулиганство сработало, ДОС собрался и прикидывается, будто бы я его разработал. Дело стало за малым — протестировать это на реальном железе.

❯ Создание загрузочной дискетки


Дальше я думал просто примонтировать в dosbox пустой образ дискетки, и прямо из собранных файлов выполнить перенос системных файлов командой:

sys <path> a:

Но, факир был пьян, и фокус не удался. Поэтому решил MBR (Master Boot Record) позаимствовать с загрузочной дискетки DOS 4.0. К сожалению, MBR от MS-DOS 6.22 у меня не заработал.

Скачиваем установочные дискетки, попутно создаём пустую дискетку командой:

truncate --size 1474560 fdd.img

Загружаемся с установочной дискетки и ставим наш пустой образ 1,44 МБ дискетки в дисковод B, с помощью qemu:

qemu-system-i386 -fda Disk01.img -fdb fdd.img

Отменяем установку и форматируем дискету с переносом системных файлов:

По окончании можно закрывать окно qemu. Возвращаемся к окну с dosbox и монтируем полученный образ дискетки, с помощью следующей команды:

imgmount a: <path to fdd.img> -t floppy

И потом просто вручную переносим файлы COMMAND.COM, IO.SYS и MSDOS.SYS на дискету:

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

Для запуска в qemu следует использовать следующую команду:

qemu-system-i386 -fda fdd.img

Записать на дискетку можно командой dd, я использую USB-FDD дисковод.

sudo dd if=fdd.img of=/dev/sdk status=progress

И, да! Эта система успешно работает на реальном железе. В данном случае проверка идёт на 386 компьютере.

❯ Выводы

Запуск свежесобранного MS-DOS 4.0 на реальном железе

Запуск свежесобранного MS-DOS 4.0 на реальном железе

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

Давняя утечка MS-DOS 6.0 была неполной, и собрать его не представлялось возможным. А теперь у исследователей есть готовый инструментарий, для того чтобы попрактиковаться в разработки каких-то своих модулей старой операционной системы.

Конечно же, я по-настоящему жду, когда же обнародуют исходники MS-DOS 6.22, так как ещё надеюсь увидеть их на своём веку.

Удачи вам в ваших экспериментах!

❯ Полезные ссылки:

  1. Исходные коды MS-DOS от Microsoft

  2. Пример сборки MS-DOS 4.0 во FreeDOS (видео)

  3. Compiling MS-DOS 4.0 from DOS 4.0, on a PS/2!

  • Написано специально для Timeweb Cloud и читателей Пикабу. Подписывайтесь на наш блог, чтобы не пропустить новые интересные статьи.

  • Облачные сервисы Timeweb Cloud — это реферальная ссылка, которая может помочь поддержать наши проекты.

Показать полностью 9
7

Почему игнорируется условие IF

Привет всем. Прошу помочь знающих людей. Пробую немного разобраться в программировании микроконтроллеров на С++. Создал программу тестера батареек. Функция Void loop состоит по сути из трех условий:

1) если напряжение на батарейке больше 1,6 в то горит зеленый светодиод (newLed),

2) если от 1,4 до 1,6в, то горит желтый светодиод (okLed),

3) и все остальное - горит красный (oldLed).

Загрузке в ардуину происходит немного другое. Программа начинает бесконечный цикл и , даже без подключения проверяемой батарейки)загорается красный (ну это понятно, т.к. нулевое напряжение соответствует третьему условию), но далее программа возвращается к первому условию и загорается зеленый светодиод. И так бесконечно происходит игнорирование условия IF, по которому зеленый светодиод включается только когда более 1,6 в.

#define newLed 2

#define okLed 4

#define oldLed 6

int analogValue = 0;

float voltage = 0;

int ledDelay = 2000;

void setup()

{

pinMode(newLed,OUTPUT);

pinMode(okLed,OUTPUT);

pinMode(oldLed,OUTPUT);

}

void loop()

{

analogValue = analogRead(0);

voltage = 0.0048*analogValue;

if (voltage >= 1.6)

{ digitalWrite(newLed, HIGH);

delay(ledDelay);

digitalWrite(newLed, LOW);

}

else if(voltage < 1.6 && voltage > 1.4)

{

digitalWrite(okLed, HIGH);

delay(ledDelay);

digitalWrite(okLed, LOW);

}

else

{

digitalWrite(oldLed, HIGH);

delay(ledDelay);

digitalWrite(oldLed, LOW);

}}

_______________________________

кстати такое поведение ардуины заметил не только в этой программе. Там где программы состоят из условий IF постоянно игнорируется первое условие (оно постоянно выполняется). При загрузке скетча в симулятор Arduino в интернете пограммы работают корректно. В чем может быть дело?

Показать полностью
23

SayoriOS или о том, как мы пишем свою мини ОС

Небольшое предисловие

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

Почему называется именно SayoriOS?

Это является отсылкой к игре Doki Doki Literature Club, там был один из персонажей, к сожалению, те кто играл в игру поймут более глубокую отсылку.

SayoriOS или о том, как мы пишем свою мини ОС

Как все начиналось?

Кто заглянет к нам на GitHub, может заметить что отсчет идет с версии v0.2.13.1, дело в том что все до версии v0.3.0 было основано на другой ос (её, версию кстати после нашего релиза (v0.2.13.1) удалили), с версии v0.3.0 было проделано множество работы, прошло уже больше года и я хочу вам рассказать чего мы добились за это время.

На каком языке программирования вы пишете ОС?

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

Почему вы пишете именно x86 битную версию, а не x64?

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

Немного о действующих лицах

Никита Пиминов - собственно я, как создатель и инициализатор проекта

Андрей Павленко - второй разработчик, написал почти все драйвера для ос

Дима Радеев - добавил поддержку звука ошибок

Даниил Лебедев - добавил поддержку Rust в ядре

Рустем Гимадутдинов - добавил поддержку мыши PS/2

А теперь перейдем к краткому ChangeLog'у

v0.3.0 - Релиз 09.11.2022

Скриншоты версии v0.3.0

Как я и говорил ранее, самое большое обновление было тут.

У нас наконец-то тогда появилась поддержка потоков, можно было выполнять сразу два дело одновременно, но тогда очень ощутима потеря производительности. Для драйвера клавиатуры мы завезли поддержку русских букв, что и сейчас, что и до этого, смена раскладки находиться на F1. Самое интересно тогда было связанно с файлами, было сделано что-то подобие своей файловой системы, и аналог своего формата изображений Duke.

v0.3.1 - Релиз 16.12.2022

Скриншоты версии v0.3.1

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

v0.3.2 - Релиз 02.04.2023

SayoriOS или о том, как мы пишем свою мини ОС

В этой версии ситуация уже по лучше :) Опять же исправили множество багов (и добавили новых)

  • Появилась поддержка нормальных шрифтов PSF

  • Поддержка PCI

  • Поддержка звука через AC97 (в QEMU работает в нормально, в VBox'e заикается ,а на реальном железе не тестировалось)

  • Обновили местами интерфейс

  • Добавили Parallel Desktop - это прототип рабочего стола

v0.3.3 - Релиз 08.10.2023

Скриншоты версии v0.3.3

У этого релиза, также визуальных отличий почти не было, были только небольшие фишки

  • Добавлена система триггеров (событий)

  • Поддержка setjmp/longjmp

  • Поддержка температуры процессора

  • Первые шаги ACPI

  • Поддержка SSE

  • Определение других процессорных ядер

  • Научились работать с жесткими дисками, IDE PIO, ATAPI Дисководы, а также с Floppy (RW)

  • Добавлена поддержка vsprintf(), sprintf(), asprintf(), vasprintf()

  • Ну и пофиксили некоторые моменты, и некоторые другие фишки

v0.3.4 - Релиз 31.12.2023

Скриншоты версии v0.3.4

Это был наш предновогодний релиз, и вот список изменений:

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

  • Исправили детектор имени процессора, раньше выводилась пустота

  • Исправлена работа на видеокартах с Cirrus

  • Добавлена поддержка IDE-дисков (в режиме DMA) и частичная поддержка SATA

  • Переписали полностью, функционал который отвечал за файлы, теперь этим занимается менеджер файловых систем и дисков (nvfs | dpm | fsm)

  • Туда же подключили все устройства (виртуальный диск, диски, floppy)

  • Удалили sefs (был наш аналог файловой системы) и аналог Targa, заменив собственно TarFS + Targa (с 4ю режимами)

  • Добавили базовую поддержку libstring и libvector

  • Добавили проигрыватель miniplay (Воспроизводит wav файлы)

  • Добавили поддержку JavaScript (port elk) => JSE

  • Начата работа над сетью

  • Добавлен эмулятор GameBoy, правда производительность у него очень низкая.

Буду рад обратной связи!

Благодарю всех за внимание!

Ссылка на GitHub: https://github.com/pimnik98/SayoriOS

Мы в VK: https://vk.com/sayorios

И телеграм: https://t.me/sayorios

В соц.сетях, можете найти мемы касаемо разработки, и сами новости.

Всех с наступившим Новым Годом и наступающим Рождеством.

Показать полностью 18
11

Как дела у c++ разработчиков?

Привет всем! Нужен совет от с++ разработчиков по поводу работы.

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

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

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

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

Собственно, вопрос - все ли у вас (разработчиков с++) лучше в этом плане? Действительно ли технические задачи в мире с++ находятся в приоритете? Или работа с клиентами и прочая бюрократия тоже присутствует? Или есть какие-то свои "анти-программисткие" заморочки и хрен редьки не слаще?

18

Выбор курса

Доброго времени суток. Ситуация такая: я студент 3-го курса вечернего обучения направления ИСИТ. И дело в том, что я о С++ знаю толком ничего. Самые основы, например, циклы for, if/else, switch, while написать могу, но на этом всё. Мои знания остались поверхностные с первого курса, как только дело дошло до указателей. В универе толком ничему не учат, дают только херовые методички, задания и делайте с этим что хотите, главное, чтобы прислали к дедлайну.
У кого не спрошу какие курсы лучше пройти, какие толковые, какие отстойные, никто ничего сказать не может.
Может быть здесь кто-то сможет что-нибудь посоветовать. Меня, например, заинтересовал способ изучения языка через создание игр на UE4. Но при этом всегда демотивирует неуверенность в том, толковый ли этот курс или он будет такой же бессмысленный как те, что дают нам преподаватели (неразвернутая информация, кучу всего нужно искать самостоятельно в других источниках и тп)
Вот, собственно, сама книга, про которую я говорю:

Выбор курса

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

Показать полностью 1
10

С++ Книги Для Начинающего Программиста

Здравствуйте уважаемые программисты, хочу задать вопрос на тему какую книгу по программированию начать изучать первой.

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

Вопрос насущный заключается в том, какую книгу вы посоветуете имея уже свой опыт в изучении и почему именно, какие в ней минусы и плюсы?

7

Мобильная 1С и внешние компоненты

Очень надеюсь, что здесь есть люди, которые делают/сделали компоненты для мобильного приложения/клиента 1С.

Хочу сделать компоненту для мобильного приложения (Android), но не понимаю как её собрать. Пишу на C++. DLL получается и всё круто, а SO, для ARM/ARM64, при подключении на мобилке вылетает. Причем и моя, и с ИТС. И как отладить не понимаю. Собирал через Visual Studio. Тестил на своем телефоне (ARM64) и на ТСД (ARM). В процессе гугления нашёл ещё способы:
1. Собрать под Linux и, вроде как, оно будет работать
2. Собрать SO в Android Studio

Но тут уже не хватает знаний как и что делать и по итогу просто запутался. И спросить совсем не у кого(

Прошу подсказать, скинуть какой-нибудь материал для подсказки, мини-инструкцию, пример или хоть как-нибудь помочь

P.S. Пишу на Пикабу уже от отчаяния, ибо три дня гугления ничего не дают. Естественно без рейтинга

Отличная работа, все прочитано!