Большинство динамических языков динамического программирования

Кажется, я должен согласиться с этим сообщением , когда он заявляет, что

[...] код в динамически типизированных языках следует соглашениям с типичной типизацией

Многочисленный динамический код языка, с которым я сталкиваюсь, действительно кажется довольно статическим (думая о PHP), тогда как динамические подходы выглядят несколько неуклюжими или ненужными.

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

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

Примеры:

  • Отражение
  • Первоклассные продолжения
  • Изменение/генерация объекта времени выполнения
  • Метапрограммирование
  • Оценка кода времени выполнения
  • Отсутствие поведения элемента

Каковы полезные приложения для таких методов?

Ответы

Ответ 1

Все функции, которые вы перечисляете, также доступны в статически типизированных языках, некоторые с ограничениями.

  • Отражение: присутствует в Java, С# (не безопасно типа).
  • Первоклассные продолжения: ограниченная поддержка в Scala (возможно, другие)
  • Изменение объекта Runtime: изменение типа объекта поддерживается в ограниченной форме на С# с использованием методов расширения (будет в Java 7) и неявных преобразований типов в Scala. Хотя открытый класс не поддерживается, большинство случаев использования покрываются преобразованиями типов.
  • Метапрограммирование: я бы сказал, что метапрограммирование - это заголовок многих связанных функций, таких как отражение, изменения типа во время выполнения, АОП и т.д.

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

Функция открытого класса, поддерживаемая Ruby, - это то, что компилируемые языки никогда не будут поддерживать. Это наиболее гибкая форма метапрограммирования (со всеми вытекающими последствиями: безопасность, производительность, ремонтопригодность). Вы можете изменить классы платформы. Он используется Ruby on Rails для создания методов объектов домена из метаданных "на лету". На статически типизированном языке вы должны хотя бы создать (или сгенерировать код) интерфейс вашего объекта домена.

Если вы ищете "самые диманианские языки", все гомокиноязычные языки, такие как LISP, а Prolog - хорошие кандидаты. Интересно, что С# несколько гомоиконна с деревьями выражений в LINQ.

Ответ 2

Некоторые примеры широкого применения вышеупомянутых методов:

  • Продолжения появляются в веб-фреймворках, таких как Rails или Seaside. Они могут использоваться, чтобы позволить API подделывать локальный контекст. В Seaside или Rails это делает API более похожим на обработчик формы локального GUI, чем обработчик запросов HTTP, что упрощает задачу кодирования элементов пользовательского интерфейса приложения. Однако, хотя многие динамические языки имеют сильную поддержку продолжений, они, конечно же, не уникальны для этого типа языка.

  • Отражение довольно широко используется для O/R-карт и сериализации, но многие статически типизированные языки также поддерживают отражение. На языках с утиным языком они могут быть использованы для определения во время выполнения, если средство реализовано путем просмотра метаданных объекта. Некоторые маркеры O/R (и аналогичные инструменты) работают, реализуя обращения к переменным экземпляра и перенаправляя обновления в кэшированную запись на уровне доступа к данным. Это помогает сделать персистентность относительно прозрачной для разработчика, поскольку обращения к полю выглядят так же, как локальные переменные.

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

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

    Еще один пример метапрограммирования - метод Smalltalk #notImplemented:, который вызывается при попытках вызвать несуществующие методы. Имя и параметры метода предоставляются разработчику #notImplemented: и могут впоследствии использоваться для конструктивного вызова метода. Ловушку этого можно использовать (например) для реализации общих механизмов прокси.

LISP программисты утверждают, что LISP является самым динамичным языком всех из-за его поддержки первого класса для прямого доступа к деревьям синтаксиса кода (так называемые макросы). Это средство делает реализацию DSL тривиальным в LISP - и прозрачно интегрирует их в вашу базу кода.

Ответ 3

Вы должны посетить Douglas Crockford Wrrrld Wide Web и посмотреть его волшебство над Javascript. Javascript обычно написан довольно простым и простым способом, например, слегка упрощенным C. Но это только поверхность. Неизбежные ключевые слова - это небольшой процент владения языком. Большая часть его заключается в объектах и ​​методах, экспортируемых системой, и они полностью изменяемы. Вы можете заменить/расширить методы "на лету" , вы можете заменить довольно глубоко укоренившиеся системные методы, гнездо eval(), загрузить сгенерированную <SCRIPT> на лету и т.д. Это можно использовать при написании всех типов языковых расширений, фреймворков, наборов инструментов и т.д. Вместо 200 строк кода вашей программы в прямом Javascript вы пишете 50 строк, которые изменяют работу Javascript, и еще 50, которые используют новый синтаксис для выполнения этой работы. Вы можете создавать целые страницы "на лету" , в том числе встроенные в них JS. Вы превращаете структуру веб-страницы в хранилище данных. Вы заменяете часто используемые методы популярных объектов и своих собственных, изменяете свое поведение "на лету" , изменяя не только внешний вид, но и функцию веб-страницы за один клик.

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

Ответ 4

Я не буду утверждать, что Lisp является "самым динамичным" (я даже не уверен, что это означает), но программисты Lisp часто делают вещи, которые трудно невозможны на других языках:

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

Yegge рассказывает об этом здесь w.r.t. Emacs, например, анализирует XML, преобразовывая его в s-выражения, записывая функции для тегов, которые вы хотите обработать, и фактически запускаете их.

Ответ 5

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

Я бы сказал, что везде, где вы используете REST и jason, вы, скорее всего, найдете динамический код, например, где javascript, php, perl, ruby,... популярны хотя бы частично потому, что они способны динамической адаптации.

Кроме того, существует много кода браузера javascript, который имеет дело с версией браузера и брендами, использующими динамические методы.

Ответ 6

Да, я считаю, что JavaScript как хороший.
JavaScript настолько гибкий, что люди, работающие на разных языках, имеют для них разные варианты. Подобно Microsoft имеет Ajax-библиотеку с типичным синтаксисом типа .NET/С#. Также есть некоторые библиотеки JavaScript, которые используют $, который похож на PHP-синтаксис. Его все там, потому что JavaScript является bueaty. Сколько других языков можно сказать, что может облегчить что-то вроде этого?
И нужно знать о функции закрытия JavaScript, которая представляет собой современное состояние и помогает создавать удивительные алгоритмы с отличными результатами.