Чем отличается компиляция (tsc) от транспиляции?

Когда речь заходит о TypeScript, часто употребляются два термина — компиляция и транспиляция. На первый взгляд они кажутся синонимами, так как в обоих случаях происходит преобразование кода. Однако между ними есть принципиальные различия, которые важно понимать, особенно в контексте работы с tsc — стандартным компилятором TypeScript.

Что такое компиляция

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

В случае TypeScript компиляция означает анализ исходного кода на наличие ошибок и преобразование его в JavaScript. Несмотря на то что результатом является не машинный код, а код на другом языке высокого уровня, сам процесс все равно называется компиляцией, потому что происходит проверка типов, анализ структуры программы и применение правил языка.

Что такое транспиляция

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

Пример транспиляции — перевод TypeScript в JavaScript. Здесь не происходит понижения уровня кода до машинного представления, вместо этого создается код, который можно выполнить в среде исполнения JavaScript, например, в браузере или Node.js.

Как работает tsc

Инструмент tsc выполняет одновременно и компиляцию, и транспиляцию.

  • С одной стороны, он компилирует код, потому что проверяет правильность типов, соответствие синтаксису и выявляет потенциальные ошибки еще до выполнения программы.

  • С другой стороны, он транспилирует код, так как конечный результат работы компилятора — это JavaScript, который имеет аналогичный уровень абстракции и может быть выполнен в стандартных JS-движках.

Принципиальное различие

  • Компиляция — это процесс анализа и преобразования кода в более низкоуровневое представление с проверкой типов и строгим контролем.

  • Транспиляция — это преобразование кода в другой язык высокого уровня без значительной потери абстракции.

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