Как узнать, является ли язык динамическим?

Я пытаюсь лучше понять, что на самом деле означает «динамический» язык. У меня довольно большой опыт работы с Lingo, языком сценариев для линейки продуктов Adobe (ранее Macromedia) Director, и мне просто интересно, будет ли он считаться «динамическим языком».

Способ обработки переменных и списков кажется мне очень "динамичным языком".

С переменными вы должны просто написать foo = 3 или bar = "Hello World". Вы не объявляете переменную как int или _4 _ - она ​​вычисляет это как есть.

Со списками вы можете просто написать что-то вроде miscCollection = [3, "Hello World", #helloWorld, ["Embedded List", "Goes Here", 3], [#phrase: "Property List goes here", #value: 3]]. Разве это не было бы похоже на tuple?

Достаточно ли этих функций, чтобы претендовать на статус «динамического языка»?

Интересно, что я гораздо больше использую C #, а Director / Lingo - намного меньше, но, несмотря на все волнения по поводу динамических языков в наши дни, мне интересно, действительно ли я иду против течения.

ИЗМЕНИТЬ

Что касается ответа Марка Рушакоффа, то ниже сделана попытка проанализировать, квалифицируется ли Lingo как «динамический», используя эту статью в Википедии < / а>:

  1. Eval - В Lingo есть ключевые слова do и value. do выполнит всю команду, например, do "foo = 23" или do "foo = sum(20, 3)". value пытается преобразовать строку в число, но это больше, чем просто оператор синтаксического анализа - он может фактически преобразовать строковое представление переменной в ее номер, например, предполагая foo = 23, оператор value("foo") будет оценивать как 23.

  2. Функции высшего порядка - если я правильно понимаю, это, по сути, то, что я бы назвал «делегатом» в C #. Насколько мне известно, Lingo не поддерживает это напрямую, хотя вы можете создать тип (называемый «родительским скриптом»), который имеет функцию и передать экземпляр типа.

  3. Замыкания - Насколько я знаю, это не поддерживается.

  4. Продолжение - Насколько я знаю, это не поддерживается.

  5. Отражение - По крайней мере, да. Фактически вы создаете новые экземпляры типов, используя строку, например fooInstance = script("Foo").new(bar). Также возможно преобразовать экземпляр типа в строку, содержащую имя типа (чтобы вы могли имитировать GetType() функциональность C #). Вы также можете запрашивать свойства типа, не зная имен свойств (например, искать свойство по индексу) и узнавать имена свойств по индексу.

  6. Макросы. Я не верю в то, как статья в Википедии описывает макрос. Однако можно редактировать сценарии во время выполнения, так что, возможно, это имеет значение.

Итак, кажется, что Lingo получает от 2 до 3 баллов из 6 по динамическим функциям, но я недостаточно разбираюсь в закрытии и продолжении, чтобы точно знать, что Lingo их не поддерживает. Думаю, я не уверен, что делать выводы. Комментарии приветствуются.


person devuxer    schedule 01.11.2009    source источник
comment
Используемое вами определение кажется очень непоследовательным. Непонятно, почему лямбды / замыкания должны иметь какое-либо отношение, например, к динамическому языку. Похоже, что eval - единственное значимое определение. Конечно, есть также динамически типизированные, и я не уверен, должна ли ваша динамика быть той же самой или совершенно другой концепцией.   -  person Pavel Minaev    schedule 02.11.2009
comment
@Pavel, спасибо за ваш комментарий, но это не мое определение. Это было из статьи в Википедии, на которую ссылался Марк в своем ответе. Если вы читаете эту статью, она помечена парой предупреждений о необходимости доработки, так что вы, вероятно, правы, сомневаясь в определении.   -  person devuxer    schedule 03.11.2009
comment
Честно говоря, этот вопрос примерно так же полезен, как вопрос, какого цвета коричневый цвет. Без четкого и общепринятого определения языка динамического программирования классификация языков как динамических или нет, на самом деле вам ничего не скажет.   -  person Stephen C    schedule 18.01.2010
comment
@DanM - учитывая, что вы согласны с тем, что @Pavel прав, ставя под сомнение процитированное определение, вам, вероятно, не следует использовать его в качестве основы для своего вопроса.   -  person Stephen C    schedule 18.01.2010
comment
@Stephen, для меня вопрос столь же полезен, как если бы вы указали на плитку шоколада и спросили, она коричневая? Как только вы поймете, что что-то, с чем вы знакомы, имеет свойство x, вы можете идентифицировать другие вещи, которые не настолько знакомы, чтобы увидеть, обладают ли они свойством x. Что касается моего редактирования, это действительно был способ ответить на ответ, который был длиннее, чем то, что можно было разумно поместить в комментарий, а не одобрение статьи в Википедии.   -  person devuxer    schedule 18.01.2010
comment
@DanM - ИМО, любая попытка определить язык динамического программирования обречена на провал. Если вы посмотрите на ряд языков, которые разные люди назвали динамическими, вам будет трудно найти какие-либо свойства, общие для всех из них. Как видно из статьи в Википедии.   -  person Stephen C    schedule 18.01.2010
comment
@Stephen, тут никаких аргументов. Это, наверное, единственное, что я узнал, задав этот вопрос :)   -  person devuxer    schedule 18.01.2010


Ответы (4)


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

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

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

Это две крайности. Как и все в жизни, на практике языки находятся где-то между двумя теоретическими крайностями. Поэтому иногда трудно сказать, является ли язык типизированным или нетипизированным - часто все, что вы можете сказать, это что-то вроде «язык X лучше проверяет типы во время компиляции, чем язык Y, потому что эти ошибки обнаруживаются в X, но не в Y: ... . "

Учитывая это определение, вы можете беспокоиться, что (1) типизированный язык требует намного большего количества текста в программе (потому что вам нужно указать, к какому типу относится каждое значение) и (2) типизированный язык может ограничивать то, что вы можете делать без необходимости (потому что система типов недостаточно умен, чтобы позволить что-то, что вы видите, будет работать).

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

String s = "hello"

когда это очевидно, просто

s = "hello"

что "s" должно быть String? Такие «умные» языки, где нет необходимости говорить, какие типы есть, но они все еще проверяются, часто называют «Хиндли Милнер», потому что это люди, которые первыми разработали, как это сделать. в деталях.

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

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

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

У языков, которые я называл «нетипизированными» (или динамически типизированными), есть типы. Например, в Python (который является нетипизированным динамическим языком) по-прежнему существует разница между String и Integer. Но у них нет дополнительной логики, которая проверяет программу перед ее запуском. Поэтому правильнее было бы сказать, что у них есть типы, но нет системы типов.

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

person andrew cooke    schedule 10.11.2009
comment
-1 - называть динамически типизированный язык нетипизированным - это вопиющее злоупотребление принятой терминологией. То, что вы называете типизированным языком, является языком со статической типизацией. en.wikipedia.org/wiki/ - person Stephen C; 18.01.2010

Определение типа (например, ваши примеры foo = 3 и bar = "Hello World") не подразумевает динамический язык. Ключевое слово var в C # определяет тип переменной во время компиляции, и Haskell также может использовать неявную типизацию для всех переменных, даже в скомпилированных программах.

«Язык динамического программирования» - это довольно неопределенный термин, но я думаю, что если бы вам пришлось ограничить это к одному квалификатору, это будет отражение во время выполнения. Если вы умеете отражать, вы, вероятно, можете использовать другие квалификаторы, перечисленные в статье Википедии (eval, изменение среды выполнения объекта, замыкания, макросы ...).

Я ничего не знаю о языке Lingo, но я бы сказал, что в целом легче дисквалифицировать язык как динамический, чем квалифицировать язык. Может ли Lingo выполнить какие-либо / все квалификаторы из статьи в Википедии? Если нет, то, вероятно, это просто не динамично. Если он может делать что-либо, то, вероятно, он, по крайней мере, «достаточно динамичен».

person Mark Rushakoff    schedule 02.11.2009

Когда люди говорят о «динамическом» языке программирования, они обычно имеют в виду систему динамических типов. Лучшее определение того, что такое система динамических типов (и что это не так), что я когда-либо читал, - это отличная статья Криса Смита Что нужно знать перед обсуждением систем типов.

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

person Daniel Pryden    schedule 02.11.2009
comment
Спасибо за указатель. Прочитав и частично поняв статью, я могу сказать вам, что в моем примере языка Lingo нет средства проверки типов. Если действительно, убедитесь, что вы не пытаетесь использовать переменную, которая никогда не была назначена, но это все. Тем не менее, не думаю, что я действительно ушел от понимания того, что такое система динамических типов . У меня есть некоторое представление о том, чем он не является, в чем он хорош, а в чем нет, но я думаю, мне нужно что-то менее абстрактное, чтобы по-настоящему осмыслить это. - person devuxer; 03.11.2009
comment
@DanThMan: Я не знаком с Lingo, но уверен, что он действительно имеет систему типов. Звучит просто так, что он очень расплывчатый (то есть выполняет большое количество неявных преобразований). Свободная система типов часто ассоциируется с динамическими языками, но это ни в коем случае не является обязательным требованием. Python, например, имеет довольно строгую систему типов, но очень динамично типизируется. На мой взгляд, языки с динамической типизацией полезны для многих вещей, но языки со слабой типизацией - это просто хороший способ доставить вам неприятности. YMMV. - person Daniel Pryden; 03.11.2009

Я хочу показать, что Lingo - динамичный язык.

Я сделал LingoF функциональную среду программирования для Lingo. Этот фреймворк полностью написан на Lingo, без использования xtra и низкоуровневых компонентов, поэтому было бы невозможно разработать такой фреймворк, если бы язык не был динамическим.

Учитывая эту структуру, вот моя оценка Lingo как динамического языка:

1 - Eval - Lingo имеет ключевые слова do и value. Кроме того, вы можете скомпилировать сценарий во время выполнения. См. Функцию LingoF «Lingo Expressions».

2 - Функции высшего порядка - LingoF показывает, насколько возможно широкое использование функций высшего порядка в Lingo.

3 - Замыкания - снова LingoF показывает, как можно работать с замыканиями в Lingo.

4 - Продолжение - помощники синтаксиса LingoF определяются с помощью методов продолжения. Можно писать функции в стиле передачи продолжения. Отметьте это (взято из модуля LingoF):

on public_factorialCPS_2
on fac me, n,k
  x = LingoF().var()
  if ( n = 0 ) then return k [1] 
  else return me.factorialCPS[$(#-,n,1) ] [ LingoF().fun(x) [ k [ $(#*,n,x) ]  ] ]
end

5 - Отражение - Уже ответил утвердительно и согласен. Например, менеджер модулей LingoF реализован с использованием функций Lingo Reflection, упомянутых DanM.

6 - Макросы - мне нужно будет провести дополнительные исследования в этой области. Поскольку Director поддерживает связанные сценарии (сценарии, хранящиеся во внешних текстовых файлах), можно реализовать какие-то макросы. Возможно, диспетчер макросов может перехватить некоторые события, такие как startMovie (чтобы развернуть их) и stopMovie (чтобы снова сжать их). Другая возможность - использовать поля в качестве скриптов и расширять их в членах скрипта, я уверен, что это будет работать нормально.

Итак, моя оценка по динамическим характеристикам - от 5 до 6 из 6.

person Gus    schedule 18.01.2010