Как стать автором
Обновить

TypeScript Native (AOT) Compiler

Время на прочтение2 мин
Количество просмотров6.7K

Имплементация нативного Ahead-of-Time компилятора для языка TypeScript

Абстракт

Со времен появления языков программирования С и С++ прошло много времени, за это время появилось много новых языков таких как Java, C#, F#, Rust, Erlang, Python и т.д. Все новые языки привносили что-то новое в способы программирования и решения типичных задач для программирования. С распространением интернета появились такие языки как JavaScript и его преемник TypeScript. Последний, в свою очередь, стал очень популярный для Web-разработок.

Вступление

С и С++ остаются лидерами среди компиляторов для нативного кода, но со временем многие люди перешли с С++ на новые языки такие как TypeScript и уже позабыли практики применяемые для программирования на С++. Позвольте мне представить Вам попытку разработать компилятор, который бы использовал TypeScript как язык для компилирования машинного кода как это делает C или С++.

TypeScript Native (AOT) Compiler (далее tsc)

Давайте посмотрим в чем разница между кодом С/C++ и таким же кодом на TypeScript.

C/C++ код

#include <cstdio>

int foo(int val)
{
  return val;
}

int main()
{
  int val = 1;
  printf("Value: %d", foo(val));
  return 0;
}	

и аналог на TypeScript

function foo(val = 0)
{
  return val;
}

function main() {
  const val = 1;
  print("Value:", foo(val));
}

Как мы видим большой разницы между кодом нет, но для любителей TypeScript синтаксис С/C++ имеет много ненужных вещей. Например, зачем явно указывать тип переменной если ее тип компилятор может определить сам во время компиляции.

tsc позволяет компилировать нативный код или выполнять сразу без компиляции (JIT). Это удобно для проверки кода без "долгой" компиляции и когда код готов, сгенерировать выполняемый файл (EXE). Так же есть возможность генерировать WASM и выполнять его в Chrome и всех броузерах, которые поддерживают WASM.

tsc Так же позволяет компилировать код с использованием GC(Garbage collection) или отключать его и управлять памятью самостоятельно.

Взаимодействие с С/C++

Так как tsc компилирует нативный код, то взаимодействие с С/C++ уже доступно "out-of-box", достаточно продекларировать функцию, которую хотите использовать, например:

type int64 = 2147483648;
declare malloc(size: int64): any;

Заключение

tsc разрабатывается с использование LLVM и находиться сейчас в активной разработке. Принять участие в разработке или попробовать компилятор самому можно на Git ASDAlexander77/TypeScriptCompiler: TypeScript Compiler (by LLVM) (github.com)

Теги:
Хабы:
Всего голосов 17: ↑11 и ↓6+5
Комментарии25

Публикации

Истории

Работа

Программист C++
133 вакансии
QT разработчик
8 вакансий

Ближайшие события