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

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

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

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

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

ميزات وقت تشغيل V8

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

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

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

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

تحسين ميزة "اكتشاف الوظيفة"

تم تحسين ميزة رصد الدوال في Apps Script للنصوص البرمجية التي تستخدم الإصدار 8. يتعرّف وقت التشغيل الجديد على تنسيقات تعريف الدوالّ التالية:

      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');
  }
}

عرض السجلات

توفّر Apps Script خدمتَي تسجيل: خدمة Logger وconsole. تُسجِّل كلتا هاتين الخدمتَين السجلات في خدمة تسجيل Stackdriver نفسها.

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

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

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

أمثلة على بنية 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. افتح مشروع Apps Script.
  2. على يمين الصفحة، انقر على إعدادات المشروع .
  3. ضَع علامة في مربّع الاختيار تفعيل وقت تشغيل محرك V8 لمتصفِّح Chrome.

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

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

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

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

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

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

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

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

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