Кто-нибудь может объяснить C C ++ Java относительно динамического или статического языка - PullRequest
5 голосов
/ 06 марта 2011

Кто-нибудь может объяснить C C ++ Java относительно языка динамической типизации или статической типизации.

Я где-то читал, что C C ++ и Java все являются статическим языком.Но я помню, что есть и другие мнения по этому поводу.Очень растерян.

Спасибо!

Ответы [ 4 ]

6 голосов
/ 06 марта 2011

Какие еще мнения?Нет сомнений в том, что C, C ++ и Java являются статически типизированными языками, а C ++ и Java имеют некоторые динамически типизированные функции.Есть еще одна проблема: строго по сравнению со слабой типизацией, которая в первую очередь относится к неявным преобразованиям и перегрузкам.В Интернете можно найти множество подробных обсуждений этих вопросов;вы можете начать с http://en.wikipedia.org/wiki/Type_system

1 голос
/ 27 марта 2011

После ответа Хловдала я снова процитирую Бенджамина Пирса с чем-то положительным в этом вопросе.Я ссылаюсь на главу 1 «Типы и языки программирования» и расширяю ее.

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

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

Редактировать : "статическая типизация" - это , а не четко определенная концепция.Чтобы показать это, я (в общих чертах) определю три свойства, которые могут относиться к «статической типизации».

  1. Перед выполнением программы она проверяется на тип: и Java, C и C ++ удовлетворяют этомукритерий.
  2. Если тип программы проверяется, мы можем гарантировать, что во время выполнения не будет ошибок определенного класса: C и C ++ не пройдут этот критерий, Java пройдет его (хотя это возможно только из-за неудачного приведения типов).специально исключены из этого класса ошибок).
  3. Во время выполнения не существует представления типа, определенного языком.Это свойство не подходит как для Java, так и для C ++ и характеризует такие языки, как C и Pascal.

Если вы говорите, что язык «статически типизирован», если он имеет все три свойства, которые я упомянул выше, то ни Java, C или C ++ статически типизированы.

1 голос
/ 06 марта 2011

Это спектр. В C нет никаких функций динамической типизации, хотя он позволяет вам использовать void * и использовать для самостоятельной подделки. C ++ и Java имеют динамическую диспетчеризацию для методов класса, поэтому в C ++ и Java есть случаи, когда вы не знаете, какой метод фактически вызывается для объекта до времени выполнения. Java включает в себя API отражения, который фактически позволяет вам проверять и изменять типы во время выполнения, поэтому он немного более динамичен, чем C ++. Кроме того, существуют такие языки, как Python и Ruby, которые в значительной степени полностью динамичны - почти ничего не проверяется во время компиляции, и у вас есть такие функции, как «типизирование утки», когда вас не слишком волнует фактический тип, если он поддерживает операция, о которой вы заботитесь.

0 голосов
/ 06 марта 2011

Что касается различных мнений о статической / строгой типизации, я случайно наткнулся на этот старый комментарий slashdot сразу после прочтения этого вопроса:

Приходит мое любимое определение "строгой типизации"из языков программирования Шримама Кришнамурти: применение и интерпретация (стр. 205):

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

Бенджамин Пирс (автор типов и языков программирования) написал нечто подобное (см. Марк Джейсон Доминус цитирует Пирса о " _ _ набрав" ):

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...