Как вы по-разному программируете на динамических языках? - PullRequest
30 голосов
/ 18 декабря 2008

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

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

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

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

РЕДАКТИРОВАТЬ (05.01.2009): я ценю ответы ниже, но они, кажется, не объясняют огромный рост производительности, который, по словам защитников динамического языка, они испытывают.

Ответы [ 15 ]

9 голосов
/ 09 апреля 2009

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

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

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

Утиная печать очень полезна. Принцип «Обязательно игнорировать» в XML - это то, что сделало XML таким значительным и полезным в Интернете. Но это просто пример утки.

Еще один способ выразить утки - это веб-мантра «Будь строг в том, что ты посылаешь, щедро в том, что ты принимаешь». Это тоже очень фундаментальная идея.

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

4 голосов
/ 18 декабря 2008

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

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

и

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

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

3 голосов
/ 05 февраля 2009

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

Один хороший пример магии Dynamic Languages ​​- это фрагмент кода 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();

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

2 голосов
/ 14 октября 2009

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

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

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

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

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

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

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

Но это в основном удерживает мое внимание в приятном месте.

2 голосов
/ 05 января 2009

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

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

2 голосов
/ 19 декабря 2008

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

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

2 голосов
/ 19 декабря 2008

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

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

2 голосов
/ 18 декабря 2008

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

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

В Perl я просто буду использовать хеш и «изобретать» ключи при кодировании.

1 голос
/ 26 ноября 2009

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

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

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

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