Я попытаюсь заглянуть в будущее ...
Вопрос 1: Для языков с динамической типизацией, которые "не имеют явных аннотаций типов", нужно ли им выводить / реконструировать типы / классы
Нет, они не должны делать вывод в классическом смысле, но рано или поздно они все равно это сделают: когда к переменной обращаются и участвуют в некоторых вычислениях / манипуляциях.
Не забывайте и о константах. Если я напишу:
avar = "Goofy"
, то какой-то тип вывода уже существует, чтобы понять, что авар должен содержать строку из пяти символов. Позже, например, при выполнении
avar = avar + " blah" // append some char
переменная avar имеет некоторый маркер, говорящий «это строка»;на основании логического вывода (что такое «бла»?) интерпретатор определяет, что две строки должны быть объединены. Здесь я вижу и вывод, и реконструкцию ...
Взгляд в будущее: компилятор (даже для интерпретируемых языков - например, Python может быть скомпилирован в .pyc) может получить большие преимущества в правильном выводе несколькихвещи. Вышеприведенная инструкция «avar = avar + 'blah'» может быть скомпилирована с чем-то, что уже знает, что мы соединяем две строки, и, следовательно, быстрее.
Выбор между статическим и динамическимвводить только внутренние реализации языков программирования, не видимые для программистов языков?
Это две грани медали;что хорошо для одного, может быть не хорошо для другого. Языки со статической типизацией, по-видимому, всегда быстрее, но более многословны для написания (требуется больше набора текста - каламбур). Динамическая типизация удобна, но медленнее и может привести к ошибкам во время выполнения. Я думаю, что выбор сделан, глядя точно на конечного пользователя языка, поэтому я думаю НЕТ: выбор между статическим и динамическим очень хорошо виден пользователю!
НО: тамявляется промежуточным звеном, а именно «утка», которая может (должна) быть статической, но более умной и менее многословной для написания. Это не может решить (у монет всегда будет две стороны), но это может помочь.
Заметили ли программисты только, используют ли языки явные аннотации типа / класса или нет, не используют ли языки статические илидинамическая типизация?
Теоретически, ответ может быть да: программист должен знать только о явной типизации или автоматической типизации, которую язык предоставляет пользователю. Но на практике программисты умны, часто запускают программы, которые пишут, а иногда даже отлаживают. При запуске и, более того, при отладке возникают различия между статической и динамической типизацией. Это потому, что программисты умны, а компьютеры глупы (есть исключения, но не обычно).
Опять же, заглянем в будущее: могут появиться языки, которые будут внутренне статически типизированы, но способны представлятьсами квазиодинамически типизированы. Хороший. Не должно произойти обратного: кто хочет многословный, статически типизированный язык, который в итоге действительно динамичен?
Только мои два цента.