Pull to refresh

Comments 19

Объявления типа переменной не требуется, поскольку Smalltalk — динамически типизированный язык.
Но ведь в статически типизированных тоже не требуется. Даже больше того. В некоторых языках можно объявлять переменную не назначая ей значение, получится неинициализированная переменная (в си так можно). Так вот в динамически типизированных объявление переменной без типа — аналог объявления переменной без значения в статически типизированных, что не очень хорошо. В статически типизированных такой проблемы нет, если не указать тип, то он все равно будет назначен статически.
В смолтолке вообще нет синтаксиса для объявления у переменной типа. Автор видать это хотел сказать.
Фраза, к которой вы зачем-то попытались придраться, абсолютно верная: динамическая типизация => объявлять тип переменных не нужно.
Наличие вывода типов (вы, возможно это имели ввиду, но забыли уточнить?) в некоторых статически типизированных языках (что делает необязательным явно указывать типы) никоим образом не делает исходное утверждение неверным. Вам бы логику подучить? ;)

«Даже больше того». Дальнейший текст не имеет вообще никакого смысла: несмотря на то, что тип переменной в Smalltalk не указывается, она всегда инициализируется конкретным значением, и проблемы неинициализированных переменных здесь просто нет.
«Так вот в динамически типизированных объявление переменной без типа» — ничего общего с объявление переменной без значения в статически типизированных не имеет.
Если есть значение, значит и тип точно есть. Динамическая типизация означает что тип может меняться во время выполнения, но не то что значение может быть вообще без типа.
несмотря на то, что тип переменной в Smalltalk не указывается, она всегда инициализируется конкретным значением
Значит и тип всегда при инициализации есть конкретный. Значит там такой же вывод типов. То что вывод типов сначала появился в динамически типизированных языках не значит что не указывать типы можно по причине динамической типизации.
Вывод типов => объявлять тип переменных не нужно. Динамическая или статическая типизация — не важно.
Теперь я понял цель исходного комментария — вы хотите разобраться с типами? ;)

Если есть значение, значит и тип точно есть. Динамическая типизация означает что тип может меняться во время выполнения, но не то что значение может быть вообще без типа.

Рад, что вы это понимаете (с некоторыми оговорками — см. ниже).
Динамическая типизация в Smalltalk — строгая типизация. Кстати, статическая типизация не обязательно влечет за собой строгую (в качестве примера можете взять упомянутый вами же C).

Значит и тип всегда при инициализации есть конкретный.

В каждый момент времени в переменной лежит конкретное значение — ему можно приписать некий «тип». Только надо бы понять, что такое «тип». Оставим это (пока) на самостоятельное изучение?

Значит там такой же вывод типов.

Вывод типов => объявлять тип переменных не нужно. Динамическая или статическая типизация — не важно.

Никакого вывода типов в языках с динамической типизацией нет. Вывод типов — «фишка» языков со статической типизацией, позволяющая системе на основе анализа кода понять тип переменной на этапе компиляции. Просто чтобы пользователю не приходилось заниматься этой утомительной работой.

В динамических языках проверка типа осуществляется в момент выполнения. В том же Smalltalk-е, в частности, это означает, что объект, получив сообщение, либо найдет в классе, экземпляром которого данный объект являтся, (или в классе выше по иерархии) соответсвующий метод, либо выкинет исключение пошлет себе специальное сообщение #doesNotUnderstand.

На самом деле, надо понимать, что (по крайней мере) в исходном понимания ООП типы не предусмотрены, и мы с определенной долей условности «проецируем» позднее связывание на понятие типизации. А на самом деле, в Smalltalk таки
значение может быть вообще без типа
И даже не «может быть», а всегда без типа! Но при этом, Smalltalk — язык со строгой динамической типизацией. :)

Да, я это понимаю. Почти со всем согласен кроме
И даже не «может быть», а всегда без типа!
Тогда типизация бы называлась «никакая». Но она называется «строгая статическая». Там всегда тип есть. Просто нету соответствия между типом и конкретным местом кода.
Тогда типизация бы называлась «никакая».
Типизация была бы «никакая», если бы объект можно было заставить выполнить недопустимую операцию.
Но она называется «строгая статическая».
Она называется «строгая динамическая» — потому что заставить выполнить «недопустимую операцию» невозможно.
Там всегда тип есть.
Типа нет! Я выше объяснил, почему. Не верите — загрузите Pharo (или любую другую реализацию Smalltalk) и убедитесь лично ;) …ну, или найдите его там
То была описка (статическая динамическая). А вы объяснили что
В динамических языках проверка типа осуществляется в момент выполнения.
Это я и так знал. Странно что осуществляется проверка того чего нет.
> Странно что осуществляется проверка того чего нет.
Чтобы не было странно надо (а) понять, что такое тип и (б) взять слова «проверка типа» в кавычки: в том же Smalltalk-е проверки типов как таковой нет; она просто не нужна, так как (строгая динамическая) «типизация» заложена в основополагающий для ООП принцип посылки сообщений и в Smalltalk-е реализована вполне себе надежным способом.
Тип — это умозрительная вещь. Не обязательно в коде компилятора (интерпретатора) должны быть явно структуры данных отвечающие за тип что-бы считать что компилятор (интерпретатор) работает с типом. Обычно в машинном коде не остается и следов типов. А в действиях интерпретатора может не быть явных проверок если он сможет доказать что они не нужны. Типы данных появляются «на бумаге», когда мы (люди) анализируем язык.
Вот так сложилось что понятие «тип» используют при рассуждениях о языках программирования, даже если интерпретатор не использует.
Тип — это умозрительная вещь.
Когда компилятор статически типизированного языка отказывается компилировать вашу программу из-за несовместимости типов или программа на динамически типизированном языке выкидывает исключение по той же причине —  в чей ум она обращается? :)

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

Однако, похоже, мою мысль про отсутствие типов в Smalltalk-е при наличии «типизации» надо пояснить. В качестве контр-примера возьмем Java. Там типом объекта (примитивные типы не рассматриваем) является его класс. Часть контроля типов выполняется в момент компиляции (статически). Но, поскольку типы в Java «кривые» (если сравнивать с наследниками ML), приходится допускать возможность «обходить» контроль типов и система вынуждена часть проверок выполнять в run-time. И это именно проверка типа: если я хочу послать некоторому объекту сообщение X(), система сначала должна убедиться, что я «имею право это сделать» (метод реализован в классе объекта или в родительском классе), если нет — имеем исключение. То есть, типы есть, они материальны, более того, они присутствуют даже в рантайм.

В Smalltalk-е типов нет, даже класс объекта не задает его тип: я могу послать абсолютно любое сообщение любому объекту. Звучит как полное отсуствие типизации? А вот нет! Механизм связывания сообщений с методами обеспечивает что-то вроде «проверки типов» (при фактическом отсуствии типов на всех этапах и в каком бы то ни было виде — даже в «умозрительном»): система обращается к классу объекта, просит найти соответствующий сообщению метод; если не находит, делает тоже с родительским классом… пока не упирается в корень иерархии; если это произошло, объекту посылается сообщение #doesNotUnderstand (которое, как минимум, реализовано в классе Object, и, следовательно, не приведет к крушению системы), обеспечивающее нужную обработку данной ситуации. То есть, типов нет, проверки типов нет, а поведение полностью аналогичное строгой динамической типизации есть!

Да, Smalltalk — необычный язык и говорить о его типах нужно осторожнее. Я понял вас, так тоже можно считать.
Я это читал еще давным давно. Просто у меня странное (может даже иррациональное) желание сказать что тип можно не указывать не потому что динамическая типизация. Хотя да, из-за динамической типизации теряется связь между местом в коде и типом, значит даже при желании тип не получится явно указывать. Я просто мало программировал на таких языках, только на питоне чуть-чуть и то для работы, а не по собственному желанию.
В общем случае тип можно не указывать по разным причинам:
— за вас это может сделать кто-то другой (вывод типов)
— они будут определены и проверены автоматически в момент выполнения программы
— их просто нет
(Последнее не означает автоматически, что нет типизации. Но и наличие типов не гарантирует сильную/строгую типизацию.)
Очень интересный вопрос. Может быть, дадите ответ? Я бы с удовольствием узнал ответ.
Sign up to leave a comment.

Articles