Prepack به طور خلاصه ابزاری برای اجرای سریعتر کدهای جاوااسکریپت است. این ابزار اپنسورس به طور کلی سورسکد جاوااسکریپت را بهینهسازی میکند؛ اما در مورد چگونگی این کار بایستی گفت که Prepack کدهای گلوبال جاوااسکریپت را با کدهای مشابهی جایگزین میکند و این در حالی است که این کدهای جایگزین تنها یک توالی ساده از به اصطلاح Assignment هستند که این کار باعث میشود از شَر اکثر محاسبات و تخصیص آبجکتها (Object Allocation) خلاص شوید.
نوشتن برنامهٔ سادهٔ Hello World با Prepack
برای روشنتر شدن نحوهٔ تغییر کدها، مثال معروف Hello World را ابتدا به صورت کدهای مرسوم جاوااسکریپت مینویسیم:
(function () {
function hello() { return 'hello'; }
function world() { return 'world'; }
global.s = hello() + ' ' + world();
})();
حال خروجی کدهای فوق که با استفاده از Prepack رِندِر شده است:
(function () {
s = "hello world";
})();
به یاد داشته باشیم که Prepack تحت هیچ عنوان یک محیط مرورگر یا نودجیاس را شبیهسازی نمیکند؛ به عبارت دیگر، در Prepack چیزهایی همچون دستورات document یا window وجود ندارند که در این صورت در ابتدای کدی که میخواهید با استفاده از Prepack آن را بهینه کنید، باید مدلهایی از عملکردهای مرتبط را تعریف کنید. برای مثال، نمونه فانکشنهای هلپر برای ساخت مدل به صورت زیر است:
// 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 ارزیابی خواهد کرد؛ از همین روی، حتماً به روشی که در بالا گفته شد باید آنها را به برنامهٔ خود شناساند.