Что компилятор angular "компилируется"?

Меня спросили сегодня и не смогли дать правильный ответ.

Typescript преобразуется в JS. Затем происходит дрожание дерева, "меньше" (необязательно) и что еще в процессе развертывания. Но ничего подобного (afaik) не имеет ничего общего с "компиляцией". Все становится в комплекте и сильно оптимизировано, но оно фактически не составлено, правильно?

Существует даже опережающий компилятор, который действительно делает заметную работу. Что мне не хватает?

Javascript сам по-прежнему интуитивно понятен, верно?

Ответ 1

Вы предполагаете, что компиляция означает получение исходного кода и создание машинного кода, низкоуровневых кодов и т.д. Но на самом деле компиляция означает просто получение одного исходного кода и превращение его в другой. Поэтому кажется разумным сказать, что использование Typescript и создание JavaScript - это форма компиляции. Это не отличается от того, что (например) делает С# при компиляции в язык IL.

Тем не менее, я бы сказал, что лучшее слово для этого - Transpiling. Я бы предположил, что компилятор Typescript лучше описать как Transpiler.

Разница невелика, и транспортер можно рассматривать как тип компилятора; но (чистый) скомпилированный язык (обычно) превращает язык высокого уровня в язык низкого (эр) уровня (ближе к машинному коду), как пример С#. Транспортер превращает язык высокого уровня в язык аналогичного уровня (абстракции) (также высокого уровня). *

Результат скомпилированного кода, как правило, не является языком, который вы написали бы сами. Результатом транспилятора является другой язык высокого уровня. Теоретически вы могли бы написать IL (в качестве примера), но он действительно предназначен для создания компилятором, и для этого нет инструментов или поддержки, вы создаете IL только путем компиляции С#/vb.net. Принимая во внимание, что Javascript - это удобный (и используемый) язык программирования сам по себе.

* Много предостережений, так как определения этих слов и их использование довольно расплывчаты

Ответ 2

Кажется, вы задаете три вопроса в одном:

  • В чем разница между компилятором и транспилером?
  • Do Angular и TypeScript реализовать компиляторы или транспиляторы?
  • Есть ли отдельный компилятор Angular? Что он компилирует?

В чем разница между компилятором и транспилером?

@JörgWMittag предоставил очень хороший ответ на этот вопрос.

Do Angular и TypeScript реализовать компиляторы или транспиляторы?

И TS, и Angular реализуют реальные компиляторы. Они выполняют те же самые этапы лексического анализа, анализа, семантического анализа и генерации кода как компиляторы C/С++, которые производят код сборки (за исключением, вероятно, для оптимизации). Вы можете видеть, что класс/папка называется "компилятор" как в Angular, так и TS.

Компилятор Angular не связан с компилятором TypeScript. Это очень разные компиляторы.

Есть ли отдельный компилятор Angular? Что он компилирует?

Angular имеет два компилятора:

  • Просмотр компилятора
  • Компилятор модуля

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

Помимо преобразования шаблона, компилятор представления также компилирует различные данные метаданных в виде декораторов, таких как @HostBinding, @ViewChild и т.д.

Предположим, вы определили компонент и его шаблон следующим образом:

@Component({
  selector: 'a-comp',
  template: '<span>A Component</span>'
})
class AComponent {}

Используя эти данные, компилятор создает следующий слегка упрощенный компонент factory:

function View_AComponent {
  return jit_viewDef1(0,[
      elementDef2(0,null,null,1,'span',...),
      jit_textDef3(null,['My name is ',...])
    ]

Он описывает структуру представления компонентов и используется при создании экземпляра компонента. Первым node является определение элемента, а второе - текстовое определение. Вы можете видеть, что каждый node получает необходимую информацию при создании экземпляра через список параметров. Его задача компилятора разрешить все необходимые зависимости и предоставить их во время выполнения.

Я настоятельно рекомендую прочитать эти статьи:

Также см. ответ на В чем разница между Angular AOT и JIT-компилятором.

Задача компилятора модуля заключается в создании модуля factory, который в основном содержит объединенные определения поставщиков.

Для получения дополнительной информации прочитайте:

Ответ 3

Typescript переходит в JS. Затем происходит дрожание дерева, "меньше" (необязательно) и что еще в процессе развертывания. Но ничего подобного (afaik) не имеет ничего общего с "компиляцией". Все становится в комплекте и сильно оптимизировано, но оно фактически не составлено, правильно?

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

Компиляция просто означает перевод программы с языка A на язык B. Что все это значит. (Также обратите внимание, что для A и B вполне возможно быть одним и тем же языком.)

В некоторых случаях у нас есть более специализированные имена для некоторых видов компиляторов, в зависимости от того, что A и B, и что делает компилятор:

  • Если A воспринимается как язык ассемблера, а B воспринимается как машинный язык, тогда мы называем его ассемблером,
  • Если A воспринимается как машинный язык, а B воспринимается как язык ассемблера, тогда мы называем его дизассемблером,
  • Если A считается более низким, чем B, то мы называем его декомпилятором
  • если A и B - это один и тот же язык, и результирующая программа работает быстрее или легче, тогда мы называем это оптимизатором
  • если A и B - одни и те же языки, а результирующая программа меньше, тогда мы называем ее minifier,
  • если A и B - одни и те же языки, и полученная программа менее читаема, тогда мы называем ее обфускатором,
  • Если A и B воспринимаются как примерно одинаковые уровни абстракции, мы называем это транспилером и
  • если A и B воспринимаются как примерно одинаковый уровень абстракции, и полученная в результате программа сохраняет форматирование, комментарии и намерения программистов, так что возможно поддерживайте полученную программу так же, как и исходную программу, тогда мы называем ее реинжиниринговым инструментом.

Также обратите внимание, что более старые источники могут использовать термины "перевод" и "переводчик" вместо "компиляции" и "компилятора". Например, C говорит о "единицах перевода".

Вы также можете наткнуться на термин "процессор языка". Это может означать либо компилятор, либо интерпретатор, либо оба компилятора и интерпретаторы в зависимости от определения.

Javascript сам по-прежнему интерпретируется, верно?

JavaScript - это язык. Языки - это набор логических правил и ограничений. Языки не интерпретируются и не компилируются. Языки просто.

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

Эти два члена принадлежат на разных уровнях абстракции. Если английский язык был типизированным, "интерпретируемый язык" был бы ошибкой типа.

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

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

Пример: каждая существующая в настоящее время реализация JavaScript для основного потока имеет компилятор.

V8 начался как чистый компилятор: он скомпилировал JavaScript прямо на умеренно оптимизированный собственный машинный код. Позже был добавлен второй компилятор. Теперь есть два компилятора: легкий компилятор, который производит умеренно оптимизированный код, но сам компилятор очень быстрый и использует небольшую ОЗУ. Этот компилятор также вводит код профилирования в скомпилированный код. Второй компилятор - более тяжелый, медленный, более дорогой компилятор, который, однако, производит гораздо более быстрый и быстрый код. Он также использует результаты кода профилирования, введенного первым компилятором для принятия решений по динамической оптимизации. Кроме того, решение, которое код для повторной компиляции с использованием второго компилятора выполняется на основе этой профилирующей информации. Обратите внимание, что ни разу не присутствовал переводчик. V8 никогда не интерпретирует, он всегда компилируется. Он даже не содержит переводчика. (На самом деле, я считаю, что в настоящее время это так, я описываю первые две итерации.)

SpiderMonkey компилирует JavaScript в байт-код SpiderMonkey, который затем интерпретируется. Интерпретатор также просматривает код, а затем наиболее часто исполняемый код компилируется компилятором на собственный машинный код. Таким образом, SpiderMonkey содержит два компилятора: один из JavaScript для байт-кода SpiderMonkey, а другой из байт-кода SpiderMonkey для собственного машинного кода.

Почти все механизмы выполнения JavaScript (за исключением V8) следуют этой модели компилятора AOT, который компилирует JavaScript в байт-код, и механизм смешанного режима, который переключает между интерпретацией и компиляцией этого байт-кода.

Вы написали в комментарии:

Я действительно думал, что машинный код где-то связан.

Что означает "машинный код"?

Что такое машинный язык одного человека - это другой промежуточный язык человека и наоборот? Например, есть процессоры, которые могут изначально запускать байт-код JVM, на таком CPU, байт-код JVM - это собственный машинный код. И есть интерпретаторы для машинного кода x86, когда вы запускаете эти машинные коды x86, интерпретируется байт-код.

Существует интерпретатор x86, называемый JPC, написанный на Java. Если я запускаю машинный код x86 на JPC, запущенном на собственном JVM-процессоре... который является байт-кодом и который является собственным кодом? Если я компилирую машинный код x86 на JavaScript (да, есть инструменты, которые могут это сделать) и запускать его в браузере на моем телефоне (который имеет процессор ARM), который является байт-кодом и который является собственным машинным кодом? Что делать, если программа, которую я компилирую, является эмулятором SPARC, и я использую его для запуска кода SPARC?

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

Ответ 4

Получение кода, который вы написали для запуска в браузере, включает в себя две вещи:

1) Пересылка Typescript в JavaScript. Это своего рода проблема. Я думаю, что они просто используют webpack.

2) Компиляция абстракций angular в JavaScript. Я имею в виду такие вещи, как компоненты, трубы, директивы, шаблоны и т.д. Это то, над чем работает основная команда angular.

В случае, если вас действительно интересует этот второй бит, компилятор angular, наблюдатель, автор компилятора Tobias Bosch, объясняет компилятор angular на AngularConnect 2016.

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

Ответ 5

Для получения более подробной информации следуйте: https://en.wikipedia.org/wiki/Angular_(web_framework)

Straight answer to your question is: 

У angular нет компилятора. Потому что это не язык.

Но у typcript есть компилятор, на котором написана языковая угловая библиотека /FrameWork.

Так как у него нет компилятора, он не может ничего скомпилировать.

1.) " Angular " (версии 2.x и выше) - это библиотека /FrameWork, написанная с использованием языка, который называется typcript.

2.) Напротив, angularjs (версии 1.x) - это библиотека /FrameWork, написанная на языке, называемом сценарием Java.

почему компилятор:

Поскольку angular написан с использованием машинописного текста, он неизвестен браузеру (это реальная платформа, на которой функциональный код выполняется для веб-приложений).

Таким образом, с помощью компилятора машинописи угловые компоненты преобразуются в понятные браузеру компоненты Java-скриптов.

Ответ 6

СОВЕТЫ ДЛЯ ВСЕХ: Всегда всегда НАЧИНАЙТЕ ответы (и исследования) с ОПРЕДЕЛЕНИЙ! СЛОВАРЬ MERRIAM-WEBSTER... Компилировать: глагол компьютеров: "преобразовать (инструкции по программированию) в форму, понятную и понятную компьютеру"

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

ОБСУЖДЕНИЕ: Словарь Вебстера здесь следует считать высшим авторитетом, но его определение разочаровывающе расплывчато.

Википедия действительно является фактическим авторитетным источником. Если в этом случае мы рассматриваем его объяснение как вышестоящий орган, то он (как обычно) старается предложить некоторые действительно полезные идеи, особенно следующие:

  1. Компиляция в самом строгом смысле означала "перевод программного кода с языка, который НЕ был непосредственно исполняется компьютером, в код, который непосредственно исполнялся компьютером".
  2. ЕСЛИ мы принимаем вышеупомянутое как ОБЩЕЕ определение "компиляции"... ЕСЛИ все, что происходит в Angular, это "перевод" Typescript в Javascript... ЕСЛИ для кода Javascript все еще требуется "Интерпретация" в байт-код... Если байт-код затем интерпретируется node.js в код, исполняемый компьютером... ТО, что делает Angular, НЕ "СОБИРАЕТСЯ" в прямом смысле. Период.

ЭТО СКАЗАЛ...

  1. ЕСЛИ мы ослабляем наше определение "компиляции", чтобы просто означать "перевод программного кода с языка более высокого уровня на язык более низкого уровня"... Если мы принимаем, что Typescript является (во многих отношениях) языком "более высокого уровня" чем Javascript... ТО, что делает Angular (перевод Typescript на Javascript) "компилируется"...

ЭТО СКАЗАЛ...

  1. Если мы введем несколько новых типов компиляции (согласно Википедии):
    • Компиляция: перевод кода с языка более высокого уровня на язык более низкого уровня;
    • Транспилирование: перевод кода между по существу "эквивалентными" языками; а также
    • Декомпиляция: перевод кода с языка более низкого уровня на язык более высокого уровня; ПОТОМ, будет ли Angular "компилировать" или "переносить", зависит от того, принимаете ли вы утверждение, что Typescript (даже немного) является языком "более высокого" уровня, чем Javascript.

Мне? а. Я предпочитаю "рабочее определение" компиляции как "перевод с высокого на низкий"; (оно более обобщенно и оставляет место для эволюции определения) b. Я также действительно считаю Typescript языком, возможно, "более высокого уровня", чем Javascript; SO c. Я в порядке с Angular, утверждающим, что он "компилируется"

АЛЬТЕРНАТИВА НЕОБХОДИМА: если мы требуем, чтобы "компилирование" означало "перевод в" исполняемый "код"; ЕСЛИ мы принимаем, что Typescript "выше", чем Javascript; ТОГДА Angular НЕ "компилирует": - | но ТАКЖЕ Angular И даже не "переносит" :-(! В действительности мы НЕ МОЖЕМ ДАЖЕ ОПИСАТЬ ТОЛЬКО ЧТО Angular ДЕЛАЕТ, используя доступный словарь!

Поэтому я "обобщаю" (читай "расслабляюсь") мое определение "компилировать", чтобы оно означало просто "выше-ниже" вместо "выше-к-машине", и теперь мой доступный словарь МОЖЕТ описать, что делает Angular - это IS "компилирует"

Если целью этого обсуждения является УЛУЧШЕНИЕ ПОНИМАНИЯ, то я надеюсь, что мое небольшое предложение будет полезно для некоторых.

Приветствия, -Mark в Северной Авроре, Иллинойс