Последствия типизации в языке программирования - PullRequest
2 голосов
/ 13 марта 2012

Я проходил курс C #, и в моей голове всплыла следующая тема, и, надеюсь, пришло время избавиться от нее: каковы последствия типизации для языка программирования?

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

Если я прав до этого момента, то я спрашиваю: что это значит / действительно происходит с приведением типов в таких языках, как C #?Скажем, у меня есть метод, который определен с использованием параметра типа Object, и я передаю ему любое производное типа (то есть любого типа) - что происходит в этот момент, за кулисами?

Я склоненпредположить, что типизация также предлагает мне ограничения на доступ к членам в любом данном экземпляре объекта.Другими словами, я предполагаю, что компилятор всегда смотрит на тип переменной, а не на экземпляр, который он получает, чтобы выполнить / применить свои правила проверки, а затем запустить или нет сообщение об ошибке.Это правильно?В приведенном ниже примере, поскольку тип переменной - Object, компилятор не позволит мне получить доступ к любому из членов моего экземпляра - если я не выполню приведение к типу экземпляра.Здесь я хочу уточнить, что экземпляр был и будет всегда сохранять свой тип - независимо от того, выполняется ли приведение или нет.Приведение, следуя моей теории, необходимо только для того, чтобы компилятор - инструмент, который помог нам в нашей работе - и которому мы подчиняемся на каждом этапе построения нашей программы - может принять, что этот код действительно100% доверчивый / "безопасный".

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

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

Любые изпредположения выше неверны?(Или, может быть, я должен спросить ... кто-нибудь из них прав?)

1 Ответ

0 голосов
/ 30 декабря 2014

Ваш ответ показывает хорошее понимание причин, по которым у нас есть типы в языках программирования.

...