суббота, 15 сентября 2012 г.

Абстракция

Краткое содержание предыдущей серии: неделю назад я утверждал, что большие системы - плохо. Система - это, в принципе, почти, хорошо. Но вот большие - они большие и противоречивые (оказывается, есть даже теорема Тарского, из которой теорема Гёделя получается как частный случай. Философски она звучит как "истинность невыразима", формально еще 4-5 формальных слов. А я, лошара, знал только другую теорему Тарского, ту которая про геометрию).

 Кодексы и законы по жизни противоречивы. В них так и пишут: "если что, смотреть в более крутом кодексе". Меня потряс тот пример (не знаю сколько там процентов лжи и правды), что законодательство в области иммиграции в Англии полу-формализовали на Прологе и понаходили дырок.

С большими системами борются самой же системой. Смотреть "Итальянская забастовка".

Другой пример, который мне рассказали, про религию. Арабы, которые шахиды в Израиле, часто делали свои плохие дела в различных магазинчиках/кофешках. Врываются они в замкнутое пространство и с криком "Кто ел из моей миски" делают, даже можно сказать, мокрое дело. А евреи те еще, они ж прочитали, что арабы и свиньи вообще не совместимы (одним религия запрещает есть других). Оказывается, что если повесить шкурку животного у себя в магазинчике при входе, то правильный араб не имеет право там взрываться, ибо если части мяса араба попадут на вышеупомянутую шкурку животного, то араб не попадет в свой рай с 40 девственницами. Не знаю, есть ли у них ад, но попадет (или вообще не попадет) не туда. Короткий анекдот "возвращается как-то камикадзе с успешно выполненного задания" был раньше, не знаю источника.

Собственно, если система большая и непонятная, то борются с этим абстракцией. Абстракция - это когда проводят черту и говорят: "как-то работает". Можно сказать, что разбиение на подсистемы, но дальнейшее нас малоинтересует. Алгеброиды, физики и ООП-шники может и называют это по-разному, но суть одна. Программисты могут использовать слово "интерфейс", но лучше "контракт". То есть мы знаем что получается, но как именно - нет.

Открываете холодильник, а там свет. Вы задумывались об этом? Думаю, и не стоит.

Предположим, что вы - "полу"-программист. То есть понимаете на высоком уровне, что происходит, если в языке высокого уровня написать i = i + 1. Внутри там все довольно не просто, на книжку хватит.

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

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

Далее нужно загрузить значение, прибавить 1, записать в память. Обращение в память, если страница у вас в кеше процессора, то все замечательно. Иначе, лучше бы вы этого не знали. Скорее всего, у процессора более одного кеша. Начинается раскрутка, можно дойти вплоть до свопа на диске. Тут самый ад, там еще и всякие прерывания будут. То, что у каждого процесса своя виртуальная адресация - семечки. Некоторые куски памяти "напрямую" отображаются на реальные физические устройства. А когда у вас несколько ядер на процессоре, они ж чуть ли не отдельным проводком на шине как-то говорят друг другу, что данные в кеше этих страниц хранить не надо, а брать каждый раз с памяти.

В общем, там ну очень много всего происходит. i = i + 1. Это у математиков просто прибавление единицы. А переполнение?  В многопоточном коде, если это синхранизацией не обернуто, может все что угодно произойти. А еще я ни слова не сказал, откуда мы получили код выполнения, про сегментацию памяти по областям, и кучу всего и я сам не знаю.

А так хорошая абстракция, после выполнения строки i = i + 1 у нас что-то увеличится на единицу. Скорее всего. Абстракция и нужна, чтобы скрыть весь этот ужас.

У всяких математиков/физиков/химиков/биологов примерно так же.

То есть есть какой-то суммарно очень большой УЖАС. Специалисты проводят и отсекают какие-то куски, проставляя там абстракции. Хочешь копать - копай, вскроешь все на этом уровне - уткнешься в новые абстракции. Можешь своих нагенерить.

Ладно, пойду я, салат доем. Открою холодильник и не буду задумываться, как же там свет появляется.

Четыре ноги - хорошо, две ноги - плохо. Абстракция - хорошо, большие системы - плохо.