Динамічно проти статично типізованих досліджень мов [закрито]


69

Чи існують дослідження, проведені щодо ефективності мов, що стаціонарно проти динамічно набраних?

Зокрема:

  • Вимірювання продуктивності програміста
  • Ставка дефекту

Також включаючи наслідки того, застосовується чи ні одиничне тестування.

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


8
@bigown, мені не здається, що питання продуктивності та дефекти стосуються теорії інформатики
Winston Ewert

2
@Winston: Вивчення подібних питань - це робота комп'ютерних науковців, а не програмістів.
Маньєро

9
@bigown, так, це питання інформатики, але це не питання теорії інформатики. Теорія CS по суті стосується того, що ми можемо математично довести щодо програм та обчислень. Питання продуктивності програміста - це не питання теорії cs. Були обговорені питання динамічного набору тексту як тут, так і в потоковому потоці. В історії не було жодного.
Вінстон Еверт

8
Питання ідеально по темі. Це питання обговорює одну з найважливіших властивостей інструментів, які ми використовуємо для програмування.
Френк Шірар

4
@Winston: Системи набору тексту належать до теорії CS, але практичні дослідження цього не роблять.
Девід Thornley

Відповіді:


42

Деякі пропонували прочитати:

Не зовсім про статичне введення тексту, але пов'язане з цим:

Деякі цікаві статті чи нариси на тему чи статичний аналіз програм загалом:

А для тих, хто буде цікавий, про що це все:

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

Особисто, Я твердо вважаю, що статичне введення за допомогою динамічного введення полегшує виявлення помилок. Я витрачаю занадто багато типів на пошук помилок друку і дрібних помилок, таких як JavaScript або навіть Ruby-код. І коли ми говоримо про те, що динамічне введення тексту дає змогу підвищити продуктивність, я думаю, що це здебільшого зводиться до інструментального обладнання. Якщо статично типізовані мови мають правильні інструменти, що дозволяють здійснити фонову перекомпіляцію та забезпечити інтерфейс REPL, то ви отримаєте переваги обох світів. Скала надає це, наприклад, що робить його дуже простим у навчанні та прототипі в інтерактивній консолі, але дає переваги статичного набору тексту (і сильнішої системи типу, ніж багато інших мов, ML-мов убік). Так само я не думаю, що я втрачаю продуктивність, використовуючи Java або C ++ (через статичне введення тексту), поки я використовую IDE, який допомагає мені. Коли я повертаюсь до кодування лише за допомогою простих конфігурацій (редактор + компілятор / інтерпретатор), тоді мені здається, що більш громіздкі та динамічні мови здаються легшими у використанні. Але ти все одно полюєш на клопів. Я думаю, люди скажуть, що питання інструментарію - це зворотний аргумент, як би інструменти були кращими для динамічних мов, то більшість помилок і помилок помилок було б вказано під час кодування, але це відображає ваду в системі, на мою думку. Тим не менш, я зазвичай прототипом в JRuby і пізніше кодую на Java більшість речей, які я роблю. як би інструменти були кращими для динамічних мов, то більшість помилок і помилок помилок буде вказуватися під час кодування, але це відображає ваду в системі, на мою думку. Тим не менш, я зазвичай прототипом в JRuby і пізніше кодую на Java більшість речей, які я роблю. як би інструменти були кращими для динамічних мов, то більшість помилок і помилок помилок буде вказуватися під час кодування, але це відображає ваду в системі, на мою думку. Тим не менш, я зазвичай прототипом в JRuby і пізніше кодую на Java більшість речей, які я роблю.

ПОПЕРЕДЖЕННЯ: Деякі з цих посилань ненадійні, а деякі проходять через портали різних обчислювальних товариств, використовуючи доступ до членів на платній основі. Вибачте з цього приводу, я намагався знайти кілька посилань для кожного з них, але це не так добре, як хотілося б.


Це виявлення помилок - це головним чином через неправильно написані назви змінних чи назви методів, або десь посередині? (Я ненавиджу неявну декларацію змінної саме з цієї причини: у Smalltalk ви оголошуєте всі свої змінні вгорі, тож ви відразу знаєте, коли ви ввели помилку в ім'я змінної. (Опис помилок назви методу іноді теж трапляється, якщо ім'я методу ніколи використовувались у зображенні раніше.))
Френк Шейрар

Щодо інструментального інструменту, я мушу сказати, що це залежить від вашої мови - у Smalltalk є чудові інструменти, включаючи браузер Refactoring, який Eclipse ще (як мені кажуть) ще догнав.
Френк Шірар

@Frank Shearar, оскільки я почав з Ruby (походить з Java), я зрозумів, що те, що висловлювання @ haylem, ймовірно, не стосується Smalltalk. Не моє мантра про неможливість автоматичного рефакторингу в динамічно набраних мовах. Я повністю згоден з розділом "особисто" Хайлема .... ігноруючи SmallTalk, звичайно :) Це справедливо, певною мірою, оскільки SmallTalk, хоча і не мертвий, напевно не користується популярністю, яку мають Python або Ruby (зараз у жовтні 2010 р.) ).
Ден Rosenstark

3
@haylem, особисто я вдячний вам за те, що я відчув, що я не єдина людина у світі, яка працює на динамічних мовах, але, коли їм надають вибір, багато разів ОБИБУЄМО статично типовані мови (той самий випадок, Java проти JRuby або Groovy).
Дан Розенстарк

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

19

Лише вчора я знайшов це дослідження: одиничне тестування недостатньо. Вам також потрібен статичний набір тексту.

В основному автор використовував інструмент, здатний автоматично перетворити проект з нестатичної мови введення тексту в статичний (пітон в haskell)

Потім він вибрав ряд проектів з відкритим кодом Python, які також включали розумну кількість тестових одиниць, і автоматично перетворив їх у haskell.

Переклад до Haskell виявив низку помилок, пов'язаних з типом змінних: помилки не були виявлені тестовими одиницями.


4
Незручна правда динамічного набору тексту.
День

6
"Переклад на Haskell виявив низку помилок, пов’язаних з типом змінних: помилки не були виявлені тестовими одиницями.": З мовою, що динамічно вводиться, ви повинні вручну перевірити властивості вашого коду, які статично -типізована мова автоматично перевіряється компілятором. Це як більш трудомістке, так і схильне до помилок. +1
Джорджіо

4
Я відповів на публікацію за цим посиланням на Reddit. Я не думаю, що висновки, зроблені з паперу, є розумними.
Ведрак

Обидві системи набору тексту мають свої плюси та мінуси та їх використання. Це як би обговорювати приведення кулемета до рукопашного бою. Це війна віросповідання далеко не кінець. З цим, я погоджуюся з Ведраком. Нестатичним мовам потрібно більше тестових випадків, щоб виявити помилки, викликані типами. Ось їхня природа і кон. Але програмісту потрібно написати тест, який помилиться в коді, викликаний несподіваним станом введення, не обов'язково вичерпним тестуванням типу введення.
Andre Figueiredo

10
  • Посилання на обговорення доповіді ACM " Експеримент про статичні та динамічні системи типу " (2010) статті Стефана Ханенберга (на яку посилалася Лорін Хохштайн у попередньому дописі).
  • Висновок: продуктивність для подібної якості була вищою в динамічній мові.
  • Потенційні упередження / питання валідності: Експериментальними предметами були всі студенти. Також обмежена різноманітність завдань програмування (суб'єктам пропонувалося реалізувати сканер і аналізатор).
  • Документ ACM " Чи впливають мови на програмування продуктивність? " (2007) Делорі, Кнудсон та Чун.
  • Висновок: JavaScript, Tcl, Perl продуктивніше, ніж C # C ++ та Java. Python та PHP потрапляють посередині.
  • Потенційні упередження / проблеми дійсності: Немає міри якості (наприклад, виявлені помилки після випуску). Жодних мір надійності (чи надійніше програмне забезпечення, написане на мовах, що набираються статично?). Зразок зміщення - усі проекти були відкриті з репозиторіїв CVS з відкритим кодом. Крім того, немає різниці між слабо і сильно набраними мовами (тобто вказівниками).
  • Дисертація " Емпіричне дослідження продуктивності та якості програмного забезпечення " (2008) Майкла Ф. Сіока
  • Висновок: Вибір мови програмування не впливає суттєво на продуктивність чи якість. Однак це впливає на витрати на оплату праці та "якість в загальному портфелі програмних програм".
  • Потенційні упередження / проблеми дійсності: обмежено домену авіоніки. Мови програмування могли бути введені статично. Я не читав тезу, тому не можу оцінити її суворість.
    Моя думка. Хоча є слабкі докази того, що динамічно набрані мови є більш продуктивними, це не є переконливим. (1) Є багато факторів, які не контролювались, (2) є занадто мало досліджень, (3) мало або взагалі не було обговорень, що є відповідним методом тестування.

6

Ось відправна точка:

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


5
Для людей, які не є IEEE, що є основним резюме?
Френк Ширар

1
@Frank Shearar, висновок, який вони роблять, полягає в тому, що мова програмування впливає на продуктивність. Вони вимірюють рядки коду на програміста на мову на рік, я не впевнений, що це хороший показник продуктивності.
Вінстон Еверт

3
@Winston: Це, безумовно, хибна показник. Ви можете вважати, що COBOL є дуже продуктивним мовою: потрібно багато рядків, щоб зробити що-небудь корисне, але їх досить легко написати.
Девід Торнлі

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

Я з цим згоден. Але це не служить для відповіді на моє початкове запитання.
Вінстон Еверт

1

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

Ось резюме виконавця:

З контрольованих експериментів лише три показують ефект, достатньо великий, щоб мати будь-яке практичне значення. Дошкільне дослідження, що порівнює C, C ++, Java, Perl, Python, Rexx та Tcl; дослідження Endrikat, що порівнює Java та Dart; і експеримент Кулі з VHDL та Verilog. На жаль, всі вони мають проблеми, які важко зробити дійсно сильний висновок.

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

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

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

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

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

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

Я виявив тематичне дослідження 0install (яке порівнювало різні мови з Python і врешті-решт влаштувалося на Ocaml) як одне з найбільш цікавих речей, на які я натрапив, але це така суб'єктивна річ, яку кожен буде тлумачити по-різному, що ви можете побачити, дивлячись .

Це відповідає моєму враженню (у моєму маленькому куточку світу ACL2, Isabelle / HOL та PVS - найпоширеніші докази, і є сенс, що люди віддають перевагу більшої автоматизації при вирішенні проблем у галузі), але це також суб'єктивні.

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

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

Деякі помітні упущення досліджень - це комплексні дослідження з використанням досвідчених програмістів, не кажучи вже про дослідження, які мають велику групу «хороших» чи «поганих» програмістів, дивлячись на те, що наближається до значного проекту (у місцях, де я працював, тримісячний проект би вважати невеликим, але це на кілька порядків більше, ніж будь-який проект, що використовується в контрольованому дослідженні), використовуючи "сучасні" статично типовані мови, використовуючи поступовий / необов'язковий введення тексту, використовуючи сучасні основні IDE (наприклад, VS та Eclipse), використовуючи сучасні радикальні IDE (наприклад, LightTable), використовуючи старі шкільні редактори (наприклад, Emacs та vim), проводити технічне обслуговування нетривіальної бази коду, обслуговувати все, що нагадує реалістичне середовище, проводити обслуговування на базі коду, з якою ви вже знайомі тощо.

Якщо ви подивитесь на коментарі до цих досліджень в Інтернеті, більшість з них передаються навколо, щоб виправдати ту чи іншу точку зору. Дослідження «Пречельт» щодо динамічного проти статичного, а також подальші спостереження на Ліспі - це багаторічні фаворити прихильників динамічної мови, і дослідження гірничих видобутку останнім часом стало модним серед функціональних програмістів.


0

Я, чесно кажучи, не вважаю, що введення тексту Static vs Dynamic - це справжнє питання.

Я думаю, що два параметри повинні бути першими:

  • рівень знання мови: чим ви досвідченіший, тим більше знаєте про "ґетчі" і тим більше шансів на те, щоб уникнути їх / легко відстежити. Це також стосується конкретної програми / програми, над якою ви працюєте
  • тестування: я люблю статичну типізацію (пекло мені подобається програмування на C ++: p), але є стільки, що компілятор / статичний аналізатор може зробити для вас. Бути впевненим у програмі просто неможливо, не перевіривши її. І я все для нечіткого тестування (коли це застосовується), тому що ви просто не можете думати про всі можливі комбінації вводу.

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

Якщо ви пишете розв'язаний код і випробовуєте кожну функціональність широко, то ви створите добре відточений код, і, таким чином, ви будете продуктивними (адже ви не можете кваліфікуватись як продуктивні, якщо не оціните якість продукту, чи не так? )

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


2
Якщо це зустрічне запитання, де в ньому питання? :) Я погоджуюсь, що інші фактори важливіші, ніж статичний та динамічний набір тексту. Однак прихильники динамічного набору тексту вимагають кращої продуктивності, а прихильники статичного набору тексту - більш високої якості коду. Мені було цікаво, чи є у когось фактичні докази на підтвердження їхніх вимог.
Вінстон Еверт

@Winston: Я видалив лічильник біт: p Як ви вже згадували, це переважно претензії. Я думаю, що більшість прихильників динамічного набору тексту поєднують простоту використання з динамічним набором тексту, тоді як простота використання в основному стосується інструментів. Я згоден, що можливість писати прототипи швидкого викидання та експериментувати короткі команди за допомогою інтерпретатора - це підвищення продуктивності, але навіть Haskell (можливо, мова з найбільш вражаючою системою типів на даний момент) має інтерпретатора для швидкого експерименту: )
Матьє М.

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

0

Ось декілька:

  • Стефан Ганенберг. 2010. Експеримент щодо систем статичного та динамічного типу: сумніви щодо позитивного впливу систем статичного типу на час розробки. У працях міжнародної конференції ACM про об'єктно-орієнтовані мови програмування та програми (OOPSLA '10). ACM, Нью-Йорк, Нью-Йорк, США, 22-35. DOI = 10.1145 / 1869459.1869462 http://doi.acm.org/10.1145/1869459.1869462

  • Даніель П. Делорі, Чарльз Д. Кнутсон, Скотт Чун, "Чи впливають мови на програмування на продуктивність? Дослідження з використанням даних проектів з відкритим кодом", флос, стор.8, перший міжнародний семінар з нових тенденцій досліджень і розробок FLOSS (FLOSS '07: ICSE Workshop 2007), 2007

  • Далі, М .; Сазавал, В., Фостер, Дж.: Робота в стадії: емпіричне дослідження статичного набору тексту в рубіні, практикум з оцінки та корисності мов та інструментів програмування (PLATEAU) на ON-WARD 2009.

  • Люц Прешельт та Вальтер Ф. Тічі. 1998. Контрольований експеримент для оцінки переваг перевірки типу аргументів процедури. IEEE Trans. Softw. Англ. 24, 4 (квітень 1998 р.), 302-312. DOI = 10.1109 / 32.677186 http://dx.doi.org/10.1109/32.677186

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