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

Статически типизированные языки и динамически типизированные языки в принципе кажутся противоположными понятиями. Однако, как может выглядеть язык, например, Objective-C, одновременно обе эти вещи? Мне кажется, что Objective-C более статичен, чем динамический. Может кто-нибудь объяснить, как это возможно?

Ответы

Ответ 1

Я считаю, что вы вводите в заблуждение статическое типирование и динамическое разрешение метода. Objective-C определенно сильно, статически типизирован. Как и C, все переменные должны быть объявлены и напечатаны (нет даже вывода типа, как в других современных, статически типизированных языках). Компилятор генерирует код на основе типа переменных, и этот тип не может быть изменен во время выполнения.

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

Ответ 2

Objective-C действительно (концептуально) только слой на самом языке C и, как таковой, может иметь как статические, так и динамические типы. Статический, если вы используете материал base-C, динамический, если используете расширения Objective-C.

Но C также сортирует эту функцию. Если вы просто думаете о типе void * на C, вы увидите, что он может указывать на любой тип, следовательно, дает вам (очень грубый) динамически типизированный язык.

Например:

int i;
float f;
double d;
void *p = &i;
p = &f;
p = &d;

Во всех этих присвоениях p выше, он сделал указание на другой тип. Если вы делаете свой код достаточно умно, вы можете даже эмулировать RTTI и полиморфизм в C.

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

Ответ 3

Если вы спрашиваете о технической способности поддерживать идиомы, это не особо интересный вопрос. Просто посмотрите на большинство современных языков и посмотрите, как они это делают. Обычно это с помощью какого-то динамического типа catch-all (Object в VB, dynamic в С#, void* в C и т.д.).

На метафизическом/онтологическом уровне этот вопрос гораздо интереснее...

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

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

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

Ответ 4

C - это статически типизированный язык, но он обладает гибкостью для повторного использования типов для других типов и для использования общих указателей (тип void *). Тип void * означает "указатель на неуказанный тип данных". Objective-C реализует свои динамические типы с помощью этих типов void *, хотя обычно это абстрагируется несколькими уровнями определений, typedefs и т.д.

Ответ 5

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

Ответ 6

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

Статично типизированный язык - это тот, который включает фазу проверки типов (и отчетности) во время компиляции (или, по крайней мере, до выполнения кода). Цель C, конечно, имеет это, поэтому статически типизирована.

В динамически типизированном языке отсутствует такая фаза проверки типа. Следовательно, Objective C не является динамически типизированным этим определением - и я думаю, что это наиболее стандартное определение.

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

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