Що людей так приваблює в динамічних мовах? [зачинено]


81

Здається, останнім часом усі стрибають на динамічну, некомпільовану нарізку. Я переважно працював лише на скомпільованих мовах із статичним типом (C, Java, .Net). Я маю досвід роботи з динамічними мовами, наприклад, ASP (Vb Script), JavaScript та PHP. Використання цих технологій залишило неприємний смак у роті, коли я думав про динамічні мови. Речі, які зазвичай вловлював би компілятор, такі як неправильно написані імена змінних та присвоєння змінному значення неправильного типу, не відбуваються до часу виконання. І навіть тоді ви можете не помітити помилку, оскільки вона просто створює нову змінну та присвоює якесь значення за замовчуванням. Я також ніколи не бачив, щоб intellisense добре працював на динамічній мові, оскільки, ну, змінні не мають явного типу.

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


9
Напевно сумно (і дивно) бачити так мало захищаючих динамічних мов.
davidtbernal

11
Оскільки це єдиний спосіб отримати щось у всіх динамічних ненависниках нижче, я відповім тут: Динамічні мови дозволяють писати код швидше, немає двох способів про це. Мені не потрібно турбуватися про тип будь-якої зі своїх змінних, і мені не потрібно запускати велику важку IDE для написання коду. Таким чином, набагато краще виконувати швидкі завдання, які зайняли б більше часу із системами статичного типу через громіздкість систем типів, що змушує вас сказати компілятору ВСЕ.
RCIX,

2
Що з програмістами на C # парохіальна короткозорість?
Azeem. Батт

2
Я вважаю, що ви ще не читали steve.yegge.googlepages.com/is-weak-typing-strong-anough ?
RCIX,

5
Помилка написання назв змінних, що є проблемою, походить від неявного оголошення змінних, а не статичного / динамічного. Динамічні мови, які вимагають явного оголошення змінних (наприклад, Smalltalk), не мають цієї проблеми.
Frank Shearar

Відповіді:


101

Я думаю, причина в тому, що люди звикли до статично набраних мов, які мають дуже обмежені та невиразні системи типу. Це такі мови, як 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))))))

Приклад Хаскелла фальсифікує статично набрану, отже, багатослівну гіпотезу . Приклад LISP фальсифікує багатослівність гіпотези , тому статично набрана . Немає ніяких наслідків в обох напрямках між набором тексту та багатослівністю. Ви можете сміливо викидати це з розуму.

Помилка: мови, що набираються із статичним набором, слід компілювати, а не інтерпретувати. Знову ж таки, неправда. Багато мов із статичним типом мають перекладачів. Існує інтерпретатор Scala, інтерпретатори GHCi та Hugs для Haskell, і, звичайно, SQL як статично набирається, так і інтерпретується довше, ніж я був у живих.

Знаєте, можливо, динамічна натовп просто хоче свободи, щоб не мусити думати так ретельно про те, що вони роблять. Програмне забезпечення може бути неправильним або надійним, але, можливо, це не обов’язково.

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


26
Відмовитися від типу сейф для свободи не заслуговує ні на те ... О так, чоловіче .. Відмінно поруч із постом
baash05

6
lisp досить багатослівний сам по собі, він не має нічого спільного з тим, що його динамічно набирають ... спробуйте в python. def qsort (l): повертає qsort ([x для x в l [1:], якщо x <l [0]]) + l [0] + qsort ([x для x в l [1:], якщо x> = l [0]]) якщо l ще l
фортран

13
Саме в цьому суть. Це не має нічого спільного з динамічним або статичним набором тексту.
Апокалісп

9
Я стверджую, що ваші приклади досить бідні. Люди, які хвалять динамічні мови, швидше за все не обирають Lisp of Haskell. Швидше за все, вони обирають Python або Ruby замість Java або C #.
Корі Д.

8
Аргумент стверджує, що існує зв'язок між багатослівністю та типністю. Як бачите, будь-який такий збіг обставин - випадковість. Нетипово саме тому, що я вибрав ці мови. Хаскелл набирається сильніше, ніж будь-що інше, тому він є хорошим представником статично набраних мов. LISP - це суттєва динамічна мова, яку всі інші обов’язково наслідують, але ніколи не дублюють.
Апокалісп

70

Не забувайте, що вам потрібно написати 10x покриття коду в модульних тестах, щоб замінити те, що робить ваш компілятор: D

Я був там, робив це за допомогою динамічних мов, і не бачу абсолютно жодної переваги.


4
Радий, що я не єдиний. Змушує мене спати краще вночі.
erikkallen

Це справді велика перевага статичного перед динамічним набором тексту. Я не можу сказати, скільки разів я пропустив typesafe typedef в C ++, лише щоб дати змогу компілятору знайти мені ще деякі помилки. (Іди компілятор, іди! Принеси мені ще декількох помилок! :-)
Dimitri C.

Нісенітниця. Якщо ви тестуєте метод і тестуєте методи, які викликають метод, ви знаєте, що передача параметрів є нормальною. За визначенням, добре перевірений код точно не отримає додаткової вигоди від статичного набору тексту.
Garth Kidd

4
@Gart: дивне визначення. Не з багатьма людьми погодиться. ОТО, більшість людей погоджуються, що програма перевірки типу компілятора реалізує багато (іноді дуже складних) тестів.
Конрад Рудольф

3
@yar, якщо ви не тестуєте свій код, ви вразливі до логічних помилок. Зараз я працюю в Python десять років. Я не думаю, що я коли-небудь мав TypeError у виробництві. Однак у мене було багато логічних помилок. Висновок: Мені не потрібна статична перевірка типу, але я точно потребую модульних тестів.
Гарт Кідд,

40

Читаючи відповіді інших людей, здається, що є більш-менш три аргументи для динамічних мов:

1) Код менш багатослівний. Я не вважаю це дійсним. Деякі динамічні мови менш багатослівні, ніж деякі статичні. Але F # набирається статично, але статичне введення там не додає багато, якщо таке є, коду. Хоча це неявно набирається, але це зовсім інша річ.

2) "Моя улюблена динамічна мова X має мою улюблену функціональну функцію Y, тому динамічна краще". Не змішуйте функціональне та динамічне (я не можу зрозуміти, чому це потрібно сказати).

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

Я сам рішуче прихильник статичного набору тексту з однієї головної причини: ремонтопридатність. У мене є система з парою 10 тисяч рядків JavaScript, і будь-яка інша рефакторинг, який я хочу зробити, займе півдня, оскільки (неіснуючий) компілятор не скаже мені, що ця змінна перейменовувала. І це код, який я написав сам, також добре структурований IMO. Я б не хотів, щоб завдання було керувати еквівалентною динамічною системою, яку написав хтось інший.

Думаю, за це мене масово прихилять, але я ризикну.


цитата: На динамічних мовах ви можете відразу бачити свої результати. Новини: Ви можете зробити це за допомогою C # у Visual Studio (з 2005 року) теж. Просто встановіть точку зупинки, запустіть програму в налагоджувачі та модифікуйте програму під час налагодження. Я роблю це постійно, і це чудово працює. Це було в Дельфах з першого дня (1995?) І, мабуть, у Турбо Паскалі до цього (я точно не пам’ятаю).
No'am Newman,

6
10 тис. Рядків JavaScript? Я думаю, що це приблизно 9000 рядків занадто багато, і я люблю мови сценаріїв ...
Оз.

@ No'am: Я знаю. Ви можете зробити це і в Visual C ++ 6 (що насправді було головним для мене не переходити на C #, поки не вийшов VS2k5). Якщо що, це лише додає суті. @Oz: Звідки ти знаєш, скільки роботи повинен зробити мій JS?
erikkallen,

Я думаю, що люди, яким подобається бачити їх зміни, починають діяти одразу, як і звичайний текстовий редактор, а не VS. Кожному своє. Ви можете розглянути щось на зразок JSLint.
dlamblin

2
Хороший момент з рефакторингу. Я справді починаю насолоджуватися Ruby завдяки швидкому прототипуванню та дрібним сценаріям, але я ніколи не намагався б підтримувати великий продукт у кількох розробників без статичного набору тексту.
LoveMeSomeCode

19

VBScript відстій, якщо ви не порівнюєте його з іншим смаком VB. PHP - це нормально, якщо ви пам’ятаєте, що це обросла мова шаблонів. Сучасний Javascript чудовий. Дійсно. Тонни веселощів. Просто тримайтеся подалі від будь-яких сценаріїв із тегом "DHTML".

Я ніколи не користувався мовою, яка не допускала помилок виконання. ІМХО, це в основному червоний оселедець: компілятори не вловлюють всіх помилок і не перевіряють наміри. Явне введення тексту - це чудово, коли вам потрібні явні типи, але частіше за все цього немає. Шукайте запитання тут genericsабо тему про те, чи було використання неподписаних типів хорошим вибором для змінних індексу - більшу частину часу цей матеріал просто заважає і дає людям можливість крутити, коли у них є час .

Але, я насправді не відповів на ваше запитання. Чому динамічні мови привабливі? Оскільки через деякий час написання коду стає нудним, і ви просто хочете реалізувати алгоритм. Ви вже сиділи і все це опрацьовували, складали схеми потенційних проблемних сценаріїв і довели їх розв'язуваність, і єдине, що залишилось зробити, це закодувати двадцять рядків реалізації ... і двісті рядків зразкового тексту, щоб він скомпілювався . Потім ти розумієш, що система типів, з якою ти працюєш, відображає не те, що ти насправді робиш, а чужу надзвичайно абстрактну ідею того, чим ти можеш займатися, і ти вже давно відмовився від програмування на все життя, щоб налаштувати нарікання так нав’язливо-компульсивний, що це буде ганьбою навіть вигаданого детектива Адріана Монка.

Ось тоді ви починаєте гіпсувати, починаючи серйозно дивитись на динамічні мови.


Цікаві речі ... Я подивлюсь, чи переконає мене Рубі. PHP не мав, але я відчуваю, що багато з цього тому, що це OO-матеріали - це остання думка.
Dan Rosenstark

3
"двадцять рядків реалізації ... і двісті рядків шаблону, щоб зробити його компіляцією": Я не погоджуюся з цим твердженням. Звичайно, це було правдою в часи Java, але C # 3 і Scala значно зменшили необхідну кількість шаблонів.
cdmckay

5
Дні Java закінчились? тріскає пиво і готується до святкування Ой ... почекай ... С ++.
Shog9

2
"VBScript відстій, якщо ви не порівнюєте його з іншим смаком VB" Так? Ви хочете сказати, що VBScript - найкращий варіант Visual Basic? Напевно, я вас недооцінив.
MusiGenesis

19

Я штатний програміст .Net, який повністю закріпився за статичним типом C #. Однак я люблю сучасний JavaScript.

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

Я думаю, що є також кілька класів динамічних мов. У мене немає бажання повертатися до написання класичних сторінок ASP у VBScript. Для того, щоб бути корисним, я думаю, що динамічна мова повинна підтримувати якусь колекцію, список чи асоціативну конструкцію в своїй основі, щоб об'єкти (або те, що передається об'єктам) могли бути виражені та дозволяти вам будувати більш складні конструкції. (Можливо, нам усім слід просто кодувати в LISP ... це жарт ...)

Я думаю, що в колах .Net динамічні мови отримують поганий реп, оскільки вони пов'язані з VBScript та / або JavaScript. VBScript просто згадується як страшний сон з багатьох причин, за якими заявила Кібі - хтось пам'ятає, як застосовувати тип у VBScript за допомогою CLng, щоб переконатися, що у вас є достатньо бітів для 32-бітового цілого числа. Крім того, я думаю, що JavaScript все ще розглядається як мова браузера для випадаючих меню, яка написана по-різному для всіх браузерів. У цьому випадку проблема полягає не в мові, а в різних об’єктних моделях браузера. Що цікаво, чим більше дозріває C #, тим динамічніше він починає виглядати. Я люблю лямбда-вирази, анонімні об'єкти та умовивід типу. Це більше схоже на JavaScript щодня.


1
Я хотів би, щоб хтось додав обробку файлів, сокети та бібліотеку графічного інтерфейсу до JavaScript, а потім створив компілятор ... JS на робочому столі .......
UnkwnTech


Крім того, завжди можна було написати програму windows gui за допомогою jscript. Ну, і так дуже довго. див. "windows hta" для отримання додаткової інформації - Ви отримуєте додатковий apis, що працює в hta, який ви не отримуєте в браузері. Віджети інформаційної панелі отримують багато енергії. Веб-додатки на iphone набагато потужніші, ніж більшість людей їм поважають . Apple зробила для браузера JS багато потужних API для мобільного сафарі.
Бретон,


+1 для наміру тут. Хоча одного разу ваш код може бути переведений у статичну мову, динаміка (особливо Python) чудово підходить для одноразових та прототипів.
new123456

18

Ось статично набраний 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))))))

Думаю, ви тут упереджуєте вибір мови. Лисп, як відомо, важкий для батьків. Більш близьким до Хаскелла буде Пітон.

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 звідси


25
Це не репліка, а аргумент на підтримку. Це показує, що система типу мови (або її відсутність) дуже мало говорить нам про те, чи буде вона багатослівною або короткою.
Апокалісп

2
Я погоджуюсь з Apocalisp, багатослівність не залежить ні від динамічних, ні від статичних мов. Я б навіть сказав, що статичне / динамічне введення тексту майже не впливає на багатослівність мови. Так що так, це не статичний друкарський табір, що руйнує реторту.
BefittingTheorem

або perl! сортувати (@array);
Джеймс Андерсон,

Все порівняння Апокаліспа було фігнею. По-перше, швидке сортування (як визначено в оригінальній статті Тоні Хоара) - це місцевий алгоритм, спеціально розроблений для використання мінімального додаткового простору, але Апокалісп використовував негідну версію спільноти Haskell, яка асимптотично витрачає більше пам'яті і працює сотні разів повільніше, ніж справжній швидкий сорт. Хаскелл намагається виразити справжній алгоритм швидкої сортування, оскільки він покладається на мутацію (!) Перевірте ці спроби Хаскелла та зв’яжіться
JD

По-друге, ви не можете робити твердих тверджень щодо багатослівності на основі двох реалізацій алгоритму, який був підданий бастардизації для однієї з мов. Подивіться на APL або J, або K, або Mathematica, або будь-яку іншу стислу (= сучасну) динамічно набрану мову. Вони повинні бути коротшими, ніж будь-яка статично набрана мова. Висновок типу скорочує розрив, але розрив все одно повинен існувати.
JD

15

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

Але тоді я начебто пропускаю перевірку часу компіляції (друкарська помилка трапляється) та автоматичне завершення IDE. Загалом менша кількість коду та читабельність для мене окупаються.

Ще однією перевагою є зазвичай інтерпретована / некомпільована природа мови. Змініть код і негайно перегляньте результат. Це справді економить час під час розробки.

І останнє, але не менш важливе, мені подобається той факт, що ви можете запустити консоль і спробувати щось, у чому ви не впевнені, наприклад клас або метод, який ви ніколи раніше не використовували, і подивитися, як він поводиться. Консоль має багато варіантів використання, і я просто залишу це для вас.


Принаймні одна відома мені ID-версія Python (а саме, IDLE, та, яка трапляється із звичайною збіркою інтерпретатора Python) дійсно має можливості автозавершення, хоча заявлені змінні мають її лише у вікні інтерпретатора.
JAB

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

1
@ 01: використання загальних конструкцій мови. Це досить читабельно, якщо ви знаєте основи мови.
Естебан Кюбер,

1
Начитаність не має нічого спільного з динамічним набором тексту. Наприклад, лямбди Скали, як правило, коротші (і, можливо, виразніші), ніж блоки Рубі, те саме, що порівнює доповнення списку Хаскелла та Пітона. Консоль REPL існує, наприклад, для F #, Scala, Haskell. Швидке завантаження зміненого коду до запущеного додатку - сильна сторона динамічних мов. Хоча існують деякі технології, які дозволяють це використовувати для статичних мов (JavaRebel, наприклад).
Олексій

1
Цікаво, що я знаходжу код МЕНШЕ читабельним. Номер один, тому що я часто не можу використовувати свою IDE для перенесення в індексі, щоб знайти декларації та вбудовану документацію тощо, і номер два, тому що синтаксис досить компактний, часто я забуваю, що це означає! Я також ставлю FAR більшим вагою щодо втрати автозавершення IDE. Це не тільки знахідка, я думаю, це абсолютно підвищує ремонтопридатність.
spronkey

12

Ваші аргументи проти динамічних мов цілком слушні. Однак враховуйте наступне:

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

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


7
@wvdschel: За вашою логікою, я міг би стверджувати, що компільовані мови, такі як C # і Java, тоді не потрібно компілювати, оскільки мені залишається лише натиснути кнопку "Відтворити" на моїй IDE, і вони просто запускаються. Оскільки я не помічаю, що IDE компілює для мене, це "просто не має значення".
cdmckay

2
@cdmckay: А чи можете ви підключитися до запущеної програми C # / Java і запускати проти неї команди, змінюючи або запитуючи її під час роботи. Інтерпретовані (якими є багато динамічних мов) мови дозволяють виконувати самоаналіз під час виконання, що компільовані мови просто не роблять.
RHSeeger

4
@RHSeeger - Гм, так, ви можете зробити все це за допомогою Visual Studio. Редагувати та продовжувати не обмежується лише динамічними мовами.
Грег Бук,

4
@ baash05, я думаю, ти повністю пропустив пункт hte цієї відповіді, 1. означає, що ти можеш запускати код, коли ти правильно це зробиш, не потрібно чекати, поки компілятор побачить ефекти кожної незначної зміни. 2. Погода, з якою ви погоджуєтеся, чи ні, буде менше писати код і читати, не аргументуючи цей факт.
Fire Crow

1
2. Це питання не статичного проти динамічного, а процедурного проти функціонального. Правда: Python (і багато інших динамічних мов) є більш функціональними, ніж Java. False: Це має щось спільне з динамічним набором тексту.
erikkallen,

8

Я вважаю, що "нова знайдена любов" до мов з динамічним типом має менше спільного з тим, чи є статично набрані мови кращими чи гіршими - в абсолютному сенсі - ніж зростання популярності певних динамічних мов. Рубін на рейках, очевидно, був великим явищем, яке спричинило відродження динамічних мов. Те, що зробило рейки настільки популярними і створило стільки перетворювачів із статичного табору, було головним чином: дуже стислий та сухий код та конфігурація. Це особливо вірно у порівнянні з веб-фреймворками Java, які вимагали конфігурації XML. Багато програмістів Java - розумних - теж перетворюються, а деякі навіть євангелізують рубін та інші динамічні мови. Для мене три різні функції дозволяють динамічним мовам, таким як Ruby або Python, бути більш стислими:

  1. Мінімалістичний синтаксис - головним є те, що анотації типів не потрібні, але також дизайнер мови розробив мову з самого початку стислою
  2. синтаксис вбудованої функції (або лямбда) - можливість писати вбудовані функції та передавати їх як змінні робить багато видів коду більш короткими. Зокрема, це справедливо для операцій зі списком / масивом. Коріння цієї ідеї, очевидно, було - LISP.
  3. Метапрограмування - метапрограмування є великою частиною того, що змушує рейки галочкувати. Це породило новий спосіб рефакторингу коду, який дозволив клієнтському коду вашої бібліотеки бути набагато коротшим. Це також походить від LISP.

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

Що стосується більш вдосконалених статичних мов ... Haskell - чудова мова, у неї є №1 та №2, і хоча у неї немає №3, система типів настільки гнучка, що ви, мабуть, не знайдете браку мета бути обмежувальним. Я вважаю, що ви можете робити метапрограмування в OCaml під час компіляції з мовним розширенням. Scala - нещодавно додане і дуже перспективне. F # для табору .NET. Але користувачів цих мов меншість, і тому вони насправді не сприяли цій зміні в середовищі мов програмування. Насправді, я дуже впевнений, що популярність Ruby вплинула на популярність таких мов, як Haskell, OCaml, Scala та F #, на додаток до інших динамічних мов.


7

Особисто я думаю, що просто більшість «динамічних» мов, якими ви користувались, просто є поганими прикладами мов взагалі.

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

Зайве говорити, що я продуктивніший у будь-якій з цих мов, ніж PHP. До біса, я волів би кодувати в Scheme або Prolog, ніж в PHP. (Але останнім часом я насправді роблю більше Prolog, ніж будь-що інше, тож сприйміть це з достатком солі!)


6

Моя оцінка динамічних мов дуже пов’язана з тим, наскільки функціональними вони. Розуміння списку Python, закриття Ruby та прототипізовані об’єкти JavaScript - все це дуже привабливі аспекти цих мов. Всі вони також мають першокласні функції - те, без чого я не бачу життя.

Я б не класифікував PHP та VB (сценарій) однаково. Для мене це переважно імперативні мови з усіма недоліками динамічного набору тексту, які ви пропонуєте.

Звичайно, ви не отримуєте однаковий рівень перевірки часу компіляції (оскільки немає часу компіляції), але я би очікував, що інструменти перевірки статичного синтаксису з часом будуть розвиватися, щоб принаймні частково вирішити цю проблему.


Я ніколи раніше нікого не чув, навіть припускаючи, що йому подобаються прототипіровані об'єкти JavaScript.
erikkallen

6

Однією з переваг, на яку вказують динамічні мови, є можливість просто змінити код і продовжувати працювати. Не потрібно перекомпілювати. У VS.Net 2008 під час налагодження ви можете фактично змінити код і продовжувати працювати без перекомпіляції. Чи можливий зникнення цієї та інших переваг використання динамічних мов завдяки досягненню компіляторів та IDE.


Ви праві, що динамічно набраним мовам немає нічого, що дозволяє змінювати код у запущеній системі. Набагато простіше з інтерпретованими мовами (не плутати з динамічними), але це можна зробити навіть за допомогою скомпільованого коду. Як один із прикладів, PL / SQL Oracle - це статично набрана компільована мова, і Oracle вже десятки років має функцію, де ви можете змінювати процедури PL / SQL у запущеній системі.
Апокалісп

Зараз у Mono є репл
Стів Гілхам

Динамічні мови можуть робити такі речі поза налагоджувачем та з всередині вашої програми . Крім того, можливість виконувати виправлення мавп на заняттях при тестуванні одиниць - це економія часу.
Естебан Кюбер,

6

Ах, я не бачив цієї теми, коли публікував подібне запитання

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

Програмування програми.

Це досить складно зробити в компільованих мовах, загалом, візьмемо для прикладу .Net. Для того, щоб це працювало, вам потрібно зробити всі види mambo jumbo, і зазвичай це закінчується кодом, який працює приблизно в 100 разів повільніше.

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

Наприклад, щоб створити калькулятор в Lua, все, що мені потрібно зробити, це:

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

Тепер спробуйте зробити це в .Net.


6
Ви часто створюєте калькулятори? Я знаходжу аргументи типу "Я можу створити додаток hello world у 20 символів", які взагалі не мають значення.
erikkallen,

Ви щойно показали, наскільки надзвичайно низькою є ваша фантазія. Погана програма для програмування m8. GL.
majkinetor

Не потрібно отримувати особисті дані. Я думаю, що пункт справедливий. Дуже легко (і дуже часто) придумати аргументи типу 'подивіться, скільки коду вам потрібно написати, щоб надрукувати рядок на консолі в C #, в lua я можу сказати просто print ("Привіт, світ") '. Але співвідношення реального коду до типового зразка не залишається таким, коли проекти переростають у реалістичні розміри.
erikkallen,

2
Фігня. Ось статично набраний F #, який працює на .NET: Linq.QuotationEvaluator.Evaluate <@ 2 + 3 @>
JD

6

Моя основна причина вподобання динамічних (набраних, оскільки це, здається, фокус потоку) мов полягає в тому, що ті, якими я користувався (у робочому середовищі), значно перевершували нединамічні мови, якими я користувався. C, C ++, Java тощо ... це всі жахливі мови для реальної роботи. Я хотів би бачити неявно набрану мову, яку так само природно програмувати на стільки динамічно набраних.

З огляду на це, є певні конструкції, які просто вражають динамічно набраними мовами. Наприклад, у Tcl

 lindex $mylist end-2

Той факт, що ви передаєте "кінець-2", щоб вказати потрібний індекс, неймовірно стислий і очевидний для читача. Я ще не бачив статично набраної мови, яка робить це.


1
Чим це краще, ніж $ mylist.length-2? Мені здається, що такий синтаксис додає лише додаткові ключові слова без реальної вигоди, тобто мова важча для вивчення.
erikkallen,

Я буду трохи педантичним і зазначу, що він не додає ніяких ключових слів до самої мови, він додає це до цієї команди. Сказано, справа в тому, щоб бути зрозумілішим. Термін "кінець" виражає намір / значення, а не спосіб досягнення; там сказано "останній елемент".
RHSeeger

1
Якщо я розумію вас правильно, у такому випадку це ще гірше. Ви повинні вивчити новий синтаксис для кожної команди. що означає панель ключових слів при використанні в команді foo?
erikkallen,

@erikkallen: Це те саме, що вивчити різні вхідні дані до стандартної бібліотеки для будь-якої іншої мови. Насправді кожна команда в ядрі Tcl є, більш-менш, лише частиною стандартної бібліотеки. Теоретично немає команд, які не можна було б видалити та повторно реалізувати як чистий код Tcl. З огляду на це, входи та їх значення досить узгоджені в цій бібліотеці (тобто end означає те саме в усіх командах)
RHSeeger

5

Я думаю, що такий аргумент є дещо дурним: "Речі, які зазвичай потрапляли б до компілятора, такі як неправильно написані імена змінних та присвоєння змінному значення неправильного типу, не відбуваються до часу виконання" так, це правильно, як PHP-розробник Я не бачу таких речей, як помилково введені змінні до часу виконання, АЛЕ час виконання - це крок 2 для мене, в C ++ (це єдина компільована мова, у якої я маю досвід) це крок 3, після зв’язування та компіляції.
Мій код складається
Не кажучи вже про те, що це займає кілька секунд після того, як я натиснув кнопку save, до того, як мій код готовий до запуску, на відміну від скомпільованих мов, де це може зайняти буквально години. Мені шкода, якщо це звучить трохи сердито, але мені набридло, що люди ставляться до мене як до програміста другого курсу, бо мені не потрібно компілювати свій код.


3
Ой, на практиці ... ну, можливо, я просто некомпетентний, але в PHP щебінь від помилок з помилками - це величезна витрата часу. Особливо, коли ви успадковуєте величезну базу коду, яка не дозволяє вмикати жорсткі попередження.
Dan Rosenstark

1
Ви ЗАВЖДИ можете ввімкнути суворе повідомлення про помилки (), і будь-яка хороша IDE запобіжить 99% помилок з помилками.
UnkwnTech

Не кажучи вже про те, що на будь-якій мові можна щось неправильно написати, однак легше (можливо, швидше) знайти ці помилки, оскільки мій перекладач знаходиться на тому самому кроці при зв’язуванні / компіляції, тому знову ваше спростування не діє.
UnkwnTech

4
-1: аргумент компіляції відволікає увагу від реального аргументу, який стосується набору тексту, статичного чи динамічного. Як динамічні, так і статичні мови можна компілювати та інтерпретувати. Скарги щодо правопису та часу компіляції виходять за межі цих питань.
BefittingTheorem

Буквально годин? Що ви компілюєте, оригінальний ПК IBM?
xcramps

3

Аргумент є більш складним, ніж цей (прочитайте статтю Єгге "Чи слабкий друк досить сильний" для цікавого огляду набір ).

У динамічних мовах також не обов’язково бракує перевірки помилок - висновок типу C #, можливо, є одним із прикладів. Таким же чином, C і C ++ мають жахливі перевірки компіляції, і вони набираються статично.

Основними перевагами динамічних мов є: а) здатність (яку не обов’язково постійно використовувати) та б) закон Бойда про ітерацію .

Остання причина є масовою.


3
Висновок типу - це не те саме, що динамічне введення, оскільки виведений тип все одно повинен бути однозначно відомим під час компіляції.
Маркус Даунінг, 02

4
-1: C # набирається статично, а не динамічно.
Джульєтта

2

Хоча я ще не є великим шанувальником Ruby, я вважаю динамічні мови справді чудовими та потужними інструментами.

Думка про відсутність перевірки типу та оголошення змінних не є надто великою проблемою. Слід визнати, що ви не можете вловити ці помилки до часу запуску, але для досвідчених розробників це насправді не проблема, і коли ви робите помилки, їх зазвичай легко виправити.

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

Хороші IDE дадуть достатньо intellisense, щоб ви знали, чи змінна була "оголошена", і вони також намагаються зробити для вас умовивід для певного типу, щоб ви могли визначити, що таке змінна.

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

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


2
Я вважаю, що будь-який аргумент, який використовує "для досвідчених розробників це насправді не проблема", зазвичай трохи небезпечний. Як і в, я міг би сказати, що ООП / управління пам’яттю тощо в C ++ не є проблемою для досвідченого розробника. Чому з чимось таким простим, як оголошення змінної та перевірка базового типу, мені потрібно бути настільки обережним та досвідченим? Мені б більше хотілося, щоб мова допомагала мені програмувати, а не дозволяла мені робити помилки, які можна легко запобігти за допомогою статичного підходу. І я думаю, що багатослівність дуже мало пов’язана з динамічним або статичним набором тексту, перевірити Haskell або Scala.
BefittingTheorem

Я згоден, я також вважаю цей аргумент трохи небезпечним. Моя думка полягає в тому, що проблема перевірки типу під час кодування не так вже й погана. Помилку ви побачите відразу у 90% випадків. Це проблема для 10% випадків, коли неявне перетворення типу може спричинити стрес, однак, коли ви знаєте, що робите, ви не дозволите цього трапитися. JavaScipt - чудовий приклад 10%, коли це може бути небезпечним, але мене ніколи це не кусало за весь час розробки для нього.
Dan Herbert

@Brian Heylin: тоді ти мусиш ненавидіти C! Так багато способів вистрілити собі в ногу, але настільки використовуваних і (в деяких випадках) улюблених.
Естебан Кюбер

2

Я думаю, що нам потрібні різні типи мов залежно від того, чого ми намагаємось досягти чи вирішувати за допомогою них. Якщо ми хочемо додаток, який створює, отримує, оновлює та видаляє записи з бази даних через Інтернет, нам краще зробити це за допомогою одного рядка коду ROR (за допомогою ліска), ніж писати його з нуля на статично набраній мові. Використання динамічних мов звільняє розум від сумнівів

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

до проблем, які ближче до потреб бізнесу, наприклад

  • дані зберігаються / оновлюються тощо в базі даних, як я використовую їх для залучення трафіку на мій сайт

У будь-якому випадку, одна перевага вільно набраних мов полягає в тому, що нас насправді не хвилює, який це тип, якщо він поводиться так, як передбачається. Саме тому ми набираємо качок на динамічно набраних мовах. це відмінна функція, і я можу використовувати однакові імена змінних для зберігання різних типів даних у міру потреби. також, статично набрані мови змушують вас мислити як машина (як компілятор взаємодіє з вашим кодом тощо), тоді як динамічно набрані мови, особливо ruby ​​/ ror, змушують машину мислити як людина.

Ось деякі аргументи, якими я обґрунтовую свою роботу та досвід роботи з динамічними мовами!


1
Ваші пункти 1 і 3 ідентичні, і IMO є причиною віддавати перевагу статичному набору тексту. Що робити, якщо ви зміните тип на щось несумісне? Якщо ви зміните змінну з int на рядок, ви, мабуть, зробите це з причини. А якщо ні, просто відновіть проект, поки всі помилки збірки не зникнуть. Зазвичай це не займає так багато часу, і іноді в процесі ви виявляєте справжню проблему, на яку раді, що вам вказав компілятор. Пункт 2 недійсний, нарощування рядка виконується автоматично на всіх мовах (мабуть, принаймні на всіх, з якими я стикався за останні 15 років), крім C.
erikkallen

Я згоден з тим, що залежно від програми у вас можуть бути підстави віддати перевагу будь-якому типу мови перед іншим, а статичні мови, які швидші, можуть забезпечити кращі результати. Але я говорив, що якщо вам потрібно створити веб-програму, подібну до будь-якої іншої, можливо, вам буде краще надавати функціонал швидше, використовуючи динамічну мову, ніж статичну. також, припустимо, вам потрібно використовувати змінну x таким чином, що x.func = "так", а x.func _ = "ні". тобі все одно, який це тип, це качка, поки вона плаває, як качка. саме тому динамічний набір тексту також називають набором качок. Залишилося 0!
Умар,

1

Я думаю, що обидва стилі мають свої сильні сторони. На мій погляд, це або / або мислення начебто калічить для нашої спільноти. Я працював в архітектурах, які були статично набрані зверху вниз, і це було добре. Моя улюблена архітектура - для динамічно набраних на рівні інтерфейсу та статично набраних на функціональному рівні. Це також заохочує мовний бар'єр, який забезпечує розмежування інтерфейсу та функцій.

Щоб бути циніком, може бути, що просто динамічні мови дозволяють розробнику бути більш ледачим і робити все, щоб знати менше про основи обчислень. Чи це добре, чи погано - вирішує читач :)


1

FWIW, Компіляція більшості додатків не повинна тривати годинами. Я працював із програмами розміром від 200 до 500 тис. Рядків, на компіляцію яких потрібні хвилини. Звичайно, не години.

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

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

То, можливо, це для мене більше набору інструментів, ніж проблема динамічної / статичної мови?

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


1
Я б сказав, що час складання справді залежить від мови, що використовується. У .Net проект такого розміру може зайняти лише пару хвилин для складання. Якщо це було зроблено на C, то я міг би бачити, що це все займає деякий час.
Кібі

Гаразд, я вам це дам. Але коли ви задумаєтесь, скільки проектів, які ви хотіли б написати на C, було б можливо написати на PHP із значним часом компіляції? Я думаю, є певний момент, що мови, що перекладаються, не є правильним інструментом для роботи, і навпаки. Я великий шанувальник того, щоб вибрати відповідний інструмент для роботи та використовувати те, у чому ви найкраще працюєте. Я не бачу причини намагатися змусити одну мову робити все, коли інша спрощує це. Немає причин перевчати те, що ти знаєш.
bdwakefield

До речі, існує плагін php для VS jcxsoftware.com/vs.php Я ще не пробував його, оскільки він не безкоштовний, але з того, що я чув, він так само гарний з php, як Zend (5,5 як 6 відстій) з усіма доброта VS
UnkwnTech

Ви просто вражаєте, що є однією з найбільших причин, чому ніхто так сильно не використовує динамічні мови. Ніхто не створив великих вигадливих двомісячних рядків коду IDE, котрі можуть зробити для вас майже все, що завгодно з будь-якою з них, тому всі плачуть про те, що "вони не безпечні в типі, тому надто легко помилитися"
RCIX,

Мені байдуже про тип безпечного безглуздого. Мене це не так сильно турбує. Моя найбільша скарга полягає в тому, що це просто фізично займає більше часу і часто в рази набагато складніше відстежити проблеми. Для мене я думаю, що стиль розвитку суперечить тому, як я люблю працювати.
bdwakefield

1

Продуктивність у певному контексті. Але це лише одне середовище, яке я знаю, порівняно з деякими іншими, які я знаю чи бачив, що використовуються.

Smalltalk on Squeak / Pharo with Seaside - набагато ефективніша та ефективніша веб-платформа, ніж ASP.Net (/ MVC), RoR або Wicket, для складних додатків. Поки вам не потрібно буде взаємодіяти з чимось, що має бібліотеки в одній із цих, але не малих розмов.

Неправильно написані імена змінних червоні в IDE, IntelliSense працює, але не настільки конкретно. Помилки під час роботи на веб-сторінках - це не проблема, а особливість, один клік, щоб викликати налагоджувач, один клік до моєї IDE, виправити помилку в налагоджувачі, зберегти, продовжити. Для простих помилок час туди-назад для цього циклу становить менше 20 секунд.


1

Динамічні мови завдають удару у відповідь

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

Розмова, що обговорює динамічні мови, що є позитивними і скільки негативних насправді не відповідає дійсності.


1

Тому що я вважаю нерозумним те, що потрібно оголошувати тип коробки. Тип залишається з суттю, а не з контейнером. Статичне друкування мало сенс, коли тип коробки мав прямий вплив на те, як інтерпретуються біти в пам'яті.

Якщо ви поглянете на шаблони дизайну в GoF, ви зрозумієте, що значна частина з них існує лише для боротьби зі статичністю мови, і вони не мають жодної причини існувати в динамічній мові.

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


1

Поставте себе на місце абсолютно нового програміста, який вибирає мову для початку, якому не байдужа динаміка проти стаїчного проти лямбда проти цього проти цього тощо; яку мову ВИ б обрали?

C #

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

Луа:

function printStuff(args)
    for key,value in pairs(args) do
       print value .. " "
    end
end
strings = {
    "hello",
    "world",
    "from lua"
}
printStuff(strings)

3
Це насправді не аргументовано. Ми не зовсім нові програмісти; ця дискусія найбільш жорстоко вирує між не зовсім новими програмістами.
peSHIr

Це лише одна з причин, чому програмісти, можливо, віддали перевагу динамічним мовам; їх загалом легше зрозуміти, ніж інших, і таким чином залучати до них більше нових програмістів.
RCIX,

1

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

Особиста частина стосується торгівлі деякими чеками та іншими кроками для розробки та тестування швидкості (при цьому, ймовірно, відмова від деякої продуктивності процесора). Є деякі люди, для яких це звільнення та підвищення продуктивності, а є деякі, для кого це зовсім протилежне, і так, це певним чином залежить від конкретного смаку вашої мови. Я маю на увазі, що ніхто тут не каже, що Java скелюється за швидкий, стислий розвиток, або що PHP - це тверда мова, де ви рідко будете робити важко помітну друкарську помилку.


1

Я люблю як статичні, так і динамічні мови. Кожен проект, яким я займався приблизно з 2002 року, був додатком C / C ++ із вбудованим інтерпретатором Python. Це дає мені найкраще з обох світів:

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

Я виявляю, що поєднання статично набраної мови для побудови системи та мови динамічного типу для її налаштування дає мені гнучкість, стабільність та продуктивність.

Відповісти на питання "Що з любов’ю до динамічних мов?" Для мене це здатність повністю перепроводити систему під час виконання будь-яким можливим способом. Я розглядаю мову сценаріїв як "запуск шоу", тому виконувана програма може робити все, що завгодно.


1

Я взагалі не маю великого досвіду роботи з динамічними мовами, але одну динамічну мову, яку я знаю, JavaScript (вона ж ECMAScript), я дуже люблю.

Ну, почекайте, яка тут дискусія? Динамічна компіляція? Або динамічний набір тексту? JavaScript охоплює обидві бази, тому, мабуть, я поговорю про обидві:

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

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

Але коли компіляція відкладена, ви можете бачити результати швидше. Це одна перевага. Мені подобається просто зберігати файл і досить швидко бачити свою програму в дії.

Ще однією перевагою є те, що ви можете писати та компілювати код під час виконання . Чи можливо це в статично скомпільованому коді, я не знаю. Я думаю, це повинно бути, оскільки все, що компілює JavaScript, в кінцевому підсумку є машинним кодом і статично компілюється. Але в динамічній мові це тривіальна справа. Код може писати і запускати сам. (І я майже впевнений, що .NET може це зробити, але CIL, до якого .NET компілюється, так чи інакше динамічно компілюється, і це не так тривіально в C #)

Динамічний набір тексту :

Я думаю, що динамічний набір тексту є виразнішим, ніж статичний. Зверніть увагу, що я використовую термін виразно неформально, щоб сказати, що динамічне введення тексту може сказати більше з меншим. Ось код JavaScript:

var Person = {};

Чи знаєте ви, що таке Людина зараз? Це загальний словник. Я можу зробити це:

Person ["First_Name"] = "Джон";
Person ["Last_Name"] = "Сміт";

Але це ще й об’єкт. Я міг би звернутися до будь-якого з цих "ключів" таким чином:

Person.First_Name

І додайте будь-які методи, які я вважаю необхідними:

Person.changeFirstName = функція (newName) {
  this.First_Name = newName;
};

Звичайно, можуть виникнути проблеми, якщо newName не є рядком. Його не зловлять відразу, якщо взагалі коли-небудь, але ви можете перевірити себе. Це питання торгівлі виразною силою та гнучкістю задля безпеки. Я не проти додати код для перевірки типів і т. Д., І я ще не зіткнувся з помилкою типу, яка завдала мені великого горя (і я знаю, що це не говорить багато. Це може бути питанням часу: )). Однак мені дуже подобається така здатність адаптуватися на льоту.


1

Гарний допис у блозі на ту саму тему: Python робить мене нервовим

Підписи методів практично не потрібні в Python. У Java статичне введення робить підпис методу рецептом: це все лайно, яке потрібно, щоб цей метод працював. У Python не так. Тут підпис методу скаже вам лише одне: скільки аргументів потрібно, щоб він працював. Іноді це навіть не зробить, якщо ти почнеш трахатися з ** кваргами.


0

Тому що це весело весело весело. Приємно не турбуватися про розподіл пам’яті, наприклад. Цікаво не чекати компіляції. тощо тощо тощо


19
Збір сміття ортогональний статичній / динамічній перевірці типу.
mmagin

0

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

Я використовував VHDL минулої весни для кількох класів, і мені подобається їх метод представлення бітів / байтів, і те, як компілятор ловить помилки, якщо ви намагаєтеся призначити 6-бітову шину 9-бітовій шині. Я спробував відтворити його в C ++, і я чесно намагаюся акуратно змусити друк працювати безперебійно з існуючими типами. На мою думку, Стів Єгге дуже добре описує проблеми, пов’язані з сильними системами типу.

Щодо багатослівності: Я вважаю, що Java та C # є досить багатослівними у великому плані (давайте не будемо вибирати маленькі алгоритми, щоб "довести" думку). І так, я писав в обох. С ++ також бореться з тією ж сферою; VHDL тут піддається.

Здавалося б, парсум є доброчесністю динамічних мов загалом (я наводжу Perl та F # як приклади).


Еквівалент присвоєння 9-бітової шини 6-бітовій полягає у спробі призначити int короткому або щось подібне. Це помилка в C # (і Java, я думаю), і будь-який компілятор C або C ++ повинен мати можливість видавати попередження про це.
erikkallen,

-1. Weakly typed language != Dynamically typed language.
Джо Д.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.