Я думаю, вы путаетесь, когда проверяются типы с тем, как они проверяются. Типизация во время выполнения не обязательно является слабой.
Главное преимущество статических типов в том, что вы говорите: они исчерпывающие. Вы можете быть уверены, что все сайты вызовов соответствуют типу, просто позволив компилятору сделать это.
Основное ограничение статических типов заключается в том, что они ограничены в ограничениях, которые они могут выражать. Это зависит от языка: большинство языков имеют относительно простые системы типов (c, java), а другие - чрезвычайно мощные системы типов (haskell, cayenne).
Из-за этого одних типов ограничений недостаточно. Например, в java типы более или менее ограничены проверкой совпадения имен типов. Это означает, что значение любого ограничения, которое вы хотите проверить, должно быть закодировано в какую-то схему именования, отсюда и множество косвенных указаний и шаблонов, общих для кода Java. C ++ немного лучше в том, что шаблоны позволяют немного больше выразительности, но не приближаются к тому, что вы можете делать с зависимыми типами. Я не уверен, каковы недостатки более мощных систем шрифтов, хотя очевидно, что некоторые или больше людей будут использовать их в промышленности.
Даже если вы используете статическую типизацию, скорее всего, она недостаточно выразительна, чтобы проверить все, что вам небезразлично, поэтому вам также придется писать тесты. Сэкономит ли статическая типизация больше усилий, чем требуется в шаблоне, - это спор, который ведется веками, и я не думаю, что у него есть простой ответ для всех ситуаций.
Что касается вашего второго вопроса:
Как мы можем безопасно повторно использовать типизированный язык среды выполнения?
Ответ - тесты. Ваши тесты должны охватывать все важные случаи. Инструменты могут помочь вам оценить, насколько исчерпывающими являются ваши тесты. Инструменты проверки покрытия позволяют узнать, покрываются ли тесты тестами или нет. Инструменты мутации тестов (шут, шутка) могут сообщить вам, если ваши тесты логически неполны. Приемочные тесты позволяют узнать, что написанное вами соответствует требованиям, и, наконец, регрессионные тесты и тесты производительности гарантируют, что каждая новая версия продукта сохраняет качество предыдущей.
Одна из замечательных особенностей правильного тестирования по сравнению с использованием сложных косвенных указаний типов заключается в том, что отладка становится намного проще. При запуске тестов вы получаете определенные неудачные утверждения в тестах, которые четко выражают то, что они делают, а не тупые заявления об ошибках компилятора (подумайте об ошибках шаблона C ++).
Независимо от того, какие инструменты вы используете: написание кода, в котором вы уверены, потребует усилий. Скорее всего, это потребует написания множества тестов. Если штраф за ошибки очень высок, например, в программном обеспечении для аэрокосмической или медицинской техники, вам может потребоваться использовать формальные математические методы для подтверждения поведения вашего программного обеспечения, что делает такую разработку чрезвычайно дорогостоящей.
person
Jason Watkins
schedule
19.05.2009