Краткое содержание предыдущей серии: неделю назад я утверждал, что большие системы - плохо. Система - это, в принципе, почти, хорошо. Но вот большие - они большие и противоречивые (оказывается, есть даже теорема Тарского, из которой теорема Гёделя получается как частный случай. Философски она звучит как "истинность невыразима", формально еще 4-5 формальных слов. А я, лошара, знал только другую теорему Тарского, ту которая про геометрию).
Кодексы и законы по жизни противоречивы. В них так и пишут: "если что, смотреть в более крутом кодексе". Меня потряс тот пример (не знаю сколько там процентов лжи и правды), что законодательство в области иммиграции в Англии полу-формализовали на Прологе и понаходили дырок.
С большими системами борются самой же системой. Смотреть "Итальянская забастовка".
Другой пример, который мне рассказали, про религию. Арабы, которые шахиды в Израиле, часто делали свои плохие дела в различных магазинчиках/кофешках. Врываются они в замкнутое пространство ис криком "Кто ел из моей миски" делают, даже можно сказать, мокрое дело. А евреи те еще, они ж прочитали, что арабы и свиньи вообще не совместимы (одним религия запрещает есть других). Оказывается, что если повесить шкурку животного у себя в магазинчике при входе, то правильный араб не имеет право там взрываться, ибо если части мяса араба попадут на вышеупомянутую шкурку животного, то араб не попадет в свой рай с 40 девственницами. Не знаю, есть ли у них ад, но попадет (или вообще не попадет) не туда. Короткий анекдот "возвращается как-то камикадзе с успешно выполненного задания" был раньше, не знаю источника.
Собственно, если система большая и непонятная, то борются с этим абстракцией. Абстракция - это когда проводят черту и говорят: "как-то работает". Можно сказать, что разбиение на подсистемы, но дальнейшее нас малоинтересует. Алгеброиды, физики и ООП-шники может и называют это по-разному, но суть одна. Программисты могут использовать слово "интерфейс", но лучше "контракт". То есть мы знаем что получается, но как именно - нет.
Открываете холодильник, а там свет. Вы задумывались об этом? Думаю, и не стоит.
Предположим, что вы - "полу"-программист. То есть понимаете на высоком уровне, что происходит, если в языке высокого уровня написать i = i + 1. Внутри там все довольно не просто, на книжку хватит.
Попробую в двух словах, как я это все вижу. Подразумевается, что у нас компилируемый код, без всяких интерпретаторов. И компилятор в рамках оптимизации это не прибил. Далее есть такие штуки, где ж это все в памяти у нас лежать будет. Скорее всего стек, но если добавить (в С-шном коде) несколько магических значков, то может лежать и в хипе.
На момент исполнения этой строчки кода мы (он, компьютер) уже знает адрес, что-где-зачем лежит. Если в стеке, то нужно понять в каком именно. Да, у каждого потока он свой, а в некоторых операционных системах их еще два (пользовательский и ядра, на случай безопасности). Если в хипе, то как-то адрес мы уже получили (и будет надеяться, что память пока не освободили). В реальности это или несколько сложнее, или несколько проще. То есть какой-то магией мы получили адрес.
Далее нужно загрузить значение, прибавить 1, записать в память. Обращение в память, если страница у вас в кеше процессора, то все замечательно. Иначе, лучше бы вы этого не знали. Скорее всего, у процессора более одного кеша. Начинается раскрутка, можно дойти вплоть до свопа на диске. Тут самый ад, там еще и всякие прерывания будут. То, что у каждого процесса своя виртуальная адресация - семечки. Некоторые куски памяти "напрямую" отображаются на реальные физические устройства. А когда у вас несколько ядер на процессоре, они ж чуть ли не отдельным проводком на шине как-то говорят друг другу, что данные в кеше этих страниц хранить не надо, а брать каждый раз с памяти.
В общем, там ну очень много всего происходит. i = i + 1. Это у математиков просто прибавление единицы. А переполнение? В многопоточном коде, если это синхранизацией не обернуто, может все что угодно произойти. А еще я ни слова не сказал, откуда мы получили код выполнения, про сегментацию памяти по областям, и кучу всего и я сам не знаю.
А так хорошая абстракция, после выполнения строки i = i + 1 у нас что-то увеличится на единицу. Скорее всего. Абстракция и нужна, чтобы скрыть весь этот ужас.
У всяких математиков/физиков/химиков/биологов примерно так же.
То есть есть какой-то суммарно очень большой УЖАС. Специалисты проводят и отсекают какие-то куски, проставляя там абстракции. Хочешь копать - копай, вскроешь все на этом уровне - уткнешься в новые абстракции. Можешь своих нагенерить.
Ладно, пойду я, салат доем. Открою холодильник и не буду задумываться, как же там свет появляется.
Четыре ноги - хорошо, две ноги - плохо. Абстракция - хорошо, большие системы - плохо.
Кодексы и законы по жизни противоречивы. В них так и пишут: "если что, смотреть в более крутом кодексе". Меня потряс тот пример (не знаю сколько там процентов лжи и правды), что законодательство в области иммиграции в Англии полу-формализовали на Прологе и понаходили дырок.
С большими системами борются самой же системой. Смотреть "Итальянская забастовка".
Другой пример, который мне рассказали, про религию. Арабы, которые шахиды в Израиле, часто делали свои плохие дела в различных магазинчиках/кофешках. Врываются они в замкнутое пространство и
Собственно, если система большая и непонятная, то борются с этим абстракцией. Абстракция - это когда проводят черту и говорят: "как-то работает". Можно сказать, что разбиение на подсистемы, но дальнейшее нас малоинтересует. Алгеброиды, физики и ООП-шники может и называют это по-разному, но суть одна. Программисты могут использовать слово "интерфейс", но лучше "контракт". То есть мы знаем что получается, но как именно - нет.
Открываете холодильник, а там свет. Вы задумывались об этом? Думаю, и не стоит.
Предположим, что вы - "полу"-программист. То есть понимаете на высоком уровне, что происходит, если в языке высокого уровня написать i = i + 1. Внутри там все довольно не просто, на книжку хватит.
Попробую в двух словах, как я это все вижу. Подразумевается, что у нас компилируемый код, без всяких интерпретаторов. И компилятор в рамках оптимизации это не прибил. Далее есть такие штуки, где ж это все в памяти у нас лежать будет. Скорее всего стек, но если добавить (в С-шном коде) несколько магических значков, то может лежать и в хипе.
На момент исполнения этой строчки кода мы (он, компьютер) уже знает адрес, что-где-зачем лежит. Если в стеке, то нужно понять в каком именно. Да, у каждого потока он свой, а в некоторых операционных системах их еще два (пользовательский и ядра, на случай безопасности). Если в хипе, то как-то адрес мы уже получили (и будет надеяться, что память пока не освободили). В реальности это или несколько сложнее, или несколько проще. То есть какой-то магией мы получили адрес.
Далее нужно загрузить значение, прибавить 1, записать в память. Обращение в память, если страница у вас в кеше процессора, то все замечательно. Иначе, лучше бы вы этого не знали. Скорее всего, у процессора более одного кеша. Начинается раскрутка, можно дойти вплоть до свопа на диске. Тут самый ад, там еще и всякие прерывания будут. То, что у каждого процесса своя виртуальная адресация - семечки. Некоторые куски памяти "напрямую" отображаются на реальные физические устройства. А когда у вас несколько ядер на процессоре, они ж чуть ли не отдельным проводком на шине как-то говорят друг другу, что данные в кеше этих страниц хранить не надо, а брать каждый раз с памяти.
В общем, там ну очень много всего происходит. i = i + 1. Это у математиков просто прибавление единицы. А переполнение? В многопоточном коде, если это синхранизацией не обернуто, может все что угодно произойти. А еще я ни слова не сказал, откуда мы получили код выполнения, про сегментацию памяти по областям, и кучу всего и я сам не знаю.
А так хорошая абстракция, после выполнения строки i = i + 1 у нас что-то увеличится на единицу. Скорее всего. Абстракция и нужна, чтобы скрыть весь этот ужас.
У всяких математиков/физиков/химиков/биологов примерно так же.
То есть есть какой-то суммарно очень большой УЖАС. Специалисты проводят и отсекают какие-то куски, проставляя там абстракции. Хочешь копать - копай, вскроешь все на этом уровне - уткнешься в новые абстракции. Можешь своих нагенерить.
Ладно, пойду я, салат доем. Открою холодильник и не буду задумываться, как же там свет появляется.
2 комментария:
Во-первых, 39 девственниц, если мне память не изменяет. Во-вторых, до ООП, не говорили об уровнях абстракций, это называлось компрессия, просто рисовался "квадратик" (в блок-схеме или алгоритме), а потом в другом месте рисовалось содержимое этого "квадратика".
1) поиск таки больше говорит, что их 40. А про свиную шкуру - это правда и широко распространено? Для меня это не более чем "байка", а вам - географически близко...
2) Интерфейсы и абстракции были всегда и везде и до компьютеров.
Говорят, что в СССР размеры (диаметры) банок тушенки и сгущенного молока совпадали с размером танковых и пушечных снарядов. Абстрактная фабрика.
Отправить комментарий