Является ли Google Closure настоящим компилятором?

19

Этот вопрос вдохновлен дебатами в комментариях к этому вопросу переполнения стека . В документации Google Closure Compiler говорится следующее (выделение добавлено):

Closure Compiler - инструмент для ускорения загрузки и работы JavaScript. Это настоящий компилятор для JavaScript. Вместо компиляции из исходного языка в машинный код, он компилирует из JavaScript в лучший JavaScript.

Однако Википедия дает следующее определение «компилятора»:

Компилятор - это компьютерная программа (или набор программ), которая преобразует исходный код, написанный на языке программирования (исходном языке), в другой компьютерный язык ... Средство переписывания языка обычно представляет собой программу, которая переводит форму выражений без изменения язык.

Исходя из этого, я бы сказал, что Google Closure не является компилятором. Но тот факт, что Google недвусмысленно заявляет, что на самом деле это «настоящий компилятор», заставляет задуматься, есть ли что-то еще. Является ли Google Closure действительно компилятором JavaScript?

Джеймс Аллардис
источник
2
Бьюсь об заклад, JS, который он выводит, является надлежащим подмножеством всех легальных JS; в этом смысле его выходной язык - «другой» язык.
AakashM

Ответы:

23

Закрывающий компилятор - это минификатор , оптимизатор и валидатор « все в одном». Этот вид помещает его в свою собственную категорию, потому что вы правы в том, что компилятор должен по крайней мере взять что-то, что не будет работать в его текущей форме, и превратить его во что-то, что будет (возьмем TypeScript для примера на основе ECMAScript).

Но обвиняете ли вы Google в расширении терминологии? Как еще они собирались это назвать? Google Minifier? Нет, это нечто большее, и там сотни таких людей. Оптимизатор Google? Это намного больше, чем это. Google Validator? Нет, это тоже нечто большее.

Так что выбор

  • Назовите это Google Closure Foogle и добавьте в лексикон совершенно новое бессмысленное слово.
  • Назовите это Google Closure Minoptivalidator, который яснее в намерениях, но труднее запомнить.
  • Назовите это Google Closure Compiler, что довольно близко к правде.

Он делает все, что вы ожидаете от компилятора, только с семантической разницей. И, в конце концов, все слова в определенной степени определяются их использованием. Так что, если Google может убедить людей называть это компилятором, определение компилятора немного меняется. Конечно, ни в коем случае это не вызовет проблемы.

Или, возвращаясь к более раннему примеру, можете ли вы найти что-то существенное в TypeScript, которое позволяет называть его «истинным компилятором», в то время как компилятор Google Closure должен быть ограничен «почти компилятором»?

прецизионный самописец
источник
Суть вопроса состояла в том, чтобы просто увидеть, что люди считают «компилятором». Как заявил 0A0D, это просто семантика, но я просто удивился, почему Google почувствовал необходимость уточнить, что это «настоящий компилятор». +1 за "Миноптивалидатор"!
Джеймс Аллардис
@JamesAllardice: Опять же, потому что если вы можете убедить людей в том, что это компилятор, то определение компилятора растягивается, чтобы включить его. И это действительно справедливо в этом случае. Если вы определяете новое слово, которое отделяет его от компилятора семантической строкой, ваш продукт классифицируется как «почти, но не совсем».
фунтовые
1
Я не знаю, мне нравится "Google Foogle" :-)
GrandmasterB
9
Я голосую за Minoptival. Это звучит как динозавр. Все любят динозавров, верно?
Изката
2
@Izkata: Если история эволюции и научила нас чему-то, так это тому, что Javascript не будет содержаться. Javascript вырвался на свободу, он распространяется на новые территории и болезненно прорывается через барьеры, может быть, даже опасно.
фунтовые
9

Исходя из этого, я бы сказал, что Google Closure не является компилятором.

Ну да ... но это предполагает, что Википедия авторитетна в этом вопросе.

И в качестве противопоставления определению в Википедии рассмотрим некоторые определения в словаре (из http://www.thefreedictionary.com/compiler ):

2) (Компьютерные науки) - программа, которая переводит другую программу, написанную на языке высокого уровня, на машинный язык, чтобы ее можно было выполнить.

2) (электроника и информатика / информатика) компьютерная программа, с помощью которой язык программирования высокого уровня, такой как COBOL или FORTRAN, преобразуется в машинный язык, на котором может работать компьютер.

Компьютерная программа, связанная с определенными языками программирования, которая преобразует инструкции, написанные на этих языках, в машинный код, который впоследствии может быть выполнен непосредственно компьютером.

Конечно, все эти определения немного устарели, но они действительно показывают, что не существует «одного истинного значения» ... и что значения таких терминов, как «компилятор», со временем меняются. (И, ИМО, это просто отлично, потому что нам на самом деле не нужно точное определение для этого случая.)

Спор о том, является ли компилятор Closure «истинным компилятором» или нет (IMO), не является плодотворной деятельностью. Было бы более полезно понять, что Google подразумевает под «истинным компилятором» ... в этом контексте.

Стивен С
источник
2
+1, по иронии судьбы, JS - это и «машинный язык» для Интернета, и «язык программирования высокого уровня».
К.Стефф
3
+1, и плюс еще один для «предполагает, что Википедия является авторитетным в этом вопросе». Слишком много людей слепо принимают то, что там написано.
Марьян Венема
6

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

Тот факт, что и исходный, и результирующий тексты являются допустимым JavaScript, является простым совпадением.

Это важно, потому что есть много инструментов, которые выполняют только текстовые манипуляции с кодом (минификаторы, префтификаторы и т. Д.), Но не выполняют никакой обработки AST, а тем более регенерируют код. Даже если эти инструменты становятся все более и более мощными, это не одно и то же программное обеспечение, а ограничения разные.

Хавьер
источник
1
Спасибо, это интересный ответ. Я думаю, что ваше объяснение может предложить лучшее определение «компилятора», чем Википедия и различные словари, которые цитировали другие.
Джеймс Аллардис
Что ж, мне нравится этот ответ, и я голосовал за него в какой-то момент, но я хотел бы отметить, что вполне возможно скомпилировать (в традиционном понимании языка высокого уровня) даже без создания AST. Например, давайте построим компилятор . Теперь, безусловно, верно, что компилятор из учебника Креншоу довольно грубый, но я не верю, что кто-либо обвинял его в том, что он не является компилятором.
dmckee
Я не читал эту ссылку, но я бы согласился, что явный AST не является строго необходимым для компиляции. Тем не менее, в большинстве случаев существует эквивалентная структура, либо явная в данных, либо неявная в исполнении (возможно, стек вызовов (или его эволюция во времени) отражает синтаксический анализ). Моя главная мысль заключается в том, что компиляция - это не манипулирование текстом, а генерация кода на основе анализа некоторого исходного кода.
Хавьер
4

Это семантика на мой взгляд. В традиционном смысле это не компилятор. Однако в той же ссылке в Википедии написано

Компилятор может выполнять многие или все следующие операции: лексический анализ, предварительную обработку, синтаксический анализ, семантический анализ (синтаксически-ориентированный перевод), генерацию кода и оптимизацию кода.

Закрытие выполняет некоторые или все эти операции.

Чуть дальше в статье в Википедии

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

При этом, я предполагаю, что это было проще назвать " Закрытие Компилятор », а не «оптимизатором закрытия», потому что на самом деле это просто оптимизация JavaScript для браузеров, не нужно переводить его на другой язык или байт-код.

Закрытие Компилятор как существительное не является следствием .

Брайан
источник
Это просто семантика, ты прав. Суть вопроса заключалась в том, чтобы просто увидеть, что люди считают «компилятором». Я до сих пор не думаю, что Closure Compiler является «настоящим компилятором», но он выполняет много подобных действий.
Джеймс Аллардис
3

Во-первых, давайте уберем это от того, как существует компилятор исходного кода. Вы не можете сказать, что что-то не является компилятором, потому что конечный результат не является кодом более низкого уровня.

Хотя корректно, что Closure Compiler генерирует AST и имеет фразу для генерации кода, многие Javascript minimizer уже делают это, и я бы, вероятно, не назвал их компиляторами.

Что действительно отличает Closure Compiler, так это его применение многих известных методов компиляции в обнаружении и оптимизации ошибок. Вот некоторые примеры:

Тип системы:

Закрывающий компилятор определяет аннотированную систему типов. Он использует методы вывода типов, которые многие компиляторы используют для проверки вашей программы на наличие ошибок.

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

Закрытие Компилятор создает графы вызовов для переименования и удаления мертвого кода на уровне всей программы.

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

Closure Compiler оптимизирует Javascript, применяя различные методы анализа потока управления, а также анализ потока данных. Классические методы компилятора, такие как: встраивание, распределение регистров, анализ переменных в реальном времени и многие другие, используются для того, чтобы выжать последний байт из выходного Javascript.

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

Менее известная часть Closure Compiler, которая может использоваться для разделения вашего кода на отдельную загрузку для более быстрого запуска. Он также использует множество графовых алгоритмов. Что-то также очень распространено в «традиционных» компиляторах.

Все эти методы компиляции и статического анализа отличают Closure Compiler от других Javascript minimizer. Принимая во внимание тот факт, что целевой язык ввода и вывода одинаков, я не понимаю, почему он не классифицирован как «настоящий компилятор».

Алан
источник