نظرة عامة على وقت تشغيل V8

في "برمجة تطبيقات Google" وJavaScript، يتضمّن وقت التشغيل أو بيئة وقت التشغيل محرّك JavaScript الذي يحلّل رمز النص البرمجي وينفّذه. يوفر وقت التشغيل قواعد حول كيفية الوصول إلى الذاكرة، وكيفية تفاعل البرنامج مع نظام تشغيل الكمبيوتر، وبنية البرنامج القانونية. يشتمل كل متصفح ويب على بيئة تشغيل لـ JavaScript.

في السابق، كانت "برمجة التطبيقات" مدعومة من مترجم Rhino لJavaScript من Mozilla. على الرغم من أنّ Rhino وفّر طريقة ملائمة لبرمجة التطبيقات لتنفيذ نصوص برمجية للمطوّرين، فإنّها ربطت أيضًا "برمجة التطبيقات" بإصدار JavaScript محدّد (ES5). لا يمكن لمطوّري "برمجة تطبيقات Google" استخدام بنية JavaScript وميزات أكثر حداثة في النصوص البرمجية التي تستخدم وقت تشغيل Rhino.

لحلّ هذه المشكلة، أصبحت "برمجة التطبيقات" متوافقة الآن مع بيئة تشغيل V8 التي تشغّل Chrome وNode.js. يمكنك نقل النصوص البرمجية الحالية إلى V8 للاستفادة من بنية JavaScript الحديثة وميزاتها.

تصف هذه الصفحة الميزات الجديدة التي يفعّلها المحرِّك V8 وكيفية تفعيل V8 للاستخدام في النصوص البرمجية. نقل النصوص البرمجية إلى V8 يصف خطوات نقل بيانات النصوص البرمجية الحالية لاستخدام بيئة التشغيل V8.

ميزات بيئة تشغيل V8

يمكن للبرامج النصية التي تستخدم وقت تشغيل V8 الاستفادة من الميزات التالية:

بنية ECMAScript الحديثة

يمكنك استخدام البنية الحديثة لـ ECMAScript في النصوص البرمجية التي يدعمها وقت التشغيل V8. تتضمن هذه البنية كلاً من let وconst والعديد من الميزات الرائجة الأخرى.

يمكنك الاطّلاع على أمثلة على بنية V8 للحصول على قائمة مختصرة بالتحسينات الشائعة للبنية التي يمكنك إجراؤها باستخدام بيئة تشغيل V8.

رصد محسّن للوظائف

تم تحسين اكتشاف وظيفة "برمجة تطبيقات Google" للنصوص البرمجية التي تستخدم V8. تتعرّف بيئة التشغيل الجديدة على تنسيقات تعريف الدوال التالية:

      function normalFunction() {}
      async function asyncFunction() {}
      function* generatorFunction() {}

      var varFunction = function() {}
      let letFunction = function() {}
      const constFunction = function() {}

      var namedVarFunction = function alternateNameVarFunction() {}
      let namedLetFunction = function alternateNameLetFunction() {}
      const namedConstFunction = function alternateNameConstFunction() {}

      var varAsyncFunction = async function() {}
      let letAsyncFunction = async function() {}
      const constAsyncFunction = async function() {}

      var namedVarAsyncFunction = async function alternateNameVarAsyncFunction() {}
      let namedLetAsyncFunction = async function alternateNameLetAsyncFunction() {}
      const namedConstAsyncFunction = async function alternateNameConstAsyncFunction() {}

      var varGeneratorFunction = function*() {}
      let letGeneratorFunction = function*() {}
      const constGeneratorFunction = function*() {}

      var namedVarGeneratorFunction = function* alternateNameVarGeneratorFunction() {}
      let namedLetGeneratorFunction = function* alternateNameLetGeneratorFunction() {}
      const namedConstGeneratorFunction = function* alternateNameConstGeneratorFunction() {}

      var varLambda = () => {}
      let letLambda = () => {}
      const constLambda = () => {}

      var varAsyncLambda = async () => {}
      let letAsyncLambda = async () => {}
      const constAsyncLambda = async () => {}

طرق عناصر طلب البيانات من العوامل المُشغِّلة ومعاودة الاتصال

يمكن للبرامج النصية التي تستخدم V8 استدعاء طرق الكائنات وفئة الطرق الثابتة من الأماكن التي يمكنك فيها استدعاء طرق المكتبة. وتشمل هذه الأماكن ما يلي:

يوضح مثال V8 التالي استخدام طرق الكائنات عند إنشاء عناصر قائمة في جداول بيانات Google:

function onOpen() {
  var ui = SpreadsheetApp.getUi(); // Or DocumentApp, SlidesApp, or FormApp.
  ui.createMenu('Custom Menu')
      .addItem('First item', 'menu.item1')
      .addSeparator()
      .addSubMenu(ui.createMenu('Sub-menu')
          .addItem('Second item', 'menu.item2'))
      .addToUi();
}

var menu = {
  item1: function() {
    SpreadsheetApp.getUi().alert('You clicked: First item');
  },
  item2: function() {
    SpreadsheetApp.getUi().alert('You clicked: Second item');
  }
}

عرض السجلات

توفّر "برمجة تطبيقات Google" خدمتَين للتسجيل: خدمة Logger والفئة console. وتكتب كلتا الخدمتين السجلات على خدمة تسجيل Stackdriver نفسها.

لعرض سجلّات Logger وconsole، انقر على سجلّ التنفيذ في أعلى أداة تعديل النصوص البرمجية.

عرض عمليات التنفيذ

للاطّلاع على سجلّ تنفيذ النص البرمجي، افتح مشروع "برمجة التطبيقات"، وانقر على رمز عمليات التنفيذ على يمين الصفحة.

أمثلة على بنية V8

في ما يلي قائمة مختصرة بالميزات التركيبية الشائعة والمتاحة للنصوص البرمجية التي تستخدم وقت التشغيل V8.

let وconst

تسمح لك الكلمتان الرئيسيتان let وconst بتحديد المتغيّرات المحلية لنطاق الحظر وثوابت نطاق الحظر، على التوالي.

// V8 runtime
let s = "hello";
if (s === "hello") {
  let s = "world";
  console.log(s);  // Prints "world"
}
console.log(s);  // Prints "hello"

const N = 100;
N = 5; // Results in TypeError
      

الدوال السهمية

توفر الدوال السهمية طريقة مكثفة لتحديد الدوال ضمن التعبيرات.

// Rhino runtime
function square(x) {
  return x * x;
}

console.log(square(5));  // Outputs 25
      
// V8 runtime
const square = x => x * x;
console.log(square(5));  // Outputs 25

// Outputs [1, 4, 9]
console.log([1, 2, 3].map(x => x * x));
      

صفوف

توفر الفئات وسيلة لتنظيم الرمز من الناحية النظرية مع التوريث. الفئات في V8 هي في الأساس عبارة عن حل تركيبي فوق الوراثة المستندة إلى نموذج JavaScript الأولي.

// V8 runtime
class Rectangle {
  constructor(width, height) { // class constructor
    this.width = width;
    this.height = height;
  }

  logToConsole() { // class method
    console.log(`Rectangle(width=${this.width}, height=${this.height})`);
  }
}

const r = new Rectangle(10, 20);
r.logToConsole();  // Outputs Rectangle(width=10, height=20)
      

إتلاف المهام الدراسية

تدمير تعبيرات المهام الدراسية هي طريقة سريعة لفك ضغط القيم من الصفائف والكائنات إلى متغيرات مميزة.

// Rhino runtime
var data = {a: 12, b: false, c: 'blue'};
var a = data.a;
var c = data.c;
console.log(a, c);  // Outputs 12 "blue"

var array = [1, 2, 3];
var x = a[0];
var y = a[1];
var z = a[2];
console.log(x, y, z);  // Outputs 1 2 3
      
// V8 runtime
var data = {a: 12, b: false, c: 'blue'};
var {a, c} = data;
console.log(a, c);  // Outputs 12 "blue"


var array = [1, 2, 3];
var [x, y, z] = array;
console.log(x, y, z);  // Outputs 1 2 3


      

القيم الحرفية للنموذج

القيم الحرفية للنموذج هي سلاسل حرفية تسمح بالتعبيرات المضمّنة. تتيح لك تجنب عبارات تسلسل السلاسل الأكثر تعقيدًا.

// Rhino runtime
var name =
  'Hi ' + first + ' ' + last + '.';
var url =
  'http://localhost:3000/api/messages/'
  + id;
      
// V8 runtime
var name = `Hi ${first} ${last}.`;
var url =
  `http://localhost:3000/api/messages/${id}`;


      

المَعلمات التلقائية

تتيح لك المَعلمات التلقائية تحديد القيم التلقائية لمَعلمات الدوال في بيان الدوال. ويمكن أن يؤدي هذا إلى تبسيط التعليمة البرمجية في نص الدالة لأنه يزيل الحاجة إلى تعيين القيم الافتراضية بشكل صريح للمعلمات المفقودة.

// Rhino runtime
function hello(greeting, name) {
    greeting = greeting || "hello";
    name = name || "world";
    console.log(
        greeting + " " + name + "!");
}

hello();  // Outputs "hello world!"
      
// V8 runtime
var hello =
  function(greeting="hello", name="world") {
      console.log(
        greeting + " " + name + "!");
  }

hello();  // Outputs "hello world!"

      

سلاسل متعددة الأسطر

يمكنك تحديد سلاسل متعددة الأسطر باستخدام البنية نفسها المستخدَمة في القيم الحرفية للنماذج. وكما هو الحال مع القيم الحرفية للنموذج، يتيح لك بناء الجملة هذا تجنب تسلسلات السلاسل وتبسيط تعريفات السلاسل.

// Rhino runtime
var multiline = "This string is sort of\n"
+ "like a multi-line string,\n"
+ "but it's not really one.";
      
// V8 runtime
var multiline = `This on the other hand,
actually is a multi-line string,
thanks to JavaScript ES6`;
      

تفعيل بيئة تشغيل V8

إذا كان هناك نص برمجي يستخدم وقت تشغيل Rhino، يمكنك تبديله إلى V8 من خلال تنفيذ ما يلي:

  1. افتح مشروع "برمجة تطبيقات Google".
  2. على يمين الصفحة، انقر على رمز إعدادات المشروع .
  3. ضع علامة في مربّع الاختيار تفعيل بيئة تشغيل Chrome V8.

بدلاً من ذلك، يمكنك تحديد وقت تشغيل النص البرمجي مباشرةً من خلال تعديل ملف بيان النص البرمجي:

  1. افتح مشروع "برمجة تطبيقات Google".
  2. على يمين الصفحة، انقر على رمز إعدادات المشروع .
  3. ضَع علامة في مربّع الاختيار إظهار ملف البيان "appsscript.json" في المحرِّر.
  4. على يمين الصفحة، انقر على رمز المحرِّر > appsscript.json.
  5. في ملف البيان appsscript.json، اضبط الحقل runtimeVersion على القيمة V8.
  6. في أعلى الشاشة، انقر على رمز حفظ المشروع .

توضّح عملية نقل النصوص البرمجية إلى V8 الخطوات الأخرى التي يجب اتخاذها لضمان عمل النص البرمجي بشكل جيد باستخدام V8.

تفعيل بيئة تشغيل Rhino

إذا كان النص البرمجي يستخدم V8 وتريد تبديله لاستخدام وقت تشغيل Rhino الأصلي، يمكنك إجراء ما يلي:

  1. افتح مشروع "برمجة تطبيقات Google".
  2. على يمين الصفحة، انقر على رمز إعدادات المشروع .
  3. أزِل العلامة من مربّع الاختيار تفعيل بيئة تشغيل Chrome V8.

يمكنك بدلاً من ذلك تعديل بيان النص البرمجي:

  1. افتح مشروع "برمجة تطبيقات Google".
  2. على يمين الصفحة، انقر على رمز إعدادات المشروع .
  3. ضَع علامة في مربّع الاختيار إظهار ملف البيان "appsscript.json" في المحرِّر.
  4. على يمين الصفحة، انقر على رمز المحرِّر > appsscript.json.
  5. في ملف البيان appsscript.json، اضبط الحقل runtimeVersion على القيمة DEPRECATED_ES5.
  6. في أعلى الشاشة، انقر على رمز حفظ المشروع .

كيف يمكنني نقل النصوص البرمجية الحالية؟

يصف دليل نقل النصوص البرمجية إلى الإصدار V8 الخطوات اللازمة لنقل بيانات نص برمجي حالي لاستخدام V8. يتضمّن ذلك تفعيل بيئة تشغيل V8 والتحقّق من النص البرمجي بحثًا عن أي حالات عدم توافق معروفة.

النقل التلقائي للنصوص البرمجية إلى V8

اعتبارًا من 18 شباط (فبراير) 2020، ستبدأ Google تدريجيًا في نقل النصوص البرمجية الحالية التي تجتاز اختبار التوافق التلقائي إلى V8. وتستمر النصوص البرمجية المتأثرة في العمل بشكل طبيعي بعد نقل البيانات.

إذا أردت إيقاف عملية نقل البيانات التلقائية لنص برمجي، اضبط الحقل runtimeVersion في ملف البيان على DEPRECATED_ES5. يمكنك اختيار نقل النص البرمجي إلى V8 يدويًا في أي وقت بعد ذلك.

كيف يمكنني الإبلاغ عن الأخطاء؟

يشرح دليل الدعم كيفية الحصول على مساعدة بشأن البرمجة على موقع Stack Overflow والبحث في تقارير المشاكل الحالية والإبلاغ عن أخطاء جديدة وتقديم طلبات ميزات جديدة.