Как язык программирования может быть как статически, так и динамически типизированным? - PullRequest
15 голосов
/ 18 апреля 2010

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

Ответы [ 6 ]

25 голосов
/ 18 апреля 2010

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

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

9 голосов
/ 18 апреля 2010

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.

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

1 голос
/ 18 апреля 2010

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

1 голос
/ 18 апреля 2010

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

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

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

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

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

0 голосов
/ 03 декабря 2011

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

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

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

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

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

0 голосов
/ 18 апреля 2010

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

...