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

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

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

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

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

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

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

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

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

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

التعرّف المحسَّن على الوظائف

تم تحسين اكتشاف وظيفة "برمجة التطبيقات" للنصوص البرمجية التي تستخدم الإصدار 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');
  }
}

عرض السجلات

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

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

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

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

أمثلة على بنية 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. ضع علامة في مربّع الاختيار تفعيل وقت تشغيل الإصدار 8 من Chrome.

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

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

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

تفعيل وقت تشغيل Rhino

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

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

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

  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 والبحث في تقارير المشاكل الحالية والإبلاغ عن الأخطاء الجديدة وتقديم طلبات ميزات جديدة.