HPUNIX Сайт о ОС и не только!

Так ли плоха динамическая типизация

23 июля 2012 - unix
Так ли плоха динамическая типизация
Так ли плоха динамическая типизация

В ближайшее время наблюдается большой энтузиазм к языкам программирования со статической типизацией. Часто тот факт, что в некотором языке (Scala, Haskell, OCaml, …) употребляется статическая типизация, преподносится в качестве бесспорного достоинства этого языка над языками программирования с динамической типизацией (Erlang, Clojure и другие лиспы, Perl, Python, Ruby, …). Тут имеет место очевидная замена понятий, манипуляция неокрепшим сознанием неопытных программистов, троллинг, пропаганда и другие плохие вещи.

Так ли плоха динамическая типизация

Обратим внимание, что в программировании есть две большие ниши.

Первую нишу можно условно именовать «низкоуровневой». Сюда относится разработка драйверов, операционных систем, приложений для микроконтроллеров на хим-заводах, виртуальных машин, архиваторов/кодеков, большинства СУБД, нередко — компиляторов и отладчиков, также разработка веб-браузеров и движков трехмерных компьютерных игр.

В общем, это все те области, где бешено рулят C/C++ и в обозримом будущем переход с их на что-то другое не предвидится. Так как эти языки являются очень низкоуровневыми и все равно не владеют правильной статической типизацией, «низкоуровневая» ниша в контексте данного поста нам не увлекательна.

Есть и совсем другая ниша, которую, как вы, вероятнее всего, уже додумались, мы условно назовем «высокоуровневой». Сюда относятся разработка большинства десктоп-приложений, сайтиков (включая фронтенд), мобильных приложений, игр типа Angry Birds, бесов, не много занимающихся вычислениями, неких СУБД, различного рода искусственных умов, и т.д.. В этой нише выбор языков программирования намного богаче, а поэтому любопытно порассуждать о применимости языков со статической и динамической типизацией.

Так ли плоха динамическая типизация

Вообщем, почему людям нравится статическая типизация? Приемущественно, по двум причинам. Во-1-х, языки со статической типизацией обычно резвее языков с динамической типизацией.

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

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

За примерами далековато ходить не нужно — взять хотя бы SBCL (это таковой компилятор Common Lisp), PyPy (JIT-компилятор Python’а в машинный код) либо V8 (практически как PyPy, только для JavaScript). Программки на Common Lisp могут дробить числа не ужаснее Java, в связи с чем 1-ый аргумент за статическую типизацию, как минимум, сомнителен. Отметим, что неправильно ассоциировать быстродействие программ, написанных на CL и C++, так как эти языки употребляются для решения задач, относящихся к различным нишам.

Также аргумент относительно скорости сомнителен по совсем другой причине. Вправду ли в «высокоуровневой» нише нередко требуется умение стремительно дробить числа?

По сути, десктопные приложения все равно огромную часть времени ждут ввода каких-либо данных юзером либо ответа от СУБД. Большая часть веб-сайтов написаны на кое-чем вроде PHP либо Perl, и, по всей видимости, скорость этих языков всех устраивает. Снова же, так как огромную часть времени они всего только парсят формочки и работают с базой данных.

Так ли плоха динамическая типизация

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

Дэдлоки, состояние гонки, ошибки округления, целочисленное переполнение, утечки памяти, выход за границу массива, sql-injection и многие другие. Ну и простые ошибки при реализации бизнес-логики никто не отменял.

Чтоб обезопасить приложение от этих ошибок, его необходимо тестировать. А так как тестировать вручную довольно огромное приложение занимает много времени, испытания должны быть автоматизированы. Появляется закономерный вопрос.

Если нам все равно нужно писать испытания, для чего нужна статическая проверка типов?

Примечание: Занимательный вопрос — может ли статическая типизация повысить качество продукта, разрабатываемого командой программистов, которые не пишут испытания? Лично я в этом сомневаюсь.

Культура разработки или есть, с code review, тестированием, непрерывной интеграцией и другими неплохими практиками, тогда и продукт выходит хорошим, или ее нет. Если команда не пишет «эти глуповатые испытания в стиле Два + Два = 4», зато практикует «тестирование в бою», релизы раз в год, имена переменных X1, X2, …, XN, также другие ужасные вещи, на выходе получится говно. В обоих случаях не играет никакой роли, пишется продукт на Scala либо на PHP.

Но динамическая типизация не только лишь не ужаснее статической, да и в чем либо, может быть, даже и превосходит ее. Я приведу несколько примеров, чтоб показать, что я имею ввиду, хотя они чуть ли показывают бесспорное преимущество динамической типизации над статической.

Так ли плоха динамическая типизация

Языки с динамической типизацией обычно легче в исследовании. Исходя из убеждений бизнеса это значит, что вы сможете нанять неплохого программера без опыта программирования на применяемом вами языке. Всего за несколько недель из неплохого программера без познания языка X он перевоплотится в неплохого программера с хорошим познанием языка Х.

Статическая типизация обременительна исходя из убеждений разработчика языка программирования. Решение использовать в языке статическую типизацию приводит к усложнению поддержки и развития языка программирования.

Почитайте TAPL, и вы поймете, как трудно сделать язык с правильной статической типизацией. Также я бы рекомендовал ознакомиться с восхитительной заметкой о том, какие смешные баги находят в компиляторе Scala и сколько времени иногда уходит на их исправление.

В конце концов, языки с динамической типизацией обычно имеют последующие достоинства над языками со статической типизацией:

Так ли плоха динамическая типизация
  • Языки с динамической типизацией резвее компилируются, нежели компиляция вообщем предусмотрена, что осязаемо ускоряет разработку;
  • Почему-либо языки с динамической типизацией нередко имеют более читаемые сообщения об ошибках, ежели языки со статической типизацией (вроде «программа свалилась, так как класс Int не имеет способа toLower, файл string_parser.code, строчка 193, переменная StrVariable, стектрейс: …»);
  • Так ли плоха динамическая типизация
  • Обычно в языках с динамической типизацией также предусмотрен удачный мокинг, что существено упрощает написание тестов;
  • В Erlang, к примеру, вы сможете подсоединиться к работающему приложению и выполнить в нем некоторый отрывок кода с целью поправить что-то либо запустить трассировщик с целью разобраться в обнаруженной баге;

Хотя, строго говоря, нет обстоятельств, по которым в языке со статической типизацией нельзя воплотить все эти пункты.

Я мог бы привести еще пару резонов за динамическую типизацию, но вы, наверняка, уже сообразили идею. Динамическая типизация имеет не наименьшее право на существование, чем статическая. Это просто два совсем различных подхода.

Чуть ли какой-то из них значительно лучше другого.

Похожие статьи

  • Чем неплох и чем плох Linux (либо хоть какой другой nix)

    Друзья нередко задают мне вопросы в стиле «а чем так хороша эта ваша Ubuntu?», «а не перейти ли мне на Linux?», «а какой линукс мне избрать?» и тп. Эта статья поможет новеньким в мире открытых ОС най...

  • Эволюция применяемых языков программирования

    На написание этой статьи меня вдохновили заметки На чём пишете? Дениса Филонова и Эволюция применяемых языков Даркуса. В их создатели вспоминают, как они начинали программировать, какие языки прогр...

  • Предпосылки, по которым мне нравится Haskell

    Последний гиковcкий выпуск Radio-T (номер 253) вышел на уникальность увлекательным. Речь зашла о Scala, рефакторинге, TDD, багтрекерах, и даже (наконец!) о моем возлюбленном Haskell. К огорчению, тема...

  • Итак, вы решили стать программером

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

  • Очередные 10 прочитанных книжек

    Данная заметка содержит короткие рецензии на 10 книжек, прочитанных мною за последние два месяца. В большей степени это были книжки о многофункциональном программировании, PostgreSQL и Git. Со перечнем из...

Теги: ос
Рейтинг: +10 Голосов: 198 1199 просмотров
Комментарии (0)

Нет комментариев. Ваш будет первым!

Найти на сайте: параметры поиска

Windows 7

Среда Windows 7 на первых порах кажется весьма непривычной для многих.

Windows 8

Если резюмировать все выступления Microsoft на конференции Build 2013.

Windows XP

Если Windows не может корректно завершить работу, в большинстве случаев это

Windows Vista

Если к вашему компьютеру подключено сразу несколько мониторов, и вы регулярно...