Использует для динамических языков - PullRequest
8 голосов
/ 30 января 2009

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

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

Ответы [ 13 ]

15 голосов
/ 30 января 2009

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

Со временем это будет качаться в другую сторону. Уже различные статические языки имеют:

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

  • Вывод типа, что избавляет от необходимости тратить время на написание того, что должно быть очевидным

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

  • Неявные преобразования, позволяющие имитировать «исправление обезьян» без рисков, которые обычно связаны.

  • Загрузка кода и простой программный доступ к компилятору, поэтому пользователи и третьи лица могут создавать сценарии для вашей программы. Используйте с осторожностью!

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

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

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

3 голосов
/ 30 января 2009

Вот Стив Йегге на эту тему.

Гвидо ван Россум также связался с этим докладом в его взятии Скалы .

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

Пример на Python:

def lengths(sequence):
    try:
        return sum(len(item) for item in sequence)
    except TypeError:
        return "Wolf among the sheep!"

>>> lengths(["a", "b", "c", (1, 2, 3)])
6
>>> lengths( ("1", "2", 3) )
'Wolf among the sheep!'

Как вы думаете, сколько времени мне понадобилось, чтобы написать, и сколько циклов компиляции-запуска-отладки?

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

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

«Мне любопытно, каковы преимущества динамические языки, даже если у вас есть те ».

По сравнению с языком программирования D:

  • Python - более компактный язык. Он позволяет вам выразить столько же, сколько D, но использует для этого гораздо меньше различных концепций - чем меньше, тем больше .

  • Python имеет мощную стандартную библиотеку - батареи включены .

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

1 голос
/ 30 января 2009

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

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

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

1 голос
/ 30 января 2009

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

1 голос
/ 30 января 2009

Я действительно написал сообщение в блоге об этом: linky . Но этот пост в принципе можно описать так:

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

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

1 голос
/ 30 января 2009

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

Значит, дело не в том, что вы не можете делать это на статически типизированном языке (если у вас есть отражение во время выполнения), это просто сложнее.

0 голосов
/ 20 марта 2009

Взгляните на этот e4x пример в JavaScript:

var sales = <sales vendor="John">
    <item type="peas" price="4" quantity="6"/>
    <item type="carrot" price="3" quantity="10"/>
    <item type="chips" price="5" quantity="3"/>
  </sales>;

alert( sales.item.(@type == "carrot").@quantity );
alert( sales.@vendor );
for each( var price in sales..@price ) {
  alert( price );
}

Особенно, посмотрите на строку:

alert( sales.item.(@type == "carrot").@quantity );

На типичных статических языках вам не нужно писать sales.item, так как вы не можете знать, что товар является собственностью продаж до времени выполнения. Это не ограничено е4х. При подключении вы пишете в аналогичном стиле при написании SOAP-клиентов или любого другого базового типа, о котором вы не знали до времени выполнения. На статическом языке обычно требуется запустить инструмент, который будет генерировать заглушки или программы очень подробным образом. Затем, если что-то изменится в веб-сервисе, вам нужно будет заново генерировать заглушки. Посмотрите на код DOM Java:

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

public class Foo {

    public Document createDocument() {
        Document document = DocumentHelper.createDocument();
        Element root = document.addElement( "root" );

        Element author1 = root.addElement( "author" )
            .addAttribute( "name", "James" )
            .addAttribute( "location", "UK" )
            .addText( "James Strachan" );

        Element author2 = root.addElement( "author" )
            .addAttribute( "name", "Bob" )
            .addAttribute( "location", "US" )
            .addText( "Bob McWhirter" );

        return document;
    }
}

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

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

0 голосов
/ 30 января 2009

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

...