Протекающие абстракции, Или зачем современному программисту знать все эти низкоуровневые детали

Содержание

Слайд 2

Что пишет типичный современный программист

Что пишет типичный современный программист

Слайд 3

Что пишет типичный современный программист

Что пишет типичный современный программист

Слайд 4

А то и еще хуже

А то и еще хуже

Слайд 5

На самом деле все еще хуже Оптимизирующий Генератор байт-кода Препроцессор шаблоны

На самом деле все еще хуже

Оптимизирующий
Генератор байт-кода

Препроцессор шаблоны условная компиляция

JIT-компилятор

STL/ATL, препроцессор,
Оптимизирующий компилятор

VMWare

патчит
гостевую ось на ходу

Железо руками давно уже
никто не проектирует,
Везде сплошные
CAD, VHDL и FPGA

Слайд 6

И как с этим теперь жить? «Я лучше буду знать что-то

И как с этим теперь жить?

«Я лучше буду знать что-то одно,

но буду знать это хорошо»
«Пусть за меня думает компьютер, я буду решать только высокоуровневые вопросы»
«Преждевременная оптимизация – корень всех зол»
«Будет тормозить – будем думать»
Слайд 7

Протекающие абстракции Leaky abstraction © Joel Spolsky, http://www.joelonsoftware.com/articles/LeakyAbstractions.html Что же может

Протекающие абстракции

Leaky abstraction © Joel Spolsky, http://www.joelonsoftware.com/articles/LeakyAbstractions.html
Что же может протечь?
Проблемы с

безопасностью
Проблемы с производительностью
Ошибки
Документированные особенности реализации
Слайд 8

Например Transmission Control Protocol Абстракция надежного соединения через ненадежную сеть Реальная

Например

Transmission Control Protocol
Абстракция надежного соединения через ненадежную сеть
Реальная сеть теряет пакеты

или доставляет их не по порядку
TCP имитирует надежное соединение
Слайд 9

Но TCP использует подтверждения, таймауты и повторную передачу TCP рвет соединение

Но

TCP использует подтверждения, таймауты и повторную передачу
TCP рвет соединение при трех

последовательных таймаутах
TCP гарантирует доставку, но не гарантирует время доставки
Слайд 10

Другой пример Java/C# используют сборку мусора Полезная абстракция, которая устраняет висячие

Другой пример

Java/C# используют сборку мусора
Полезная абстракция, которая устраняет висячие ссылки и

утечки памяти
Снижение стоимости разработки от 2 до 5 раз
Слайд 11

Но Если вы не думаете, куда (а также, когда и почему)

Но

Если вы не думаете, куда (а также, когда и почему) у

вас деваются объекты, вы будете делать ошибки.
В С++ и C# это будут разные ошибки.
Кстати, в Java/C# утечки памяти очень даже бывают…
Слайд 12

Exception security C++ style RAII (Resource allocation is initalization) Деструкторы зовутся

Exception security

C++ style
RAII (Resource allocation is initalization)
Деструкторы зовутся в конце блока
Завернуть

выделяемый ресурс в объект с конструктором/деструктором, и исключения вам не страшны

Java/C# style
Финализаторы зовутся JVM знает когда
Внешние ресурсы надо освобождать явно
Висячие ссылки/утечки возвращаются к нам
Try {}
Catch {}
Catch {}
Finally { window.close(); bitmap.recycle(); session.destroy(); …. }

Слайд 13

Пример из жизни В Android есть две кучи Managed heap (Dalvik)

Пример из жизни

В Android есть две кучи
Managed heap (Dalvik)
Native heap (OpenGL/BMP)
Объектам

нативной кучи надо явно звать recycle.
Куча приколов
Нативная куча кончилась, вы зовете gc, а толку нет
Утечки памяти в нативной куче
Висячие ссылки в управляемой куче
И прочие радости жизни
И все это в условиях жестко ограниченной памяти.
Слайд 14

Пример из жизни (самый противный вариант) Класс-обертка вокруг битмапа в нативной

Пример из жизни (самый противный вариант)

Класс-обертка вокруг битмапа в нативной куче
Битмап

большой, обертка маленькая
Насоздавали битмапов, нативная куча кончилась, а управляемая куча почти не занята.
Сборка мусора не проходит (не видит, чего собирать-то)
Слайд 15

Пример из жизни (продолжение) Ну давайте везде звать recycle()? http://masterden.livejournal.com/50326.html []

Пример из жизни (продолжение)

Ну давайте везде звать recycle()?
http://masterden.livejournal.com/50326.html
[]
Поэтому при работе с

битмапами постоянно ставишь recycle. А вот мы и подобрались к объяснению баги, описанной в начале. Даже в доках от гугла есть пример отдачи картинки в OpenGL, где после трансфера её туда битмап "ресайклится". Ага! У меня в коде было тоже самое! Но тот самый злосчастный экран отличалcя от остальных тем, что битмапы грузил не с SD-карты, а из ресурсов прилады! А они (ресурсы) грузятся один раз на всё приложение. И, будучи поресайкленной, битмапа из ресурсов оставалась таковой до рестарта приложения
[]
Слайд 16

На самом деле все еще хуже Приколы вылезают не только при

На самом деле все еще хуже

Приколы вылезают не только при явном

освобождении памяти
Приколы могут вылезать если вы используете два разных сборщика мусора
Например:
CLR (.Net) использует mark’n’sweep
COM (legacy VB) использует reference count
Слайд 17

В чем разница? Mark’n’sweep Сборка мусора дорогая операция Зовется только от

В чем разница?

Mark’n’sweep
Сборка мусора дорогая операция
Зовется только от горя (когда память

кончилась)
Refcount
Сборка мусора происходит «сама», звать ее не надо
Никаких хуков на «что-то мы сожрали много памяти» нету
Тот же сценарий: маленькая обертка в mark’n’sweep куче вокруг большого refcount объекта
Refcount куча разрослась до хрен-знает-скольколлиона байт, а mark’n’sweep про это ни сном, ни духом
Слайд 18

Безопасность

Безопасность

Слайд 19

Dynamic SQL, говорите? Хех… Кавычка попадает в базу Legacy код на VB/ASP/Abscess берет ее из базы

Dynamic SQL, говорите?

Хех…

Кавычка попадает в базу

Legacy код на VB/ASP/Abscess берет
ее

из базы
Слайд 20

Хорошие практики Ну и что? – скажут многие Не надо знать

Хорошие практики

Ну и что? – скажут многие
Не надо знать низкоуровневые детали

и не надо знать, что может протечь
Надо знать хорошие практики, как бороться с протечками
Слайд 21

Хорошие практики не панацея Хорошая практика: нельзя совать пальцы в розетку

Хорошие практики не панацея

Хорошая практика: нельзя совать пальцы в розетку