Cтатика

топ 100 блогов love5an09.08.2010 Написал сейчас интерфейс битовых векторов для своего нового проекта на CL (библиотека различных алгоритмов сжатия/распаковки. Сейчас для CL, насколько я понимаю, есть только salza2, и там только DEFLATE и она только архивирует)(примерный набросок кода: http://paste.lisp.org/display/113332).

И задумался, в очередной раз, о статической типизации.

Какие compile-time гарантии она дает? Да крайне небольшие. Гарантии того порядка, что наш код не будет умножать бананы на тапки. Но ведь и так, кто в здравом уме это вообще будет делать?

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

Такое способны гарантировать только сложнейшие системы зависимых типов(dependent types). Но мне плохо становится от осознания необходимого количества расставленных по всему коду "гарантий"(в виде if'ов и подобного), и от оверхеда, который они принесут.

А как насчет других потенциальных ошибок? Как статическая типизация может нам гарантировать "целостность" потока? А именно, то, что между вызовами функций записи в поток, его счетки не поменяются так, что в результирующем буфере окажется мусор? Никак! От этого спасет только модульность, инкапсуляция.

И таких ошибок, которые типизации ортогональны - большинство. Причем, подавляющее.
Другое дело - оптимизация, но тут подход, используемый в CL - опциональные декларации типов, кажется мне оптимальным. При соответствующих декларациях, тот же SBCL способен выдать _очень_ эффективный код.

В контексте производительности результирующего кода можно, кстати, вспомнить еще один момент. А именно, когда при работе со статическими языками нам требуется динамика. Мы, естественно, можем ее в статических языках переизобрести. Но вот эффективность полученного, как в плане памяти, так и в плане производительности, в сравнении с кодом, генерируемым компиляторами того же Common Lisp - под огромным вопросом.

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

Оставить комментарий

Архив записей в блогах:
в дело борьбы с традиционным советским обжорством за праздничным столом.Так, в ...
Пока идут новогодние каникулы, в жизни одного известного ЖЖ-деятеля – Диакона Андрея Кураева – разворачивается трагедия шекспировского размаха. Не сомневаюсь, что найдется кто-нибудь, задавший вопрос: «А кто такой этот Диакон Андрей Кураев?». Вот вам ссылка из Википедии: Как ...
Часто некоторые пенсионеры жалуются что не хватает денег. И еще часто вижу как эти пенсионеры идут за покупками в более дорогие магазины. И еще хвастаются что покупаю со скидкой. Хотя рядом можно найти в другом такой же товар дешевле без всякой скидки. Хотя зимы еще не, но я вспомнил ...
"Тот самый Мюнхаузен" , "Убить Дракона" , "Дом который построил Свифт" - абсолютно невозможные картины в современной России. Только в СССР могли снимать такое кино и писать такие пьесы. То время прошло ... Пройдёт совсем немного времени и не останется никого, кто понимает о чем эти ...
Сегодня правым Германии страшно, как никогда. Нет, они не встретили на улице размахивающего дубиноподобной пиписькой негритоса. На этот раз всё куда страшнее и таинственней. Дело в том, что кто-то из них насчитал аж пятерых (а то и семерых) умерших за короткий промежуток времени ...