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

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

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

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

توضّح هذه الصفحة الميزات الجديدة التي يتيحها 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() {
  const 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();
}

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

عرض السجلات

توفّر Apps Script خدمتَين لتسجيل البيانات، وهما خدمة Logger وفئة console. تكتب كلتا الخدمتين السجلات إلى خدمة Stackdriver Logging نفسها.

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

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

لعرض سجلّ عمليات تنفيذ النص البرمجي، افتح مشروع Apps Script وانقر على عمليات التنفيذ على يمين الشاشة.

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

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

let وconst

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

// V8 runtime
let s = "hello";
if (s === "hello") {
  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 a = [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
const data = {a: 12, b: false, c: 'blue'};
const {a, c} = data;
console.log(a, c);  // Outputs 12 "blue"


const array = [1, 2, 3];
const [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
const name = `Hi ${first} ${last}.`;
const 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
const 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
const multiline = `This on the other hand,
actually is a multi-line string,
thanks to JavaScript ES6`;
      

تفعيل وقت التشغيل V8

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

  1. افتح مشروع Apps Script.
  2. على يمين الصفحة، انقر على إعدادات المشروع .
  3. ضَع علامة في مربّع الاختيار تفعيل وقت تشغيل محرك V8 لمتصفِّح Chrome.

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

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

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

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

إذا كان النص البرمجي يستخدم V8 وكنت بحاجة إلى التبديل إلى وقت تشغيل Rhino الأصلي، اتّبِع الخطوات التالية:

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

يمكنك بدلاً من ذلك تعديل ملف بيان النص البرمجي باتّباع الخطوات التالية:

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

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

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

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

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

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

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

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