Розуміння того, як движок Chrome V8 перекладає JavaScript у машинний код

Перш ніж зануритися глибоко в основу Chrome V8, спершу давайте розберемо наші основи. Усі наші системи складаються з мікропроцесорів, того, що зараз сидить у вашому комп’ютері і дозволяє вам це читати.

Мікропроцесори - це крихітні машини, які працюють з електричними сигналами і в кінцевому рахунку виконують свою роботу. Ми даємо інструкції мікропроцесорам. Інструкції написані мовою, яку мікропроцесори можуть інтерпретувати. Різні мікропроцесори розмовляють різними мовами. Деякі з найпоширеніших - IA-32, x86–64, MIPS та ARM. Ці мови безпосередньо взаємодіють з апаратним забезпеченням, тому написаний на них код називається машинним кодом. Код, який ми пишемо на своїх комп’ютерах, перетворюється або компілюється у машинний код.

Ось так виглядає машинний код:

Він складається з інструкцій, які виконуються на певному фрагменті пам'яті у вашій системі на низькому рівні. Ви повинні почуватись щасливчиком за те, що вам не довелося писати все це для запуску вашої програми!

Мови високого рівня абстраговані від машинної мови. На рівні абстракції нижче ви можете побачити, як далеко абстрагується JavaScript від рівня машини. C / C ++ відносно набагато ближче до апаратного забезпечення і, отже, набагато швидше, ніж інші мови високого рівня.

Повернемось до движка V8: V8 - це потужний механізм Javascript з відкритим кодом, який надає Google. То що насправді являє собою Javascript Engine? Це програма, яка перетворює код Javascript на нижчий рівень або машинний код, який мікропроцесори можуть зрозуміти.

Існують різні механізми JavaScript, включаючи Rhino, JavaScriptCore та SpiderMonkey. Ці двигуни відповідають стандартам ECMAScript. ECMAScript визначає стандарт мови сценаріїв. JavaScript базується на стандартах ECMAScript. Ці стандарти визначають, як мова повинна працювати і які особливості вона повинна мати. Ви можете дізнатись більше про ECMAScript тут.

Двигун Chrome V8:

  • Механізм V8 написаний на C ++ і використовується в Chrome та Nodejs.
  • Він реалізує ECMAScript, як зазначено в ECMA-262.
  • Двигун V8 може працювати автономно, ми можемо вбудувати його за допомогою власної програми C ++.

Давайте трохи краще розберемося в останньому пункті. V8 може працювати автономно, і одночасно ми можемо додати власну реалізацію функції в C ++, щоб додати нові функції до JavaScript.

Так наприклад: print('hello world')не є дійсним оператором у Node.js. Якщо ми її скомпілюємо, це дасть помилку. Але ми можемо додати свою власну реалізацію функції друку на C ++ поверх V8, який є відкритим кодом у Github, таким чином змушуючи функцію друку працювати оригінально. Це дозволяє JavaScript зрозуміти більше, ніж те, що стандарт ECMAScript визначає, що повинен розуміти JavaScript.

Це потужна функція, оскільки C ++ має більше можливостей як мова програмування порівняно з JavaScript, оскільки набагато ближче до апаратного забезпечення, як-от робота з файлами та папками на жорсткому диску.

Дозвіл нам писати код на мові C ++ і робити його доступним для JavaScript робить це таким чином, щоб ми могли додати більше можливостей до JavaScript.

Node.js сам по собі є реалізацією C ++ механізму V8, що дозволяє програмування на сервері та мережеві програми.

Давайте тепер розглянемо деякі відкриті коди всередині движка. Для цього вам потрібно зайти в папку v8 / sample / shell.cc.

Тут ви можете побачити реалізацію різних функцій, таких як Printі Read,які в основному недоступні в Node.js.

Нижче ви можете побачити реалізацію Printфункції. Кожного разу, коли print()функція викликається в Node.js, вона створює зворотний виклик і функція буде виконана.

Подібним чином ми можемо додати власну реалізацію різних нових функцій в C ++ всередині V8, що дозволяє зрозуміти це Node.js.

Це, звичайно, занадто багато, щоб схопити для простої заяви, і це обсяг роботи, яку виконує двигун V8 під капотом.

Тепер ви повинні чітко розуміти, як працює Node.js і що насправді є двигуном Chrome V8.

Дякуємо, що прочитали цю статтю. Давайте простежимо на Twitter , Linkedin , Github , і Facebook .