пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ
Слишком длинный поисковый запрос.
По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие
наши статьи:
Поговорим сегодня про Cisco SVI – Switch VLAN Interface и о том, как его настроить. Для начала вспомним основы – для связи между оконечными устройствами в локальной сети (LAN) требуется коммутаторы, а для связи между различными локальными сетями требуется маршрутизатор.
VLAN 2 уровня также создает новый широковещательный домен, то есть если отправить бродкаст в этой подсети – все устройства, подключенные к этому VLAN’у получат его (не важно, к какому или каким коммутаторам они подключены). Причем все устройства в этом VLAN’е могут общаться между собой без какого-либо устройства 3 уровня. Однако, если требуется связаться с другим VLAN’ом, то будет необходима маршрутизация в том или ином виде.
Для сегментации и связи между VLAN’ами необходим либо маршрутизатор, либо коммутатор 3 уровня. Если мы используем роутер для сегментации, то это означает, что каждый интерфейс на маршрутизаторе являет собой отдельный широковещательный домен, то есть отдельный сегмент.
В случае использования коммутатора 3 уровня, мы предварительно создаем несколько обычных VLAN’ов на коммутаторе, то есть несколько широковещательных доменов. Затем для каждого VLAN’а необходимо создать соответствующий интерфейс на коммутаторе, который будет отвечать за маршрутизацию. Этот интерфейс и есть SVI.
Таким образом, порядок действий следующий – создается обычный VLAN, и затем назначается сетевой адрес на этом VLAN’е. Главная особенность в том, что SVI – виртуальный интерфейс, то есть все клиенты в данном VLAN’е будут использовать SVI как шлюз по умолчанию. По умолчанию, SVI создан на свитчах Cisco 3 уровня на VLAN 1 для целей управления устройством.
Настройка
Итак, схема ниже:
А теперь мы покажем пример настройки двух SVI на коммутаторе 3 уровня, в соответствии со схемой выше. Сначала – VLAN 10:
MERION-SW(config)#vlan 10
MERION-SW(config)#interface vlan 10
MERION-SW(config-if)#description WORKSTATIONS
MERION-SW(config-if)#ip address 10.0.0.1 255.255.255.0
Мы создали VLAN, назначили сетевой адрес и поставили описание. Теперь повторим тоже самое для VLAN 20:
MERION-SW(config)#vlan 20
MERION-SW(config)#interface vlan 20
MERION-SW(config-if)#description SERVERS
MERION-SW(config-if)#ip address 10.0.1.1 255.255.255.0
Еще раз – зачем это все нужно?
Вы спросите, зачем это нужно и почему бы не использовать вариант с физическими интерфейсами маршрутизатора или «роутер-на-палке» (router on a stick)? Использовать SVI проще и чаще всего дешевле – банально поэтому.
Кроме того, использование SVI на коммутаторе 3 уровня также является более эффективным с точки зрения сходимости и управления – так как весь функционал 2 и 3 уровня управляется на одном коммутаторе 3 уровня.
Сегодня мы посмотрим на движок JavaScript V8 с точки зрения внутреннего устройства и разберемся, как именно выполняются программы JavaScript.
Справка
Сетевые стандарты – это набор правил, которые реализует браузер. Они определяют и описывают составляющие Всемирной паутины.
W3C – это международное сообщество, которое занимается разработкой открытых стандартов для Интернета. Они следят за тем, чтобы все придерживались одних и тех же рекомендаций, вследствие чего пропадет необходимость поддерживать десятки совершенно разных сред.
Современный браузер – это достаточно мудрёное программное обеспечение с кодовой базой, которая состоит из десятка миллионов строк кода. И потому его, как правило, разбивают на несколько модулей, каждый из которых отвечает за разную логику.
Две самых важных части браузера – это движок JavaScript и механизм визуализации.
Blink - это механизм визуализации, который отвечает за весь конвейер визуализации, в том числе DOM-деревья, стили, события, интеграцию с V8. Он анализирует DOM-дерево, задает стили и определяет наглядную геометрию всех элементов.
Blink расцвечивает содержимое на вашем экране, постоянно отслеживая динамические изменения при помощи кадров анимации. Движок JS – это большая часть браузера, но мы еще эту тему не разбирали.
Движок JavaScript 101
Движок JavaScript выполняет и компилирует код JavaScript в собственный машинный код. У каждого крупного браузера есть свой собственный разработанный движок JS: Google Chrome использует V8, Safari – JavaScriptCore, а Firefox – SpiderMonkey.
Мы будем работать исключительно с V8, так как он используется в Node.js и Electron, но при этом нужно понимать, что другие движки построены аналогично.
На каждом этапе будет присутствовать ссылка на код, ответственный за этот конкретный этап, чтобы у вас была возможность ознакомиться с кодовой базой и продолжить работу за рамками данной статьи.
Мы будем работать с зеркалом (зеркальным сервером) V8 на GitHub. Оно предоставляет удобный и хорошо знакомый пользовательский интерфейс для навигации по кодовой базе.
Подготовка исходного кода
Для начала V8 должен загрузить исходный код. Это можно сделать через сеть, из кэша или в этом вам может помочь квалифицированный работник.
После того, как вы получите код, нам необходимо изменить его так, чтобы его смог понять компилятор. Этот процесс называется синтаксическим анализом. В нем участвуют два компонента: сканер и сам синтаксический анализатор.
Сканер берет файл JS и конвертирует его в список известных токенов. Список всех токенов JS есть в файле
keywords.txt
.
Синтаксический анализатор берет этот список и формирует дерево абстрактного синтаксического анализа (AST – Abstract Syntax Tree). AST – это древовидное представление исходного кода. Каждый узел дерева – это конструкция, которая встречается в коде.
Давайте посмотрим на простой пример:
function foo() {
let bar = 1;
return bar;
}
Этот код образует следующее дерево:
Пример AST-дерева
Вы можете выполнить этот код, выполнив обход дерева в ширину (корень, левая ветка, правая ветка):
Определите функцию
foo
.
Объявите переменную
bar
.
Присвойте значение
1
переменной
bar
.
Верните переменную
bar
как результат работы функции.
Вы также увидите
VariableProxy
. Это элемент, который связывает абстрактную переменную с местом в памяти. Процесс разрешения
VariableProxy
называется анализом области видимости переменных.
В нашем примере в качестве результата мы получим все
VariableProxy
, которые указывают на одну и ту же переменную
bar
.
JIT-парадигма
Согласно общим правилам, для того, чтобы выполнить код, язык программирования нужно преобразовать в машинный код. Есть несколько способов, как это можно сделать.
Самый распространённый способ преобразования кода – это компиляция перед выполнением. Работает это так же, как и звучит: код преобразуется в машинный непосредственно перед выполнением программы на этапе компиляции.
Такой подход используют многие языки программирования, например, C++, Java и другие.
С другой стороны, у нас есть интерпретирование: каждая строка кода выполняется непосредственно по время выполнения программы. Такой подход, как правило, используют языки с динамической типизацией, например, JavaScript и Python, так как до выполнения точный тип данных неизвестен.
Так как компиляция перед выполнением позволяет оценить весь код сразу, она может обеспечить лучшую оптимизацию, а, соответственно, и получить более производительный код. Но при этом интерпретирование проще с точки зрения реализации, но, как правило, медленнее, чем вариант с компиляцией.
Для того, чтобы быстрее и эффективнее преобразовывать код, написанный на динамических языках программирования, был разработан новый подход, который называется JIT-компиляцией (Just-In-Time-компиляция – компиляция «на лету»). Этот подход сочетает в себе лучшие качества интерпретирования и компиляции.
V8 можнет использовать интерпретирование в качестве основного метода и находить функции, которые используются чаще, чем остальные, и компилировать их, используя информацию о типах из предыдущих запусков программы.
Однако существует вероятность того, что тип изменится. Вместе с тем, нам нужно деоптимизировать скомпилированный код и повторно запустить интерпретирование (после этого, когда мы получим обратную связь нового типа, мы можем снова скомпилировать функцию).
Давайте изучим каждую составляющую JIT-компиляции подробнее.
Интерпретатор
V8 использует интерпретатор, который называется Ignition. Прежде всего он берет дерево абстрактного синтаксического анализа и генерирует байт-код.
У команд байт-кода также есть метаданные, такие как позиции исходной строки для дальнейшей отладки. Как правило, команды байт-кода согласуются с абстракциями JS.
А теперь возьмем наш пример и сгенерируем байт-код для него вручную:
LdaSmi #1 // write 1 to accumulator {записывает 1 в аккумулятор}
Star r0 // read to r0 (bar) from accumulator {считывает (bar) в r0 из аккумулятора}
Ldar r0 // write from r0 (bar) to accumulator {записывает (bar) из r0 в аккумулятор}
Return // returns accumulator (возвращает аккумулятор)
В Ignition есть нечто, что называется аккумулятором – место, где вы можете хранить или откуда вы можете считывать значения.
Аккумулятор позволяет избежать ситуаций, когда необходимо добавлять и вытаскивать вершину стека. Он также является неявно определенным аргументом для многих байт-кодов и, как правило, хранит результат операции. Return неявно возвращает аккумулятор.
Весь доступный байт-код вы можете извлечь
из соответствующего исходного кода
.
Выполнение
После того, как будет сгенерирован байт-код, Ignition будет интерпретировать команды с помощью таблицы обработчиков с доступом по ключу в виде байт-кода. Для каждого байт-кода Ignition может найти соответствующие функции-обработчики и выполнить их с предлагаемыми аргументами.
Как уже упоминалось ранее, этап выполнения также предоставляет обратную связь типа кода. Давайте разберемся, как это все получается и как этим управлять.
Для начала, обсудим, как объекты JavaScript могу быть представлены в памяти. При самом простом подходе мы можем создать словарь для каждого объекта и связать его с памятью.
Первый подход к хранению объектов
Однако, как правило, есть много объектов с одинаковой структурой, поэтому хранить большое количество одинаковых словарей будет неэффективно.
Для того, чтобы избежать таких ситуаций, V8 отделяет структуру объекта от самих значений с помощью форм объектов (Map) и вектора значений в памяти.
Например, мы создаем объектный литерал:
let c = { x: 3 }
let d = { x: 5 }
c.y = 4
В первой строке он создаст форму
Map[c]
, которая имеет свойство
x
со смещением 0.
Во второй строке V8 будет повторно использовать ту же форму для новой переменной.
После третьей строки он создаст новую форму
Map[c1]
, у которой будет свойство
y
со смещением 1, а также ссылку на предыдущую форму
Map[c]
.
Пример форм объектов
В приведенном выше примере каждый объект может иметь ссылку на форму объекта, где для каждого свойства V8 может найти смещение для значения, хранящегося в памяти.
Формы объектов – это, по сути, связные списки. То есть, если вы напишите
c.x
, то V8 перейдет в начало списка, найдет там
y
, перейдет к связанной форме и, наконец, получит
x
и считает из него смещение. После чего он перейдет к вектору памяти и вернет из него первый элемент.
Как вы уже могли понять, в большом веб-приложении будет огромное количество таких связных форм. И при этом на выполнение поиска по связному списку затрачивается линейное время, что делает поиск свойств достаточно затратной операцией.
Для того, чтобы решить данную проблему в V8, вы можете использовать встроенный кэш (IC – Inline Cache). В нем сохраняется информация о том, где можно найти свойства объектов. Таким образом, количество поисков сокращается.
Вы можете представить, что это некое прослушивающее устройство в вашем коде: он отслеживает все события CALL, STORE и LOAD внутри функции и записывает все проходящие через нее формы.
Структура данных, которая используется для хранения IC, называется вектором обратной связи. Это просто массив, в котором хранятся все IC функции.
function load(a) {
return a.key;
}
Для функции выше вектор обратной связи будет выглядеть следующим образом:
[{ slot: 0, icType: LOAD, value: UNINIT }]
Это простая функция, у которой есть только один IC, который имеет тип LOAD и значение
UNINIT
. Это значит, что он не был инициализирован, и мы не знаем, что будет происходить дальше.
Давайте вызовем эту функцию, передав ей другие аргументы, и посмотрим, как изменится встроенный кэш.
let first = { key: 'first' } // shape A {форма А}
let fast = { key: 'fast' } // the same shape A {та же форма А}
let slow = { foo: 'slow' } // new shape B {новая форма В}
load(first)
load(fast)
load(slow)
После первого вызова функции
load
наш встроенный кэш получит обновленное значение:
[{ slot: 0, icType: LOAD, value: MONO(A) }]
Теперь это значение стало мономорфным, а это значит, то кэш разрешается только в форму А.
После второго вызова V8 проверит значение IC и увидит, что оно мономорфно и имеет ту же форму, что и переменная
fast
. В связи с чем, он тут же вернет смещение и разрешит его.
При третьем вызове форма будет отличаться от сохраненной. Поэтому V8 вручную разрешит его и обновит значение до «полиморфный» с помощью массива из двух возможных форм.
[{ slot: 0, icType: LOAD, value: POLY[A,B] }]
Теперь при каждом вызове этой функции V8 должен проверять не одну форму, а перебрать несколько вариантов.
Для того, чтобы ускорить ваш код, вы можете инициализировать объекты одинаковыми типами и не слишком усердствовать, меняя их структуру.
Примечание: возьмите это на заметку, но если это может привести к дублированию кода или если ваш код станет менее выразительным, то не делайте этого.
Встроенные кэши также отслеживают то, как часто они вызываются, чтобы понять, хорошо ли Turbofan справляется с оптимизацией компилятора.
Компилятор
Ignition помогает только до определенного времени. Если функция становится достаточно медленной, то она оптимизируется в компиляторе Turbofan.
Turbofan берет байт-код из Ignition и обратную связь типа (вектор обратной связи) функции, применяет набор преобразований на его основе и выдает машинный код.
И как мы уже видели до этого, обратная связь типа не всегда гарантирует, что функция останется неизменной.
Например, код, который был оптимизирован с помощью Turbofan, основан на том предположении, что некоторая операция сложения всегда прибавляет целые числа.
Но что будет, если функция получит строку? Этот процесс называется деоптимизацией. Мы отбрасываем оптимизированный код, возвращаемся к интерпретируемому, возобновляем выполнение и обновляем обратную связь типа.
Подведем итог
В этой статье мы рассмотрели реализацию движка JS и четкие этапы выполнения кода на JavaScript.
Подведем итог и взглянем на процесс компиляции, так сказать, сверху.
Общая схема V8
Рассмотрим процесс шаг за шагом:
Все начинается с того, что мы получаем код JavaScript из сети.
V8 анализирует код с точки зрения синтаксиса и превращает его в дерево абстрактного синтаксического анализа (AST).
Беря за основу это дерево AST, интерпретатор Ignition может приступить к своей работе и начать формировать байт-код.
На этом этапе движок запускает код и собирает обратную связь типов.
Чтобы ускорить работу, байт-код можно отправить оптимизирующему компилятору вместе с данными обратной связи. Оптимизирующий компилятор создает на его основе некие предположения, после чего выдает высокооптимизированный машинный код.
Если в какой-то момент оказывается, что одно из предположений неверно, то оптимизирующий компилятор деоптимизирует код и возвращается к интерпретатору.
Смотря какой fabric смотря сколько details — разбираемся насколько сильно нужен английский айтишнику, для чего стоит его учить и какие преимущества дает знание языка.
Английский язык уже давно утвердился как неотъемлемая часть IT-индустрии. Он поможет построить карьеру в иностранной компании, изучить первоисточники, разобраться в терминах, получить доступ к самым свежим исследованиям или участвовать в мировых IT-событиях.
Преимущества знания английского языка в ИТ
Доступ к актуальным знаниям. Большинство современных исследований, технической документации, учебных материалов и курсов в области информационных технологий написаны на английском языке. Знание языка позволяет быть в курсе последних тенденций и актуальных новостей.
Возможности для карьерного роста. Многие ведущие технологические компании и стартапы работают в международном контексте и требуют знания английского языка для общения с командой, клиентами и партнерами по всему миру.
Участие в международных проектах. Английский язык открывает двери для работы над глобальными проектами и сотрудничества с международными командами. Это обогащает опыт и расширяет профессиональные горизонты.
Работа в зарубежной компании. Знание английского языка значительно увеличивает шансы на трудоустройство в иностранные компании или получение предложений о работе за рубежом. Как дополнительная опция — можно запустить свой международный стартап и привлекать коллег с разных уголков мира.
Улучшение коммуникативных навыков. Владение английским языком улучшает общение в профессиональной среде, помогает эффективнее работать в команде и участвовать без затруднений в обсуждении.
Доступ к международным конференциям и семинарам. Английский язык позволяет посещать международные конференции, семинары и воркшопы, где можно обменяться опытом с экспертами индустрии.
Развитие софт скиллс. Изучение иностранного языка стимулирует когнитивные функции, улучшает память и способствует развитию критического мышления.
Создание профессионального портфолио. Владение английским языком позволяет публиковать статьи, разработки и проекты на международных платформах, тем самым формируя авторитетное портфолио.
Культурное обогащение. С навыками английского языка вы сможете лучше понять культуру разных стран, что полезно не только в профессиональной, но и в личной жизни.
IT-специалистам необходим технический английский, который включает в себя несколько ключевых аспектов:
Чтение технической документации и литературы. Это важный навык, потому что в своей работе вы наверняка столкнетесь с тематической литературой, которую надо понять и проанализировать. Вас ждут: технические статьи, руководства, спецификации, API-документация и книги по программированию и IT.
Коммуникация в команде. В международных командах вся коммуникация проходит на английском языке. Это включает обсуждение технических задач, участие в митингах и написание отчетов и писем.
Написание кода и комментариев. Часто код пишется с использованием англоязычных идентификаторов и комментариев.
Поиск информации и решение проблем. Чтобы решить задачу, вам придется искать ответы, читать форумы (например, Stack Overflow), блоги и другие ресурсы. Как правило, они ведутся на английском языке, а еще в англоязычных источниках больше информации про нетипичные ошибки и трудные ситуации.
Прохождение интервью и профессиональное развитие. Если вы стремитесь попасть в международный проект, вам не избежать собеседования. Для него важно уметь проходить технические интервью на английском языке, писать резюме и сопроводительные письма. Профессиональное развитие включает участие в конференциях, воркшопах и курсах повышения квалификации, которые часто проводятся на английском языке.
Как учить английский, если совсем нет времени
Для начала вам следует определиться, зачем вам нужен английский язык: для чтения технической документации, общения с коллегами, участия в международных проектах или для переезда в англоязычную страну. Это поможет сосредоточить усилия на наиболее важных аспектах.
Важный шаг для тех, кто пытается вписать изучение языка в плотный график — привычка искать нужную информацию на английском. Если пока сложно понимать оригинальные тексты, можно обратиться к специальным программам — установите расширение Яндекс- или Google-переводчика, чтобы не переключаться между вкладками. Можем посоветовать несколько плагинов, которые переводят слова в зависимости от контекста, формируют карточки для тренировки, проводят тесты и позволяют сформировать свой личный словарик по уровню и целям. Это расширения:
Rememberry
,
Toucan
или
Fluent
. Для перевода текста хорошо подойдет
DeepL Translate
, работающий на базе ИИ-редактора. Помните, что просто запоминать слова недостаточно — нужно использовать их в реальном общении при любой возможности. Это поможет быстрее их запомнить.
Важную роль в изучении языка играет общение. Присоединяйтесь к международным IT-сообществам и форумам, таким как
Stack Overflow
,
GitHub
,
Reddit
. Участие в обсуждениях поможет не только улучшить языковые навыки, расширить словарный запас, но и вникнуть в контекст.
Если вы смотрите много видео, включите функцию перевода на YouTube или воспользуйтесь функцией нейроперевода видео. Окружите себя англоязычным контентом – так вы будете в центре актуальных новостей мира IT. Для восприятия информации на слух полезно слушать подкасты в оригинале, даже если на замедленной скорости.
Где еще можно учить английский язык
Для IT-специалистов существует много полезных ресурсов. Часть из них мы уже упоминали выше, теперь поделимся другими способами прокачать свои навыки.
Интенсивные курсы и языковые школы. Если у вас есть возможность, посещайте курсы английского языка или занимайтесь с репетитором, особенно если вам нужен быстрый прогресс.
Приложения для общения:
- Tandem и HelloTalk позволяют найти партнеров для языкового обмена. Здесь вы можете практиковать английский с носителями языка.
- Duolingo и Memrise — популярные приложения для изучения языка в игровой форме. Вы не пропустите уведомление от зеленой совы.
Подкасты про технологии
. Такой вариант подойдет для тех, кто может слушать и понимать подкасты в оригинале, а вот новичку скорее всего будет сложно разобраться.
Книги и учебники на английском. Здесь все зависит от вашего уровня владения английским. Несомненно, это сложно и займет больше времени, чем если бы вы читали текст на привычном языке.
Технические блоги и новостные сайты.
TechCrunch
- один из ведущих сайтов, посвященных высоким технологиям и стартапам. Публикует новости, анализы и обзоры новых продуктов и технологий.
GitHub Blog
- блог платформы GitHub, на котором собраны новости и практики разработки программного обеспечения.
Wired
- журнал и веб-сайт, занимающийся исследованием, как технологии влияют на культуру, экономику и политику.
Ars Technica
- сайт для IT-профессионалов и энтузиастов, предлагающий глубокие аналитические статьи и новости в сфере технологий.
Собрали все в один курс
Если вы поняли, что для работы в IT вам необходим английский язык — мы собрали для вас все самое полезное в
наш курс
. Здесь необходимая лексика и фразы для работы в программах и для коммуникации с командой. Статьи и материалы, которые необходимо прочитать, чтобы быть в курсе.
