Этот вопрос вдохновлен дебатами в комментариях к этому вопросу переполнения стека . В документации Google Closure Compiler говорится следующее (выделение добавлено):
Closure Compiler - инструмент для ускорения загрузки и работы JavaScript. Это настоящий компилятор для JavaScript. Вместо компиляции из исходного языка в машинный код, он компилирует из JavaScript в лучший JavaScript.
Однако Википедия дает следующее определение «компилятора»:
Компилятор - это компьютерная программа (или набор программ), которая преобразует исходный код, написанный на языке программирования (исходном языке), в другой компьютерный язык ... Средство переписывания языка обычно представляет собой программу, которая переводит форму выражений без изменения язык.
Исходя из этого, я бы сказал, что Google Closure не является компилятором. Но тот факт, что Google недвусмысленно заявляет, что на самом деле это «настоящий компилятор», заставляет задуматься, есть ли что-то еще. Является ли Google Closure действительно компилятором JavaScript?
источник
Ответы:
Закрывающий компилятор - это минификатор , оптимизатор и валидатор « все в одном». Этот вид помещает его в свою собственную категорию, потому что вы правы в том, что компилятор должен по крайней мере взять что-то, что не будет работать в его текущей форме, и превратить его во что-то, что будет (возьмем TypeScript для примера на основе ECMAScript).
Но обвиняете ли вы Google в расширении терминологии? Как еще они собирались это назвать? Google Minifier? Нет, это нечто большее, и там сотни таких людей. Оптимизатор Google? Это намного больше, чем это. Google Validator? Нет, это тоже нечто большее.
Так что выбор
Он делает все, что вы ожидаете от компилятора, только с семантической разницей. И, в конце концов, все слова в определенной степени определяются их использованием. Так что, если Google может убедить людей называть это компилятором, определение компилятора немного меняется. Конечно, ни в коем случае это не вызовет проблемы.
Или, возвращаясь к более раннему примеру, можете ли вы найти что-то существенное в TypeScript, которое позволяет называть его «истинным компилятором», в то время как компилятор Google Closure должен быть ограничен «почти компилятором»?
источник
Minoptival
. Это звучит как динозавр. Все любят динозавров, верно?Ну да ... но это предполагает, что Википедия авторитетна в этом вопросе.
И в качестве противопоставления определению в Википедии рассмотрим некоторые определения в словаре (из http://www.thefreedictionary.com/compiler ):
Конечно, все эти определения немного устарели, но они действительно показывают, что не существует «одного истинного значения» ... и что значения таких терминов, как «компилятор», со временем меняются. (И, ИМО, это просто отлично, потому что нам на самом деле не нужно точное определение для этого случая.)
Спор о том, является ли компилятор Closure «истинным компилятором» или нет (IMO), не является плодотворной деятельностью. Было бы более полезно понять, что Google подразумевает под «истинным компилятором» ... в этом контексте.
источник
Я думаю, что причина, по которой его можно назвать «настоящим компилятором», заключается в том, что он создает полное AST (абстрактное семантическое дерево) из ваших программ и использует его для генерации нового текста.
Тот факт, что и исходный, и результирующий тексты являются допустимым JavaScript, является простым совпадением.
Это важно, потому что есть много инструментов, которые выполняют только текстовые манипуляции с кодом (минификаторы, префтификаторы и т. Д.), Но не выполняют никакой обработки AST, а тем более регенерируют код. Даже если эти инструменты становятся все более и более мощными, это не одно и то же программное обеспечение, а ограничения разные.
источник
Это семантика на мой взгляд. В традиционном смысле это не компилятор. Однако в той же ссылке в Википедии написано
Закрытие выполняет некоторые или все эти операции.
Чуть дальше в статье в Википедии
При этом, я предполагаю, что это было проще назвать " Закрытие Компилятор », а не «оптимизатором закрытия», потому что на самом деле это просто оптимизация JavaScript для браузеров, не нужно переводить его на другой язык или байт-код.
Закрытие Компилятор как существительное не является следствием .
источник
Во-первых, давайте уберем это от того, как существует компилятор исходного кода. Вы не можете сказать, что что-то не является компилятором, потому что конечный результат не является кодом более низкого уровня.
Хотя корректно, что Closure Compiler генерирует AST и имеет фразу для генерации кода, многие Javascript minimizer уже делают это, и я бы, вероятно, не назвал их компиляторами.
Что действительно отличает Closure Compiler, так это его применение многих известных методов компиляции в обнаружении и оптимизации ошибок. Вот некоторые примеры:
Тип системы:
Закрывающий компилятор определяет аннотированную систему типов. Он использует методы вывода типов, которые многие компиляторы используют для проверки вашей программы на наличие ошибок.
Межпроцедурные оптимизации
Закрытие Компилятор создает графы вызовов для переименования и удаления мертвого кода на уровне всей программы.
Внутрипроцедурные оптимизации
Closure Compiler оптимизирует Javascript, применяя различные методы анализа потока управления, а также анализ потока данных. Классические методы компилятора, такие как: встраивание, распределение регистров, анализ переменных в реальном времени и многие другие, используются для того, чтобы выжать последний байт из выходного Javascript.
Модульная система
Менее известная часть Closure Compiler, которая может использоваться для разделения вашего кода на отдельную загрузку для более быстрого запуска. Он также использует множество графовых алгоритмов. Что-то также очень распространено в «традиционных» компиляторах.
Все эти методы компиляции и статического анализа отличают Closure Compiler от других Javascript minimizer. Принимая во внимание тот факт, что целевой язык ввода и вывода одинаков, я не понимаю, почему он не классифицирован как «настоящий компилятор».
источник