Имеет ли чувствительность к регистру какое-либо отношение к строго типизированным языкам (или слабо типизированным языкам)?

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

Я искал в Google строго типизированный язык для официального определения, и одна из основных ссылок, которые я нашел, была из Yahoo Answers, в котором говорилось, что чувствительность к регистру является частью слабой / строгой типизации языка.

Я всегда думал, что простой ответ на разницу между строго типизированным / слабо типизированным языком состоит в том, что первый требует явного объявления типов, тогда как второй более открытый, даже «динамический».

Два потока S / O (здесь и здесь) Я обнаружил, что до сих пор, похоже, предлагал это (более или менее), но они ничего не упоминают о чувствительности к регистру. Есть ли вообще связь между чувствительностью к регистру и сильным / слабым?


person ina    schedule 15.12.2010    source источник
comment
Ваш источник - плохая шутка, очень похожая на: В. Вы знаете, почему некоторые компьютерные ученые так сильно нажимают на клавиши, когда набирают свои программы? A. Они предпочитают СИЛЬНО ТИПОВЫЕ языки!   -  person Nathan Smith    schedule 27.07.2017
comment
вау, это был действительно очень старый вопрос 7 лет назад, когда я был в основном человеком php / javascript   -  person ina    schedule 27.07.2017


Ответы (3)


Пара уточнений:

  1. Чувствительность к регистру не имеет ничего общего с сильной и слабой типизацией, статической и динамической типизацией или любым другим свойством системы типов. Я не знаю, почему ответ на ответы Yahoo получил один положительный голос, но это совершенно неверно. Просто не обращай на это внимания.

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

    Например, умножение строк "foo" и "bar" дает 0 в качестве результата в perl, в то время как это вызывает ошибку типа в ruby, python, java, haskell, ml и многих других языках. Таким образом, эти языки более строго типизированы, чем perl.

    Строгая типизация также иногда используется как синоним статической типизации.

  3. Статически типизированный язык - это язык, в котором типы переменных, функций и выражений известны во время компиляции (или в любом случае до времени выполнения - статически типизированный язык не нужно компилировать как таковой, хотя на практике это обычно так). Это означает, что если программа со статической типизацией содержит ошибку типа, она не будет запущена. Если программа с динамической типизацией содержит ошибку типа, она будет работать до точки, в которой возникает ошибка, а затем выйдет из строя.

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

Что еще более важно, существует множество статических и строго типизированных языков (например, Haskell, ML), которые не требуют аннотаций типов, но вместо этого используют алгоритмы вывода типов для вывода типов.

person sepp2k    schedule 15.12.2010

Теоретически чувствительность к регистру совершенно не связана со строгостью типов. Чувствительность к регистру зависит от того, относятся ли идентификаторы foo, FOO и fOo к одной и той же переменной, функции или чему-то еще. Строгость к типу зависит от того, имеют ли переменные типы или только значения, насколько легко преобразовывать типы и т. Д.

На практике может существовать корреляция между чувствительностью к регистру и строгостью типов, но сейчас я не могу придумать достаточно языков, нечувствительных к регистру, для проведения оценки. У меня сложилось впечатление, что большинство широко используемых сегодня языков чувствительны к регистру, возможно, потому, что C был чувствителен к регистру и был очень влиятельным, возможно, потому, что это был единственный способ заставить людей прекратить ПРОГРАММИРОВАНИЕ ВСЕГО ЗАГЛАВНЫМИ буквами после пары десятилетий использования FORTRAN, COBOL и BASIC.

person zwol    schedule 15.12.2010
comment
Если есть корреляция, она несовершенная. Например, Pascal более строго типизирован, чем C (меньше неявных преобразований, нет нетипизированных указателей), но он нечувствителен к регистру, а C чувствителен к регистру. - person David Gelhar; 15.12.2010

Нет, они не связаны. Языки со строгим типизацией заставляют вас указывать тип данных, которые может содержать переменная, например, действительное число, целое число, текстовая строка или некоторый объект, определенный программистом. Вы не можете случайно назначить другой тип данных этой переменной, если она не является неявно конвертируемой: примеры этого заключаются в том, что вы обычно можете поместить целое число в действительное число (т.е. double x = 3.14; x = 3; в порядке, но int x = 3; x = 3.14; может не быть, в зависимости от того, насколько сильно набрал язык). Слабо типизированные языки просто сохраняют все, что от них требуется, без этих проверок работоспособности. В строго типизированных языках, таких как C ++, вы все равно можете создать тип, который может хранить данные, которые могут быть любым из определенного набора типов (например, C ++ boost::variant), но иногда они немного более ограничены в том, сколько вы можете сделать и насколько удобно. это использовать.

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

person Tony Delroy    schedule 15.12.2010