Разве выбор статической и динамической типизации не виден программистам языков? - PullRequest
0 голосов
/ 30 октября 2019

Из Концепции проектирования в языках программирования от Turbak

Хотя некоторые динамически типизированные языки имеют маркеры простых типов (например, имена переменных Perl начинаются ссимвол, обозначающий тип значения: $ для скалярных значений, @ для значений массива и% для хеш-значений (пары ключ / значение)), языки с динамической типизацией обычно не имеют явных аннотаций типов.

Обратное утверждение верно в статически типизированных языках , где явные аннотации типов являются нормой. Большинство языков, происходящих от Algol 68, таких как Ada, C / C ++, Java и Pascal, требуют, чтобы типы были явно объявлены для всех переменных, всех компонентов структуры данных, а также всех параметров функции / процедуры / метода и возвращаемых значений. Однако некоторые языки (например, ML, Haskell, FX, Miranda) достигают статической типизации без явных объявлений типов с помощью метода, называемого реконструкцией типа или выводом типа.

Вопрос 1: Для языков с динамической типизацией, которые «не имеют явных аннотаций типов», нужно ли им выводить / реконструировать типы / классы, используя некоторые методы реконструкции типов / классов или вывода типов / классов, как это делают статически типизированные языки?

Вопрос 2: В приведенной выше цитате говорится, что статическая или динамическая типизация и явные или никакие аннотации типов не могут смешиваться и совпадать.

  • Является ли выбор между статической и динамической типизацией только внутренним для реализаций языков программирования, невидимым для программистов языков?

  • Заметили ли программисты на языках программирования только, используют ли языки явные аннотации типа / класса или нет, используют ли языки статическую или динамическую типизацию? В частности, языки с явными аннотациями типа / класса выглядят одинаково для программистов, независимо от того, являются ли они статической или динамической типизацией? Разве языки без явных аннотаций типа / класса выглядят одинаково для программистов, независимо от того, являются ли они статической или динамической типизацией?

Спасибо.

Ответы [ 3 ]

1 голос
/ 30 октября 2019

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

foo = bar + baz

Необходимо создать код более низкого уровня, который фактически выполняет то, что выражает этот код. Что именно этот код выражает, зависит от деталей;скажем, на этом гипотетическом языке + может использоваться как для добавления чисел, так и для объединения строк. Это две очень разные операции, для которых должен быть сгенерирован другой машинный код, поэтому статически типизированный язык должен знать, какие типы здесь задействованы и какой код должен быть сгенерирован.

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

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

Является ли выбор между статической и динамической типизацией только внутренним для реализаций языков программирования, невидимым для программистов языков? [..]

  • статически типизированные языки могут перехватывать определенные классы ошибок во время компиляции (например, операция + не имеет смысла для переменных bar и baz,который вы объявили как int и str "), который будет отображаться только во время выполнения в динамических языках
  • , следовательно, динамические языки часто в гораздо большей степени зависят от наборов тестов, чем языки со статической типизацией
  • , как отмечено выше, bar + baz может выдавать совершенно разные результаты каждый раз, когда он выполняется в динамических языках, тогда как он всегда будет давать один и тот же тип в статических языках;одно это позволяет использовать совершенно разные стили программирования
  • «дженерики» - это то, что многие динамические программисты даже не знают, как пишется, в то время как это огромный помощник в статически типизированных языках (в общем, дженерики допускают что-то вроде * 1039). * чтобы возвращать разные типы даже в статических языках, но все равно требуется определенное количество типов по сравнению с динамическими языками)
  • статические языки все еще нуждаются в аннотациях типов (и независимо от того, насколько хорош механизм вывода, вы будете встречаются с ними рано или поздно), поэтому статические языки выглядят не так, как динамические

Возможно, здесь еще много всего, но в итоге: программист будет обратите внимание на разницу.

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

1 голос
/ 30 октября 2019

Я попытаюсь заглянуть в будущее ...

Вопрос 1: Для языков с динамической типизацией, которые "не имеют явных аннотаций типов", нужно ли им выводить / реконструировать типы / классы

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

Не забывайте и о константах. Если я напишу:

avar = "Goofy"

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

avar = avar + " blah"   // append some char

переменная avar имеет некоторый маркер, говорящий «это строка»;на основании логического вывода (что такое «бла»?) интерпретатор определяет, что две строки должны быть объединены. Здесь я вижу и вывод, и реконструкцию ...

Взгляд в будущее: компилятор (даже для интерпретируемых языков - например, Python может быть скомпилирован в .pyc) может получить большие преимущества в правильном выводе несколькихвещи. Вышеприведенная инструкция «avar = avar + 'blah'» может быть скомпилирована с чем-то, что уже знает, что мы соединяем две строки, и, следовательно, быстрее.

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

Это две грани медали;что хорошо для одного, может быть не хорошо для другого. Языки со статической типизацией, по-видимому, всегда быстрее, но более многословны для написания (требуется больше набора текста - каламбур). Динамическая типизация удобна, но медленнее и может привести к ошибкам во время выполнения. Я думаю, что выбор сделан, глядя точно на конечного пользователя языка, поэтому я думаю НЕТ: выбор между статическим и динамическим очень хорошо виден пользователю!

НО: тамявляется промежуточным звеном, а именно «утка», которая может (должна) быть статической, но более умной и менее многословной для написания. Это не может решить (у монет всегда будет две стороны), но это может помочь.

Заметили ли программисты только, используют ли языки явные аннотации типа / класса или нет, не используют ли языки статические илидинамическая типизация?

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

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

Только мои два цента.

1 голос
/ 30 октября 2019

Для языков с динамической типизацией, которые "не имеют явных аннотаций типов", нужно ли им выводить / восстанавливать типы / классы, используя некоторые методы восстановления типа / класса или методы вывода типа / класса, как это делают статически типизированные языки? ?

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

Разве программисты на языках программирования только замечают, используют ли языки явныеаннотации типа / класса или нет, используют ли языки статическую или динамическую типизацию?

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

var x = 4.2;
print("hello");
print("foo" / 4.2);

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

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

Если результатом является «привет», за которым следует NaN, язык - JavaScript.

...