Что такое динамический язык, и почему C # не подходит? - PullRequest
31 голосов
/ 24 апреля 2009

Слушая подкаст, я слышал, что C # не является динамическим языком, в то время как Ruby есть.

Что такое "динамический язык"? Означает ли существование динамических языков, что существуют статические языки?

Почему C # является динамическим языком, а какие другие языки динамическими? Если C # является не динамическим, почему Microsoft настойчиво продвигает его на рынок?

А также, почему большинство .NET-программистов сходят с ума по этому поводу, оставляя другие языки и переходя на C #?

Почему Ruby "язык будущего"?

Ответы [ 12 ]

70 голосов
/ 24 апреля 2009

Что такое динамический язык?

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

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

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

Почему C # не является динамическим языком?

C #, предшествующий 4.0, является статически связанным языком и, следовательно, не является динамическим языком.

Почему Ruby является языком будущего?

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

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

26 голосов
/ 24 апреля 2009

На динамическом языке вы можете сделать это:

var something = 1;
something = "Foo";
something = {"Something", 5.5};

Другими словами, тип не является статическим. В статически типизированном языке это может привести к ошибке компилятора.

Такие языки, как C, C ++, C # и Java, имеют статическую типизацию.

Такие языки, как Ruby, Python и Javascript, типизируются динамически.

Кроме того, это не то же самое, что "сильно или слабо" напечатано. Это что-то другое вместе.

6 голосов
/ 01 августа 2009

Я поражен тем, как c # охватывает фундаментальный набор парадигм программирования.

Можно сказать, что c # допускает богатое объектно-ориентированное программирование, богатое компонентно-ориентированное программирование, хорошо интегрированное функциональное программирование, полный набор операций запроса для разных типов источников данных (linq), элегантный подход к параллельному программированию через pLinq и параллельные расширения, в следующем выпуске (c # 4.0) будут мощные динамические возможности, и почти уверен, что в C # 5.0 будет иметь солидный набор метапрограммирования особенности.

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

3 голосов
/ 26 февраля 2010

Знаете ли вы, что VB6 одновременно статичен и динамичен?

Если вы объявляете переменные с заданным типом, вы получаете статическое поведение:

Dim name as Label

Теперь вы можете получить доступ только к тем членам с именем, которые Label s, и intellisense это знает.

Если у вас есть класс и добавлено ключевое слово implements, тогда ваш класс может реализовывать методы другого класса. Это наследование интерфейса, которое позволяет VB6. Вы можете получить некоторое время полиморфизма.

Вы также можете объявить переменные следующим образом:

Dim proxy As Object

Теперь intellisense вам не поможет, а VB6 позволит вам делать все, что угодно с proxy:

proxy.foo()

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

Вы также можете выполнить:

set proxy = <any instance>

и это запустится. Не имеет значения, есть ли у <any instance> метод foo или нет.

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

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

3 голосов
/ 24 апреля 2009

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

В записи Википедии перечислены многочисленные динамические языки.

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

3 голосов
/ 24 апреля 2009

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

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

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

2 голосов
/ 24 апреля 2009

В C # 3.0 типы всего должны быть известны во время компиляции. Это статический язык. Динамический язык использует динамическую диспетчеризацию во время выполнения для определения типа вещей и методов, которые нужно вызывать для этих вещей. Оба типа языков имеют свои преимущества и недостатки. C # 4.0 добавит динамические возможности. Андерс Хейлсберг выступил с великолепной речью о статических стихах. динамические языки и C # 4.0 на PDC.

2 голосов
/ 24 апреля 2009

Слова static и dynamic не определены однозначно.

Однако чаще всего подразумеваются две проблемы:

1) В статических языках тип переменной (то есть тип значения, которое переменная может содержать или указывать) не может изменяться в течение программы. Например, в C # вы объявляете тип переменной при ее определении, например:

int a;

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

2) На статическом языке тип объекта не может быть изменен. В динамических языках объект может изменяться, поскольку вы можете присоединять или удалять методы и свойства, тем самым, по сути, превращая его в совершенно другой объект.

1 голос
/ 24 апреля 2009

Динамический язык обычно считается тем, который может динамически интерпретировать и генерировать код во время выполнения. C # не может этого сделать.

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

1 голос
/ 24 апреля 2009

Нет настоящего "языка будущего". У разных языков разные цели. Самое большее, вы могли бы сказать, что Ruby - это язык будущего.

Согласно Википедии:

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

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

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