Чи справжній компілятор Google Closure?


19

Це питання викликане дискусіями в коментарях до цього питання щодо переповнення стека . Документація компілятора закриття Google зазначає наступне (наголос додано):

Компілятор закриття - це інструмент для швидшого завантаження та запуску JavaScript. Це справжній компілятор для JavaScript. Замість компіляції з вихідної мови в машинний код вона компілюється з JavaScript на кращий JavaScript.

Однак Wikipedia дає таке визначення "компілятора":

Компілятор - це комп'ютерна програма (або набір програм), яка перетворює вихідний код, написаний мовою програмування (мовою джерела), в іншу комп'ютерну мову ... Переписувач мови - це звичайно програма, яка переводить форму виразів без зміни мову.

Виходячи з цього, я б сказав, що закриття Google не є компілятором. Але той факт, що Google прямо заявляє, що насправді це "справжній компілятор", змушує мене замислитися, чи є в ньому більше. Чи справді закриття Google - компілятор JavaScript?


2
Надіваюсь, JS, що виводить, є належним набором усіх юридичних JS; у цьому сенсі її вихідною мовою є "інша" мова.
AakashM

Відповіді:


23

Компілятор закриття - це мініфікатор , оптимізатор і валідатор все-в-одному. Цей тип ставить його у власну категорію, тому що ви правильні, що компілятор повинен принаймні взяти те, що не буде працювати у його поточному вигляді, і перетворити його на щось, що буде (візьміть TypeScript для прикладу на основі ECMAScript).

Але ви звинувачуєте Google у розтягуванні термінології? Як ще вони його називали? Google Minifier? Ні, це більше того, і там сотні таких. Google Optimiser? Це набагато більше, ніж це. Google Validator? Ні, це теж більше, ніж це.

Тож вибір є

  • Назвіть це Google Closure Foogle та введіть у лексикон зовсім нове інакше безглузде слово.
  • Назвіть це Minoptivalidator Google Closure, який чіткіший за наміром, але складніше запам'ятати.
  • Назвіть це компілятор закриття Google, який досить близький до істини.

Це робить усе, що ви очікуєте від компілятора, лише з семантичною різницею. І, врешті-решт, усі слова певною мірою визначаються їх використанням. Отже, якщо Google може переконати людей називати це компілятором, визначення компілятора дещо змінюється. Безумовно, ні в якому разі це не спричинить проблеми.

Або, повернувшись до попереднього прикладу, ви можете знайти щось важливе про TypeScript, що дозволяє його називати "справжнім компілятором", тоді як компілятор закриття Google повинен бути обмежений "майже компілятором"?


Суть питання полягала лише в тому, щоб реально побачити, що люди сприймають як "компілятора". Як зазначає 0A0D, це просто семантика, але мені просто стало цікаво, чому Google відчув необхідність уточнити, що це "справжній компілятор". +1 для "Minoptivalidator"!
Джеймс Еллардіс

@JamesAllardice: Знову ж таки, тому що якщо ви можете переконати людей, що це компілятор, то визначення компілятора розтягується, щоб включити його. І це справді справедливо, що в цьому випадку це повинно бути. Якщо ви визначите нове слово, яке відокремлює його від компілятора сематичним рядком, ваш продукт класифікується як "майже, але не зовсім".
пдр

1
Я не знаю, мені подобається "Google Foogle" :-)
GrandmasterB

9
Я голосую за Minoptival. Це звучить як динозавр. Всім подобаються динозаври, правда?
Ізката

2
@Izkata: Якщо є щось, чого нас навчила історія еволюції, це те, що Javascript не міститиметься. Javascript вимикається, він поширюється на нові території і пробивається через бар'єри болісно, ​​може, навіть небезпечно.
пдр

9

Виходячи з цього, я б сказав, що закриття Google не є компілятором.

Ну так ... але це передбачає, що Вікіпедія в цьому питанні є авторитетною.

І як протилежне визначенню Вікіпедії, розгляньте деякі визначення словника (від http://www.thefreedictionary.com/compiler ):

2) (Computer Science) - програма, яка переводить іншу програму, написану мовою високого рівня, на машинну мову, щоб вона могла бути виконана.

2) (Електроніка та комп’ютерна наука / Інформатика) - комп'ютерна програма, за допомогою якої мова програмування високого рівня, наприклад COBOL або FORTRAN, перетворюється на машинну мову, на яку може діяти комп'ютер.

Комп'ютерна програма, пов'язана з певними мовами програмування, яка перетворює інструкції, написані цими мовами, в машинний код, який згодом може бути виконаний безпосередньо комп'ютером.

Зазначені визначення є трохи старомодними, але це ілюструє, що немає "єдиного справжнього значення" ... і справді, що значення термінів, як "компілятор" змінюються з часом. (ІМО, це просто чудово, тому що нам не потрібне точне визначення для цього випадку.)

Дебати, чи компілятор закриття є "справжнім компілятором", чи ні (IMO) не є плідною діяльністю. Було б корисніше зрозуміти, що означають люди "підписні компілятори" ... в цьому контексті.


2
+1, За іронією долі, JS є і "машинною мовою" для Інтернету, і "мовою програмування високого рівня".
K.Steff

3
+1, а також ще одне для "передбачає, що Вікіпедія в цьому питанні є авторитетною". Занадто багато людей сліпо приймають те, що трапляється там, що пишеться.
Мар'ян Венема

6

Я думаю, що причина, чому його можна назвати "справжнім компілятором", полягає в тому, що він створює повний AST (абстрактне семантичне дерево) з ваших програм і використовує його для створення нового тексту.

Той факт, що як оригінали, так і тексти в результаті є дійсними JavaScript, є простим збігом обставин.

Це важливо, тому що існує багато інструментів, які виконують лише текстові маніпуляції кодом (міні-пристрої, гарнітури та ін.), Але не виконують жодної обробки AST, а тим більше регенерації коду. Навіть якщо ці інструменти є все більш потужними, вони не є програмним забезпеченням одного типу, а обмеження різні.


1
Дякую, це цікава відповідь. Я думаю, що ваше пояснення може запропонувати краще визначення "компілятора", ніж Вікіпедія та різні словники, які цитують інші.
Джеймс Еллардіс

Ну, мені подобається ця відповідь і я проголосував за неї в якийсь момент, але зауважу, що цілком можливо скласти (у традиційному розумінні мови на машині високого рівня), не будуючи ніколи AST. Наприклад, див. «Побудова компілятора» . Тепер, безумовно, правда, що компілятор з підручника Креншоу є досить грубим, але я не вірю, що хтось звинувачував його у тому, що він не був компілятором.
dmckee

Я не читав цього посилання, але погодився б, що явний AST не є строго необхідним для компіляції. Однак у більшості випадків існує еквівалентна структура, або явна в даних, або неявна у виконанні (можливо, стек виклику (або його еволюція в часі) відображає синтаксичний аналіз). Моя основна суть полягає в тому, що компіляція - це не маніпуляція текстом, а генерування коду з аналізу деякого вихідного коду.
Хав’єр

4

На мою думку, це семантика. У традиційному розумінні це не компілятор. Однак у тому ж посиланні на Вікіпедії йдеться

Компілятор, ймовірно, виконує багато чи всі наступні операції: лексичний аналіз, попередня обробка, синтаксичний аналіз, семантичний аналіз (синтаксичний переклад), генерування коду та оптимізація коду.

Закриття виконує деякі або всі ці операції.

Трохи далі в статті Вікіпедії

Однак на практиці рідко буває щось про мову, що вимагає, щоб вона була виключно складена або виключно інтерпретована, хоча можна створити мови, які покладаються на повторне тлумачення під час виконання.

Зважаючи на це, я здогадуюсь, що легше було назвати його " компілятором закриття ", а не "оптимізатором закриття", оскільки це просто оптимізація JavaScript для браузерів, а не необхідність перекладу його на іншу мову чи байт-код.

Компілятор закриття як іменник - це неслідник .


Це просто семантика, ти маєш рацію. Суть питання полягала саме в тому, щоб побачити, як люди бачать "компілятора". Я досі не думаю, що компілятор закриття не є "справжнім компілятором", але він виконує багато подібних дій.
Джеймс Еллардіс

3

По-перше, давайте вийдемо з шляху компілятора джерело-джерело. Ви не можете сказати, що щось не є компілятором, оскільки кінцевий результат не є кодом нижчого рівня.

Хоча правильно, що компілятор закриття генерує AST і має фразу для генерації коду, багато мінімізаторів JavaScript там уже це роблять, і я, мабуть, не називаю їх також компіляторами.

Що по-справжньому відрізняє компілятор закриття - це застосування багатьох відомих методів компілятора в виявленні та оптимізації помилок. Ось кілька прикладів:

Тип системи:

Компілятор закриття визначає систему анотованих типів. Він використовує методи виводу типу, які використовує багато компілятор для перевірки вашої програми на наявність помилок.

Міжпроцедурні оптимізації

Компілятор закриття створює графіки викликів для перейменування та видалення мертвого коду на цілому рівні програми.

Внутріпроцедурна оптимізація

Компілятор закриття оптимізує Javascript, застосовуючи різні аналізи потоку управління, а також аналіз потоку даних. Класичні методи компілятора, такі як: Вбудоване, Виділення регістрів, Аналіз змінних в реальному часі .. та багато іншого використовуються для видавлювання останнього байту з вихідного Javascript.

Модульна система

Менш відома частина компілятора закриття, яку можна використовувати для поділу вашого коду на окреме завантаження для швидшого запуску. Він також використовує багато алгоритмів графіків. Щось також дуже часто зустрічається в «традиційних» компіляторах.

Усі ці методи компілятора та статичного аналізу - це те, що відрізняє компілятор закриття від інших мінімізаторів Javascript. Відриваючись від того, що цільова мова вводу та виводу однакова, я не бачу, чому вона не класифікується як "справжній компілятор".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.