Часть 1. Об определениях
Прежде всего, какой язык и реализацию вы называете паскалем? Если вы говорите об ISO Pascal чем он умер много лет назад. Если вы говорите о каком-то другом языке или реализации, предоставьте дополнительную информацию.
Во-вторых (как уже упоминал Теун Д.), не существует определения термина "строгая типизация". Взгляните на статью Википедии о строгой типизации.
Однако за короткую историю вычислительной техники этим терминам придавалось такое большое разнообразие значений, что зачастую трудно понять вне контекста, что имеет в виду отдельный автор, когда их использует.
Предположим, что мы следуем определению из статьи Луки Карделли Typeful Programming, описанной ниже на странице Википедии:
В статье Луки Карделли Typeful Programming строгая типизация описывается просто как отсутствие непроверенных ошибок типа во время выполнения. В других текстах отсутствие непроверенных ошибок во время выполнения называется безопасностью или безопасностью типов; В ранних работах Тони Хоара это называется безопасностью собственности.
В любом случае описанное поведение не может быть классифицировано как статичная (или безопасная) дисциплина типизации. Мне лично очень не нравится это хммм... Ну это не фича, это баг. знак равно
Часть 2. Ответ
Я думаю, что проблема не в этой слабой типизации, а в большом разнообразии целочисленных типов, доступных в некоторых языках.
Существуют ли какие-либо другие языки, применяющие такой синтаксис, кроме знаменитых C и C++?
Я думаю, что почти каждый статически типизированный язык с различными типами целых чисел имеет такое поведение. Было хорошей идеей иметь эти SHORTINT и все такое прочее в первые годы для экономии памяти. Но теперь, когда почти каждый ПК имеет около 1 ГБ и более оперативной памяти... Предположим, у нас есть 1 миллион 4-байтовых целых чисел вместо 2-байтовых коротких чисел. Это всего около 4 МБ ОЗУ вместо 2 МБ. Я думаю, что это разумная цена за отсутствие всего этого странного поведения, которое вы описали.
Взгляните на Оберон-07 Вирта (Language Report , PDF). Существует только один целочисленный тип — 32-битное INTEGER.
Также можно упомянуть Python (или, может быть, какой-то другой современный язык с динамической типизацией) с типом int, который представляет числа в неограниченном диапазоне, только в зависимости от доступной (виртуальной) памяти.
Таким образом, вы можете видеть тенденцию - разнообразие типов целых чисел - это выживание 70-х. знак равно
Каковы плюсы такого синтаксиса?
Плюсы (вероятно) уменьшение многословия. Эти статически типизированные языки уже настолько многословны, что если мы решим добавить некоторое явное преобразование целочисленного типа, как это сделал Вирт в Oberon-2 (взгляните на функции SHORT() и LONG()), они станут еще более многословными. В качестве компромисса можно разрешить неявное преобразование. Также во многих языках фактический размер переменных целочисленных типов не фиксирован и отличается от одной реализации к другой. Единственная доступная информация заключается в том, что size(shortint) ‹= size(int). В случае равенства явное преобразование выглядит довольно странно.
Часть 3. Дифирамб Оберону-2 =)
Кстати, не беспокойтесь слишком о Паскале. Он мертв, но в Оберон-2 Никлаус Вирт исправил свою ошибку.
В Главе 6 Language Report вы можете найти информацию о типах. Для нашего обсуждения важным утверждением является:
Типы с 3 по 5 — целочисленные типы, типы 6 и 7 — вещественные типы, и вместе они называются числовыми типами. Они образуют иерархию; больший тип включает (значения) меньшего типа: LONGREAL ›= REAL ›= LONGINT ›= INTEGER ›= SHORTINT
В Главе 9 мы можно прочитать о заданиях:
Выражение должно быть совместимо по назначению с переменной
Наконец, в Приложении А:
Совместимость с заданиями
Выражение e типа Te совместимо по присваиванию с переменной v типа Tv, если выполняется одно из следующих условий:
Te и Tv одного типа;
Te и Tv являются числовыми типами, и Tv включает Te;
...
Итак, мы здесь. Вы не можете присвоить выражение INTEGER переменной SHORTINT. Если вам интересно, вы также можете взглянуть на Component Pascal, второстепенный вариант и усовершенствование Oberon. -2. Создание компонентов BlackBox – это интегрированная среда разработки для Windows.
В ответ на комментарий Джастина Смита.
Я поражен, что он сказал, что больший тип включает (значения) меньшего типа: LONGREAL ›= REAL ›= LONGINT ›= INTEGER ›= SHORTINT, учитывая, что существуют LONGINT, которые не могут быть выражены как REAL.
Я немного смущен вашим утверждением
есть LONGINTS, которые не могут быть выражены как REAL
На самом деле на моей машине IDE, упомянутая выше, имеет
МАКС(ДЛИННОЕ) = 9223372036854775807
МАКС(РЕАЛЬНОЕ) = 1,797693134862316E+308
Таким образом, вы можете представить каждое LONGINT как РЕАЛЬНОЕ число. Но представление может быть неточным. Я думаю, что вы на самом деле говорили об этом, но мы говорим здесь о преобразовании различных целочисленных типов. А преобразование между REAL и INTEGER — это совсем другая история. История плохого и запутанного нейминга. НАСТОЯЩИЕ числа на самом деле не являются настоящими числами с математической точки зрения. Они являются некоторым приблизительным представлением. Можно использовать приближение рациональных чисел (с сохранением числителя и знаменателя в виде целых чисел), но чаще всего использование аппроксимации с плавающей запятой. Стандарт IEEE для вычислений с плавающей запятой (также известный как IEEE 754) является наиболее широко используемый стандарт для вычислений с плавающей запятой.
Каждый должен знать, что НАСТОЯЩИЕ числа — это не настоящие, а числа, описанные в стандарте IEEE 754. И каждый должен прочитать Что должен знать каждый программист об арифметике с плавающей запятой уточнить некоторые моменты.
Но это уже другая история... =)
person
Wildcat
schedule
22.01.2010