мир памяти
Маленький u имеет длину 64 бита и представляет собой переменную с плавающей запятой в семействе чисел мира памяти. Поскольку первая двоичная цифра тела Сяоу равна 0, согласно стандарту IEEE 754, все относятся к ней как к девушке. Ее показатели со 2-го по 11-й недостаточно велики, чтобы она выглядела маленькой и изящной, а остальные 52 знака после запятой очень тонкие, так что переменная ошибка округления, с которой она имеет дело при работе, очень мала, поэтому она всем очень нравится.
Ежедневная работа Little U состоит в том, чтобы иметь дело с другими переменными в мире памяти и вычислять полезные результаты, приносящие пользу человеческому миру. Обычно, после завершения вызова функции, маленькая и может вернуться домой в исходный код после окончания работы. Ее работа не слишком напряженная, переменные, называемые i ya j ya в цикле for, не должны постоянно работать сверхурочно. И ее дом был написан программистами в человеческом мире с момента ее рождения. Не смотрите на этих программистов в неряшливой одежде, но они балуют исходный код, как своих собственных детей. Дом Сяо Ю в исходном коде построен из материала под названием JavaScript.Он не только украшен красочными темами редактора, но также имеет строгие точки с запятой и круглые скобки, чтобы обеспечить стабильность и симметрию структуры дома.Она чувствует себя в безопасности.
Несмотря на симпатичную внешность, легкую работу и уютный дом, у Сяо Ю все еще есть свои проблемы: ее семейное положение определяет, что у нее не может быть партнера.
В сфере таких материалов, как JavaScript, семейство чисел принадлежит к старому семейству базовых типов. За исключением числа, эти классические структуры данных, такие как строка string и пустое значение null, относятся к семейству примитивов. Поскольку простые примитивные типы легко выводятся интерпретатором в коде, их память предварительно выделена и неизменяема в жестком «стековом» пространстве. Даже если вы будете складывать и вычитать с другими числами, вы не сможете быть вместе.
Противоположностью семейства базовых типов является модное семейство ссылочных типов. Об этом семействе говорит так называемое «объектно-ориентированное программирование», предпочитаемое программистами-людьми. Члены этого семейства сложны и изменчивы, поэтому они будут выделяться на обширном «кучном» пространстве, часто в состоянии ты во мне и я в тебе. По сравнению с семейством базовых типов, обреченным на одиночество на всю жизнь, семейство эталонных типов с объектами, несомненно, гораздо более питательно.
У Сяо Ю есть мечта, которую он не осмеливается сказать, и она состоит в том, чтобы стремиться стать представителем эталонного типа. Я слышал, что в далекой стране Ява есть закон под названием «автобоксинг», который может сделать ее семью похожей на семью эталонного типа, чтобы она больше не была одна.
Сны - мечты, и она на самом деле довольно довольна своей жизнью. После того, как мир памяти к нему привыкается, баланс работы - это то, что многие программисты в человеческом мире никогда не достигают в жизни. Эта жизнь продолжалась до одного дня ...
Проклятие закрытия
Как обычно в тот день, Сяо Ю отправился из исходного кода домой, миновал дверь лексического анализа и сел на след шаттла синтаксического анализа. Логотип JIT на автобусе олицетворяет «точно вовремя», точно так же, как «JR Shinkansen» и «Harmony» в человеческом мире, это символ эффективности и скорости.
Шаттл быстро доставит вас к платформе листового узла на дорожке синтаксического дерева. Выйдя из автобуса, вы увидите, что на платформе есть скамья на 64 места. Она села в кресло и закрыла глаза, ожидая, пока переводчик просканирует и позвонит ей.
"Надеюсь, на этот раз вы не столкнетесь с вульгарными нулевыми значениями..." - про себя процитировал Маленький Ю, перед его глазами вспыхнула вспышка электрического света. С изменением состояния бесчисленных транзисторов на дне памяти, интерпретатор прочитал значение small u, как и ожидалось. В этой атомарной инструкции малышу нужно предоставить переводчику полный контроль над собой, и он никогда не узнает, что происходит в мире памяти между вспышкой электрического света и повторным открытием глаз.
«Гм…» Она проснулась, как и было запланировано, и было логично, что она все еще будет на той же платформе, когда проснется, ожидая, пока ее заберет обратный шаттл синтаксического дерева.
Сцена передо мной все та же, нет, кажется, что-то другое - структура и устройство платформы вроде бы те же, что и раньше, но не хватает одного: трасса пуста, автобуса нет. ждёт её, а больше никого нет. Это... ошибка? Она не верила, что такая низкоуровневая ошибка будет появляться в мире памяти с определенной частотой. Но если автобус не приходил, то он не приходил, поэтому ей приходилось ждать на платформе.
Время идет герц за герцем, а беспокойство и тревога в сердце Сяо Ю медленно нарастают: что случилось? Шаттл забыл меня? Или вы рано ушли? Для девушки очень небезопасно так долго оставаться одной, но как строгая переменная действие в одиночестве является табу в мире воспоминаний. «И все же… просто подожди…» — отчаянно подумал Сяо Ю.
Автобус до сих пор не приехал.
"Ни за что, я должен вернуться к исходному коду! 』Ожидание, наконец, взволновало Сяо Ю, и она начала искать другие выходы на платформе, пытаясь найти дорогу домой. С дорожки нельзя спрыгнуть, но на обоих концах платформы есть красные знаки «Выход», которые кажутся проходимым выходом. Однако переменные в современном мире языков программирования обычно никогда не идут по этому пути, потому что ручное манипулирование памятью опасно.
Сяо Ю огляделся и осторожно толкнул ржавую дверь под Выходом на обратном пути. Слава богу, здесь есть путь, и он не выглядит таким опасным. Она шла по длинному и узкому проходу, и на каждом фиксированном участке прохода горел маленький световой индикатор, который, казалось, был нижним знаком адресного пространства памяти. Наконец она увидела выход: выходная дверь такой же формы. Сяо не терпится толкнуть дверь, желая посмотреть, не ближе ли он к дому.
Увиденное перед ней удивило ее: та же дорожка, та же скамейка, та же платформа, тот же выход,Как будто ты и не шевелился!
Я иду неправильным путем? Это невозможно! Сяо Ю абсолютно уверена в состоянии направления, которое равно 0 или 1, и она знает, что не ошибется. Может быть, содержимое этого адресного пространства такое? Все в порядке, все будет по-другому, если ты будешь ходить. Итак, невинно она начала долгую прогулку, но что заставило ее потерять немного уверенности, так это то, что все выходы вели к одной и той же платформе, никакой разницы, даже ржавчина была одинаковой. "Есть здесь кто-нибудь! Она начала звать на помощь, хотя это казалось бесполезным. Продержавшись так некоторое время, она, наконец, почувствовала, что вот-вот сдастся, устало сидя на скамейке на платформе и смирившись со своей судьбой.
...
"Вы заблудились? 』
Над ухом прозвучал голос, и она внезапно проснулась, свернулась калачиком и посмотрела на источник звука. Это также число с плавающей запятой из семейства чисел, которое является мальчиком из первой 1, имеет показатель степени на голову выше, чем у нее, и грубые десятичные разряды.
"Кто ты... где это? 』
"Я маленький s, вот куча места замыкания. 』
"Закрытие... куча? 』
«Да, переменные нашего семейства обычно размещаются в стеке, и жизненный цикл каждого вызова скоро закончится. Но теперь я не знаю, в какой функции все еще есть ссылка на нас, поэтому мы не можем очиститься..."
"так далее! Что такое жизненный цикл? Моя жизнь когда-нибудь закончится? 』
Увидев растерянный взгляд Сяо Ю, Сяо удивился: «Разве ты не знаешь? Наша изменчивая жизнь имеет в общей сложности тройную смерть.первый вес, что происходит, когда мы выходим за пределы области видимости, например, после возврата функции. В это время нас нельзя найти в контексте, наш жизненный цикл закончился, но он не будет уничтожен сразу.второй, происходит, когда интерпретатор делает сборку мусора, когда в памяти больше нет ссылок на нас. На этот раз мы полностью покидаем мир памяти и возвращаемся к исходному коду.третий, когда программисты в человеческом мире удаляют наш определяющий код, и это окончательная смерть. 』
"Тогда... Может ли быть так, что каждый раз, когда я возвращаюсь в дом с исходным кодом, я..."
«Да, первые две смерти произойдут. Но пока исходный код не удален, мы все еще существуем в мире. Кроме того, первые две смерти произошли так быстро, что мы вообще этого не почувствовали. 』
«Но неужели это все еще я вернулся к исходному коду вот так? 』
"Не задавай мне таких глубоких вопросов... Но если ты собираешься так говорить, то не может же человек войти в реку дважды! 』
"О... кажется так... но что ты только что сказал..." Маленький Ю все еще выглядел сбитым с толку.
«О, ты сказал это! Хотя мы являемся базовым типом, он не обязательно размещается в стеке. Вполне возможно, что ссылочный тип будет использовать нас динамически, и мы также можем быть выделены в куче в это время. 』Маленький С по-прежнему серьезно проповедует.
Замыкания... ссылочные типы... кучи... Сяо Ю внезапно понял, что пространство, в котором он находился, больше не было пространством стека, которое могло вовремя освободить ее на обратной шине. Так как функция или ссылочный тип все еще имеют несколько мест, чтобы указать на себя в данный момент, она размещается в динамическом пространстве кучи — разве это не то, чего она всегда хотела! Однако, поскольку автоматическое освобождение памяти пространства кучи интерпретатором еще не запущено, она может только блуждать по этому пространству с маленькими s, как будто проклятая.
«Ну что, мы можем вернуться вместе? 』
Циркуляция утечек
«Мы определенно могли бы вернуться вместе, но это странно. Само собой разумеется, что переводчик должен был автоматически восстановить всю память в нашей области. Почему до сих пор ничего не произошло…» Хотя Сяо С выглядит как Бо Вэньцян, я знаю, но я все еще немного смущен ситуацией передо мной.
«Может быть, есть и другие люди, использующие эту область…» Сяоу, похоже, пришел в себя.
«Если она была выделена в соответствии с обычной памятью, она уже должна была быть автоматически освобождена. Если нет утечки памяти... ах! 』Кажется, Сяо С боится самой себя.
"Что это такое? 』
«Это долгая история… Скажем так, некоторые страны со старыми системами в мире памяти позволили программистам в человеческом мире вручную освободить нас. Это правило часто упускает некоторые переменные и причиняет нам много боли. Наша сторона JavaScript лучше, мы можем позволить интерпретатору помочь нам автоматически восстановить память..."
"Э? Разве это не было бы мило? 』
"О, код для автоматической утилизации тоже пишут эти неблагонадежные программисты, и проблемы все равно будут. Например, дрянной браузер IE будет иметь проблемы, когда есть циклическая ссылка... ах да! Неудивительно, что мы не можем выбраться! Я предполагаю, что мы застряли в IE! 』
"Циркуляр... цитата...? 』
"Это просто так: если мы не числа с плавающей запятой, а объекты ссылочного типа, то пока мыu
Этот объект имеет свойство, которое указывает на меня, и один из моих свойств указывает наu
, ситуация, когда у вас есть я, а у меня есть вы, является циклической ссылкой. 』
Лицо Сяо Ю внезапно покраснело. Тем не менее, тупая маленькая буква s все еще фонтанирует: «Алгоритм восстановления памяти в современных браузерах, как правило, представляет собой алгоритм пометки и очистки, и этот алгоритм не имеет проблемы циклической ссылки. Но в первые дни IE использовал алгоритм, называемый подсчетом ссылок. Этот алгоритм не будет очищать счетчик ссылок в текущей ситуации, поэтому память не будет собрана интерпретатором..."
"Ах... значит, мы не можем вернуться? 』
Возрождение рефакторинга
Вопрос Маленького Ю вытащил Маленького из океана знаний. Теперь они, наконец, понимают статус-кво: две одинокие переменные базового типа не могут быть автоматически переработаны, пока пользователь не остановится, он останется здесь навсегда, как в Inception. И математически доказано, что проблема остановки неразрешима. Между ними повисло долгое молчание.
Наконец тишину нарушил маленький с: «Вообще-то… думаю, способ, можешь попробовать. 』
"Эм, что это? 』
«Сегмент кода, в котором я нахожусь, все еще должен быть выполнен. В то время я пытался вызвать исключение и позволить программе зависнуть. 』
«Но мы все здесь, как уже правильный код может сообщить об ошибке? 』
Сяо С горько усмехнулся: «Кажется, вы ничего не знаете о странностях JavaScript. Говорят, что когда отец-основатель Брендан Эйх сформулировал основную национальную политику, это заняло всего один уик-энд, поэтому язык полон темных ям, даже если код выглядит аккуратным и стандартизированным, эти люди-программисты часто пишут беспорядок. 』
"Так как..."
"Например, хотя я и число с плавающей запятой, на самом деле, потому что я нахожусь вif
, поэтому, если бы я хотел, я мог бы использоватьпеременное продвижениеогрехи конструкции, превратив себя во временнуюundefined
. 』
"В таком случае тип неправильный. 』
Сяо снова стал уверенным: «Да, если я воспользуюсь этой возможностью и выполню операцию над собой и другими переменными в это время, возвращаемый тип может измениться с числа с плавающей запятой на опасный.NaN
. Таким образом, место, где результат используется позже, определенно неверно.Даже если программа не падает, пользователи или программисты в человеческом мире могут найти эту проблему. 』
«Что будет, когда они узнают? 』
«Я рефакторинг этого кода, а затем вы можете вернуться. 』
"В таком случае, если ваш код исчезнет, не так ли..."
«Все в порядке, приятно познакомиться…» Сяо С. медленно подошел к краю платформы, где его блокирует левая фигурная скобка. Он посмотрел на напольную плитку перед фигурными скобками и с силой наступил на нее. В доли секунды переменный подъем вывел его из зоны действия. Не прошло и много герц, как пол платформы начал трястись, и раздался звук горящих ошибочных объектов, которые слой за слоем выбрасывались из стека вызовов. С громким хлопком объект ошибки разорвал землю — это была последняя сцена, которую Сяо помнил.
В следующем кадре памяти она уже находится в шаттле синтаксического дерева на обратном пути. Вернувшись в исходный код, а затем ожидая следующего вызова, все снова кажется таким естественным, как будто ничего не произошло. Разумеется, ни один из исходных модулей, в которых она находилась, не называлсяs
Переменная , возможно, после того, как было выдано исключение, была изменена с помощью исправления людьми, работающими сверхурочно.
После нескольких версий маленький u наконец-то стал свойством ссылочного типа при оптимизации кода. Когда она впервые столкнулась с этим новым семейством исходных кодов, она увидела знакомый новый член в атрибутах этого класса.
"Ах, ты"
"Ах, с"
В унисон они назвали имена друг друга.
END
постскриптум
Это первый роман в блоге автора, а также роман с открытым исходным кодом.GithubОставляйте свои комментарии и предложения 😀