Что такое динамический язык и почему C # не подходит?

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

Что такое «динамический язык»? Подразумевает ли существование динамических языков наличие статических языков?

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

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

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


person Community    schedule 24.04.2009    source источник
comment
Ruby - язык будущего ... пожалуйста!   -  person jasonco    schedule 24.04.2009
comment
@jasonco, я знаю. Cobol - это будущее.   -  person JaredPar    schedule 24.04.2009
comment
LOLCODE - это будущее!   -  person Adam Robinson    schedule 24.04.2009
comment
У нас уже есть несколько других версий этого вопроса ... stackoverflow.com/ вопросы / 493973 / использует-для-динамических-языков ... stackoverflow.com/questions/311882/   -  person dkretz    schedule 24.04.2009
comment
Недавно Скотт Хансельман загрузил интервью с Майклом Фордом о IronPython (еще одном динамичном языке), интервью интересно и, возможно, может дать вам некоторое представление. hanselminutes.com/default.aspx?showID=177   -  person Nathan Koop    schedule 24.04.2009
comment
Спасибо всем за ответы, но почему люди голосуют против? Это не связано с программистом ??? !!   -  person egyamado    schedule 25.04.2009
comment
Единственный истинный язык будущего - это Лисп. Это единственный язык, которому выпала честь быть языком будущего более 50 лет подряд!   -  person Pavel Minaev    schedule 01.08.2009
comment
-1 для Why is Ruby "the language of the future"?   -  person user    schedule 22.09.2012


Ответы (12)


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

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

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

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

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

C # до 4.0 был статически связанным языком и, следовательно, не был динамическим языком.

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

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

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

person Community    schedule 24.04.2009
comment
Спасибо, JaredPar, о том, почему Ruby - это язык будущего? Я слышал это на одном из подкастов, и ребята говорили об этом, как будто это факт. Теперь я знаю, что они ошибались ... - person egyamado; 25.04.2009
comment
Люди всегда заявляют о языке будущего. Это всегда их любимый язык. - person Chuck; 25.04.2009
comment
Обратите внимание, что ничто не мешает языку поддерживать как статическую, так и динамическую типизацию. Один из таких языков - Curl. - person Christopher Barber; 16.05.2010
comment
Руби - the language of the future из тех, кто говорил на подкаст-шоу. Те, кто переезжает из RoR to .NET MVC, они могут сказать, что Ruby is the language of the past. Также я слышал от одного Ruby разработчика, что Ruby was created to make developers happy :). На эту тему ходит множество мифов. - person angularrocks.com; 21.11.2013

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

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

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

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

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

Кроме того, это не то же самое, что «строго или слабо» типизировано. Все вместе это что-то другое.

person Community    schedule 24.04.2009

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

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

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

person Community    schedule 01.08.2009

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

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

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

person Community    schedule 24.04.2009

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

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

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

person Community    schedule 24.04.2009
comment
@David - «X - это Y будущего», с другой стороны, означает, что кто-то пытается вам что-то продать. +1 Отличный комментарий. Языки подобны религиям ... их много, поэтому один - лучший, равно как и религия будущего. Это просто не имеет смысла. - person jasonco; 24.04.2009

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

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

Dim name as Label

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

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

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

Dim proxy As Object

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

proxy.foo()

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

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

set proxy = <any instance>

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

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

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

person Community    schedule 26.02.2010

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

person Community    schedule 24.04.2009
comment
Ух ты. скажи, что это не так! Статическая типизация - это самое большое преимущество C # перед мировыми «рубинами» и phps. Ошибки в написании - это скорее ошибки времени компиляции, чем странные несоответствия во время выполнения. Я, конечно, надеюсь, что динамическую типизацию можно будет отключить. - person Jason Kester; 24.04.2009
comment
@Jason: На самом деле, то, что они делают в 4.0, просто потрясающе. dynamic становится ключевым словом для объявления динамических типов, так что да, это необязательно. :) Но они также добавляют целый динамический уровень выполнения (DLR). Отличный материал. Видео тоже хорошее b / c в конце Андерс немного рассказывает о том, что будет после 4.0. Очень мило. Небольшой спойлер ... REPL на C #! - person JP Alioto; 24.04.2009

Слова статический и динамический не имеют четкого определения.

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

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

int a;

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

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

person Community    schedule 24.04.2009
comment
Относительно (1): это явное и неявное. Есть много языков, в которых вы не объявляете тип переменной, но он по-прежнему статичен, а типы проверяются во время компиляции. Это называется выводом типа. - person RHSeeger; 05.08.2009

c # статически типизирован, т.е. int i = 0; попробуйте установить i как строку. компилятор пожалуется,

где в качестве python переменная, которая использовалась для хранения целого числа, затем может быть установлена ​​для хранения строки,

Статический: типы окончательные, Динамический: типы могут быть изменены,

С # пытается добавить больше динамических функций, например var

person Community    schedule 24.04.2009
comment
var в C # не является динамической функцией, это просто неявная типизация. Тип переменной по-прежнему строго типизирован и не может быть изменен. - person blowdart; 24.04.2009
comment
var в C # - это просто сокращение для экономии ввода. Кроме того, динамический язык - это больше, чем просто динамические типы, в противном случае вы могли бы использовать объект или вариант для хранения всех ваших переменных. - person Steven; 24.04.2009

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

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

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

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

person Community    schedule 24.04.2009
comment
›Ruby - это динамический язык, а C # - нет, поскольку Ruby интерпретируется, а C # компилируется. Это совершенно неверно. - person Steve Klabnik; 26.04.2009

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

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

person Community    schedule 24.04.2009

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

person Community    schedule 03.12.2017