Что привлекает людей в динамических языках?

Кажется, что в последнее время все запрыгивают на динамичную, некомпилированную подножку. В основном я работал только с скомпилированными языками со статической типизацией (C, Java, .Net). У меня есть опыт работы с динамическими языками, вроде ASP (Vb Script), JavaScript и PHP. Использование этих технологий оставило у меня неприятный привкус, когда я думал о динамических языках. Вещи, которые обычно были бы обнаружены компилятором, такие как неправильное написание имен переменных и присвоение переменной значения неправильного типа, не происходят до времени выполнения. И даже тогда вы можете не заметить ошибку, поскольку она просто создает новую переменную и присваивает какое-то значение по умолчанию. Я также никогда не видел, чтобы intellisense хорошо работал на динамическом языке, поскольку, ну, переменные не имеют явного типа.

Что я хочу знать, так это то, что людей так привлекает в динамических языках? Каковы основные преимущества с точки зрения того, что динамические языки позволяют делать, что невозможно или сложно сделать на скомпилированных языках. Мне кажется, что мы давно решили, что такие вещи, как некомпилированные asp-страницы, генерирующие исключения времени выполнения, были плохой идеей. Почему наблюдается возрождение этого типа кода? И почему мне, по крайней мере, кажется, что Ruby on Rails на самом деле не похож на то, что вы не могли бы сделать с ASP 10 лет назад?


person Community    schedule 04.09.2008    source источник
comment
Довольно грустно (и странно) видеть так мало защищающих динамические языки.   -  person davidtbernal    schedule 27.10.2009
comment
Поскольку это единственный способ добиться чего-то, прежде всего, от всех нижеприведенных динамических ненавистников, я отвечу здесь: динамические языки позволяют писать код быстрее, и здесь нет двух способов. Мне не нужно беспокоиться о типе какой-либо из моих переменных, и мне не нужно запускать большую тяжелую IDE для написания кода. Таким образом, намного лучше выполнять быстрые задачи, которые потребовали бы больше времени с системами статических типов из-за громоздкости систем типов, заставляющих вас сообщать компилятору ВСЕ.   -  person RCIX    schedule 27.10.2009
comment
Что за ограниченная близорукость программистов на C #?   -  person Azeem.Butt    schedule 27.10.2009
comment
Во-первых, что такое парохиальная миопия?   -  person RCIX    schedule 27.10.2009
comment
@RCIX: Тогда сделайте такие быстрые вещи на языке сценариев, который по своей сути является динамическим. Я бы предпочел строгую безопасность типов - но с обобщениями и умным компилятором с выводом типов, как в большинстве функциональных языков - на языке (ах), который я использую.   -  person peSHIr    schedule 27.10.2009
comment
Насколько я понимаю, вы не читали steve.yegge.googlepages.com/ is-weak-typing-достаточно-достаточно?   -  person RCIX    schedule 27.10.2009
comment
Вам нужно сочетание статического и динамического просто потому, что вам не нравится использовать строгую систему типов без обобщений, лямбда-выражений, неявных переменных и т. Д.   -  person RCIX    schedule 27.10.2009
comment
Проблема с неправильным написанием имен переменных связана с неявным объявлением переменных, а не со статическими / динамическими. В динамических языках, требующих явного объявления переменных (например, Smalltalk), этой проблемы нет.   -  person Frank Shearar    schedule 24.02.2010
comment
С правильной IDE (например, Zend Studio, netbeans, eclipse и т. Д.) Вы можете отловить кучу ошибок еще до выполнения.   -  person Moak    schedule 26.05.2010


Ответы (32)


Я думаю, причина в том, что люди привыкли к языкам со статической типизацией, которые имеют очень ограниченные и невыразительные системы типов. Это такие языки, как Java, C ++, Pascal и т. Д. Вместо того, чтобы идти в направлении более выразительных систем типов и лучшего вывода типов (как, например, в Haskell, и даже в некоторой степени SQL), некоторые люди предпочитают просто сохранять вся информация о типах в их голове (и в их тестах) и полностью отказаться от статической проверки типов.

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

Заблуждение: динамические языки менее подробны. Заблуждение состоит в том, что информация о типе равна аннотации типа. Это абсолютно неверно. Все мы знаем, что аннотация типа раздражает. Машина должна уметь разбираться в этом. И в современных компиляторах так и есть. Вот статически типизированная QuickSort в двух строках Haskell (из haskell.org):

qsort []     = []
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)

А вот динамически типизированная QuickSort в LISP (из swisspig.net):

(defun quicksort (lis) (if (null lis) nil
  (let* ((x (car lis)) (r (cdr lis)) (fn (lambda (a) (< a x))))
    (append (quicksort (remove-if-not fn r)) (list x)
      (quicksort (remove-if fn r))))))

Пример Haskell опровергает гипотезу, статически типизированной, поэтому многословной. Пример LISP опровергает гипотезу, подробный, поэтому статически типизированный. Нет никакого смысла ни в одном направлении между набором текста и многословием. Вы можете смело выбросить это из головы.

Заблуждение: языки со статической типизацией должны компилироваться, а не интерпретироваться. Опять же, это неправда. Многие статически типизированные языки имеют интерпретаторы. Есть интерпретатор Scala, интерпретаторы GHCi и Hugs для Haskell, и, конечно же, SQL был статически типизирован и интерпретирован дольше, чем я жил.

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

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

person Community    schedule 04.09.2008
comment
Да, и если вы говорите о Java, то есть Groovy ... это Java с динамической типизацией. - person leeand00; 07.02.2009
comment
Что ж, будет более подробным, если вы выберете для всего более длинные имена! (Запрещает ли LISP имя qsort?) - person Edmund; 25.02.2009
comment
Откажитесь от типа Safe for Liberty не заслуживают ни того, ни другого .. О да, чувак .. Отлично рядом с постом - person baash05; 27.02.2009
comment
lisp сам по себе довольно подробный, он не имеет ничего общего с его динамической типизацией ... попробуйте его в python. def qsort (l): return qsort ([x for x in l [1:] if x ‹l [0]]) + l [0] + qsort ([x for x in l [1:] if x› = l [0]]) если l иначе l - person fortran; 04.08.2009
comment
В том-то и дело. Это не имеет ничего общего с динамической или статической типизацией. - person Apocalisp; 04.08.2009
comment
Haskell - отличный язык. Но я подозреваю, что большинство людей, занимающихся статической типизацией, не используют Haskell, Scala, Ocaml или f #. - person airportyh; 04.08.2009
comment
Отличный момент с алгоритмом - динамический язык предназначен только для записи, сколько программистов, которые не знают lisp / haskell, могут это понять? не много. Я предпочитаю плохо написанный код Java. - person IAdapter; 04.08.2009
comment
Я думаю, что одна из причин, по которой люди не разбираются в статически типизированных языках, таких как C, C ++ и Java, - это все, что связано с приведением типов. К счастью, я думаю, что вывод типов в C # и Scala (и других) в основном решил эту проблему. Вы получаете выразительность динамического языка с безопасностью и контролем ошибок типизированного языка. Для меня это хороший компромисс. - person cdmckay; 04.08.2009
comment
Я бы сказал, что ваши примеры довольно скудные. Люди, восхваляющие динамические языки, вряд ли выберут Lisp of Haskell. Скорее всего, они предпочтут Python или Ruby, а не Java или C #. - person Corey D; 05.08.2009
comment
Люди. В качестве примеров были выбраны один очень краткий язык со статической типизацией и один очень подробный динамический язык. Haskell и LISP хорошо подходят под эти категории. - person Apocalisp; 05.08.2009
comment
Теперь я должен использовать силу Стива Йегге, чтобы провести ответный удар динамических языков, или прочтите это: steve-yegge.blogspot.com/2008/05/ - person RCIX; 27.10.2009
comment
Короче говоря, компиляторы должны уметь выводить гораздо больше, чем они делают сейчас, динамические языки могут быть намного быстрее, и (я думаю) системы динамических типов не являются чистым злом, как все думают! - person RCIX; 27.10.2009
comment
Что ж, вы привели аргумент, а затем выбрали два языка, нетипичных для своего класса, чтобы доказать это. Никто не утверждает, что все динамические языки менее подробны, чем все статические языки. Аргументом может быть то, что наиболее часто используемые статические языки (C, C ++, Java, C #) более подробны, чем наиболее часто используемые динамические языки (Python, PHP, Ruby). - person davidtbernal; 27.10.2009
comment
Аргумент гласит, что существует связь между многословием и многогранностью. Как видите, любое такое совпадение - чистая случайность. Именно поэтому я выбрал эти языки нетипично. Haskell имеет более строгую типизацию, чем что-либо еще, поэтому он является хорошим представителем языков со статической типизацией. LISP - это типичный динамический язык, который все остальные обязательно имитируют, но никогда не дублируют. - person Apocalisp; 27.10.2009
comment
Гипотеза: статическая типизация подразумевает многословность. Фальсификация: Haskell имеет статическую типизацию. Haskell - один из существующих языков с наименьшей многословностью. True (статически типизированный) = ›False (подробный) == False. Следовательно, гипотеза о подтексте опровергнута. Q.E.D. - person Apocalisp; 27.10.2009
comment
RCIX: Возможно, иронично, что Стив Йегге чрезвычайно многословен. - person Apocalisp; 27.10.2009
comment
Не все статические языки подробны, и не все динамические языки лаконичны. Однако в целом динамические языки более лаконичны, чем статические. - person RCIX; 27.10.2009
comment
Заблуждение: серия тщательно продуманных примеров (анекдотов) в общем случае что-либо доказывает. - person hobbs; 27.10.2009
comment
Если бы вы выбрали два более типичных языка (скажем, C # и Python), я не думаю, что вы сказали бы то же самое ... - person RCIX; 27.10.2009
comment
Хорошая цитата Стива Йегге (который был ярым фанатом Java, пока не увидел, что Perl превосходит его на Amazon: - person RCIX; 27.10.2009
comment
Но, посмотрев в эти выходные новый фильм «Автостопом» и увидев веселую карикатуру британской правительственной бюрократии в вогонах, я подумал: эй, я ненавижу бюрократию. А системы статического типа - это в основном бюрократия. Я хочу, чтобы они не мешали мне и позволяли мне делать вещи без необходимости заполнять кучу форм. Если цена получения статической безопасности типов - это работа с мертвым компилятором и ограничительной системой типов, что ж, тогда я могу справиться со своими собственными ошибками типа, большое спасибо. - person RCIX; 27.10.2009
comment
Извините, я не выбрал языки, которые вы знаете / любите / одобряете. Жесткое печенье, правда. - person Apocalisp; 27.10.2009
comment
hobbs: Но тщательно подобранный пример может опровергнуть плохо созданную индукцию. - person Apocalisp; 27.10.2009
comment
Хорошо, тогда давайте сделаем пример, чтобы доказать, что языки с динамической типизацией быстрее, чем языки со статическим типом, давайте разберемся с lua ... скажем ... COBOL (или вставьте сюда медленный статический язык). Чего ты знаешь! lua быстрее! Подожди, я не использовал твои любимые языки? извините ... Я хочу сказать, что вы не можете выбирать языки, чтобы доказать свою точку зрения, или вы можете доказать все, что хотите. Вам нужно использовать какой-то разумно объективный показатель для выбора языка (например, популярность) - person RCIX; 27.10.2009
comment
RCIX: Я не собираю вишни. Обвинение состоит в том, что языки со статической типизацией многословны. Это обвинение подразумевает причинную связь между многословием и типичностью. Перехожу к самому типизированному языку, для которого я мог найти пример чего-нибудь полезного. Какими бы строгими типами ни казались C # или Java, они наполовину не так строго типизированы, как Haskell. Однако Haskell более краток. Может быть, это потому, что нет никакой связи между многословием и типографией? Я не собираюсь здесь ничего доказывать. Только опровергнуть. Какая у тебя цель? - person Apocalisp; 27.10.2009
comment
RCIX: Вы все говорите, что большинство популярных динамических языков более кратко, чем языки с бедными системами типов, такими как Java и C #? В таком случае я согласен. Но это только потому, что Java и C # плохо спроектированы, а не потому, что они статически типизированы. - person Apocalisp; 27.10.2009
comment
Хорошо, во-первых, я не согласен с тем, что C # плохо спроектирован, но это еще один аргумент в целом. Я понимаю, о чем вы сейчас говорите, но не вижу в этом отношения к вопросу; вы доказали, что не ВСЕ динамические языки менее подробны, чем ВСЕ статические, и что? Кажется, создается впечатление, что основная причина использования динамических языков (краткость) исключена, и это не то, о чем вы на самом деле говорите. Наиболее популярными динамическими языками является то, что они более краткие, но их легче читать, и что верно для них. - person RCIX; 27.10.2009
comment
Это действительно то, о чем я говорю: динамическое дает вам метапрограммирование, но не более того. Многие из них обладают другими качествами, но эти качества ортогональны типам или их отсутствию. Статические языки с очень плохой системой типов, но очень хорошим маркетингом, не будут лаконичными. Но это не повод отказываться от типов. - person Apocalisp; 27.10.2009
comment
Я думаю, что вполне возможно, что что-то вроде смеси F # и чего-то вроде Python станет нормой в какой-то момент: достаточная безопасность типов для облегчения сопровождения, предлагая при этом многие функции и гибкость динамического языка. В конечном итоге я подозреваю, что это то, что нужно, чтобы подавить все статики, лучше! нет динамики лучше! поговорим ... Ладно, вернемся к статической трепке;) - person RCIX; 27.10.2009
comment
Уродливый, достаточно типизированный язык может стать нормой в какой-то момент, но если я собираюсь иметь динамический язык, я бы предпочел un (i) типизированный полностью, то есть какой-то диалект LISP. Dynamic был усовершенствован Lambda Papers в 1970-х, так что готово. Между тем, технологии идут вперед с языками с зависимой типизацией, такими как Agda и Epigram. Будущее программирования лежит в новых исследованиях, подобных этому. - person Apocalisp; 27.10.2009
comment
Но в том-то и дело, LISP позволяет вам определять статические типы по мере необходимости, и я думаю, что он выполняет для них проверку типов ... - person RCIX; 28.10.2009
comment
+1 за великолепную намеренно искаженную цитату, хотя мне очень нравится Руби. ВОПРОС: если общепринятая мудрость многословия настолько ошибочна, почему Perl, Python и Ruby полностью доминируют в рейтингах кодового гольфа на SO? - person DigitalRoss; 08.11.2009
comment
Re-интерпретаторы для компилируемых языков: есть даже интерпретатор для C ++, cint из ROOT project. И я почти уверен, что проект clang в конечном итоге тоже сделает это. - person Stefan Majewsky; 04.07.2011

Не забывайте, что вам нужно написать 10-кратное покрытие кода в модульных тестах, чтобы заменить то, что делает ваш компилятор: D

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

person Community    schedule 04.09.2008
comment
Рад, что я не единственный. Улучшает сон по ночам. - person erikkallen; 18.09.2009
comment
Это действительно большое преимущество статической типизации перед динамической. Я не могу сказать, сколько раз я пропускал typedef в C ++, просто чтобы компилятор мог найти мне еще несколько ошибок. (Давай, компилятор, давай! Принеси мне еще несколько ошибок! :-) - person Dimitri C.; 26.01.2010
comment
Бред какой то. Если вы тестируете метод и тестируете методы, вызывающие этот метод, вы знаете, что передача параметров в порядке. По определению, хорошо протестированный код не получит дополнительных преимуществ от статической типизации. - person Garth Kidd; 06.02.2010
comment
@Garth: странное определение. Не многие люди согласятся с этим. OTOH, большинство людей согласятся, что средство проверки типов компилятора реализует множество (иногда очень сложных) тестов. - person Konrad Rudolph; 06.02.2010
comment
@Garth Roxburgh-Kidd, вы предполагаете, что вы постоянно тестируете все пути через весь код. Тогда кто поддерживает ваш тестовый код? - person Dan Rosenstark; 12.03.2010
comment
@yar, если вы не тестируете свой код, вы уязвимы для логических ошибок. Я работаю на Python уже десять лет. Я не думаю, что у меня когда-либо была TypeError в производстве. Хотя у меня было много логических ошибок. Вывод: мне не особо нужна статическая проверка типов, но модульные тесты мне точно нужны. - person Garth Kidd; 13.03.2010
comment
@Garth T Kidd, это круто. Сейчас я приступаю к тестированию с помощью Ruby, так что надеюсь, он восстановит и даже превзойдет мою уверенность, скажем, в коде Java, благодаря проверкам во время компиляции. Открытый ум не очень научен, но очень объективен :) - person Dan Rosenstark; 13.03.2010

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

1) Код менее подробный. Я не считаю это верным. Некоторые динамические языки менее подробны, чем некоторые статические. Но F # имеет статическую типизацию, но статическая типизация там не добавляет большого количества кода, если таковой имеется. Хотя он неявно типизирован, но это другое дело.

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

3) На динамических языках вы можете сразу увидеть свои результаты. Новости: Вы также можете сделать это с помощью C # в Visual Studio (с 2005 года). Просто установите точку останова, запустите программу в отладчике и измените программу во время отладки. Я делаю это все время, и это прекрасно работает.

Лично я убежденный сторонник статической типизации по одной основной причине: ремонтопригодность. У меня есть система с парой 10 тыс. Строк JavaScript, и любой рефакторинг, который я хочу провести, займет примерно полдня, поскольку (несуществующий) компилятор не скажет мне, что это за переименование переменной облажался. И этот код я написал сам, ИМО тоже хорошо структурирован. Я бы не хотел, чтобы меня возложили на эквивалентную динамическую систему, написанную кем-то другим.

Думаю, за это меня будут сильно отвергать, но я рискну.

person Community    schedule 24.02.2009
comment
Цитата: На динамических языках вы можете сразу увидеть свои результаты. Новости: Вы также можете сделать это с помощью C # в Visual Studio (с 2005 года). Просто установите точку останова, запустите программу в отладчике и измените программу во время отладки. Я делаю это все время, и это прекрасно работает. Это было в Delphi с первого дня (1995?) И, вероятно, в Turbo Pascal до этого (я точно не помню). - person No'am Newman; 27.10.2009
comment
10к строк javascript? Я думаю, что это примерно на 9000 строк слишком много, и я люблю языки сценариев ... - person Oz.; 27.10.2009
comment
@ No'am: я знаю. Вы могли бы сделать это и в Visual C ++ 6 (что для меня было главным моментом не переходить на C # до выхода VS2k5). Во всяком случае, это только добавляет сути. @Oz: Как узнать, сколько работы должен сделать мой JS? - person erikkallen; 30.10.2009
comment
Я думаю, что люди, которым нравится видеть, как их изменения вступают в силу немедленно, как и при использовании текстового редактора, а не VS. Каждому свое. Вы можете подумать об использовании чего-то вроде JSLint. - person dlamblin; 01.11.2009
comment
@dlamblin: Почему предпочтительнее использовать текстовый редактор, а не IDE? Кстати, я только что протестировал Eclipse для Java, и он тоже поддерживает редактирование и продолжение. Jslint, нет, спасибо, я вместо этого перешел на Script #. - person erikkallen; 03.11.2009
comment
Хороший момент с рефакторингом. Мне действительно нравится Ruby для быстрого прототипирования и создания небольших скриптов, но я бы никогда не стал пытаться поддерживать большой продукт несколькими разработчиками без статической типизации. - person LoveMeSomeCode; 14.05.2010

VBScript отстой, если вы не сравниваете его с другим вариантом VB. PHP - это нормально, если вы помните, что это слишком заросший язык шаблонов. Современный Javascript великолепен. Действительно. Тонны веселья. Просто держитесь подальше от любых скриптов с меткой «DHTML».

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

Но я действительно не ответил на ваш вопрос. Чем привлекательны динамические языки? Потому что через некоторое время писать код становится скучно, и вы просто хотите реализовать алгоритм. Вы уже сели и проработали все это ручкой, наметили сценарии потенциальных проблем и доказали, что они разрешимы, и единственное, что осталось сделать, - это закодировать двадцать строк реализации ... и двести строк шаблона, чтобы он скомпилировался. . Затем вы понимаете, что система типов, с которой вы работаете, отражает не то, что вы на самом деле делаете, а чье-то сверхабстрактное представление о том, что вы могли делать, и вы давно отказались от программирования. за жизнь, посвященную настройке безделушек, настолько навязчиво-компульсивной, что это могло бы посрамить даже вымышленного детектива Адриана Монка.

Вот когда вы идиотесь начинаете серьезно смотреть на динамические языки.

person Community    schedule 04.09.2008
comment
Интересный материал ... Я посмотрю, убедит ли меня Руби. У PHP нет, но я чувствую, что во многом это связано с тем, что об объектах объектно-ориентированного программирования задумались позже. - person Dan Rosenstark; 01.01.2009
comment
двадцать строк реализации ... и двести строк шаблона для компиляции: я не согласен с этим утверждением. Конечно, это было правдой во времена Java, но C # 3 и Scala значительно сократили количество требуемых шаблонов. - person cdmckay; 04.08.2009
comment
Дни Java закончились? рвет пиво и готовится отпраздновать Ой ... подождите ... C ++. - person Shog9; 04.08.2009
comment
VBScript отстой, если вы не сравниваете его с другой разновидностью VB А? Вы говорите, что VBScript - это лучший вариант Visual Basic? Я, должно быть, неправильно тебя недооценил. - person MusiGenesis; 18.09.2009

Я - программист .Net на полную ставку, полностью увязший в муках C # со статической типизацией. Однако мне нравится современный JavaScript.

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

Я думаю, что существует несколько классов динамических языков. У меня нет желания возвращаться к написанию классических страниц ASP на VBScript. Чтобы быть полезным, я думаю, что динамический язык должен поддерживать в своей основе какую-то коллекцию, список или ассоциативную конструкцию, чтобы объекты (или то, что передается для объектов) могли быть выражены и позволяли создавать более сложные конструкции. (Может, нам всем стоит просто написать код на LISP ... это шутка ...)

Я думаю, что в кругах .Net динамические языки получают плохую репутацию, потому что они связаны с VBScript и / или JavaScript. VBScript просто вспоминают как кошмар по многим причинам, заявленным Кибби - кто-нибудь помнит, как принудительно вводить тип в VBScript с использованием CLng, чтобы убедиться, что у вас достаточно бит для 32-битного целого числа. Кроме того, я думаю, что JavaScript по-прежнему рассматривается как язык браузера для раскрывающихся меню, который для всех браузеров написан по-разному. В этом случае проблема не в языке, а в различных объектных моделях браузера. Что интересно, чем больше созревает C #, тем более динамичным он становится. Мне нравятся лямбда-выражения, анонимные объекты и вывод типов. Это больше похоже на JavaScript каждый день.

person Community    schedule 04.09.2008
comment
Я бы хотел, чтобы кто-нибудь добавил в JavaScript обработку файлов, сокеты и библиотеку графического интерфейса, а затем построил компилятор ... JS на рабочем столе ....... - person UnkwnTech; 17.04.2009
comment
code.google.com/p/jslibs - person Breton; 18.09.2009
comment
Кроме того, всегда можно было написать приложение с графическим интерфейсом для Windows, используя jscript. Во всяком случае, очень-очень долго. см. Windows hta для получения дополнительной информации. Вы получаете несколько дополнительных API, работающих в hta, которых нет в браузере. Виджеты на панели инструментов получают большую мощность. Веб-приложения на iphone на намного мощнее, чем думает большинство людей. Apple сделала множество мощных API-интерфейсов, доступных для просмотра JS в мобильном сафари. - person Breton; 18.09.2009
comment
commonjs.org - person Xiong Chiamiov; 15.07.2010
comment
+1 для намерения здесь. Хотя в один прекрасный день ваш код может быть переведен на статический язык, динамики (особенно Python) отлично подходят для разовых работ и прототипов. - person new123456; 21.03.2011
comment
@Unkwntech взгляните на Adobe AIR - person Horacio Nuñez; 24.03.2011

Вот статически типизированная QuickSort в двух строках Haskell (с сайта haskell.org):

qsort []     = []
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)

А вот динамически типизированная QuickSort в LISP (от swisspig.net):

(defun quicksort (lis) (if (null lis) nil
  (let* ((x (car lis)) (r (cdr lis)) (fn (lambda (a) (< a x))))
    (append (quicksort (remove-if-not fn r)) (list x)
      (quicksort (remove-if fn r))))))

Я думаю, что вы предвзято относитесь к выбору языка. Lisp, как известно, перегружен пареном. Более близким эквивалентом Haskell был бы Python.

if len(L) <= 1: return L
return qsort([lt for lt in L[1:] if lt < L[0]]) + [L[0]] + qsort([ge for ge in L[1:] if ge >= L[0]])

Код Python из здесь

person Community    schedule 04.09.2008
comment
Это не возражение, а аргумент в поддержку. Это говорит о том, что система типов языка (или ее отсутствие) очень мало говорит нам о том, будет ли она многословной или краткой. - person Apocalisp; 11.12.2008
comment
Я согласен с Apocalisp, многословие не зависит ни от динамических, ни от статических языков. Я бы даже сказал, что статическая / динамическая типизация практически не влияет на многословность языка. Так что да, это не лагерь статической типизации, разрушающий реплику. - person BefittingTheorem; 31.07.2009
comment
или Perl! сортировка (@array); - person James Anderson; 27.10.2009
comment
Все сравнение Апокалиспа было чушью. Во-первых, быстрая сортировка (как определено в исходной статье Тони Хоара) - это алгоритм на месте, специально разработанный для использования минимального дополнительного пространства, но Apocalisp использовал убранную версию сообщества Haskell не на месте, которая тратит асимптотически больше памяти и запускается сотни раз. медленнее, чем настоящая быстрая сортировка. Haskell изо всех сил пытается выразить настоящий алгоритм быстрой сортировки, потому что он полагается на мутации (!). Ознакомьтесь с этими попытками Haskell и вернитесь ко мне о предполагаемой краткости Haskell: haskell.org/haskellwiki/Introduction / Direct_Translation - person J D; 19.04.2010
comment
Во-вторых, вы не можете делать каких-либо сильных заявлений о многословности на основе двух реализаций алгоритма, который был убран специально для одного из языков. Посмотрите на APL, J, K, Mathematica или любой другой лаконичный (= современный) язык с динамической типизацией. Они должны быть более краткими, чем любой язык со статической типизацией. Вывод типа сокращает разрыв, но он все равно должен оставаться. - person J D; 19.04.2010

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

Но тогда я как бы пропускаю проверку времени компиляции (опечатка случается) и автозаполнение IDE. В целом, меньшее количество кода и удобочитаемость окупаются для меня.

Еще одно преимущество - это обычно интерпретируемый / некомпилированный характер языка. Измените код и сразу увидите результат. Это действительно экономия времени при разработке.

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

person Community    schedule 04.09.2008
comment
По крайней мере, одна известная мне Python IDE (а именно, IDLE, которая поставляется с обычной сборкой интерпретатора Python) действительно имеет возможности автозаполнения, хотя объявленные переменные имеют ее только в окне интерпретатора. - person JAB; 04.08.2009
comment
удобочитаемый? вы видели пример быстрой сортировки? я понятия не имею, что там происходит. Вы можете возразить, что это плохо написано, чтобы показать, как быстро вы можете что-то написать, но это не читается. - person IAdapter; 05.08.2009
comment
@ 01: в нем используются общие конструкции языка. Его довольно удобно читать, если вы знаете основы языка. - person Esteban Küber; 24.09.2009
comment
Я пишу PHP, и есть много IDE, которые предоставляют функции автозаполнения (например, Netbeans, Zend Studio, Eclipse, Komodo). - person davidtbernal; 27.10.2009
comment
Читаемость не имеет ничего общего с динамической типизацией. Например. Лямбды Scala обычно короче (и, возможно, более выразительны), чем блоки Ruby, то же самое при сравнении дополнений списков Haskell и Python. Консоль REPL существует, например для F #, Scala, Haskell. Быстрая загрузка измененного кода в работающее приложение - сильная сторона динамических языков. Хотя есть некоторые технологии, которые позволяют использовать статические языки (например, JavaRebel). - person Alexey; 02.04.2010
comment
Интересно, что я считаю код МЕНЬШЕ читабельным. Номер один, потому что я часто не могу использовать свою IDE, чтобы быстро найти объявления, встроенную документацию и т. Д., И номер два, потому что синтаксис настолько компактен, что довольно часто я забываю, что он означает! Я бы также дал намного больше веса потере автозаполнения IDE. Это не только находка, я думаю, что это значительно увеличивает ремонтопригодность. - person spronkey; 06.07.2010
comment
Я считаю, что самым большим недостатком динамических языков является отсутствие надлежащей поддержки IDE. Visual Studio и Eclipse увеличивают производительность как минимум в 5 раз по сравнению с взломом в Text Mate. - person siamii; 10.12.2011

Ваши аргументы против динамических языков абсолютно верны. Однако учтите следующее:

  1. Динамические языки не нужно компилировать: просто запустите их. Вы даже можете перезагрузить файлы во время выполнения, в большинстве случаев не перезагружая приложение.
  2. Динамические языки, как правило, менее подробны и более читабельны: вы когда-нибудь смотрели на данный алгоритм или программу, реализованные на статическом языке, а затем сравнивали их с эквивалентом Ruby или Python? В общем, вы видите сокращение строк кода в 3 раза. В динамических языках нет необходимости в большом количестве кода, а это означает, что конечный результат более читабелен и больше ориентирован на актуальную проблему.
  3. Не беспокойтесь о проблемах с набором текста: общий подход при программировании на динамических языках заключается в том, чтобы не беспокоиться о наборе текста: в большинстве случаев вашим методам будет передаваться правильный тип аргумента. И время от времени кто-то может использовать аргументы другого типа, которые тоже могут сработать. Когда что-то пойдет не так, ваша программа может быть остановлена, но это редко случается, если вы выполнили несколько тестов.

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

person Community    schedule 04.09.2008
comment
Если вы этого не видите, это вас не беспокоит. Это все равно, что сказать, что функциональные языки недетерминированы, потому что вы не знаете, как чередуются инструкции между потоками. Это правда, но это незаметно для пользователей или программистов, поэтому не имеет значения. - person wvdschel; 02.06.2009
comment
-1: Я бы сказал, что первая и вторая причины явно неверны, а третья - небрежная и плохая практика. Первая: динамические языки не имеют ничего общего с компиляцией кода, это касается набора текста (интерпретатор Scala). Два: просто взгляните на Haskell, Erlang, Scala и т. Д. Три: замените слова, о которых не стоит беспокоиться, на «предполагать правильное», и вы поймете, почему я нахожу последний пункт тревожным. - person BefittingTheorem; 31.07.2009
comment
@wvdschel: По вашей логике, я могу утверждать, что компилируемые языки, такие как C # и Java, не нуждаются в компиляции, поскольку все, что мне нужно сделать, это нажать кнопку Play в моей среде IDE, и они просто запустятся. Поскольку я не замечаю, что IDE компилируется для меня, это не имеет значения. - person cdmckay; 04.08.2009
comment
@cdmckay: Можете ли вы подключиться к вашей запущенной программе C # / Java и запускать для нее команды, изменяя или запрашивая ее во время работы. Интерпретируемые (каковыми являются многие динамические языки) языки, допускающие самоанализ во время выполнения, в отличие от компилируемых языков. - person RHSeeger; 04.08.2009
comment
@RHSeeger - Да, вы можете сделать все это с помощью Visual Studio. Edit-and-continue не ограничивается динамическими языками. - person Greg Beech; 05.08.2009
comment
@RHSeeger: Эээ, да, отладчик Visual Studio делает именно это. Почему это не должно быть возможным для компилируемого языка? - person Niki; 05.08.2009
comment
@Greg Beech, @nikie: C # напрямую не превращается в машинный код. Он работает на виртуальной машине. Вот почему вы можете это делать. - person Esteban Küber; 24.09.2009
comment
@ baash05, я думаю, вы полностью пропустили момент этого ответа, 1. означает, что вы можете запускать код, когда исправляете его быстрее, не нужно ждать, пока компилятор увидит эффекты каждого небольшого изменения. 2. Согласны вы с эффектом этого или нет, будет меньше кода для написания и чтения, не оспаривая этот факт. - person Fire Crow; 09.10.2009
comment
Спасибо, огненная ворона, нам нужно больше таких людей, как ты, на нашей стороне. Всего несколько недель назад я написал довольно большой lua-скрипт, и мне страшно подумать, как он будет выглядеть на C #, просто потому, что он намного проще в изучении и понимании динамических языков, таких как lua. Вам не нужно зацикливаться на половине особенностей C #. Почему массивы отсчитываются от нуля? зачем мне бросать этот чертов номер? это просто дурацкий номер! Зачем нам полдюжины разных структур данных? я просто хочу сохранить свои данные ... В чем разница между классом и структурой? И Т. Д. - person RCIX; 27.10.2009
comment
@RCIX Зачем нам полдюжины разных структур данных? Я просто хочу сохранить свои данные ... - Я рада, что меня нет в твоей команде! К вашему сведению, дебаты «Интерпретируемые и компилированные» не имеют отношения к дебатам «Статические и динамические». Продолжайте в теме. - person Kirk Broadhurst; 27.10.2009
comment
Хорошо сказано. Динамические языки обычно просто более выразительны! если a = b, а не if aVeryLongObject- ›obscureMethod.equals (anotherLongObjectName-› obscureMethod) - person James Anderson; 27.10.2009
comment
2. Это не проблема статического и динамического, а процедурного против функционального. Верно: Python (и многие другие динамические языки) более функциональны, чем Java. Ложь: это как-то связано с динамической типизацией. - person erikkallen; 03.11.2009

Я считаю, что «новая любовь» к языкам с динамической типизацией связана не столько с тем, являются ли языки со статической типизацией лучше или хуже - в абсолютном смысле, - чем с ростом популярности определенных динамических языков. . Ruby on Rails, очевидно, был большим явлением, которое привело к возрождению динамических языков. То, что сделало rails настолько популярным и привело к такому количеству преобразований из статического лагеря, было главным образом: очень кратким и СУХИМ кодом и конфигурацией. Это особенно верно по сравнению с веб-фреймворками Java, которым требовалось множество конфигураций XML. Многие Java-программисты - в том числе и умные - преобразовали, а некоторые даже проповедовали Ruby и другие динамические языки. На мой взгляд, три различные функции позволяют сделать динамические языки, такие как Ruby или Python, более лаконичными:

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

Все эти три функции не являются эксклюзивными для динамических языков, но они определенно отсутствуют в популярных сегодня статических языках: Java и C #. Вы можете утверждать, что C # имеет номер 2 в делегатах, но я бы сказал, что он вообще не используется широко - например, с операциями со списками.

Что касается более продвинутых статических языков ... Haskell - замечательный язык, у него есть # 1 и # 2, и, хотя у него нет # 3, его система типов настолько гибкая, что вы, вероятно, не найдете недостатка в мета для быть ограничивающим. Я считаю, что вы можете выполнять метапрограммирование в OCaml во время компиляции с помощью языкового расширения. Scala - очень недавнее дополнение, и оно очень многообещающее. F # для .NET-лагеря. Но пользователи этих языков составляют меньшинство, и поэтому они не внесли особого вклада в это изменение в ландшафте языков программирования. Фактически, я очень верю, что популярность Ruby положительно повлияла на популярность таких языков, как Haskell, OCaml, Scala и F #, в дополнение к другим динамическим языкам.

person Community    schedule 04.08.2009

Лично я считаю, что большинство «динамических» языков, которые вы использовали, оказались плохими примерами языков в целом.

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

Излишне говорить, что я работаю на любом из этих языков более продуктивно, чем на PHP. Черт, я бы предпочел кодировать на Scheme или Prolog, чем на PHP. (Но в последнее время я делал больше Prolog, чем что-либо еще, так что относитесь к этому с недоверием!)

person Community    schedule 04.09.2008

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

Я бы не стал категоризировать PHP и VB (скрипт) одинаково. Для меня это в основном императивные языки со всеми недостатками динамической типизации, которые вы предлагаете.

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

person Community    schedule 04.09.2008
comment
Я никогда раньше не слышал, чтобы кто-нибудь даже предполагал, что ему нравятся прототипы объектов JavaScript. - person erikkallen; 18.09.2009

Одно из преимуществ, отмеченных для динамических языков, - это возможность просто изменить код и продолжить работу. Перекомпилировать не нужно. В VS.Net 2008 при отладке вы можете изменить код и продолжить работу без перекомпиляции. Возможно ли, что с развитием компиляторов и IDE это и другие преимущества использования динамических языков исчезнут.

person Community    schedule 04.09.2008
comment
Вы правы, что в динамически типизированных языках нет ничего, что позволяло бы вам изменять код в работающей системе. С интерпретируемыми языками намного проще (не путать с динамическими), но это можно сделать даже с помощью скомпилированного кода. В качестве одного из примеров, Oracle PL / SQL является статически типизированным компилируемым языком, и Oracle уже несколько десятилетий имеет функцию, позволяющую изменять процедуры PL / SQL в работающей системе. - person Apocalisp; 09.06.2009
comment
Теперь в Mono есть ответ C # - mono-project.com/CsharpRepl - person Steve Gilham; 05.08.2009
comment
Динамические языки могут делать такие вещи вне отладчика и из внутри вашего приложения. Кроме того, возможность делать патчи обезьяны к классам при модульном тестировании позволяет сэкономить время. - person Esteban Küber; 24.09.2009

Ах, я не видел эту тему, когда отправлял аналогичный вопрос

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

Программирование программы.

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

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

Например, чтобы создать калькулятор на Lua, все, что мне нужно сделать, это:

print( loadstring( "return " .. io.read() )() )

Теперь попробуйте сделать это в .Net.

person Community    schedule 15.04.2009
comment
Вы часто создаете калькуляторы? Я нахожу аргументы того типа, что могу создать приложение hello world из 20 символов, не имеющих никакого значения. - person erikkallen; 30.10.2009
comment
Вы только что показали, насколько у вас крайне слабое воображение. Плохая штука для программирования м8. GL. - person majkinetor; 31.10.2009
comment
Не нужно переходить на личности. Думаю, это справедливо. Очень легко (и очень часто) придумать аргументы типа «посмотрите, сколько кода вам нужно написать, чтобы вывести строку на консоль на C #, в lua я могу просто сказать print (Hello, world)». Но соотношение реального кода к шаблонному не остается таким, когда проекты вырастают до реалистичных размеров. - person erikkallen; 03.11.2009
comment
Дурь несусветная. Вот какой-то статически типизированный F #, работающий на .NET: Linq.QuotationEvaluator.Evaluate ‹@ 2 + 3 @› - person J D; 19.04.2010

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

При этом есть определенные конструкции, которые просто великолепны в динамически типизированных языках. Например, в Tcl

 lindex $mylist end-2

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

person Community    schedule 04.08.2009
comment
Чем это лучше, чем $ mylist.length-2? Мне кажется, что такой синтаксис только добавляет дополнительные ключевые слова без реальной пользы, что означает, что язык сложнее выучить. - person erikkallen; 30.10.2009
comment
Я буду немного педантичен и укажу, что он не добавляет никаких ключевых слов к самому языку, он добавляет их к этой команде. При этом, это вопрос ясности. Термин «конец» выражает намерение / значение, а не то, как этого добиться; он говорит последний элемент. - person RHSeeger; 30.10.2009
comment
Если я правильно понял, в этом случае все еще хуже. Вы должны изучить новый синтаксис для каждой команды. что означает строка ключевых слов при использовании в команде foo? - person erikkallen; 03.11.2009
comment
@erikkallen: Это то же самое, что узнать, какие входы в стандартную библиотеку имеют для любого другого языка. Фактически, каждая команда в ядре Tcl более или менее является частью стандартной библиотеки. Теоретически нет команд, которые нельзя было бы удалить и повторно реализовать как чистый код Tcl. При этом входные данные и то, что они означают, довольно согласованы во всей библиотеке (т. Е. Конец означает одно и то же во всех командах). - person RHSeeger; 03.11.2009

Я думаю, что такой аргумент немного глуп: «То, что обычно было бы обнаружено компилятором, например, неправильное написание имен переменных и присвоение переменной значения неправильного типа, не происходит до тех пор, пока не выполняется время выполнения» да, это правильно, как PHP-разработчик. Я не вижу таких вещей, как неверно введенные переменные, до времени выполнения, НО время выполнения для меня - это шаг 2, в C ++ (который является единственным скомпилированным языком, который у меня есть) это шаг 3 после связывания и компиляции.
Мой код компилируется
Не говоря уже о том, что это занимает всего несколько секунд после того, как я нажму "Сохранить". до того момента, когда мой код будет готов к запуску, в отличие от компилируемых языков, где это может занять буквально часы. Прошу прощения, если это звучит немного сердито, но я устал от людей, относящихся ко мне как к второсортному программисту, потому что мне не нужно компилировать свой код.

person Community    schedule 04.09.2008
comment
О боже, на практике ... ну, может я просто некомпетентен, но в PHP проблемы с неправильным написанием переменных - огромная трата времени. Особенно, когда вы унаследовали огромную базу кода, которая не позволяет включать строгие предупреждения. - person Dan Rosenstark; 01.01.2009
comment
Вы можете ВСЕГДА включить строгий error_reporting (), и любая хорошая IDE предотвратит 99% ошибок в написании переменных. - person UnkwnTech; 04.01.2009
comment
Не говоря уже о том, что можно ошибиться в написании чего-либо на любом языке, однако легче (возможно, быстрее) найти эти ошибки, потому что мой интерпретатор находится на том же этапе при компоновке / компиляции, поэтому снова ваше возражение безразлично. - person UnkwnTech; 04.01.2009
comment
-1: аргумент компиляции отвлекает от реального аргумента, который касается типизации, статического или динамического. Можно компилировать и интерпретировать как динамические, так и статические языки. Жалобы на орфографию и время компиляции выходят за рамки этих вопросов. - person BefittingTheorem; 31.07.2009
comment
Буквально часами? На чем вы компилируете, на оригинальном IBM PC? - person xcramps; 04.08.2009
comment
месяцы спустя ... вы не всегда можете включить строгую отчетность об ошибках, потому что в некоторых случаях тысячи строк кода ЗАВИСЯТ от ее отключения. - person Dan Rosenstark; 11.08.2009
comment
@yar можешь привести пример? - person UnkwnTech; 12.08.2009

Аргумент более сложный, чем этот (прочтите статью Ягге «Слабое печатание - сильное Достаточно " для интересного обзора).

В динамических языках не обязательно отсутствует проверка ошибок - возможно, одним из примеров является вывод типа C #. Точно так же C и C ++ имеют ужасные проверки компиляции, и они статически типизированы.

Основными преимуществами динамических языков являются: а) возможность (которую необязательно использовать постоянно) и б) Закон итерации Бойда.

Последняя причина серьезна.

person Community    schedule 04.09.2008
comment
Вывод типа - это не то же самое, что динамическая типизация, потому что предполагаемый тип по-прежнему должен быть однозначно известен во время компиляции. - person Marcus Downing; 02.01.2009
comment
-1: C # типизируется статически, а не динамически. - person Juliet; 04.01.2009

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

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

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

Хорошие IDE предоставят вам достаточно intellisense, чтобы вы знали, была ли переменная «объявлена», и они также попытаются сделать для вас некоторый вывод типа, чтобы вы могли определить, что такое переменная.

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

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

person Community    schedule 04.09.2008
comment
Я считаю, что любой аргумент, который используют опытные разработчики, на самом деле это не проблема, обычно немного опасен. То есть, я мог бы сказать, что ООП / управление памятью и т. Д. В C ++ не проблема для опытного разработчика. Почему с такой простой вещью, как объявление переменных и базовая проверка типов, мне нужно быть таким осторожным и опытным? Я бы предпочел, чтобы язык помогал мне программировать, а не позволял мне делать ошибки, которые можно легко предотвратить с помощью статического подхода. И я думаю, что многословие очень мало связано с динамической или статической типизацией, посмотрите Haskell или Scala. - person BefittingTheorem; 31.07.2009
comment
Я согласен, я также считаю этот аргумент немного опасным. Я хочу сказать, что проблема проверки типов во время кодирования не так уж и плоха. В 90% случаев вы сразу увидите ошибку. Это проблема в 10% случаев, когда неявное преобразование типа может вызвать стресс, однако, если вы знаете, что делаете, вы этого не допустите. JavaScipt - отличный пример из 10%, где это может быть опасно, но я никогда не сталкивался с этим за все время разработки для него. - person Dan Herbert; 31.07.2009
comment
@ Брайан Хейлин: тогда ты должен ненавидеть C! Так много способов прострелить себе ногу, но они так используются и (в некоторых случаях) любимы. - person Esteban Küber; 24.09.2009

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

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

к проблемам, которые ближе к потребностям бизнеса, например

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

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

Вот некоторые из аргументов, которыми я оправдываю свою работу и опыт работы с динамическими языками!

person Community    schedule 27.10.2009
comment
Ваши точки 1 и 3 идентичны, и IMO является причиной предпочтения статической типизации. Что, если вы измените тип на несовместимый? Если вы меняете переменную с int на строку, вы, вероятно, делаете это не просто так. А если нет, просто перестройте проект, пока все ошибки сборки не исчезнут. Обычно это не занимает много времени, и иногда в процессе вы обнаруживаете настоящую проблему, на которую вы рады, что компилятор указал вам. Пункт 2 недействителен, рост строки выполняется автоматически на всех языках (я думаю, по крайней мере, на всех, с которыми я сталкивался за последние 15 лет), кроме C. - person erikkallen; 03.11.2009
comment
Я согласен с тем, что в зависимости от приложения у вас может быть причина предпочесть любой тип языка другому, а более быстрые статические языки могут обеспечить лучшую производительность. Но я говорил, что если вам нужно создать веб-приложение, подобное любому другому, вам, возможно, будет лучше быстрее предоставлять функциональные возможности, используя динамический язык, чем статический. также предположим, что вам нужно использовать переменную x таким образом, чтобы x.func = yes и x.func_ = no. Тебе все равно, какой это тип, это утка, если она плавает, как утка. Вот почему динамическую типизацию также называют утиной типизацией. 0 осталось! - person umar; 04.11.2009

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

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

person Community    schedule 15.04.2009

FWIW, Компиляция большинства приложений не должна занимать часы. Я работал с приложениями, длина которых составляет от 200 до 500 тыс. Строк, для компиляции которых требуется несколько минут. Уж точно не часы.

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

Мне нравится подключать свою Visual Studio к работающему процессу. Могут ли это сделать другие IDE? Может быть, но я о них не знаю. В последнее время я занимаюсь разработкой PHP, и, честно говоря, все не так уж и плохо. Однако я предпочитаю C # и VS IDE. Я чувствую, что работаю быстрее и быстрее устраняю проблемы.

Так, может быть, для меня это больше проблема с набором инструментов, чем проблема динамического / статического языка?

Один последний комментарий ... если вы разрабатываете с локальным сервером, сохранение происходит быстрее, чем компиляция, но часто у меня нет доступа ко всему на моем локальном компьютере. Базы данных и общие файлы находятся в другом месте. Легче подключиться к веб-серверу по FTP, а затем запустить мой PHP-код только для того, чтобы найти ошибку и исправить ее и повторно выполнить ftp.

person Community    schedule 15.04.2009
comment
Я бы сказал, что время компиляции действительно зависит от используемого языка. В .Net для компиляции проекта такого размера может потребоваться всего пара минут. Если он сделал это на C, то я мог бы видеть, что для компиляции всего требуется время. - person Kibbee; 16.04.2009
comment
Хорошо, я дам тебе это. Но если подумать, сколько проектов, которые, по вашему мнению, можно было бы написать на C, можно было бы написать на PHP со значительным временем компиляции? Я думаю, что есть определенный момент, когда интерпретируемые языки не подходят для работы, и наоборот. Я большой поклонник того, чтобы использовать правильный инструмент для работы и то, с чем вы лучше всего работаете. Я не вижу причин пытаться заставить один язык делать все, когда другой может сделать это проще. Нет причин заново изучать то, что вы знаете. - person bdwakefield; 17.04.2009
comment
Кстати, есть плагин php для VS jcxsoftware.com/vs.php Я не знал пробовал еще, так как это не бесплатно, но из того, что я слышал, он так же хорош с php, как и Zend (5.5, как 6 отстой) со всеми достоинствами VS - person UnkwnTech; 17.04.2009
comment
Вы просто понимаете, что является одной из главных причин, по которой никто не использует так много динамических языков. Никто не построил большую причудливую 2-метровую IDE кода, которая может сделать для вас почти все, с любым из них, поэтому все жалуются, что они небезопасны по типу, поэтому слишком легко ошибаться - person RCIX; 27.10.2009
comment
Я не забочусь о бессмысленном типе безопасного. Меня это не особо беспокоит. Моя самая большая жалоба заключается в том, что это просто физически занимает больше времени, и часто намного сложнее отследить проблемы. Я считаю, что стиль разработки противоречит тому, как я люблю работать. - person bdwakefield; 27.10.2009

Производительность в определенном контексте. Но это всего лишь одна среда, которую я знаю, по сравнению с некоторыми другими, которые я знаю или видел в использовании.

Smalltalk на Squeak / Pharo с Seaside - гораздо более эффективная и действенная веб-платформа, чем ASP.Net (/ MVC), RoR или Wicket, для сложных приложений. Пока вам не понадобится взаимодействовать с чем-то, что имеет библиотеки в одной из этих, но не smalltalk.

Имена переменных с ошибками в IDE отображаются красным цветом, IntelliSense работает, но не так специфично. Ошибки времени выполнения на веб-страницах - это не проблема, а функция: один щелчок, чтобы вызвать отладчик, один щелчок, чтобы перейти в мою среду IDE, исправить ошибку в отладчике, сохранить, продолжить. Для простых ошибок время возврата для этого цикла составляет менее 20 секунд.

person Community    schedule 03.08.2009

Динамические языки наносят ответный удар

http://www.youtube.com/watch?v=tz-Bb-D6teE

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

person Community    schedule 04.08.2009

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

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

Кроме того, я устал писать такие вещи, как MyFancyObjectInterface f = new MyFancyObject (). СУХИЙ принцип кто нибудь?

person Community    schedule 27.10.2009

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

C#

using System;
class MyProgram
{
    public static void Main(string[] args)
    {
        foreach (string s in args)
        {
            Console.WriteLine(s);
        }
    }
}

Lua:

function printStuff(args)
    for key,value in pairs(args) do
       print value .. " "
    end
end
strings = {
    "hello",
    "world",
    "from lua"
}
printStuff(strings)
person Community    schedule 27.10.2009
comment
На самом деле это не аргумент. Мы не новички в программировании; Эти дебаты наиболее ожесточенно бушуют между программистами, не являющимися новичками. - person peSHIr; 27.10.2009
comment
Это лишь одна из причин, почему программисты, возможно, предпочли динамические языки; их, как правило, легче понять, чем других, и, таким образом, они привлекают к себе больше новых программистов. - person RCIX; 27.10.2009

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

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

person Community    schedule 01.11.2009

Я люблю как статические, так и динамические языки. Каждый проект, в котором я участвовал примерно с 2002 года, был приложением C / C ++ со встроенной интерпретацией Python. Это дает мне лучшее из обоих миров:

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

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

Чтобы ответить на вопрос "Что за любовь к динамическим языкам?" Для меня это возможность полностью перенастроить систему во время выполнения любым возможным способом. Я считаю, что язык сценариев «запускает шоу», поэтому исполняющее приложение может делать все, что вы пожелаете.

person Community    schedule 02.11.2009

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

Ну погоди, а о чем тут обсуждение? Динамическая компиляция? Или динамический набор текста? JavaScript охватывает обе основы, поэтому я думаю, что я расскажу об обоих:

Динамическая компиляция:

Для начала, динамические языки компилируются, компиляция просто откладывается на потом. А Java и .NET действительно компилируются дважды. Один раз в соответствующие промежуточные языки, а затем динамически - в машинный код.

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

Еще одно преимущество состоит в том, что вы можете писать и компилировать код во время выполнения. Возможно ли это в статически скомпилированном коде, я не знаю. Я предполагаю, что это должно быть так, поскольку все, что компилирует JavaScript, в конечном итоге является машинным кодом и статически компилируется. Но на динамическом языке это довольно тривиальная задача. Код может писать и запускать сам. (И я почти уверен, что .NET может это сделать, но CIL, в который компилируется .NET, в любом случае динамически компилируется на лету, а в C # это не так тривиально)

Динамический набор:

Я считаю, что динамическая типизация более выразительна, чем статическая. Обратите внимание, что я использую термин выразительный неформально, чтобы сказать, что динамическая типизация может сказать больше с меньшими затратами. Вот код JavaScript:

var Person = {};

Вы знаете, что такое Человек сейчас? Это общий словарь. Я могу сделать это:

Person["First_Name"] = "John";
Person["Last_Name"] = "Smith";

Но это тоже объект. Я мог бы ссылаться на любой из этих «ключей» так:

Person.First_Name

И добавьте любые методы, которые я считаю необходимыми:

Person.changeFirstName = function(newName) {
  this.First_Name = newName;
};

Конечно, могут возникнуть проблемы, если newName не является строкой. Его поймают не сразу, если вообще, но вы можете проверить себя. Это вопрос обмена выразительной силы и гибкости в пользу безопасности. Я не возражаю против добавления кода для проверки типов и т. Д. Я сам, и я еще не столкнулся с ошибкой типа, которая сильно меня огорчила (и я знаю, что это мало о чем говорит. Это может быть вопросом времени: )). Однако мне очень нравится эта способность адаптироваться на лету.

person Community    schedule 06.02.2010

Хорошая запись в блоге на ту же тему: Python заставляет меня нервничать

Сигнатуры методов в Python практически бесполезны. В Java статическая типизация превращает сигнатуру метода в рецепт: это все, что вам нужно, чтобы заставить этот метод работать. Не так в Python. Здесь сигнатура метода скажет вам только одно: сколько аргументов вам нужно, чтобы он работал. Иногда он даже этого не делает, если ты начнешь возиться с ** kwargs.

person Community    schedule 26.05.2010

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

person Community    schedule 08.10.2008
comment
Сборка мусора ортогональна статической / динамической проверке типов. - person mmagin; 09.12.2008

Слабо типизированные языки позволяют гибко управлять своими данными.

Прошлой весной я использовал VHDL для нескольких классов, и мне нравится их метод представления битов / байтов и то, как компилятор обнаруживает ошибки, если вы пытаетесь назначить 6-битную шину 9-битной шине. Я попытался воссоздать его на C ++, и мне очень трудно заставить набор текста плавно работать с существующими типами. Я думаю, Стив Йегге очень хорошо описывает проблемы, связанные с системами сильных типов.

Что касается многословности: я считаю, что Java и C # довольно многословны в целом (давайте не будем отбирать маленькие алгоритмы, чтобы «доказать» точку зрения). И да, я написал на обоих. C ++ борется и в той же области; Здесь VHDL терпит поражение.

Экономия кажется достоинством динамических языков в целом (я представляю Perl и F # в качестве примеров).

person Community    schedule 04.08.2009
comment
Эквивалент назначения 9-битной шины 6-битной - попытка присвоить int короткому или чему-то подобному. Это ошибка C # (и, я думаю, Java), и любой компилятор C или C ++ должен иметь возможность выдавать предупреждение об этом. - person erikkallen; 30.10.2009

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

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

Да, теоретически язык в стиле c может предоставлять аналогичные функции (D пытается с auto обнаружением типов и dmdr, который компилирует модули и запускает их на лету, как если бы они были сценариями),

Так что да, скептики правы в том, что быть динамичным не обязательно означает более простой / чистый код.

но на практике Python > Java

Попробуйте w = "my string here".split()[1] на C или даже на Java.

person Community    schedule 27.10.2009
comment
В чем проблема с w = my string here.split () [1] в Java? В C # все было бы нормально. - person erikkallen; 03.11.2009
comment
О, это? ну, мой плохой, неправильный пример, я давно не использовал. - person hasen; 04.11.2009

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

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

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

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

person Community    schedule 27.10.2009