fa
Feedback
Программистика

Программистика

کانال بسته

Лучший канал про python Ссылка для друга: https://t.me/+Ai6ughKtf5g2ZmFi Купить рекламу: https://telega.in/c/+Ai6ughKtf5g2ZmFi Админ: @JeyRahol По рекламе: @ReivuManager

نمایش بیشتر
5 594
مشترکین
-324 ساعت
+87 روز
-8530 روز
آرشیو پست ها
Распорядок дня — важен! Сегодня я хочу рассказать вам о важности распорядка дня в нашей с вам продуктивности. Конечно, вы уже скорее всего слышали, что распорядок дня важен в жизни каждого человека. Но мне хочется больше об этом рассказать на своём примере, и как это мне помогло. Во-первых, это сон, он должен быть не очень коротким и не очень длинным, я, обычно, в день сплю 8-9 часов и считаю, что это идеальная длительность сна, которая держит меня в очень хорошем состоянии. Такой сон помогает выспаться и не проспать весь день. Так же лучше всего ложиться и просыпаться в одно и тоже время, это помогает привыкнуть организму и вы будете чувствовать себя лучше по утрам и сохранять силы на весь день. Я, например в будние дни, ложусь в 22:00 а просыпаюсь в 6:45. В выходные: ложусь в 00:00, а просыпаюсь в 9:00. Моё организм уже привык к такому распорядку, заняло это около 2 недель, у кого-то может занять больше, у кого-то быстрее, это уже зависит от человек, его индивидуальности. Со сном, вроде, разобрались. Во-вторых, это приёмы пищи. Пища наполняет наш организм энергией, недоедание и переедание очень плохо сказывается на нашем организме. При недоедание наш организм не получает нужного количества энергии, и человек весь день ходит понурым, и ему не хватает энергии на все запланированные дела. А при переедании вы будете чувствовать неприятные ощущения от боль в желудке, животе, до головных болей, так же вас будет клонить в сон. Разумный приём пищи, около 300 - 500 грамм, есть следует 3-5 раз в день и тогда ваш организм скажет вам "спасибо". В-третьих, это дела, которыми вы наполняете свой день. Не следует вставать и ещё пол часа, час и так далее ещё лежать в кровати. Следует лучше сразу встать и начать свой день с небольших бытовых дел, наподобие, застелить кровать, почистить зубы, умыться и так далее. Ведь, если вы застелите кровать, вам не так сильно будет манить снова на неё лечь. Потом можно начать уже другие дела, конечно, у многих работа или учёба, так что нужно пойти сперва туда, а потом заниматься делами важными вам, я бы посоветовал побольше читать разных книг: научных и художественных, так же пытаться развивать себя в сферах, которыми вы хотите заниматься, читая книги, смотря полезные курсы и видеоролики по этой теме. Главное, не надо залипать во всеми любимый тикток и ютуб, на всякие развлекательные видео. Надеюсь этот пост вам помог, ведь благодаря этим 3 основам распорядка дня я успеваю вести 3 своих телеграм-канала, дальше само развиваться и остаётся время на личную жизнь. Понимаю, что этот пост слегка не свойственен тематике канала, но всё же думаю советы из него будут полезны вам в повседневной жизни.🔥 @programistica

Кодировка URL Сегодня я вам расскажу про кодировку URL. Кодировка Quoted-Printable наделила особой силой символ =, Так же эта же кодировка включала механизм для представления обычного символа =. Практически идентичная схема используется в URL-адресах веб-страниц. Если вы когда-нибудь рассматривали URL-адрес веб-страницы, вы могли заметить такие последовательности символов, как %26 и %2F. Они существуют потому, что определенные символы имеют особое значение в контексте URL-адреса. Но иногда нам нужно использовать эти символы как литералы — другими словами, без специальных значений.Как мы уже видели, символы представлены в виде последовательности 8-битных блоков. Каждый фрагмент может быть представлен двумя шестнадцатеричными символами. Кодировка URL, также известная как процентная кодировка, заменяет символ на знак %, за которым следует шестнадцатеричное представление этого символа.Например, косая черта (/) имеет особое значение в URL-адресах. Она имеет код 47 в ASCII, что равно 2F в шестнадцатеричном формате. Если нужно использовать / в URL-адресе, не учитывая его особое значение, мы заменяем его на %2F. Спасибо за внимание, ставьте реакции, если понравился пост🔥 @programistica

8-битная форма представления Unicode Сегодня я вам расскажу, как компьютер представляет кодировку Unicode. А так же сравним UTF-8 и Unicode Компьютеры используют 8 бит для хранения символа ASCII, потому что они не предназначены для обработки 7-битных величин. Опять же, хотя биты стали намного доступнее, чем раньше, все же они не настолько дешевы, чтобы использовать 16 из них для хранения одной буквы, если можно обойтись восемью. Unicode решает эту проблему, используя разные кодировки для кодов символов. Кодировка — это комбинация битов, которая представляет другую комбинацию битов. Совершенно верно — мы используем абстракции (биты) для создания чисел, представляющих символы, а затем используем другие числа для представления этих чисел! Понимаете, что я имел в виду под гипотетическим значением? В частности, существует кодировка, называемая 8-битной формой представления Unicode (Unicode Transformation Format-8 bit, UTF-8), придуманная американским программистом Кеном Томпсоном (Ken Thompson) и его канадским коллегой Робом Пайком (Rob Pike). Эта кодировка чаще всего используется благодаря своей эффективности и обратной совместимости. UTF-8 назначает 8 бит каждому символу ASCII, поэтому они не занимают дополнительного места для данных ASCII. Символы, отличные от ASCII, кодируются таким образом, чтобы не нарушать работу программ, ожидающих ввода ASCII-символов. UTF-8 кодирует символы как последовательность 8-битных блоков, часто называемых октетами. Одно из удобств UTF-8 заключается в том, что количество наиболее значащих единиц в первом блоке определяет длину последовательности, потому первый блок легко распознать. Это полезно, поскольку программам легко находить границы символов. Все символы ASCII умещаются в 7 битах, поэтому на каждый символ приходится ровно один фрагмент, что довольно удобно для англоговорящих, поскольку для хранения символов английского языка нужно меньше места, чем для других языков, которым необходимы не-ASCII-символы. На схеме сверху показано, как UTF-8 кодирует символы по сравнению с Unicode. На схеме видно, что числовой код буквы A одинаков в ASCII и Unicode. Чтобы закодировать A в UTF-8, мы обговариваем условие, что любые коды, которые умещаются в 7 бит, включаются в один фрагмент UTF-8, и задаем MSB равным 0. Вот почему в кодировке UTF-8 для буквы A в начале стоит 0. Далее видно, что Unicode-вариант для символа π не умещается в 7 битах, ему нужно 11. Для кодирования π в UTF-8 мы используем два 8-битных фрагмента, первый из которых начинается со 110, а второй — с 10, в результате чего в каждом фрагменте остается 5 и 6 бит соответственно для хранения оставшегося кода. Наконец, Unicode для символа ♣️ помещается в 16 битах и поэтому занимает три фрагмента UTF-8.

photo content

Паттерн AAA (Arrange-Act-Assert) Сегодня я вам расскажу о паттерне AAA, который очень поможет вам писать более читабельный код. Допустим у нас есть такой код:
import random

numb1 = random.randint(0, 100)
numb2 = random.randint(0, 100)

print(numb1 + numb2)
Код начинается с одной строки, в нашем случае прикрепления библиотеки random, за которой следует пустая строка, затем объявление переменных, которые берут случайные целые числа в промежутке от 0 до 10, занимающие еще две строки, за которым следует пустая строка, и, наконец, оператор print, занимающий одну строку, который выводит сумму переменных на консоль. Большая часть этой структуры — результат продуманной методологии. Пустые же строки есть потому, что код следует шаблону Arrange-Act-Assert, также известному как шаблон AAA. Идея здесь в том, чтобы разделить модульный тест на три этапа. 1. На этапе arrange (подготовка) настраивается тестовое окружение. 2. На этапе act (действие) происходит выполнение или вызов тестируемого сценария. 3. На этапе assert (утверждение) проверяется, соответствует ли фактический результат ожидаемому. Конечно, такой алгоритм применим больше к коду для тестов, но тот, который я представил, более понятен новичку. В данном случае этом ожно разделить на такие этапы: 1. На этапе arrange (подготовка) настраивается окружение(библиотеки, пространоство имён и так далее). 2. На этапе act (действие) происходит выполнение или вызов сценария(сюда может входить: обозначение переменных, вызов функций и так далее). А третьего этапа тут на самом деле нет, хотя если представить, что это лишь тестовый код, то выводом, мы проверили, что код работает исправно, так что можно этот этап назвать: На этапе assert (утверждение) проверяется, соответствует ли фактический результат ожидаемому.(Да он остаётся без изменений. Примерно так это и работает, с помощью этого паттерна код становится более читабельным. Спасибо за внимание, ставьте реакции, если понравился пост🔥 @programistica

Запуск программ Сегодня я вам расскажу, как производится запуск программ на компьютере. Ранее я уже писал о том, что программисты используют функции для повторного применения кода. И это еще не всё. Существует множество функций, которые полезны для более чем одной программы, например функции сравнения двух текстовых строк. Хорошо было бы иметь возможность использовать эти сторонние функции, вместо того чтобы каждый раз писать собственные. Один из способов сделать это — сгруппировать связанные функции в библиотеки. Доступно большое количество библиотек для всего на свете, от обработки строк до сложных математических вычислений и декодирования MP3. Помимо библиотек, нестандартные программы обычно собираются по частям. Можно поместить всю программу в один файл, однако я бы не советовал это делать, на то есть достаточно причин. Главная из них заключается в том, что это упрощает одновременную работу нескольких человек над одной и той же программой. Но разбиение программ на части означает, что нужен какой-то способ связать или соединить все разрозненные части. Для этого каждая часть программы обрабатывается в промежуточном формате, предназначенном для этой цели, а затем запускается специальная программа-компоновщик, которая устанавливает все соединения. Многие промежуточные форматы файлов были созданы и улучшены по мере разработки программ. Формат исполняемых и связываемых файлов (Executable and Linkable Format, ELF) в настоящее время — самый популярный вариант. Этот формат включает разделы, похожие на объявления о поиске товаров. В разделе продаж можно найти что-то вроде объявления, в котором говорится: «У меня есть функция с именем function». Точно так же можно увидеть объявление «Ищу переменную с именем data» в разделе «Требуется». Компоновщик (linker) — это программа, которая связывает между собой все объявления, в результате чего получается программа, которая действительно может быть запущена. Но, конечно, при этом возникают сложности с производительностью. Когда вы относились к библиотекам как к одному из файлов, наполненных функциями, и связывали их с остальной частью программы - это называлось статическим связыванием. Однако примерно в 1980-х годах люди заметили, что многие программы используют одни и те же библиотеки, что было прекрасным свидетельством ценности библиотек. Но они увеличивали размер каждой программы, которая их использовала, и появилось много копий одних и тех же библиотек, использующих ценную память. Это привело к созданию общих библиотек. Можно использовать MMU, чтобы несколько программ могли обращаться к одной копии библиотеки. Имейте в виду, что инструкции из такой библиотеки являются общими для программ, которые к ней обращаются. Необходимо проектировать библиотечные функции так, чтобы они использовали кучу и стек вызывающих программ. У программ есть точка входа — адрес первой инструкции в программе. Эта инструкция не первая исполняемая при запуске программы, как это ни парадоксально. Когда все части программы связываются в исполняемый файл, включается дополнительная библиотека среды выполнения (runtime library). Код в ней запускается до достижения точки входа Библиотека среды выполнения отвечает за настройку памяти, что означает создание стека и кучи. Она также устанавливает начальные значения для элементов в области статических данных. Эти значения хранятся в исполняемом файле и должны быть скопированы в статические данные после получения памяти из системы. Такая библиотека выполняет гораздо больше функций, кроме описанных выше, особенно для сложных языков. К счастью, сейчас вам не нужно изучать это настолько подробно, как это было допустим в годах 90-х или 00-х, сейчас с этим намного проще. Спасибо за внимание, ставьте реакции, если понравился пост🔥 @programistica

Дорогие девушки, коих, по моей информации, целых 14% на канале, сегодня 8 марта, а значит это ваш день. Желаю, чтобы в этот замечательный праздник начали исполняться самые заветные желания, чтобы этот день приносил вам только положительные сюрпризы. С праздником, дорогие девушки. Пусть всë у вас будет хорошо. ❤️

Пространство системы и пользователя Сегодня, я выбрал довольно интересную тему для начинающих программистов и сисадминов, я вам расскажу о пространстве системы и пользователя. Системы многозадачности создают для каждого процесса иллюзию, что это единственная программа, запущенная на компьютере. MMU помогают развить эту иллюзию, предоставляя каждому процессу собственное пространство адресов. Но эту иллюзию трудно поддерживать, если дело касается устройств ввода/вывода. Например, ОС использует таймер, чтобы напомнить самой себе, когда переключаться между программами. ОС решает установить таймер для генерации прерывания один раз в секунду, но, если одна из пользовательских программ изменит его значение на прерывание один раз в час, все пойдет не так, как ожидалось. Точно так же MMU не обеспечит серьезной изоляции между программами, если какая-либо пользовательская программа может изменить собственную конфигурацию. Многие процессоры включают дополнительное аппаратное обеспечение, которое решает эту проблему. В регистре есть бит, который указывает, находится ли компьютер в системном или пользовательском режиме. Некоторые инструкции, например те, которые имеют дело с вводом/выводом, считаются привилегированными и могут выполняться только в системном режиме. Специальные команды, называемые ловушками или системными вызовами, позволяют программам пользовательского режима делать запросы к программам системного режима, то есть к операционной системе. Такое ранжирование имеет несколько преимуществ. Во-первых, оно защищает ОС от действий пользовательских программ, а эти программы — друг от друга. Во-вторых, поскольку программы пользователя не имеют доступа к определенным вещам, таким как MMU, операционная система может управлять выделением ресурсов для них. Системное пространство — это место, где обрабатываются аппаратные исключения. Любые программы, которые вы создаете для телефона, ноутбука или настольного компьютера, будут запускаться в пользовательском пространстве. Прежде чем вносить изменения в программы, работающие в системном пространстве, нужно стать действительно хорошим программистом.Многие процессоры включают дополнительное аппаратное обеспечение, которое решает эту проблему. В регистре есть бит, который указывает, находится ли компьютер в системном или пользовательском режиме. Некоторые инструкции, например те, которые имеют дело с вводом/выводом, считаются привилегированными и могут выполняться только в системном режиме. Специальные команды, называемые ловушками или системными вызовами, позволяют программам пользовательского режима делать запросы к программам системного режима, то есть к операционной системе.Такое ранжирование имеет несколько преимуществ. Во-первых, оно защищает ОС от действий пользовательских программ, а эти программы — друг от друга. Спасибо за внимание, ставьте реакции, если понравился пост🔥 @programistica

Но завтра обещаю написать ещë какой-нибудь интересный пост уже по теме канала, то есть о программировании

Да, что-то второй день посты не делал, обидно, но как-то увлëкся обалденной книгой: "Компьютерная графика. Рейтрейсинг и растеризация". Всем советую, может какие-то знания из неë подчеркну и напишу какой-то интересный пост из тех знаний, что получу из этой книги. Так же обожаю книги Стивена Кинга, может конечно, это мейнстрим, но они мне очень нравятся, самая любимая это "Доктор Сон", это продолжение книги "Сияние", но при этом еë можно прочесть даже без знания первой части, потому что там есть приложения, которые рассказывают о прошлом главного героя, но, конечно, Я бы не назвал Дэна Торранса основным лицом книги, конечно, ему уделено много времени, но все-таки главный герой это девочка-подросток(если еë можно так назвать, потому что всю книгу она растëт, и она всë ещë ребёнок. Ладно на этом закончу, хотя Я много могу говорить об этом прекрасном произведении искусства. Короче, всем советую к прочтению

Виртуальная память Операционные системы управляют распределением ограниченных аппаратных ресурсов между конкурирующими програ
Виртуальная память Операционные системы управляют распределением ограниченных аппаратных ресурсов между конкурирующими программами. Память является управляемым ресурсом. Операционные системы используют MMU для предоставления виртуальной памяти пользовательским программам. MMU может связывать виртуальные адреса программы с физической памятью. Но виртуальная память полезна не только для этого. Механизм отказа страницы позволяет программам думать, что у них может быть столько памяти, сколько им понадобится, даже если это превышает ее физический объем. Что произойдет, если запрошенная память больше доступного объема? ОС перемещает содержимое страниц памяти, которые в настоящее время не нужны, в более крупное, но более медленное запоминающее устройство, чаще всего на диск. Когда программа пытается получить доступ к выгруженной памяти, ОС делает все, что ей нужно, чтобы освободить место, а затем копирует запрошенную страницу обратно. Этот процесс известен как подкачка по требованию. На схеме Виртуальная память показана система виртуальной памяти с одной выгруженной страницей. При подкачке сильно страдает производительность системы, но это все же лучше, чем невозможность запустить программу из-за нехватки памяти. Системы виртуальной памяти используют ряд уловок, чтобы минимизировать снижение производительности. Одна из них — это алгоритм удаления наиболее давно использованных элементов (least recently used, LRU), отслеживающий доступ к страницам. Самые востребованные страницы хранятся в физической памяти, а наименее часто используемые выгружаются. Спасибо за внимание, ставьте реакции, если понравился пост🔥 @programistica

photo content

Относительная адресация Что нужно для одновременного запуска нескольких программ? Для начала нам понадобится программа-диспетчер, которая знает, как переключаться между программами. Мы будем называть ее операционной системой или ядром операционной системы. Чтобы отличать ОС и программы, которые она контролирует, назовем ОС системной программой, а все остальное — пользовательскими программами, или процессами. Простая ОС работает примерно так, как показано на схеме Простая операционная система Здесь ОС использует таймер, чтобы указать, когда нужно переключаться между пользовательскими программами. Этот метод планирования называется квантованием времени, потому что он дает каждой программе отрезок времени для выполнения. Состояние или контекст пользовательской программы относится к содержимому регистров и любой памяти, которую программа использует, включая стек. Это работает, но довольно медленно. На загрузку программы нужно время. Мы бы ускорили работу, если бы программы можно было загружать в память, насколько позволяет пространство, и хранить их там, как показано на схеме Несколько программ в памяти. В этом примере пользовательские программы загружаются в память одна за другой. Но подождите, как это может работать? А всё довольно просто: наш компьютер-образец использовал абсолютную адресацию, это означает, что адреса в инструкциях относятся к определенным ячейкам памяти. Запустить программу, ожидающую адрес 1000, по другому адресу, например 2000, не получится. Некоторые компьютеры решают эту проблему, добавляя индексный регистр — регистр, содержимое которого добавляется к адресам для формирования действительных адресов. Если пользовательская программа ожидает запуска по адресу 1000, ОС может передать в индексный регистр адрес 2000, прежде чем запускать ее по адресу 3000. Еще один способ решить проблему — использование относительной адресации. Вместо того чтобы располагать адреса в инструкциях относительно 0 (начало памяти в большинстве устройств), можно помещать их относительно адресов их инструкций. В случае с относительной адресацией мы используем адрес +99, поскольку инструкция находится по адресу 1, а адрес 100 находится на расстоянии 99. Аналогично последняя инструкция — это ответвление к адресу 4, который станет ответвлением с адресом −8 в относительной адресации. Подобные вещи кажутся кошмарными в двоичном формате, но современные языковые инструменты делают всю арифметику за нас. Относительная адресация позволяет перемещать программу в любое место в памяти. Спасибо за внимание, ставьте реакции, если понравился пост🔥 @programistica

Процедуры, подпрограммы и функции Многие инженеры страдают странной разновидностью лени. Если они не хотят совершать некое действие, они вложат всю свою энергию в создание того, что выполнит задачу за них, даже если для этого потребуется больше работы, чем для самого дела. Программисты хотят избежать повторного написания одного и того же фрагмента кода. На это есть веские причины, помимо лени. Например, код без повторов занимает меньше места, и, если в коде есть ошибка, ее нужно исправить только один раз. Функция (или процедура, или подпрограмма) является основой повторного использования кода. Для вас все эти термины означают одно и то же; это просто региональные языковые различия. Мы будем использовать понятие «функция», потому что оно больше всего похоже на то, что вы, возможно, изучали на уроках математики. Конструкции в большинстве языков программирования похожи. Например:
def number(x):
  return x*2
Этот код создает функцию number, которая принимает единственный параметр с именем x и возвращает его значение, умноженное на 2. На клавиатуре нет символа умножения (×), поэтому во многих языках программирования вместо умножения используется *. Теперь напишем фрагмент программы, как в следующем примере:
print(number(5))
Приятная особенность функции заключается в том, что мы можем выполнять, или вызывать, функцию number несколько раз без необходимости писать ее снова. Мы можем вычислитьnumber(4) + number(6), не повторяя код возведения числа в куб. Это простой пример, но подумайте, насколько удобна эта возможность для более сложных фрагментов кода. Спасибо за внимание, ставьте реакции, если понравился пост🔥 @programistica

Архитектуры фон Неймана и гарвардская @programistica
Архитектуры фон Неймана и гарвардская @programistica

Архитектура компьютера За прошедшие годы компьютеры стали работать быстрее благодаря множеству усовершенствований. При этом они стали потреблять меньше энергии, а программировать на них стало проще. Эти улучшения привели к значительному усложнению архитектуры. Архитектура компьютера означает расположение различных компонентов в компьютере, а не то, есть ли у него дорические или ионические колонны либо индивидуальный оттенок бежевого, как тот, который создал американский предприниматель Стив Джобс (1955–2011) для оригинального компьютера Macintosh. За прошедшие годы было испробовано множество различных архитектур. Что-то сработало, а что-то нет. Основные архитектурные элементы Две наиболее распространенные архитектуры — это архитектура фон Неймана(названная в честь гениального венгеро-американского ученого Джона фон Неймана, 1903–1957) и гарвардская (названная в честь компьютера Harvard Mark I, который, конечно же, был машиной с гарвардской архитектурой). Мы уже видели все их части по отдельности; на схеме Архитектуры фон Неймана и гарвардская показано, как они организованы. Обратите внимание, что единственное различие между ними — это способ организации памяти. При прочих равных архитектура фон Неймана немного медленнее, потому что она не может получать доступ к инструкциям и данным одновременно, поскольку использует только одну шину памяти. Гарвардская архитектура не имеет такого ограничения, но требует дополнительного аппаратного обеспечения для второй шины памяти. Ядра процессора Обе архитектуры на схеме Архитектуры фон Неймана и гарвардская имеют один ЦП, который представляет собой комбинацию АЛУ, регистров и исполнительного устройства. Многопроцессорные системы с несколькими процессорами появились в 1980-х годах как способ получить более высокую производительность, чем можно было бы достичь с помощью одного процессора. Однако, как оказалось, это не так просто. Разделение одной программы так, чтобы ее можно было распараллелить для использования нескольких процессоров, — в целом до сих пор не решенная задача, хотя некоторые варианты решений иногда работают хорошо, например для определенных типов сложной математики. Тем не менее распараллеливание полезно, если запускается более одной программы одновременно. Оно весьма пригодилось на заре создания графических рабочих станций, поскольку система X Window была настолько ресурсоемкой, что для ее запуска требовался отдельный процессор. Уменьшение геометрических размеров процессоров снижает затраты. Микросхемы изготавливаются на кремниевых пластинах, а уменьшение размеров схем означает, что на одной пластине помещается больше микросхем. Раньше более высокая производительность достигалась за счет быстродействия процессора, что означало увеличение тактовой частоты. Но более быстрые машины требовали большей мощности, что в сочетании с меньшими геометрическими размерами давало больше тепла на единицу площади. Процессоры достигли предела мощности около 2000 года — удельную мощность невозможно было увеличить без превышения температуры плавления. В некотором роде спасение было найдено в меньших геометрических размерах. Изменилось определение ЦП; то, что мы раньше называли ЦП, теперь называется ядром процессора. Многоядерные процессоры стали обычным явлением. Существуют даже системы с несколькими многоядерными процессорами, в основном в центрах обработки данных. Спасибо за внимание, ставьте реакции, если понравился пост🔥 @programistica

Положительная и отрицательная логика @programistica
Положительная и отрицательная логика @programistica

Таблица истинности закона де Моргана @programistica
Таблица истинности закона де Моргана @programistica

Закон де Моргана В дополнение к посту про булеву алгебру, сегодня я вам расскажу о законе де Моргана. В XIX веке британский математик Огастес де Морган добавил закон, применимый только к булевой алгебре, названный законом де Моргана. Этот закон гласит, что операция a И b эквивалентна операции НЕ (НЕ a ИЛИ НЕ b), как показано на схеме прикреплённой ниже: Таблица истинности закона де Моргана. Обратите внимание, что результаты a И b во втором столбце идентичны результатам, перечисленным в последнем столбце НЕ (НЕ a ИЛИ НЕ b). Это означает, что при достаточном количестве операций НЕ можно заменить операции И операциями ИЛИ (и наоборот). Это полезно, потому что компьютеры работают с настоящими входными данными, которые они не могут контролировать. Хотя было бы неплохо, если бы входные данные всегда были представлены в виде холодно или дождь, но они часто приходят в виде НЕ холодно и НЕ дождь. Подобно двойному отрицанию в естественных языках, закон де Моргана — это инструмент, который позволяет оперировать положениями отрицательной логики в дополнение к положительной логике. На схеме, которая будет тоже прикреплена ниже: Положительная и отрицательная логика, показано решение задачи «надеть ли пальто» как для положительной, так и для отрицательной логики. С левой стороны (положительная логика) можно принять решение, используя единственную операцию ИЛИ. С правой стороны (отрицательная логика) закон де Моргана позволяет принимать решение, используя единственную операцию И. Если бы закона де Моргана не существовало, пришлось бы реализовать случай отрицательной логики как НЕ не-холодно ИЛИ НЕ не-дождь. Хотя и это сработает, каждая операция влечет за собой затраты в стоимости и производительности, поэтому сокращение операций минимизирует затраты. Оборудование, которое выполняет операцию НЕ, стоит реальных денег, и, как вы узнаете из следующей главы, каскадные операции замедляют работу. Закон де Моргана говорит, что наш пример эквивалентен варианту «холодно и дождь», что намного проще. Спасибо за внимание, ставьте реакции, если понравился пост🔥 @programistica

Пример кодировки UTF-8
Пример кодировки UTF-8