В чем разница между статически типизированными и динамически типизированными языками?

«Есть ли способ избежать ошибки мутирующей таблицы без использования временной таблицы для значений или автономной транзакции?»

tl; dr no.


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

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


Перефразируя Джейми Завински: Некоторые люди, столкнувшись с исключением из мутировавшего стола, думают: «Я знаю, я буду использовать автономные транзакции». Теперь у них есть две проблемы.


Иногда ошибки можно избежать, просто изменив значения: NEW в триггере ДОПОЛНИТЕЛЬНОЕ ИЛИ ОБНОВЛЕНИЕ или используя виртуальные столбцы. Но вам нужно будет опубликовать более подробную информацию, чтобы узнать, применимы ли они.

Но лучшее обходное решение не нуждается в каком-либо другом виде.

849
задан SirSaleh 15 July 2019 в 09:20
поделиться

4 ответа

Языки со статической типизацией

Язык является статически типизированным, если тип переменной известен во время компиляции. Для некоторых языков это означает, что вы как программист должны указать тип каждой переменной (например, Java, C, C ++); другие языки предлагают некоторую форму вывода типа , способность системы типов определять тип переменной (например: OCaml, Haskell, Scala, Kotlin)

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

Примеры: C, C ++, Java, Rust, Go, Scala

Языки с динамической типизацией

A language является динамически типизированным, если тип связан со значениями времени выполнения, а не именованными переменными / полями / и т. д. Это означает, что вы, как программист, можете писать немного быстрее, потому что вам не нужно каждый раз указывать типы (если только вы не используете статически типизированный язык с выводом типа ).

Примеры: Perl, Ruby, Python, PHP, JavaScript

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

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

Perl, Ruby, Python, PHP, JavaScript

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

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

Perl, Ruby, Python, PHP, JavaScript

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

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

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

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

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

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

809
ответ дан 22 November 2019 в 21:03
поделиться

Со статическим контролем типов

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

Примеры = C++

С динамическим контролем типов

типы проверяются во время выполнения.

Примеры = Python

1
ответ дан 22 November 2019 в 21:03
поделиться

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

Языки программирования с динамической типизацией выполняют проверку типов во время времени выполнения в отличие от времени компиляции .

366
ответ дан 22 November 2019 в 21:03
поделиться

http://en.wikipedia.org/wiki/Type_system

Статическая типизация

Говорят, что язык программирования использует статическая типизация при проверке типа выполняется во время компиляции как в отличие от времени выполнения. При статической типизации типы связаны с переменными не ценности. Статически типизированные языки включают Ada, C, C ++, C #, JADE, Java, Фортран, Haskell, ML, Паскаль, Perl (в отношении различения скаляры, массивы, хеши и подпрограммы) и Scala. Статическая типизация это ограниченная форма программы проверка (см. безопасность типа): соответственно, он позволяет много типов ошибки должны быть обнаружены в начале цикл разработки. Статический тип шашки оценивают только тип информация, которая может быть определена на время компиляции, но могут проверить что проверенные условия выполняются для все возможные исполнения программа, которая избавляет от необходимости повторять проверку типа каждый раз, когда программа выполнена. Выполнение программы также можно сделать более эффективным (т. е. быстрее или с уменьшенной памятью) на исключение проверки типа во время выполнения и включение других оптимизаций.

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

 if <сложный тест> then 42 else <ошибка типа>

будет отклонен как неточно набранный, потому что статический анализ не может определить что ветвь else не будет принято. [1] Консервативное поведение проверок статического типа выгодно, когда редко оценивается как ложь: A средство проверки статического типа может определять тип ошибки в редко используемых путях кода. Без проверки статического типа даже тесты покрытия кода со 100% кодом покрытие может быть не в состоянии найти такие ошибки типа. Тесты на покрытие кода могут не могут обнаружить ошибки такого типа потому что сочетание всех мест где создаются ценности и все места, где используется определенное значение необходимо учитывать.

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

Динамическая типизация

Язык программирования называется динамически типизированный, или просто "динамический", когда большая часть проверки типов выполняется во время выполнения, а не во время компиляции. В динамической типизации типы связаны со значениями, а не переменные. Языки с динамической типизацией включают Groovy, JavaScript, Lisp, Lua, Objective-C, Perl (в отношении определяемые пользователем типы, но не встроенные типы), PHP, Prolog, Python, Ruby, Smalltalk и Tcl. По сравнению со статическим набор текста, динамический набор текста может быть больше гибкий (например, позволяя программам генерировать типы и функциональность на основе по данным времени выполнения), хотя в за счет меньшего количества априорных гарантий. Это потому, что динамически типизированный язык принимает и пытается выполнить некоторые программы, которые могут быть признан недействительным статическим типом checker.

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

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

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

Ссылки

  1. Pierce, Benjamin (2002). Типы и языки программирования. MIT Press. ISBN 0-262-16209-1.
38
ответ дан 22 November 2019 в 21:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: