Подтвердить что ты не робот

Как вы программируете по-разному в динамических языках?

Как кто-то, кто действительно знает, как использовать языки динамического программирования, подходит к программированию иначе, чем кто-то, работающий на статическом языке?

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

Большая часть кода, который я видел на языках динамического программирования, не очень отличается от кода, написанного на статических языках программирования. Как говорится, вы можете писать FORTRAN на любом языке, и многие люди это делают. Но некоторые люди используют языки динамического программирования для решения проблем способом, который нелегко перевести, например, на С++. Каковы некоторые из их методов?

Каковы хорошие ресурсы, которые обсуждают, как использовать языки динамического программирования? Не книги по синтаксису языка или ссылки на API, а ресурсы по подходам к решению проблем, которые используют возможности динамического языка.

EDIT (1/5/2009): Я ценю ответы ниже, но они, похоже, не объясняют огромный рост производительности, который говорят динамические сторонники языка.

4b9b3361

Ответ 1

Мне нравится тонкий ответ. Я занимаюсь сумасшедшим временем в Java и С++, создавая настраиваемые структуры данных, которые просто бесплатны в Python/Ruby. И создание специализированных функций для обработки этих настраиваемых структур данных. Да, на С++ STL действительно приятный. Да, дженерики на Java хороши. Они помогают создавать пользовательские структуры данных намного быстрее, однако они по-прежнему требуют большой мысли и внимания.

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

Утиная печать означает, что вы не теряете времени на определение того, что такое утка. Не имея формального определения ваших объектов, вы сохраняете много времени и энергии. Правильно определить определения сложно. Взгляните на это сообщение в блоге, где я приведу примеры: Формальные определения менее полезны, чем вы думаете

Утиная печать оказалась чрезвычайно полезной. Принцип "Игнорировать" в XML - вот что сделало XML настолько значительным и полезным в Интернете. Но это всего лишь пример утиной печати.

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

Наконец, вы можете вернуться к длинному сообщению в блоге, где я объясню, как печатать утки и как это относится к вещам типа AI и моделирования: Duck Typing, Искусственный интеллект и философия

Ответ 2

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

$row = $db->getTable('user')->getRow(27);
$row->setValue('name', 'Bob');

и

$row = $db->user->getRow(27);
$row->name = 'Bob';

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

Ответ 3

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

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

def proxy = new SoapClient("http://localhost:6980/MathServiceInterface?wsdl");
def result = proxy.add(1.0, 2.0);

Это еще один фрагмент Groovy, который извлекает данные из XML:

def contacts = new XmlParser().parseText("<contacts><name>Bahaa Zaid</name></contacts>");
def myName = contacts.name[0].text();

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

Ответ 4

Я думаю, что самая драматичная разница в выборе структур данных.

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

В Perl я просто использую хэш и "изобретаю" ключи, когда я код.

Ответ 5

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

Если я знаю, что я хочу делать, и вообще, как это сделать, мне нравится С++. Если я не знаю, как делать то, что хочу, и, вероятно, не совсем уверен в том, что я хочу делать, я предпочитаю Lisp.

Ответ 6

Быстрые итерации делают более счастливыми программистов, и они не приходят быстрее, чем интерактивный интерпретатор. Хорошая работа с интерпретатором дает вам песочницу, тестирование и прототипирование в то же время.

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

Ответ 7

Мои самые большие выигрыши в сопоставлении между базами данных и объектами (ORM).

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

Ответ 8

Это сводится к одному из моих любимых соотношений: сколько времени я трачу, думая о решении проблемы, и сколько времени я трачу на размышления об инструменте, который я использую для решения проблемы. Подумайте об этом как о соотношении S/N.

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

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

Но в основном это касается моего внимания в сладком месте.

Ответ 9

Я не могу привести это прямо сейчас (моя память не позволяет мне), но я слышал что-то вроде:

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

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

Ответ 10

Больше библиотек и более важных библиотек.

Моя догадка заключается в том, что "Duck Typing", обычно связанный с динамическими языками, помогает значительно упростить код и значительно упрощает запись родового кода. Вы не ограничены строгой иерархией классов и, следовательно, способны легче компоновать компоненты из разных библиотек.

Ответ 11

Джон, только на основе вашего обновления для редактирования от 1/5/09, вы можете найти AMOP интересное чтение и многое другое о которую вы думаете. Это довольно lisp -центрический, но ведь многие хорошие динамические идеи начались там. Поэтому, если вы можете наслаждаться (или превзойти) этот аспект, авторы обсуждают динамические аспекты, которые необходимы и используются для этого. Это довольно мощный материал.

Ответ 12

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

Ответ 13

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

Я думаю, что люди Javascript делают это, выполняя файлы JSON.

Ответ 14

Для меня это оборотная скорость. Используемые динамические языки (Python и немного JavaScript на данный момент) интерпретируются. Это означает, что я могу попробовать все на ходу. Если я хочу посмотреть, как ведет себя некоторый бит API, я могу просто взломать переводчика на пару минут.

Если бы я хотел сделать то же самое на языке С#, мне пришлось бы запустить VS, создать проект, а затем скомпилировать его. Если я хочу проверить часть более крупного программного обеспечения, над которым я работаю, мне, вероятно, придется скомпилировать это, что может занять много времени. К счастью в .Net, я могу загружать сборки из большого проекта в IronPython и получать некоторые из тех же преимуществ (то есть быстро тестировать различные части API) интерпретируемых языков.

Ответ 15

Прочитайте "Perl верхнего порядка" Марка Джейсона Домина. Он обсуждает только Perl, но он дает методы, естественные для Perl, которые были бы менее естественными на большинстве статических языков.

All languages obviously have their strengths and weaknesses and dymanic vs static 

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