Prepack: ابزاری جهت اجرای سریع‌تر کدهای جاوااسکریپت

Prepack: ابزاری جهت اجرای سریع‌تر کدهای جاوااسکریپت

اگر بخواهیم مفهوم Prepack را در یک جمله برایتان خلاصه کنیم، بایستی بگوییم «ابزاری برای اجرای سریع‌تر کدهای جاوااسکریپت». حال ممکن است این سؤال برایتان پیش بیاید که Prepack به چه‌ شکل این‌ کار را انجام خواهد داد و این چیزی است که در ادامه به آن خواهیم پرداخت. 

Prepack ابزاری است که سورس‌کد جاوااسکریپت را بهینه‌سازی می‌کند؛ در مورد چگونگی این‌کار بایستی گفت که Prepack محسباتی را حذف می‌کند که در حین اجرا (Run-time) انجام نمی‌شوند بلکه این محاسبات در زمان کمپایل (Compile-time) انجام می‌شوند. Prepack کدهای گلوبال جاوا اسکریپت را با کدهای مشابهی جایگزین می‌کند و این در حالی است که این کدهای جایگزین تنها یک توالی ساده از انتساب‌ها (Assignment) هستند اما این کار باعث می‌شود از شر اکثر محاسبات و تخصیص آبجکت‌ها (Object Allocation) خلاص شوید. 

برای روشن‌تر شدن نحوهٔ تغییر کدها، مثال معروف Hello World را ابتدا به‌صورت کدهای مرسوم جاوا اسکریپت و سپس با استفاده از Prepack می‌آوریم:

(function () {
  function hello() { return 'hello'; }
  function world() { return 'world'; }
  global.s = hello() + ' ' + world();
})();

حال خروجی کدهای فوق که با استفاده از Prepack رندر شده است:

(function () {
  s = "hello world";
})();

محیط از اهمیتی ویژه برخوردار است!
به یاد داشته باشیم که Prepack تحت هیچ عنوان یک محیط مرورگر یا Node.js را شبیه‌سازی نمی‌کند؛ به‌عبارت دیگر، در Prepack چیزهایی همچون دستورات document یا window وجود ندارند که در این صورت باید در ابتدای کدی که می‌خواهید با استفاده از Prepack آن‌را بنویسید، Model‌یی از عملکردهای مرتبط را درج کنید. برای مثال، نمونه فانکشن‌های هلپر برای ساخت Model به‌صورت زیر است: 

// Assume that a certain property has a simple known value.
__assumeDataProperty(global, "obscure", undefined);
// Assume that a certain property has a simple unknown value.
__assumeDataProperty(global, "notSoObscure", __abstract());
// Assume that a richly structured value exists
__assumeDataProperty(global, "rich", __abstract({
  x: __abstract("number"),
  y: __abstract("boolean"),
  z: __abstract("string"),
  nested: __abstract({
    x: __abstract()
  })
}));
// Forbid any accesses to an object except at known positions
__makePartial(global);
// At this point, accessing global.obscure, global.notSoObscure, global.rich.nested.x is okay,
// but accessing global.unknown or global.rich.unknown would cause an introspection error.

// The following tells Prepack to embed and call some code in the residual program.
// The code must not have any side effects on the reachable JavaScript heap.
__residual("object", function(delay) {
  return global.pushSelfDestructButton(delay);
}, "5 minutes");

 به‌نظر می‌رسد که این توضیحات کمی گیج‌کننده شدند، پس بگذارید به زبان ساده‌تر بگوییم؛ وقتی که از Prepack برای کد‌نویسی استفاده می‌کنید و این کدها به دستورات document یا window ارجاع داده می‌شوند، این ابزار آن‌ها را به‌صورت undefined ارزیابی خواهد کرد فلذا حتماً به‌روشی که در بالا گفته شد، باید آن‌ها را به برنامهٔ خود شناساند.

منبع