Які аргументи є на користь слабкого набору тексту?


40

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


17
Cooper and Torczon's Engineering a Compiler слабке введення тексту визначає як використання погано розробленої системи типу. Це впевнено не звучить так, як це принесе користь будь-кому.
Корбін березня

@Corbin March: Приємний. Мені потрібно додати це до свого списку.
Йорг W Міттаг

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

Відповіді:


46

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

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

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

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

  • слабкий набір тексту = небезпечний набір тексту / сильний набір тексту = безпечний набір тексту
  • слабке введення = динамічне введення / сильне введення тексту = статичне введення тексту
  • слабкий набір тексту = качка набору / сильний набір тексту = номінальний набір тексту
  • слабке введення = структурне введення / сильне введення = номінальне введення тексту
  • слабке введення = неявне введення / сильне введення тексту = явне введення тексту
  • слабке введення = приховане введення / сильне введення тексту = явне введення тексту
  • слабкий набір тексту = відсутність набору / сильний набір тексту = набір тексту
  • слабке введення = неявні касти / сильне введення = лише явні касти
  • слабке введення = неявні або явні касти / сильне введення тексту = взагалі відсутні
  • слабке введення = неявна конверсія / сильне введення тексту = лише явні конверсії
  • слабке введення = неявна або явна конверсія / сильне введення тексту = відсутність перетворень
  • слабкий набір тексту = інтерпретація / сильний набір тексту = компіляція
  • слабкий набір тексту = повільний / сильний набір тексту = швидкий
  • слабкий набір тексту = збирання сміття / сильний набір тексту = ручне управління пам’яттю
  • слабкий набір тексту = ручне управління пам’яттю / сильне введення тексту = вивезення сміття
  • … Та багато інших

Однак три визначення, які, як видається, використовуються найбільш широко

  • слабкий набір тексту = ваша дурна хитра мова програмування / сильна введення тексту = моя супер-чудова мова програмування
  • слабкий набір тексту = будь-яка інша мова програмування / сильний набір тексту = єдина мова програмування, яку я коли-небудь намагався вивчити (як правило, або Java, C # або C ++; як не дивно, люди, які навчаються, наприклад, Haskell або Scheme як їх перша і єдина мова, схоже, не поділяють цей світогляд)
  • слабкий набір тексту = кожна мова, яку я не розумію / сильна введення = Java (замінити на C # або C ++ за бажанням)

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

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


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

7
@ Renesis: Я б назвав це "реалізмом" :-) Я бачив достатньо дискусій про типові системи, щоб зрозуміти, що половина людей не розуміє, що вони говорять про зовсім інші речі, а інші не знають, про що говорять. про зовсім . Пару місяців тому було обговорено список основних розробок мови, яку я не називатиму, про те, щоб додати додаткову систему типу для підвищення продуктивності. Ця дискусія тривала тиждень, задіяли десятки людей та сотні листів. Ніхто не зрозумів, що необов'язкова система типу за визначенням не може покращити продуктивність. …
Jörg W Mittag

8
+1 за цинізм! Ви можете додати "сильний набір тексту = коли IDE знає типи моїх змінних (Intellisense тощо), слабкий набір тексту = коли його немає)"
user281377

1
У більш певних назвах систем типізації відсутність судження неявного значення слабке і сильний є.
Єва

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

25

Пам'ятайте, що два основних поняття, які зазвичай плутають:

Динамічне введення тексту

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

Переваги тут часто відпускаються як просто для "нових" програмістів, але також можуть бути зручними для будь-якого програміста:

if (!(arr is Array)) arr = [arr]; // is, instanceof, .constructor ==, whatever

Менше коду в будь-якому випадку, коли вам інакше доведеться передати або призначити нове значення:

if (data is Array)) {
    i = data.length; // no i = ((Array)data).length or Array myArr=(Array)data;
}

Вільний або слабкий набір тексту

Слабке введення означає, що мова неявно перетворює (або відкидає) типи при використанні.

Переваги:

  • Передайте функції будь-якого типу як параметр . Корисно для зворотних викликів, гнучких API та спрощує реалізацію закриття.
  • Неявна булева оцінка . Будь-який тип можна оцінити як булевий. Це також має побічні переваги, такі як частина заповнення ||може бути використана у присвоєнні без перетворення на булеву:

    var a = param || defaultValue;
    
  • Знову ж таки, менше коду:

    var num = 5;
    var str = "Hello";
    input.innerHTML = input.value = num;
    for (var i=0; i < input.value; i++) { ... }
    

    Навіть Java довелося пройти частково, з неявним закликом .toString()при поєднанні об'єктів із a String; інакше програмісти Java проклинають це цілий день (виписки журналу не підлягають контролю).


Обидва визначення походять з http://en.wikipedia.org/wiki/Type_system . Це сказало це краще, ніж я міг.


1
Динамічне введення тексту також вигідно, коли потрібно буде багато генерації коду на мові статичного типу. Порівняйте кількість генерації коду, необхідного для, скажімо, Entity Framework в C # з бібліотеками ORM на динамічно набраних мовах (PHP, Python тощо). Хоча деякі можуть стверджувати, що переваги з точки зору IDE IntelliSense перевищують вартість усього цього генерування коду ...
Дін Гардінг,

3
Ваш коментар "// no i = ((масив) даних) .length або масив даних myArr = (масив);" насправді не має нічого спільного з динамічним набором тексту, оскільки масив даних є доступним під час компіляції. Статично набрана мова може поширювати знання, отримані від instanceof.
Пітер Тейлор

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

@ Renesis, я ні, ні. Але сімейство мов ML є статично типовим і використовує умовиводи типу, тому вам дуже рідко доводиться чітко заявляти тип змінної.
Пітер Тейлор

1
@ Петер Тейлор правильний. Багато переваг динамічного набору тексту доступні мовами з кращими системами статичного набору тексту, як, наприклад, Haskell, Scala або навіть C #. Я б сказав, що головна перевага динамічного набору тексту - це справи, які за своєю суттю безтипові, як HTML DOM. Чому написати node ["attr"] замість node.attr? Вони завжди вирішуються під час виконання.
Метт Оленік

7

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

C - найвідоміша слабо типізована мова, і вона не виконує перевірки часу виконання або перевірки часу компіляції типу змінних. По суті , ви можете кинути char *в int *і мові не буде піклуватися. То чому б ти це робив?

Програмування на C досить близьке до того, як ви могли б робити речі зі збиранням, тому бувають випадки, коли ви дбаєте лише про адресу. З void *цієї причини не рідкість подавати або передавати посилання. Якщо ви знаєте, як організована пам'ять (знову це стосується проблеми C і збірки), ви можете зробити досить круті обчислення, виходячи з адреси в адресі, void *щоб отримати потрібну інформацію. Це може дозволити вам коротко замикати процес, який, наприклад, вам доведеться пройти в Java.

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

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


2
Я не бачу, чому сильно набрана мова не може компілювати так ефективно, як C. Але компілятор повинен бути набагато складнішим.
9000

2
C ++ - приклад однієї такої мови. У C ++ вся перевірка типів виконується під час компіляції, а жодна не виконується під час виконання ... ПІДНЯТТЯ у вас включена RTTI.
Берін Лорич

2
Не впевнений , що я згоден з цим аргументом продуктивності, але це цікавий вид.
Мартін Ба

2

Слабке введення текстів, як правило, простіше зрозуміти новачкам, наприклад, у таких як excel, javascript та vbscript. Ви також торгуєте деякою швидкістю розробки для потенційних помилок.

Хороша стаття на тему: Сильний набір тексту та сильне тестування


1
Я не думаю, що існує сильна відповідність між слабо набраними мовами та новими дружніми мовами. Рубі і пітон сильно набрані і, як правило, вважаються сприятливими для новачків. C слабо типізований і взагалі вважається новачком ворожим.
sepp2k

Ні, не мова взагалі, я просто говорив про набір тексту
Омде

2
Динамічні та сильно набрані комбінації для новачків. Хоча я бачив, що коли люди переходять зі статично набраної мови до динамічно набраної, вони також сильно плутаються. Я ніколи не бачив когось, хто почав динамічно набирати текст, хоча з тих пір, коли школи закінчують викладання C або Java в основному.
jsternberg

3
@Mchl: це не має нічого спільного ні зі статичним / динамічним, ні з сильним / слабким введенням тексту. Необхідність оголошувати типи - це явне / неявне введення тексту.
Йорг W Міттаг

1
Може так само бути;) Тож я перейшов також із явно на явно набрану мову. Виправте мене, якщо я помиляюся, Pascal набирається статично, сильно і явно, тоді як PHP динамічно, слабко і неявно вводиться, чи не так?
Mchl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.