רמות קומפילציה של Closure Compiler

הכלי Closure Compiler מאפשר לבחור מבין שלוש רמות של קומפילציה, החל מהסרה פשוטה של רווחים ותגובות ועד לשינויים משמעותיים בקוד.

WHITESPACE_ONLY

ברמת ההידור WHITESPACE_ONLY התגובות מוסרות מהקוד, וגם מעברי שורה, רווחים מיותרים, סימני פיסוק מיותרים (כמו סוגריים ונקודה-פסיק) ורווחים לבנים אחרים. הפלט של JavaScript זהה מבחינת הפונקציונליות ל-JavaScript המקורי.

הידור של תכונות שפה ימשיך להתבצע אם מצב שפת הפלט המבוקש שונה ממצב שפת הקלט. אפשר לעיין ב--language_in וב--language_out בקטע Flags and Options.

רמת הדחיסה הזו מספקת את הדחיסה הכי פחות טובה מבין שלוש הרמות.

SIMPLE_OPTIMIZATIONS

רמת הקומפילציה SIMPLE_OPTIMIZATIONS מבצעת את אותה הסרה של רווחים לבנים והערות כמו WHITESPACE_ONLY, אבל היא גם מבצעת אופטימיזציות בתוך ביטויים ופונקציות, כולל שינוי השם של משתנים מקומיים ופרמטרים של פונקציות לשמות קצרים יותר. שינוי השם של משתנים לשמות קצרים יותר מקטין את הקוד באופן משמעותי. מכיוון שהרמה SIMPLE_OPTIMIZATIONS משנה את השם רק של סמלים מקומיים לפונקציות, היא לא מפריעה לאינטראקציה בין קוד ה-JavaScript שעבר קומפילציה לבין קוד JavaScript אחר.

קומפילציה עם SIMPLE_OPTIMIZATIONS תמיד שומרת על הפונקציונליות של JavaScript שתקף מבחינת התחביר, בתנאי שהקוד לא ניגש למשתנים מקומיים באמצעות שמות של מחרוזות (למשל באמצעות הצהרות eval() או באמצעות קריאה ל-toString בפונקציות).

SIMPLE_OPTIMIZATIONS היא רמת הקומפילציה שמוגדרת כברירת מחדל.

ADVANCED_OPTIMIZATIONS

ADVANCED_OPTIMIZATIONS ברמת הקומפילציה מתבצעים אותם שינויים כמו ברמה SIMPLE_OPTIMIZATIONS, אבל נוספים מגוון שינויים גלובליים אגרסיביים יותר כדי להשיג את הדחיסה הגבוהה ביותר מבין שלוש הרמות. רמת ADVANCED_OPTIMIZATIONS מאפשרת דחיסה של JavaScript הרבה מעבר למה שאפשר להשיג באמצעות כלים אחרים.

כדי להפעיל את הדחיסה הקיצונית הזו, ADVANCED_OPTIMIZATIONS מניח הנחות חזקות לגבי הקוד שעבר קומפילציה. אם הקוד לא תואם להנחות האלה, ADVANCED_OPTIMIZATIONS ייצור קוד שלא יפעל.

לדוגמה, קוד שעבר קומפילציה באמצעות ADVANCED_OPTIMIZATIONS לא יכול לפעול עם קוד שלא עבר קומפילציה, אלא אם מבצעים פעולות מיוחדות כדי להבטיח יכולת פעולה הדדית. אם לא תסמנו פונקציות חיצוניות ומאפיינים שההפניה אליהם מופיעה בקוד, Closure Compiler ישנה את השמות של ההפניות בקוד באופן לא מתאים, וכך ייווצר חוסר התאמה בין השמות בקוד לבין השמות בקוד החיצוני.

כדי לקבל מידע נוסף על הכנת הקוד ל-ADVANCED_OPTIMIZATIONS, אפשר לקרוא את המאמר Advanced Compilation and Externs.

הטרנספורמציות ADVANCED_OPTIMIZATIONS כוללות:

  • שינוי שם אגרסיבי יותר:

    קומפילציה עם SIMPLE_OPTIMIZATIONS רק משנה את השם של פרמטרים ומשתנים בתוך פונקציות. ‫ADVANCED_OPTIMIZATIONS גם משנה את השם של משתנים גלובליים, שמות של פונקציות ומאפיינים.

  • הסרת קוד לא פעיל:

    קומפילציה עם ADVANCED_OPTIMIZATIONS מסירה קוד שניתן להוכיח שהוא לא נגיש. האפשרות הזו שימושית במיוחד בשילוב עם ספריות גדולות. אם משתמשים רק בכמה פונקציות מקובץ גדול של ספרייה, הקומפיילר יכול להסיר מהפלט שלו את כל הפונקציות חוץ מאלה.

  • הוספה של קוד inline באופן גלובלי:

    קומפילציה עם ADVANCED_OPTIMIZATIONS מחליפה חלק מהקריאות לפונקציות בגוף הפונקציה. השינוי הזה נקרא 'הטמעה'. הקומפיילר מבצע inline לפונקציות רק אם הוא קובע שהפעולה הזו בטוחה וחוסכת מקום. קומפילציה עם ADVANCED_OPTIMIZATIONS גם מבצעת החלפה של קבועים וחלק מהמשתנים, כשהקומפיילר קובע שאפשר לעשות זאת בצורה בטוחה.

איך מגדירים את רמת הקומפילציה

כדי להגדיר את רמת הקומפילציה באפליקציית Closure Compiler, צריך לכלול את התג --compilation_level בשורת הפקודה עם ערך של WHITESPACE_ONLY,‏ SIMPLE או ADVANCED, כמו בפקודה הבאה:

java -jar compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS --js hello.js