Cтатика

И задумался, в очередной раз, о статической типизации.
Какие compile-time гарантии она дает? Да крайне небольшие. Гарантии того порядка, что наш код не будет умножать бананы на тапки. Но ведь и так, кто в здравом уме это вообще будет делать?
А вот пример того, чего в моем коде(см. выше) действительно хотелось бы гарантировать: чтобы внутренние счетчики битового потока всегда были в соответствующих границах - чтобы счетик битов не выходил бы за пределы 7, а счетчик байтов - за пределы внутреннего буфера.
Такое способны гарантировать только сложнейшие системы зависимых типов(dependent types). Но мне плохо становится от осознания необходимого количества расставленных по всему коду "гарантий"(в виде if'ов и подобного), и от оверхеда, который они принесут.
А как насчет других потенциальных ошибок? Как статическая типизация может нам гарантировать "целостность" потока? А именно, то, что между вызовами функций записи в поток, его счетки не поменяются так, что в результирующем буфере окажется мусор? Никак! От этого спасет только модульность, инкапсуляция.
И таких ошибок, которые типизации ортогональны - большинство. Причем, подавляющее.
Другое дело - оптимизация, но тут подход, используемый в CL - опциональные декларации типов, кажется мне оптимальным. При соответствующих декларациях, тот же SBCL способен выдать _очень_ эффективный код.
В контексте производительности результирующего кода можно, кстати, вспомнить еще один момент. А именно, когда при работе со статическими языками нам требуется динамика. Мы, естественно, можем ее в статических языках переизобрести. Но вот эффективность полученного, как в плане памяти, так и в плане производительности, в сравнении с кодом, генерируемым компиляторами того же Common Lisp - под огромным вопросом.
Так зачем же навязывать статику? Она лишает огромного множества потенциальных возможностей(или, как минимум, снижает эффективность реализации этих возможностей), привносит кучу трудностей и неудобств(разработка в таком же динамичном стиле, в каком она обычно происходит в CL или Python, в большинстве статических языков невозможна совсем не по причине отсутствия REPL(который, к тому же, кое-где и в них присутствует)), а взамен дает только мизерные гарантии и иллюзию корректности написанного кода(а бывает еще, и иллюзию производительности).
|
</> |