V8 রানটাইম ওভারভিউ

অ্যাপস স্ক্রিপ্ট এবং জাভাস্ক্রিপ্টে, একটি রানটাইম বা রানটাইম পরিবেশে জাভাস্ক্রিপ্ট ইঞ্জিন থাকে যা স্ক্রিপ্ট কোড পার্স এবং এক্সিকিউট করে। রানটাইম কীভাবে মেমরি অ্যাক্সেস করা হয়, প্রোগ্রামটি কম্পিউটারের অপারেটিং সিস্টেমের সাথে কীভাবে ইন্টারঅ্যাক্ট করতে পারে এবং কোন প্রোগ্রাম সিনট্যাক্স বৈধ তা সম্পর্কে নিয়ম প্রদান করে। প্রতিটি ওয়েব ব্রাউজারের জাভাস্ক্রিপ্টের জন্য একটি রানটাইম পরিবেশ থাকে।

ঐতিহাসিকভাবে, অ্যাপস স্ক্রিপ্টটি মজিলার রাইনো জাভাস্ক্রিপ্ট ইন্টারপ্রেটার দ্বারা চালিত হয়েছে। রাইনো অ্যাপস স্ক্রিপ্টকে ডেভেলপার স্ক্রিপ্টগুলি কার্যকর করার জন্য একটি সুবিধাজনক উপায় প্রদান করলেও, এটি অ্যাপস স্ক্রিপ্টকে একটি নির্দিষ্ট জাভাস্ক্রিপ্ট সংস্করণের ( ES5 ) সাথে সংযুক্ত করেছে। অ্যাপস স্ক্রিপ্ট ডেভেলপাররা রাইনো রানটাইম ব্যবহার করে স্ক্রিপ্টগুলিতে আরও আধুনিক জাভাস্ক্রিপ্ট সিনট্যাক্স এবং বৈশিষ্ট্যগুলি ব্যবহার করতে পারে না।

এই উদ্বেগ দূর করার জন্য, Apps Script এখন V8 রানটাইম দ্বারা সমর্থিত যা Chrome এবং Node.js-কে শক্তি দেয়। আধুনিক জাভাস্ক্রিপ্ট সিনট্যাক্স এবং বৈশিষ্ট্যগুলির সুবিধা নিতে আপনি বিদ্যমান স্ক্রিপ্টগুলিকে V8-এ স্থানান্তর করতে পারেন।

এই পৃষ্ঠায় V8 দ্বারা সক্রিয় নতুন বৈশিষ্ট্যগুলি এবং আপনার স্ক্রিপ্টগুলিতে ব্যবহারের জন্য V8 কীভাবে সক্ষম করবেন তা বর্ণনা করা হয়েছে। V8 এ স্ক্রিপ্টগুলি স্থানান্তরিত করার মাধ্যমে বিদ্যমান স্ক্রিপ্টগুলিকে V8 রানটাইম ব্যবহার করার জন্য স্থানান্তরিত করার পদক্ষেপগুলি বর্ণনা করা হয়েছে।

V8 রানটাইমের বৈশিষ্ট্য

V8 রানটাইম ব্যবহার করে এমন স্ক্রিপ্টগুলি নিম্নলিখিত বৈশিষ্ট্যগুলির সুবিধা নিতে সক্ষম:

আধুনিক ECMAScript সিনট্যাক্স

V8 রানটাইম দ্বারা চালিত স্ক্রিপ্টগুলিতে আপনি আধুনিক ECMAScript সিনট্যাক্স ব্যবহার করতে পারেন। এই সিনট্যাক্সে let , const এবং আরও অনেক জনপ্রিয় বৈশিষ্ট্য অন্তর্ভুক্ত রয়েছে।

V8 রানটাইম ব্যবহার করে আপনি যে জনপ্রিয় সিনট্যাক্স উন্নতি করতে পারেন তার একটি সংক্ষিপ্ত তালিকার জন্য V8 সিনট্যাক্স উদাহরণগুলি দেখুন।

উন্নত ফাংশন সনাক্তকরণ

V8 ব্যবহার করা স্ক্রিপ্টগুলির জন্য Apps Script ফাংশন সনাক্তকরণ উন্নত করা হয়েছে। নতুন রানটাইম এই ফাংশন সংজ্ঞা ফর্ম্যাটগুলিকে স্বীকৃতি দেয়:

      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 Sheets-এ মেনু আইটেম তৈরি করার সময় অবজেক্ট পদ্ধতির ব্যবহার দেখায়:

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

লগ দেখুন

অ্যাপস স্ক্রিপ্ট দুটি লগিং পরিষেবা প্রদান করে: Logger পরিষেবা এবং console ক্লাস। এই দুটি পরিষেবাই একই স্ট্যাকড্রাইভার লগিং পরিষেবাতে লগ লেখে।

Logger এবং console লগগুলি দেখানোর জন্য, স্ক্রিপ্ট এডিটরের শীর্ষে, এক্সিকিউশন লগ ক্লিক করুন।

মৃত্যুদণ্ড দেখুন

আপনার স্ক্রিপ্টের এক্সিকিউশন ইতিহাস দেখতে, অ্যাপস স্ক্রিপ্ট প্রজেক্টটি খুলুন এবং বাম দিকে, এক্সিকিউশন ক্লিক করুন।

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-এর ক্লাসগুলি মূলত জাভাস্ক্রিপ্ট প্রোটোটাইপ-ভিত্তিক উত্তরাধিকারের উপর ভিত্তি করে সিনট্যাকটিকাল চিনি।

// 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!"

      

বহু-লাইন স্ট্রিং

আপনি template literals এর মতো একই সিনট্যাক্স ব্যবহার করে বহু-লাইন স্ট্রিং সংজ্ঞায়িত করতে পারেন। template literals এর মতো, এই সিনট্যাক্স আপনাকে স্ট্রিং কনক্যাটেনেশন এড়াতে এবং স্ট্রিং সংজ্ঞা সহজ করতে দেয়।

// 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 রানটাইম সীমাবদ্ধতা

Apps Script V8 রানটাইম কোনও স্ট্যান্ডার্ড Node.js বা ব্রাউজার পরিবেশ নয়। এর ফলে যখন আপনি থার্ড-পার্টি লাইব্রেরি কল করেন বা অন্যান্য জাভাস্ক্রিপ্ট পরিবেশ থেকে কোড উদাহরণ অ্যাডাপ্ট করেন তখন সামঞ্জস্যের সমস্যা দেখা দিতে পারে।

অনুপলব্ধ API গুলি

Apps Script V8 রানটাইমে নিম্নলিখিত স্ট্যান্ডার্ড JavaScript API গুলি উপলব্ধ নয় :

  • টাইমার : setTimeout , setInterval , clearTimeout , clearInterval
  • স্ট্রিম : ReadableStream , WritableStream , TextEncoder , TextDecoder
  • ওয়েব API গুলি : fetch , FormData , File , Blob , URL , URLSearchParams , DOMException , atob , btoa
  • ক্রিপ্টো : crypto , SubtleCrypto
  • গ্লোবাল অবজেক্টস : window , navigator , performance , process (নোড.জেএস)

বিকল্প হিসেবে নিম্নলিখিত অ্যাপস স্ক্রিপ্ট এপিআই ব্যবহার করুন:

  • টাইমার : সিঙ্ক্রোনাস পজের জন্য Utilities.sleep ব্যবহার করুন। অ্যাসিঙ্ক্রোনাস টাইমার সমর্থিত নয়।
  • Fetch : HTTP(S) অনুরোধ করতে UrlFetchApp.fetch(url, params) ব্যবহার করুন।
  • atob : Base64-এনকোডেড স্ট্রিং ডিকোড করতে Utilities.base64Decode ব্যবহার করুন।
  • btoa : Base64-এ স্ট্রিং এনকোড করতে Utilities.base64Encode ব্যবহার করুন।
  • ক্রিপ্টো : computeDigest , computeHmacSha256Signature এবং computeRsaSha256Signature এর মতো ক্রিপ্টোগ্রাফিক ফাংশনের জন্য Utilities ব্যবহার করুন।

যেসব API-তে Apps Script বিকল্প নেই, যেমন TextEncoder , তাদের জন্য আপনি মাঝে মাঝে polyfill ব্যবহার করতে পারেন। polyfill হল এমন একটি লাইব্রেরি যা API কার্যকারিতার প্রতিলিপি তৈরি করে যা রানটাইম পরিবেশে ডিফল্টভাবে উপলব্ধ নয়। polyfill ব্যবহার করার আগে, নিশ্চিত করুন যে এটি Apps Script-এর V8 রানটাইমের সাথে সামঞ্জস্যপূর্ণ।

অ্যাসিঙ্ক্রোনাস সীমাবদ্ধতা

V8 রানটাইম async এবং await সিনট্যাক্স এবং Promise অবজেক্ট সমর্থন করে। তবে, অ্যাপস স্ক্রিপ্ট রানটাইম পরিবেশ মূলত সিঙ্ক্রোনাস।

  • মাইক্রোটাস্ক (সমর্থিত) : বর্তমান কল স্ট্যাক পরিষ্কার হওয়ার পরে রানটাইম মাইক্রোটাস্ক কিউ (যেখানে Promise.then কলব্যাক এবং await রেজোলিউশন ঘটে) প্রক্রিয়া করে।
  • ম্যাক্রোটাস্ক (সমর্থিত নয়) : অ্যাপস স্ক্রিপ্টে ম্যাক্রোটাস্কের জন্য কোনও স্ট্যান্ডার্ড ইভেন্ট লুপ নেই। setTimeout এবং setInterval মতো ফাংশনগুলি উপলব্ধ নয়।
  • WebAssembly ব্যতিক্রম : WebAssembly API হল একমাত্র বিল্ট-ইন বৈশিষ্ট্য যা রানটাইমের মধ্যে একটি নন-ব্লকিং পদ্ধতিতে কাজ করে, যা নির্দিষ্ট অ্যাসিঙ্ক্রোনাস কম্পাইলেশন প্যাটার্ন (WebAssembly.instantiate) এর জন্য অনুমতি দেয়।

সমস্ত I/O অপারেশন, যেমন UrlFetchApp.fetch , ব্লক করছে। সমান্তরাল নেটওয়ার্ক অনুরোধগুলি অর্জন করতে, UrlFetchApp.fetchAll ব্যবহার করুন।

শ্রেণীর সীমাবদ্ধতা

আধুনিক ES6+ ক্লাস বৈশিষ্ট্যগুলির ক্ষেত্রে V8 রানটাইমের নির্দিষ্ট সীমাবদ্ধতা রয়েছে:

  • প্রাইভেট ফিল্ড : প্রাইভেট ক্লাস ফিল্ড (উদাহরণস্বরূপ, #field ) সমর্থিত নয় এবং পার্সিং ত্রুটির কারণ হয়। সত্যিকারের এনক্যাপসুলেশনের জন্য ক্লোজার বা WeakMap ব্যবহার করার কথা বিবেচনা করুন।
  • স্ট্যাটিক ফিল্ডস : ক্লাস বডির মধ্যে সরাসরি স্ট্যাটিক ফিল্ড ডিক্লেয়ারেশন (উদাহরণস্বরূপ, static count = 0; ) সমর্থিত নয়। ক্লাসের সংজ্ঞার পরে স্ট্যাটিক প্রোপার্টি বরাদ্দ করুন (উদাহরণস্বরূপ, MyClass.count = 0; )।

মডিউল সীমাবদ্ধতা

  • ES6 মডিউল : V8 রানটাইম ES6 মডিউল ( import / export ) সমর্থন করে না। লাইব্রেরি ব্যবহার করার জন্য, আপনাকে হয় Apps Script লাইব্রেরি মেকানিজম ব্যবহার করতে হবে অথবা আপনার কোড এবং এর নির্ভরতাগুলিকে একটি একক স্ক্রিপ্ট ফাইলে বান্ডিল করতে হবে। ( ইস্যু ট্র্যাকার )
  • ফাইল এক্সিকিউশন অর্ডার : আপনার প্রোজেক্টের সমস্ত স্ক্রিপ্ট ফাইল একটি গ্লোবাল স্কোপে এক্সিকিউট করা হয়। পার্শ্ব প্রতিক্রিয়া সহ শীর্ষ-স্তরের কোড এড়িয়ে চলা এবং ফাইলগুলিতে ব্যবহারের আগে ফাংশন এবং ক্লাসগুলি সংজ্ঞায়িত করা নিশ্চিত করা ভাল। যদি তাদের মধ্যে নির্ভরতা থাকে তবে সম্পাদকে আপনার ফাইলগুলিকে স্পষ্টভাবে অর্ডার করুন।

V8 রানটাইম সক্ষম করা হচ্ছে

যদি কোন স্ক্রিপ্ট Rhino রানটাইম ব্যবহার করে, তাহলে আপনি নিম্নলিখিতগুলি করে এটি V8 এ স্যুইচ করতে পারেন:

  1. অ্যাপস স্ক্রিপ্ট প্রজেক্টটি খুলুন।
  2. বাম দিকে, Project Settings ক্লিক করুন।
  3. Chrome V8 রানটাইম সক্ষম করুন চেকবক্সটি নির্বাচন করুন।

বিকল্পভাবে, আপনি স্ক্রিপ্ট ম্যানিফেস্ট ফাইল সম্পাদনা করে সরাসরি স্ক্রিপ্ট রানটাইম নির্দিষ্ট করতে পারেন:

  1. অ্যাপস স্ক্রিপ্ট প্রজেক্টটি খুলুন।
  2. বাম দিকে, Project Settings ক্লিক করুন।
  3. এডিটর চেকবক্সে "appsscript.json" ম্যানিফেস্ট ফাইল দেখান নির্বাচন করুন।
  4. বাম দিকে, Editor > appsscript.json এ ক্লিক করুন।
  5. appsscript.json ম্যানিফেস্ট ফাইলে, runtimeVersion ফিল্ডটিকে V8 মান হিসেবে সেট করুন।
  6. উপরে, প্রজেক্ট সেভ করুন ক্লিক করুন।

V8 ব্যবহার করে আপনার স্ক্রিপ্টটি ভালভাবে কাজ করে তা নিশ্চিত করার জন্য আপনার নেওয়া অন্যান্য পদক্ষেপগুলি V8-এ স্ক্রিপ্ট স্থানান্তর করার মাধ্যমে ব্যাখ্যা করা হয়েছে।

রাইনো রানটাইম সক্ষম করা হচ্ছে

যদি আপনার স্ক্রিপ্টটি V8 ব্যবহার করে এবং আপনাকে এটিকে মূল Rhino রানটাইম ব্যবহার করতে পরিবর্তন করতে হয়, তাহলে নিম্নলিখিতগুলি করুন:

  1. অ্যাপস স্ক্রিপ্ট প্রজেক্টটি খুলুন।
  2. বাম দিকে, Project Settings ক্লিক করুন।
  3. Chrome V8 রানটাইম সক্ষম করুন চেকবক্সটি সাফ করুন।

অন্যথায়, আপনার স্ক্রিপ্ট ম্যানিফেস্ট সম্পাদনা করুন:

  1. অ্যাপস স্ক্রিপ্ট প্রজেক্টটি খুলুন।
  2. বাম দিকে, Project Settings ক্লিক করুন।
  3. এডিটর চেকবক্সে "appsscript.json" ম্যানিফেস্ট ফাইল দেখান নির্বাচন করুন।
  4. বাম দিকে, Editor > appsscript.json এ ক্লিক করুন।
  5. appsscript.json ম্যানিফেস্ট ফাইলে, runtimeVersion ফিল্ডটি DEPRECATED_ES5 মান হিসেবে সেট করুন।
  6. উপরে, প্রজেক্ট সেভ করুন ক্লিক করুন।

বিদ্যমান স্ক্রিপ্টগুলি কীভাবে স্থানান্তর করব?

V8-এ স্ক্রিপ্ট মাইগ্রেট করার নির্দেশিকাটিতে একটি বিদ্যমান স্ক্রিপ্টকে V8 ব্যবহারে স্থানান্তরিত করার জন্য আপনাকে যে পদক্ষেপগুলি নিতে হবে তা বর্ণনা করা হয়েছে। এর মধ্যে রয়েছে V8 রানটাইম সক্ষম করা এবং স্ক্রিপ্টে কোনও পরিচিত অসঙ্গতি আছে কিনা তা পরীক্ষা করা।

V8-এ স্ক্রিপ্টের স্বয়ংক্রিয় স্থানান্তর

১৮ ফেব্রুয়ারি, ২০২০ থেকে গুগল আমাদের স্বয়ংক্রিয় সামঞ্জস্য পরীক্ষায় উত্তীর্ণ বিদ্যমান স্ক্রিপ্টগুলিকে ধীরে ধীরে V8-তে স্থানান্তরিত করতে শুরু করবে। মাইগ্রেশনের পরেও প্রভাবিত স্ক্রিপ্টগুলি স্বাভাবিকভাবে কাজ করতে থাকবে।

যদি আপনি কোনও স্ক্রিপ্টকে স্বয়ংক্রিয় স্থানান্তর থেকে বাদ দিতে চান, তাহলে তার ম্যানিফেস্টে runtimeVersion ক্ষেত্রটি DEPRECATED_ES5 তে সেট করুন। এরপর যেকোনো সময় আপনি স্ক্রিপ্টটিকে V8 তে ম্যানুয়ালি স্থানান্তর করতে পারেন।

আমি কিভাবে বাগ রিপোর্ট করব?

সাপোর্ট গাইডে স্ট্যাক ওভারফ্লোতে প্রোগ্রামিং সহায়তা কীভাবে পাবেন, বিদ্যমান সমস্যা প্রতিবেদনগুলি কীভাবে অনুসন্ধান করবেন, নতুন বাগ ফাইল করবেন এবং নতুন বৈশিষ্ট্য অনুরোধ করবেন তা ব্যাখ্যা করা হয়েছে।