Physics.Math.Code
151K subscribers
5.23K photos
2.21K videos
5.82K files
4.57K links
VK: vk.com/physics_math
Чат инженеров: @math_code
Учебные фильмы: @maths_lib
Репетитор IT mentor: @mentor_it
YouTube: youtube.com/c/PhysicsMathCode

Обратная связь: @physicist_i
Download Telegram
📘 The Elements of Computing Systems.zip
26.1 MB
📘 The Elements of Computing Systems: Building a Modern Computer from First Principles [2005 + 2021] Noam Nisan and Shimon Schocken

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

Достоинства:
Хорошая структурированность;
Оригинальный авторский подход.

☕️ Для тех, кто захочет задонать на кофе:
ВТБ: +79616572047 (СБП) ЮMoney: 410012169999048

#программирование #низкоуровневое_программирование #архитектура #computer_science #assembler #cpp #C

💡 Physics.Math.Code // @physics_lib
138👍27🔥9👨‍💻2🤩1🗿1
This media is not supported in your browser
VIEW IN TELEGRAM
🖥 Сборка мусора (англ. garbage collection) в программировании — одна из форм автоматического управления памятью. Специальный процесс, называемый сборщиком мусора (англ. garbage collector - GC), периодически освобождает память, удаляя из неё ставшие ненужными объекты. Автоматическая сборка мусора позволяет повысить безопасность доступа к памяти. Сборка мусора была впервые применена Джоном Маккарти в 1959 году в среде программирования на разработанном им функциональном языке программирования Лисп. Впоследствии она применялась в других системах программирования и языках, преимущественно — в функциональных и логических. Необходимость сборки мусора в языках этих типов обусловлена тем, что структура таких языков делает крайне неудобным отслеживание времени жизни объектов в памяти и ручное управление ею. Широко используемые в этих языках списки и основанные на них сложные структуры данных во время работы программ постоянно создаются, надстраиваются, расширяются, копируются, и правильно определить момент удаления того или иного объекта затруднительно.

В промышленных процедурных и объектных языках сборка мусора долго не использовалась. Предпочтение отдавалось ручному управлению памятью, как более эффективному и предсказуемому. Но со второй половины 1980-х годов технология сборки мусора стала использоваться и в директивных (императивных), и в объектных языках программирования, а со второй половины 1990-х годов всё большее число создаваемых языков и сред, ориентированных на прикладное программирование, включают механизм сборки мусора либо как единственный, либо как один из доступных механизмов управления динамической памятью. В настоящее время она используется в Оберон, Java, Python, Ruby, C#, D, F#, Go и других языках.

▪️Висячая ссылка (англ. dangling pointer) — это ссылка на объект, который уже удалён из памяти. После удаления объекта все сохранившиеся в программе ссылки на него становятся «висячими». Память, занимаемая ранее объектом, может быть передана операционной системе и стать недоступной, или быть использована для размещения нового объекта в той же программе. В первом случае попытка обратиться по «повисшей» ссылке приведёт к срабатыванию механизма защиты памяти и аварийной остановке программы, а во втором — к непредсказуемым последствиям. Появление висячих ссылок обычно становится следствием неправильной оценки времени жизни объекта: программист вызывает команду удаления объекта до того, как его использование прекратится.

▪️Утечки памяти — Создав объект в динамической памяти, программист может не удалить его после завершения использования. Если ссылающейся на объект переменной будет присвоено новое значение и на объект нет других ссылок, он становится программно недоступным, но продолжает занимать память, поскольку команда его удаления не вызывалась. Такая ситуация и называется утечкой памяти (англ. memory leak). Если объекты, ссылки на которые теряются, создаются в программе постоянно, то утечка памяти проявляется в постепенном увеличении объёма используемой памяти; если программа работает долго, объём используемой ею памяти постоянно растёт, и через какое-то время ощутимо замедляется работа системы (из-за необходимости при любом выделении памяти использовать свопинг), либо программа исчерпывает доступный объём адресного пространства и завершается с ошибкой. 📱 Подробности

📱 Автор видео: Владимир Балун

#программирование #архитектура #многопоточность #сборщикмусора #cpp #java #coding #programming

💡 Physics.Math.Code
// @physics_lib
Please open Telegram to view this post
VIEW IN TELEGRAM
56👍44🔥156👨‍💻3❤‍🔥1🤯1
📚 Подборка книг «Классика Computer Science» (26 книг + CD) [2002-2016]

💾 Скачать книги

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

Серия книг «Классика Computer Science» — это систематизированная библиотека знаний, формирующая инженерное мышление. Изучение этих трудов — это про в собственную архитектурную грамотность и способность решать нетривиальные задачи. Вопрос даже не в том, стоит ли их читать, а в том, в какой последовательности это делать для максимальной эффективности. Рекомендуемая последовательность чтения, если брать 4 базовые книги для разработчика:

📙 1. «Современный компилятор на C» (Аппель) / «Компиляторы: принципы, технологии и инструменты» (Ахо, Ульман, Лам)
Зачем: Понимание процессов компиляции и статического анализа — это основа основ. Даже если вы не пишете компилятор, эти знания незаменимы для работы с препроцессорами, линтерами, транспайлерами и понимания того, как код становится программой.

📙 2. «Компьютерные сети: нисходящий подход» (Куроуз, Росс)
Зачем: Любая современная система — это распределенная система. Глубокое понимание стека протоколов, от HTTP до TCP/IP, — обязательное условие для создания эффективных, надежных и безопасных сетевых приложений.

📙 3. «Современные операционные системы» (Таненбаум)

Зачем: Процессы, потоки, виртуальная память, файловые системы. ОС — менеджер ресурсов, с которым вы взаимодействуете ежесекундно. Знание ее устройства позволяет писать оптимальный и стабильный код, предсказывать его поведение и грамотно диагностировать проблемы.

📙 4. «Глубокая классика» (по выбору, в зависимости от специализации):
— Для системных/highload-разработчиков: «Введение в алгоритмы» (Кормен, Лейзерсон, Ривест, Штайн). Алгоритмическая грамотность — это язык, на котором говорят о сложности и эффективности.
— Для разработчиков СУБД и всех, кто работает с данными: «Базы данных. Проектирование, реализация и сопровождение. Теория и практика» (Коннолли, Бегг). Понимание внутреннего устройства СУБД на порядок повышает качество работы с данными.

☕️ Кто захочет задонать на кофе: ВТБ: +79616572047 (СБП)

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

Этот путь требует дисциплины и времени. Результат — не сиюминутный хак, а формирование той самой «кремниевой прочности», которая отличает инженера от кодера.
#cpp #java #cs #алгоритмы #сети #cplusplus #подборка_книг #IT #разработка

💡 Physics.Math.Code // @physics_lib
53👍41🔥223🥰3❤‍🔥2😍2
📚_Подборка_книг_«Классика_Computer_Science»_26_книг_+_CD_2002_2016.zip
1.4 GB
📚 Подборка книг «Классика Computer Science» (26 книг + CD) [2002-2016]

Сборник книг серии "Классика Computer Science" на тему – компьютеры, программирование, операционные системы, базы данных. Серия книг«Классика computer science», предназначенных для базовой подготовки специалистов в области компьютерных наук.

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

📔 Лафоре Р. - Объектно-ориентированное программирование C++. 4-е изд. 2004
📕Архитектура компьютера [2013] Э. Таненбаум, Т. Остин
📗Брауде Э. - Технология разработки программного обеспечения. 2004
📘Вахалия Ю. - UNIX изнутри. 2003
📙Кельтон В., Лоу А. - Имитационное моделирование. Классика CS. 3-е изд. 2004
📓Клейнберг Дж., Тардос Е. - Алгоритмы. Разработка и применение. 2016
📒 Компьютерные сети [2012] Эндрю Таненбаум, Дэвид Уэзеролл
📔 Константайн Л., Локвуд Л. - Разработка программного обеспечения. 2004
📕 Коплиен Дж. - Программирование на С++ 2005
📗 Кренке Д. - Теория и практика построения баз данных. 8-е изд. 2003
📘 Лафоре Р. - Структуры данных и алгоритмы JAVA. 2-е изд. 2012
📙 Марк Руссинович - Внутреннее устройство Windows, 7-е изд 2018
📓 Паттерсон Д., Хеннеси Дж. - Архитектура компьютеров и проектирование компьютерных систем. 4-е изд. 2012
📒 Пратт Т., Зелковиц М. - Языки программирования. Разработка и реализация 2002

#cpp #java #cs #алгоритмы #сети #cplusplus #подборка_книг #IT #разработка

💡 Physics.Math.Code // @physics_lib
1👍91🔥3533🥰4🙈2🤩1
🧩 Задача на C++: "Таинственная конкатенация"

🖥 Что выведет следующая программа? Будьте внимательны!
#include <iostream>
#define MERGE(a, b) a ## b

int main() {
const char* result1 = MERGE("Hello, ", "World!");
const char* result2 = MERGE("Hello, ", "World" "!");

std::cout << result1 << std::endl;
std::cout << result2 << std::endl;
return 0;
}

Варианты:
1. Обе строки выведут "Hello, World!"
2. Ошибка компиляции
3. Первая выведет мусор, вторая — "Hello, World!"
4. Первая вызовет ошибку, вторая скомпилируется
Задумайтесь на минутку, прежде чем запускать код...

🔍 Разбор проблемы
Правильный ответ: 2 (Ошибка компиляции) или, если точнее, ошибка возникнет уже на строке с result1.
🖥 Код с решением и комментариями:
#include <iostream>
#define MERGE(a, b) a ## b

int main() {
// Эта строка НЕ скомпилируется:
// const char* result1 = MERGE("Hello, ", "World!");
// После раскрытия макроса получим: "Hello, ""World!"
// Это два отдельных строковых литерала без оператора конкатенации

// А вот эта строка скомпилируется и выведет "Hello, World!":
const char* result2 = MERGE("Hello, ", "World" "!");
// После раскрытия макроса получим: "Hello, ""World""!"
// А благодаря фазе трансляции, соседние строковые литералы
// сливаются в один: "Hello, World!!"

// Правильный способ через макрос:
const char* result3 = "Hello, " "World!";

std::cout << result2 << std::endl; // Выведет: Hello, World!!
std::cout << result3 << std::endl; // Выведет: Hello, World!
return 0;
}

📚 Малоизвестный факт:
В C++ есть специальная фаза трансляции, где соседние строковые литералы объединяются в один. Например:
const char* s = "Hello, " "World!"; // Эквивалентно "Hello, World!"
Но этот процесс происходит до раскрытия макросов, поэтому MERGE("Hello, ", "World!") не работает как ожидается.

Ключевые моменты:
1. Оператор ## в макросах выполняет сращивание токенов, а не строк
2. Строковые литералы автоматически конкатенируются на фазе трансляции
3. Макросы раскрываются на более поздней фазе, когда уже слишком поздно для "правильной" конкатенации строк

Будьте осторожны с оператором ## при работе со строковыми литералами! Для их конкатенации лучше использовать обычное расположение рядом или constexpr функции в современном C++.

Чем токен отличается от строки?

1. Токен (в контексте препроцессора C++) — это минимальная единица текста программы, которую распознает препроцессор (
int, main, (, ), {, "Hello", 123, +, ; )
Препроцессор работает именно на уровне токенов. Оператор ## сращивает именно токены, а не их значение

2. Строковый литерал — это конкретный тип токена, который представляет строку в кавычках. Пример: "Hello" — это один токен типа "строковый литерал"


Ещё по теме: Задачки по программированию для наших подписчиков [ C/C++ ]

#C #cpp #cplusplus #программирование #задачи

💡 Physics.Math.Code // @physics_lib
Please open Telegram to view this post
VIEW IN TELEGRAM
51👍20🤷‍♂16🤯6🔥4👾4👏1👻1
📕 Анализ алгоритмов: Вводный курс [2004] Дж. Макконелл

💾 Скачать книгу

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

#cpp #java #cs #алгоритмы #сети #cplusplus #подборка_книг #IT #разработка

💡 Physics.Math.Code // @physics_lib
👍3018🔥8🗿2😱1
Анализ_алгоритмов_Вводный_курс_2004_Дж_Макконелл.zip
13 MB
📕 Анализ алгоритмов: Вводный курс [2004] Дж. Макконелл

Формально книга позиционируется как вводный курс, стремящийся демистифицировать сложную тему анализа эффективности алгоритмов, избегая излишней формализации и математической строгости. Макконнелл ставит перед собой амбициозную задачу: объяснить ключевые концепции (О-нотация, анализ затрат времени, рекуррентные соотношения) на интуитивном уровне, делая материал доступным для студентов, не обладающих серьёзной математической подготовкой. Эта гуманистическая, объяснительная миссия — главный и безусловный плюс книги.

Плюсы книги:

1. Доступность изложения. Автор действительно преуспел в том, чтобы говорить просто о сложном. Объяснения таких понятий, как асимптотическая сложность, «худший/средний/лучший случай», часто построены на удачных аналогиях и пошаговых рассуждениях. Для человека, впервые сталкивающегося с этими концепциями, книга может стать «спасательным кругом».
2. Упор на понимание, а не на формальности. Вместо сухих теорем и доказательств Макконнелл часто прибегает к эмпирическому подходу: предлагает «пощупать» разницу между алгоритмами, сравнивая время их выполнения на конкретных примерах. Это формирует важную первичную интуицию.
3. Практическая ориентированность. Рассмотрение не только классических алгоритмов сортировки и поиска, но и вопросов эмпирического измерения времени, оценки стоимости операций, анализа использования памяти — выгодно отличает книгу от чисто теоретических трактатов.
4. Главы об эмпирическом анализе и отладке. Эти разделы, посвящённые методологии тестирования производительности и поиску «узких мест», являются, пожалуй, наиболее ценными и вневременными. Они прививают важнейшие инженерные навыки.

Минусы книги:

1. Поверхностность и недостаток глубины. Стремление к простоте часто оборачивается серьёзным упрощенчеством. Книга даёт иллюзию понимания, которой может оказаться недостаточно для успешного изучения последующих, более строгих курсов (например, по структурам данных или алгоритмам). Студент, освоивший материал только по Макконнеллу, окажется неподготовленным к формальному языку Кормена, Лейзерсона или Кнута.
2. Устаревший инструментарий и контекст. 2004 год — это эпоха доминирования Java и C++, но даже для того времени выбор инструментов (например, акцент на псевдокоде, напоминающем Паскаль) выглядел консервативно. Сегодня же ссылки на конкретные измерительные методики и «железо» безнадёжно устарели. Это снижает практическую ценность многих глав для современного читателя.
3. Несистематичность. Книга напоминает скорее набор лекций или эссе, чем целостный учебник. Некоторые важные темы (например, динамическое программиние или жадные алгоритмы) затрагиваются лишь вскользь, в то время как менее значительным вопросам уделяется непропорционально много внимания.
4. Размытость целевой аудитории. Кому она адресована сейчас? Серьёзному студенту-информатику её будет катастрофически не хватать. Практикующему разработчику-самоучке, возможно, будет полезен стиль, но содержание придётся искать в более современных источниках. Остаётся узкая ниша: абсолютный новичок-гуманитарий, желающий получить самое общее представление «без математики».

▪️ Для кого может быть полезна: Для студентов непрофильных специальностей, начинающих самоучек с гуманитарным складом ума, или как самое первое, «нулевое» чтение перед изучением серьёзных учебников. А также для преподавателей, ищущих удачные бытовые аналогии для объяснения сложных понятий.
▪️ Кому стоит обойти стороной: Студентам бакалавриата компьютерных наук, готовящимся к техническим собеседованиям разработчикам, а также всем, кто ищет строгий, глубокий и современный охват темы.
▪️ Главный вывод: Книга выполнила свою историческую миссию по популяризации области, но на сегодняшний день она является скорее интеллектуальным антиквариатом, нежели актуальным учебным пособием.
#cpp #java #cs #алгоритмы #сети #cplusplus #подборка_книг #IT #разработка

💡 Physics.Math.Code // @physics_lib
👍4413🔥10🗿611