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

Комментарии 25

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

#include <cstdio>

template <typename T>
T foo(T val)
{
  return val;
}

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

Или даже так, если что-то поновее:


#include <cstdio>

auto foo(auto val)
{
  return val;
}

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

Но это довольно непрозрачный и плохой код, т.к. читателю не понятно, какой тип имеет val — unsigned или signed? Размерность 8, 32 или 64 бита? Надо знать как язык (и порой как конкретный компилятор для конкретной платформы) эти типы выводит, что особенно ужасно, если это код, который могут смотреть новички или люди, которые знакомы не конкретно с этим, а с другими языками.
Поэтому преимуществом это если и можно назвать, то очень не всегда.

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

void foo (unsigned x=0);
int y = 42;
foo(y); //warning: signed/unsigned mismatch

автор статьи этим утверждением обесценил строгую систему типов

Автоматический вывод типов не имеет к строгости системы никакого отношения.
В Haskell к примеру точно также можно нигде тип не указывать явно, и менее строгим он от этого не становится, тип все тот же, как если указать его явно.

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

НЛО прилетело и опубликовало эту надпись здесь

Сама по себе тема вполне интересная, но есть два "но":
1. Автору стоит поработать над изложением (вычитывать текст, проверять орфографию). Даже если закрыть глаза на орфографию, то в некоторых местах сломана логика повестования, например вот тут конец предложения словно вырван из другого места:

Это удобно для проверки кода без "долгой" компиляции и когда код готов, сгенерировать выполняемый файл (EXE)

2. Опущено гигантское количество внутренних деталей — то, что на Хабре бы очень оценили. Сейчас пост очень короткий и малоинформативный. Было бы интересно узнать, например, с какими проблемами автор столкнулся при генерации кода, насколько готов проект, какие подводные камни (например, насколько и как именно проект отступает от спецификаций). Можно было написать про стандартную библиотеку, которая уже существует и/или планируется.

В конце концов, TypeScript это лишь очень продвинутый тайпчекер, и поставить его на "рельсы" самостоятельного исполнения (без движка JS) это очень большая задача, о которой можно много рассказать.

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

Будет здорово, если напишете! Хабр, это одно из немногих мест в рунете, где аудитория любит и ценит лонгриды.

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

авто-определение типа — это не тоже самое что "не указываю". Вот в примере "foo(val = 0)" "= 0" говорит о то, что "val" будет целым 32битным числом со знаком (т.к. это тип целого по умолчанию). Поэтому писать код "type int = 0; foo(val: int = 0) {}" долго и не удобно. и дает одинаковый результат для проверки и компиляции

Только потому что вы задали дефолтное значение.
Сишное
int foo(int val)

Не эквивалентно
function foo(val = 0)

это если думать о ECMAScript то да. Но tsc компилятор не пытается повторить поведение ECMAScript а использует синтаксис TypeScript-а для компилирования нативного кода. т.е. val будет получать только "int" значения. если хочется передавать любые значения тогда надо писать "function foo(val: any = 0)"

Ваш пример как раз ни о чём не говорит в отрыве от конкретной имплементации. Если не смотреть в документацию, то откуда вы знаете, что там будет именно целое 32 битное число?


Ноль не обязательно в знаковом типе хранить, поэтому там вполне можно использовать и unsigned int.


В C, к примеру, тип int по стандарту должен содержать "at least" 16 бит, т.е. там не факт что и 32 даже будет даже если это действительно int. А если сделать жадный компилятор, который выбирает типы на основе возможных интервалов значений, то ноль можно и вовсе в 1 байт поместить, чтобы лишние 3 байта не тратить.


В Lua все числа представляются через double, поэтому число там не целое будет.
В JavaScript, по-моему, Number — это тоже double. Учитывая то, что взрослый TS транспайлится как раз в JS, тогда тут ещё вопрос возникает, откуда там взялись целые 32 битные числа.


Такие угадайки разве удобнее для читателя кода будут, чем написать сразу какой вы там тип хотите?

вы все верно сказали. но 32 бита для "int" используется автоматически из-за "выравнивания" и поэтому что бы использовать int16 нужно указать свой тип например: type int16 = 65535; и когда компилятор будет использовать 16 бит а не 32. Это некоторые особенности конкретной имплементации TSC и да это все нужно описывать в документации

Хм, уже название исполняемого файла спорное. Точно такое же название и у компилятора в js.

Я знаю, но на ум ничего не пришло.

tscc - typescript c compiler

tscc - ага это как намек на С++

Судя по всему, большая часть компилятора написана oduzhar. Можно поинтересоваться, чей же это проект на самом деле? Кто в действительности этот mlir-гуру который затащил ажно целый typescript?

Это один и тот же человек просто так получилось, что в одном броузере был один аккаунт, а в командной строке другой. Проект еще не закончен. там много еще чего делать, например - темплейты, юнионы, оптимизация для GC. ref. counter стратегия и так далее. работы на много лет. нужна помощь а ее нет.

Ну, похоже что помощи ждать неоткуда. Mlir, по всей видимости, новая сложная штука. Кроме того, неочевиден business value такого компилятора.

иметь нормальный С++ компилятор в виде TypeScript-а .. все новички, которые хотят писать нативный код обзавидуются :)

mlir часть уже как бы закончена там вряд ли будут изменения. нужна уже runtime поддержка

Ой, я понял, это две учётки одного человека. Александр, это очень круто, огромная качественная работа.

спасибо.. век помнить буду :)

НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории