?

Log in

No account? Create an account
November 2016   01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
cartoon

TypeScript: Static or Dynamic?

Posted on 2016.06.15 at 21:49
Tags: ,
https://medium.com/@gaperton/typescript-static-or-dynamic-64bceb50b93e#.mbkvfp8hh

Про TypeScript, и немного про теорию языков программирования вообще.

В связи с ростом популярности TypeScript, оживились флеймы static vs dynamic languages. Стороны опять точат копья.

А дело в том, что война окончена. В статье я, взрывая мозг примерами, популярно объясняю, что такое soft type system. На примере TypeScript. Ну и заодно делая небольшой экскурс в терминологию и понятия теории языков программирования.

Comments:


Николай Меркин
kodt_rsdn at 2016-06-16 03:32 (UTC) (Link)
Прямо уж взорвал примерами. Три раза написал function g().
Взгляд на типы с позиции менеджера, как на средство QA, это правильно, но чую, что неполно. Как минимум, в типы удается вынести генерацию обобщённого кода, т.е. уменьшить писанину и повысить выразительность.
А "мягкая типизация" - это расхожий термин или свежевведённый?
Имхо, любой язык с возможностями стирания типа, вплоть до тупо реинтерпреткаста к void*, сюда попадает. Или кое-кто что-то недоговорил и недовзорвал...
Gaperton
gaperton at 2016-06-16 04:47 (UTC) (Link)
> А "мягкая типизация" - это расхожий термин..

О. Это очень cтарый термин. Сейчас совсем не в моде. Даже статьи в википедии нет. Погуглите.

Edited at 2016-06-16 04:57 am (UTC)
Gaperton
gaperton at 2016-06-16 04:49 (UTC) (Link)
> Имхо, любой язык с возможностями стирания типа, вплоть до тупо реинтерпреткаста к void*, сюда попадает.

Конечно же нет.
Gaperton
gaperton at 2016-06-16 04:59 (UTC) (Link)
> Взгляд на типы с позиции менеджера

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

Ты считаешь, что-то "неполно"? Дополни.

Edited at 2016-06-16 05:37 am (UTC)
Николай Меркин
kodt_rsdn at 2016-06-16 03:48 (UTC) (Link)
Кстати, а кто сказал, что тип оператора деления - (any,any):number?
Если он перегружен, там вполне может быть (number,number):number|(MySuperFoo,xz):MyDuperBar|(any,any):number=NaN.
Т.е., иногда на выходе будет не число и даже не боттом, поэтому придётся обобщить результат до всё того же any.
Либо транслятор должен оттрассировать все вхождения функции g()...
Gaperton
gaperton at 2016-06-16 04:51 (UTC) (Link)
Особенности интерпретации оператора деления определяет конкретная ситема типов. Как она скажет - так и будет. В ней, например, может не быть никакого NaN, которое number. В ней могут быть, или не быть перегруженные операции.

Я намеренно упростил. Этот пример - это простейшая иллюстрация некой концепции, которая объясняется. Текст расчитан на человека, который не знает ничего, кроме JavaScript. И аппелирует к нему.

Я думаю, это вполне понятно, не? Концепция понятна? Или у нас проблемы с пониманием примеров?

Edited at 2016-06-16 05:30 am (UTC)
Gaperton
gaperton at 2016-06-16 05:11 (UTC) (Link)
С местными правилами бана, кстати, ты знаком, дружище? :) Оно называется "о модерировании и мудаках". Крайне рекомендую. Куда более строгое, чем на РСДН :)

Нет то, чтобы я намекал на что-то. Не пойми меня неправильно. Я уверен, что не смотря на некоторые смутные сигналы (это о моих догадках касательно твоего мотива оставлять здесь комментарии), ты сможешь держать себя в руках :)

http://gaperton.livejournal.com/62888.html

Edited at 2016-06-16 05:21 am (UTC)
VoidEx
voidex at 2016-06-16 06:56 (UTC) (Link)
А тип function const(a, b) { return a; } выведет как any, any -> any?
А тип function app(f, x) { return f(x); }?

По поводу g, я не понял, почему именно вывело any:
1. Так как в JS можно любой объект делить на 10 (если не число), и получится NaN, и именно поэтому вывело any
2. В JS в любую функцию можно всегда передать что угодно, поэтому и any

А что понимается под "война окончена"? Если то, что адепты статики скажут, что это очень хороший компромисс, то сомнительно, ибо им dep types подавай.
Gaperton
gaperton at 2016-06-16 07:37 (UTC) (Link)
> А тип function const(a, b) { return a; } выведет как any, any -> any?

Да. Так и выводит. Вот здесь можно посмотреть. https://www.typescriptlang.org/play/

> А тип function app(f, x) { return f(x); }?

Да. Выводит как все any. Не смотря на то, что могло бы предположить что f - это function.

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

Это я и имею в виду, когда говорю, что TS - динамический язык. А ведь с опциональными аннотациями типов и выводом типов это и правда хрен разберешь, не так ли?

Edited at 2016-06-16 07:43 am (UTC)
Gaperton
gaperton at 2016-06-16 07:40 (UTC) (Link)
> А что понимается под "война окончена"? Если то, что адепты статики скажут, что это очень хороший компромисс, то сомнительно, ибо им dep types подавай.

Ну, имеется более примитивный холивор, чем зависимые типы. Такой, совсем брутальный. Вроде "типы - говно!". Примерно треть детей выросших на динамическиз языках так реагирует. Оно есть. Я видел в конфах. Статья написана по мотивам флейма в Israel JavaScript, который меня совершенно изумил.
Gaperton
gaperton at 2016-06-16 07:49 (UTC) (Link)
> 1. Так как в JS можно любой объект делить на 10 (если не число), и получится NaN, и именно поэтому вывело any

Разные системы типов могут делать разные предположения. Мы легко можем навесить на JS более строгую систему типов, например. Которая запрещает NaN. И это будет по своему логично - как правило появление статически выводящегося NaN ничем хорошим не грозит, это явная ошибка.

Но это выбор разработчиков TypeScript. Они сделали такую систему типов, которая трактует этот NaN как норму, так что у нас выводится any. Она динамеческая.

Edited at 2016-06-16 07:57 am (UTC)
Николай Иваныч
nivanych at 2016-06-16 08:01 (UTC) (Link)
> TypeScript

Ладно бы PureScript...
Gaperton
gaperton at 2016-06-16 08:07 (UTC) (Link)
Пишите про PureScript.
Владимир Макайда
byyj at 2016-06-16 12:08 (UTC) (Link)
Генная инженерия, скрестили ужа с ежом и удивляются, почему оно не взлетает. Лучше бы в F# так вкладывались.

По существу хорошей статьи можно сказать, что пока вы не можете доказать математически полного покрытия тестами, любое маленькое движение в сторону строгой типизации будет полезно для качества, в ущерб скорости наброса. Typescript и есть такое аккуратное движение в эту сторону.
Трещиноватые коллекторы. Инструкция.
maksenov at 2016-06-17 02:37 (UTC) (Link)
TypeScript уже взлетел, и ради интереса просто стоит посмотреть какие библиотеки на нем написаны.

А не могли бы вы пояснить что значит математически полное покрытие тестами, и какой цели оно служит? Потому что если оно только гарантирует корректность использования всех типов, то это бессмысленно, потому что программа может быть некорректной, но все типы совпадают.
Previous Entry  Next Entry