?

Log in

No account? Create an account
nyaload

Журнал Пушыстого

Журнал Пушыстого

Previous Entry Share Flag Next Entry
Типизация: (не)строгая, статическая/динамическая, аннотации типов.
nyaload
_winnie
Есть такая вот боянистая картинка про типизизацию:




Я тут собрал похожую:


Кстати, явные аннотации типов и статическая типизация не одно и тоже, напр.
python - динамическая типизация, без аннотаций
haskell - статическая типизация, без аннотаций (опционально)
C++ - статическая типизация, с аннотациями
ActionScript - динамическая типизация. Стиль с аннотациями настоятельно навязывается компилятором и документацией.


динамически типизированные языки с аннотациями - сходу не вспомню, вроде Basic такой в каких-то диалектах, Dim quantity As Integer = 10 в комментах подсказали про ActionScript

И ещё одна терминологическая плоскость, которую тоже часто мешают со статической типизацией - "строгая типизация". Это когда без диагностики переменные случайно конвертируются во что-то неожиданное. Напр. ("hello, world" + '!') или std::string(false) в C++ или ("hello, world" + 10) в Java - пример нестрогой типизации. Другой вопрос, что в C++ всё сломается, а в Java получится строка "hello, world10".

Тут всё нечётко, в пределах одного языка могут как грабли, так и защита от дурака. Нельзя сказать, что в одном языке строгая типизация, а в другом нет. Так же грабли/защита от дурака могут быть не в языке, а в личном стиле программирования или в библиотеке. Но количество переходит в качество, которое позволяет сказать, что в python типизация строже чем в PHP, где полный ахтунг с взаимными преобразованиями строк, bool, undefined, int. В свою очередь, Java и Haskell тут строже python - bool/int не конвертируются друг в друга, пустая строка не интерпретируется как False.
Tags: ,


  • 1
Очень самоуверенно.
PS: STL, в некотором роде, чудовищен, но это проблема не статической типизации вообще, а чисто языка Си++. При этом, даже с STL многие проблемы можно обойти с помощью typedef и using.

Edited at 2010-02-15 04:14 pm (UTC)

ментально посылаю в ответ картинку, на которой доят быка

а молодая крестьянка пытается что-то делать с травой при помощи своей рыжей косы

а в сторонке джентльмен прикалывает бабочку-махаона к рубашке

def хлебать(щи, ложка):
assert(not isinstance(ложка, Лапоть))
....

Re: ментально посылаю в ответ картинку

Мне понравилась ваша картинка. Спасибо.
Я даже её процитировал у zamotivator.

Мне всегда представлялся робот, который тащит человека-рекламу, разодетого уткой, на бойню.

Re: ментально посылаю в ответ картинку, на которой доят

Увидел эту картинку и вспомнил этот разговор.
Хурма вяжет рот.

Энтропия и её отсутствие.

(Anonymous)
Много думал. Ведь интересное дело, есть у того же Жванецкого сценка про раков, которую Карцев хорошо озвучивает (у Колюша (http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BB%D1%8E%D1%88) видел нечто подобное (http://www.vlol.tv/videos/237/coluche-c-est-l-histoire-d-un-mec.html)). Там постоянно повторяется одно и то же. Но это можно смотреть и слушать много раз.

Но когда я вижу что-то сильно повторяющееся в коде - меня это сильно раздражает...

(Deleted comment)
Кажется, Cabria
Я не типо-граф-эстет, шрифты плохо различаю %) http://dobrokot.ru/pics/nya2010-02-15__22-44-17_2kb.png

(Deleted comment)
Чего-то я не понял. В языее C printf("%s\n","Hello, world"+10); честно печатает ld.
И если g++ откомпилировать, то тоже печатает ld. Даже если явно -xc++ сказать. Чего сломается-то?

Да, ты прав, в пределах микропримера в полстрочки любая эзотерика как на ладони и поведение легко определяется.

Я заменил в посте 10 на '!' (было "Hello, world"+10).

Подозреваю, ты понял что я имел ввиду -
1) неадекватное на взгляд стороннего человека сложение строки-указателя и числа :)
2) нередкая опечатка из реальных проектов, когда делалось не то, что имели ввиду, типа
path_string += '/'

НУ вообще-то если взять строчку подлиннее, чем "Hello, world" раза в три, то и восклицательный знак прибавлять можно. Это всего лишь 33.

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



А бывают и вот такие языки:
>>> "hello" + 33
: "hello33"
>>> "hello" % 33
: "hello!"
>>> "hello" / 33
: "hellР"

Изучаю, пока забавно...

... Кесарю - Кесарево, а Дедекинду - Дедекиндово ...


Картинка про белок улыбнула.

аннотации обычно называют manifest typing. примеры динамической манифестной типизации - ActionScript, Groovy, есть предложения ввести в питоне. это, конечно, примеры не обязательной манифестной типизации. обязательной динамичеcкой типизации я не видел (с тем или иным синтаксисом можно сделать переменную "нетипизированной").

В С++ аннотации не всегда обязательны

Угу, формально можно составлять пример, когда можно не писать типы. Например, выводить их при помощи перегруженной шаблонной функцией. И auto наверно начнёт активно юзаться лет через пять.
auto - оно в сейчас нестабильных версиях компиляторов, объявлять все переменные в шаблонах - это crazy.

Здесь самое время пофапать на C#, где var уже давно и хорошо юзабелен.

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

А есть ведь ещё и статически типизированный скриптовой язык:

http://en.wikipedia.org/wiki/Pike_%28programming_language%29

> python типизация строже чем в PHP, где полный ахтунг с взаимными преобразованиями строк, bool, undefined, int

А этот ахтунг усложняет написание/понимание, по сравнению с остальными?

При неумелом использовании — разумеется. В PHP5 стало можно декларировать классы/интерфейсы параметров методов — получилось слегка разумнее.

  • 1