Языки динамических типов и языки статических типов

каковы преимущества и ограничения языков динамического типа по сравнению с языками статического типа?

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

9 ответов


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

хороший взгляд на проблему от статический печатать где возможный, динамический печатать когда нужно: конец "холодная война" между языками программирования Эрик Мейер и Питер Дрейтон из Microsoft:

сторонники статического ввода утверждают, что преимущества статической типизации включают раннее обнаружение ошибки программирования (например, предотвращение добавление целого числа в логическое), более качественная документация в виде тип подписи (например, включение количество и типы аргументов при разрешение имен), больше возможностей для оптимизации компилятора (например, замена виртуальных вызовов direct вызывает, когда точный тип приемник статически ), повышение эффективности выполнения (например, не все значения должны носить динамический тип), и лучшее время дизайна опыт разработчика (например, знание тип приемника, IDE может представить выпадающее меню всех применимые члены). Статическая типизация фанатики пытаются заставить нас поверить, что "хорошо типизированные программы не могут пойти не так". Хотя это, конечно, звучит впечатляет, это довольно бессодержателен заявление. Статическая проверка типа a компиляции абстракция поведение программы во время выполнения и следовательно, это необходимо только частично звук и неполнота. Это означает, что программы все еще могут пойти неправильно из-за свойства, которые не отслеживаются type-checker, и что есть программы, которые пока они не могут пойти ошибка не может быть проверена типом. Этот импульс для уменьшения статической типизации частичные и более полные причины системы сверхсложного и экзотические, как свидетельствуют концепции например, "фантомные типы" [11] и "шаткий типов" [10]. Это как пытаюсь пробежать марафон с мячом. и цепь привязана к твоей ноге. торжествующе крича, что ты почти ... сделал это, хотя вы выручили после первой мили.

защитники динамически типизированных языки утверждают, что статическая типизация слишком жесткие, и что мягкость динамически языки делают их идеально подходит для прототипирования системный с изменяющимися или неизвестными требованиями, или которые взаимодействуют с другими системами это изменение непредсказуемо (данные и интеграция приложений.) Конечно, динамически типизированные языки незаменим для решения широкого динамическое поведение программы, например способ перехвата, динамического нагружения, мобильный код, отражение времени выполнения, etc. В матери всех газет на сценарий [16], утверждает Джон Остерхаут что статически типизированные системы языки программирования делают код меньше многоразовый, более многословный, не более безопасный, и менее выразительный, чем динамичный типизированные языки сценариев. Этот аргумент повторяется буквально многими сторонники динамически типизированных язык сценариев. Мы утверждаем, что это заблуждение и впадает в та же категория, что и утверждение, что суть декларативного программирования исключение назначения. Или как Джон Хьюз говорит [8], что это логично невозможность сделать язык более мощный, опуская функции. Защищающий дело в том, что оттягивают все проверка типа для выполнения-это хорошо дело в том, что страусиная тактика тот факт, что ошибки должны быть пойманы как только в процессе развития как вероятный.


системы статического типа стремятся устранить определенные ошибки статически, проверяя программу без ее запуска и пытаясь доказать обоснованность в определенных отношениях. Некоторые системы типов способны улавливать больше ошибок, чем другие. Например, C# может устранить исключения нулевого указателя при правильном использовании, тогда как Java не имеет такой мощности. Twelf имеет систему типов, которая на самом деле гарантирует, что доказательства будут прекращены, "решения"прекращение проблема.

однако никакая система типов не идеальна. Чтобы устранить определенный класс ошибок, они также должны отклонить некоторые совершенно действительные программы, которые нарушают правила. Вот почему Twelf на самом деле не решает проблему остановки, он просто избегает ее, выбрасывая большое количество совершенно правильных доказательств, которые заканчиваются странными способами. Аналогично, система типов Java отклоняет Clojure PersistentVector реализация за счет использования гетерогенных массивов. Он работает во время выполнения, но система не может проверить его.

по этой причине большинство систем типов предоставляют "escapes", способы переопределения статической проверки. Для большинства языков они принимают форму литья, хотя некоторые (например, C# и Haskell) имеют целые режимы, которые помечены как "небезопасные".

субъективно, мне нравится статическая типизация. Реализовано правильно (подсказка:не Java), система статического типа может быть огромной помощью в отсеве ошибок, прежде чем они сбой производственная система. Динамически типизированные языки, как правило, требуют большего модульного тестирования, что в лучшем случае утомительно. Кроме того, статически типизированные языки могут иметь определенные функции, которые невозможны или небезопасны в системах динамических типов (неявные преобразования вспомнить). Все дело в требованиях и субъективном вкусе. Я бы не стал строить следующее Eclipse в Ruby, чем пытаться написать сценарий резервного копирования в сборке или исправить ядро, используя Ява.

О, и люди, которые говорят, что "x печатать в 10 раз продуктивнее, чем y typing " просто выдувают дым. Динамический ввод может" чувствовать " быстрее во многих случаях, но он теряет почву, как только вы на самом деле пытаетесь сделать свое причудливое приложение выполнить. Аналогично, статическая типизация может показаться идеальной сетью безопасности, но один взгляд на некоторые из более сложных определений общих типов в Java заставляет большинство разработчиков спешить за глазом шоры. Даже с системами типа и урожайностью, никакая серебряная пуля.

последнее примечание:не беспокойтесь о производительности при сравнении статического и динамического ввода. Современные Джиты, такие как V8 и TraceMonkey, опасно близки к статической языковой производительности. Кроме того, тот факт, что Java фактически компилируется до динамического промежуточного языка, должен быть намеком на то, что в большинстве случаев динамическое типирование не является огромным убийцей производительности, который некоторые люди делают быть.


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

статические типы являются ограничением грамматики языка. Статически типизированные langauges строго можно сказать, что они не свободны от контекста. Простая истина заключается в том, что становится неудобно выражать язык здраво в контекстных свободных грамматиках, которые не рассматривают все свои данные просто как битовые векторы. Системы статического типа являются частью грамматика языка, если таковая имеется, они просто ограничивают ее больше, чем контекстная свободная грамматика, грамматические проверки, таким образом, происходят в двух проходах над источником на самом деле. Статические типы соответствуют математическому понятию теории типов, теория типов в математике просто ограничивает законность некоторых выражений. Например, я не могу сказать 3 + [4,7] в математике это из-за теории типов.

статические типы, таким образом, не являются способом "предотвращения ошибок" с теоретической точки зрения, они являются ограничением грамматики. Действительно, при условии, что+, 3 и интервалы имеют обычное множество теоретических определений, если мы удалим систему типов 3 + [4,7]имеет довольно хорошо определенный результат, который является набором. "ошибки типа времени выполнения" теоретически не существуют, практическое использование системы типов заключается в предотвращении операций, которые людьми не имеет смысла. Конечно, операции - это всего лишь перемещение и манипуляция битами.

загвоздка в этом система типов не может решить, будут ли такие операции выполняться или нет, если это будет разрешено. Как и в, точно разделить набор всех возможных программ в тех, которые будут иметь "ошибку типа", и те, которые не являются. Он может делать только две вещи:--14-->

1: докажите, что ошибки типа будут возникать в программе
2: докажите, что они не будут происходить в программе

это может показаться, что я противоречу себе. Но что такое проверка типов C или Java не он отвергает программу 'безграмотные', или как он называет это 'ошибка типа' если не могу успеха в 2. Он не может доказать, что они не произойдут, это не значит, что они не произойдут, это просто значит, что он не может это доказать. Вполне возможно, что программа, которая не будет иметь ошибки типа, отклоняется просто потому, что она не может быть доказана компилятором. Простой пример if(1) a = 3; else a = "string";, конечно, поскольку это всегда верно, ветвь else никогда не будет выполнена в программа, и никакая ошибка типа не произойдет. Но он не может доказать эти случаи в общем виде, поэтому он отклонен. Это главная слабость многих статически типизированных языков, в защите вас от себя, вы обязательно также защищены в случаях, когда вам это не нужно.

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

Другим преимуществом статического ввода является то, что типы известны во время компиляции, и поэтому компилятор может использовать это. Если мы в Java сделать "string" + "string" или 3 + 3, и + маркеры в тексте, в конце концов, представляют собой совершенно разные операция и datum, компилятор знает, какой выбрать из типов в одиночку.

теперь я собираюсь сделать очень спорное заявление здесь, но потерпите со мной: 'dynamic typing' не существует.

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

почему у них нет типов? Поскольку каждая операция определена и разрешена для каждого операнта, что такое "ошибка типа времени выполнения"? Это из теоретического примера чисто побочный эффект. Если делать print("string") который печатает строку является операцией, то так же length(3), первый имеет побочный эффект написания string к стандартному выходу, последнему просто error: function 'length' expects array as argument., вот и все. Есть от теоретической перспективы нет такой вещи, как динамически типизированный язык. Они нетипизированный

хорошо, очевидным преимуществом "динамически типизированного" языка является выразительная сила, система типов-это не что иное, как ограничение выразительной силы. И вообще, языки с системой типов действительно имели бы определенный результат для всех тех операций, которые не разрешены, если бы система типов просто игнорировалась, результаты просто не имели бы смысла для людей. Много языки теряют свою полноту Тьюринга после применения системы типов.

тут happen также может быть удобно в некоторых точках для отладки, показывая, что это не "ошибка", а хорошо определенное свойство языка. По сути, единственный остаток " динамического набрав", что большинство языков имеют, защищает от деления на ноль. Это то, что динамическое типирование, нет типов, нет больше типов, чем то, что ноль-это другой тип, чем все остальные числа. То, что люди называют "типом", - это просто еще одно свойство datum, например длина массива или первый символ строки. И многие динамически типизированные языки позволяют писать такие вещи, как "error: the first character of this string should be a 'z'".

другое дело, что динамически типизированные языки типа во время выполнения и, как правило, может проверить его и разобраться с ним и решить его. Конечно, теоретически это ничем не отличается от доступа к первому символу массива и просмотра, что это такое. Фактически, вы можете сделать свой собственный динамический C, просто используйте только один тип, такой как long long int, и используйте первые 8 бит для хранения вашего "типа" и записи функций соответственно, которые проверяют его и выполняют добавление float или integer. У вас есть статически типизированный язык с одним типом, или динамический язык.

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

как я уже отмечал, "статически типизированный" в целом означает случай 2, виновен, пока не доказана невиновность. Но некоторые языки, которые вообще не выводят свою систему типов из теории типов, используют правило 1: невиновен, пока не доказана вина, которая возможно, идеальный гибрид. Так что, может быть, набранная ракетка для вас.

кроме того, ну, для более абсурдного и экстремального примера, я в настоящее время реализую язык, где "типы" действительно являются первым символом массива, они являются данными, данными "типа", "типа", который сам является типом и датумом, единственным датумом, который имеет себя как тип. Типы не являются конечными или ограниченными статически, но новые типы могут быть созданы на основе информации о времени выполнения.


возможно, самым большим "преимуществом" динамического набора текста является более мелкая кривая обучения. Нет системы типов для изучения и нет нетривиального синтаксиса для угловых случаев, таких как ограничения типа. Это делает динамическую типизацию доступной для гораздо большего числа людей и возможной для многих людей, для которых сложные системы статического типа недоступны. Следовательно, динамическая типизация захватила в контекстах образования (например, Scheme / Python в MIT) и доменных языках для не-программистов (например,Mathematica). Динамические языки также попали в ниши, где у них мало или нет конкуренции (например, Javascript).

наиболее сжатые динамически типизированные языки (например, Perl, APL, J, K,Mathematica) являются специфичными для домена и могут быть значительно более краткими, чем самые краткие универсальные статически типизированные языки (например,данные, используемые) в нишах, для которых они были предназначены.

основные недостатки динамического набрав:

  • ошибки типа времени выполнения.

  • может быть очень трудно или даже практически невозможно достичь того же уровня правильности и требует значительно большего тестирования.

  • нет подтвержденной компилятором документации.

  • плохая производительность (обычно во время выполнения, но иногда во время компиляции, например, схема Сталина) и непредсказуемая производительность из-за зависимости от сложные оптимизации.

лично я вырос на динамических языках, но не прикоснулся бы к ним с 40-дюймовым полюсом как профессионал, если бы не было других жизнеспособных вариантов.


от Артима это Typing: сильный против слабого, статический против динамического статьи:

сильная типизация предотвращает операции смешивания между несовпадающими типами. Для смешивания типов необходимо использовать явное преобразование

слабая типизация означает, что вы можете смешивать типов без явного преобразования

в газете Паскаля Костанцы,динамическая и статическая типизация-на основе шаблона Анализ (PDF), он утверждает, что в некоторых случаях статическая типизация более подвержена ошибкам, чем динамическая. Некоторые статически типизированные языки заставляют вас вручную эмулировать динамическую типизацию, чтобы сделать "правильную вещь". Это обсуждается в лямда-конечная.


Это зависит от контекста. Есть много преимуществ, которые подходят для динамической типизированной системы, а также для строгой типизации. Я считаю, что поток динамических типов языка происходит быстрее. Динамические языки не ограничены атрибутами классов и компилятором, думающим о том, что происходит в коде. У тебя есть некоторая свобода. Кроме того, динамический язык обычно более выразителен и приводит к меньшему количеству кода, что хорошо. Несмотря на это, он более подвержен ошибкам, которые тоже сомнительно и зависит больше от покрытия unit test. Это простой прототип с динамическим lang, но обслуживание может стать кошмаром.

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


есть много разных вещей о статических и динамических языков. Для меня главное отличие заключается в том, что в динамических языках переменные не имеют фиксированных типов; вместо этого типы привязаны к значениям. Из-за этого точный код, который выполняется, не определен до выполнения.

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


Это все о правильном инструменте для работы. Не лучше 100% времени. Обе системы созданы человеком и имеют недостатки. Извини, но мы отстой и делаем идеальные вещи.

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


Статическая Типизация: Такие языки, как Java и Scala, являются статическими.

переменные должны быть определены и инициализированы, прежде чем они используются в Кодексе.

для ex. инт х; x = 10;