Сага в двох томах Серія із двох записів від Майкла Болтона (Michael Bolton) дають пояснення, чому часто тестування займає більше часу, ніж було заплановано. На простому прикладі він показує, що проблеми у продукті мають великий вплив на можливіть забезпечити достатнє тестове покриття.
По пам'яті: «Чому ПЗ настільки дороге»
Класика: «Структурне програмування», «дисципліна програмування»
Дейкстра розробляє принцип «Доказового програмування»
Тестування не дає гарантії правильного функціонування ПЗ, лише гарантується правильність на тестових прикладах, крок вправо, крок вліво від тестів — кирдик.
Проблема в ІТ взагалі в основах в Булевій алгебрі, вона дефектна й неадекватна реальності. Не передбачає невизначений стан, лише так/ні, і це призводить до створення усіляких костилів (обробка «виключних»/непередбачених ситуацій).
Ділення на ноль страшна проблема, ну й що що ділю на ноль? Результатом має бути невизначене число а не зовнішня дія по відношенню до Булевої алгебри — переривання. В логіці мають бути передбачені такі ситуації а не костилями й латками латати логічні «дири».
Переповнення числа має бути невизначене число а не сміття, ініціалізуватися пам'ять має невизначеним числом. Результат операції із таким числом — невизначене число. Тоді логіка стає так/ні/не визначено.
До чого стільки булевої алгебри до тестування в прямому значенні?
1) Щонайменше SQL пропонує BIT NULL і BIT NOT NULL. В .NET 2.0, наприклад, з'явився Nullable. Etc.
2) Виключення було задумано взагалі не для цього. Їхнє призначення — змусити програму реагувати на непередбачені обставини. Не передбачили — до побачення, креш. Передбачили — обробили, виправили і пішли далі. «Невизначений буль», фактично, всюди використовувався у тому ж WinAPI, коли, до прикладу, 0 — не помилка, решта — помилка і її код. Код обростав здоровенними світчами, які себе не так вже й оправдовували. І лише потім збагнули, що сенс використання виключень не полягає у змішуванні статусу виконання функції з тим, що вона повернула. Все має бути окремо і чітко розмежоване.
3) В процесорі 8087, до прикладу, можна було вказати, чи потрібно генерувати переривання при діленні на 0. Мало того, воно було не NaN-ом, а ± Inf. JavaScript, до речі, також дотримується такої семантики.
4) З переповненням сміття не буває, наскільки мені відомо. У таких випадках до уваги беруться молодші біти результату (щонайменше для аддитивних операцій). Мало того, переповнення часто-густо використовуються навмисно для отримання результатів. Знову ж таки, в JavaScript результатом, наприклад, (1 / 0) / (-1 / 0) буде NaN, і якщо його помножити на раціональне число — все одно результатом буде NaN — точно за Вашим ходом думок. Але багів від того не менше. )
Наразі не маю часу більш детально описати.
Булева логіка має до цих проблем безпосереднє відношення. На ній все побудовано + костилі.
Те, що ви описали, це костилі. Яка МВР (мова високого рівня) логічно обробляє переповнення змінної (прапорці процесора це не логічно)?
Ексепшини не панацея, вони створюють ілюзію надійності, насправді криють в собі небезпечні ефекти, помилки в компіляторі й рантаймі, бо ускладнюють систему.
WinAPI — не логічно, забули перевірити — добре що вилетіло, в гіршому випадку отримаєте малозрозумілу поведінку а ще гірше коли отримаєте правдоподібний результат.
Всі ці труднощі накладаються й так на не просту проблему — верифікація алгоритма…
Тому, АРП має підтримувати роботу із невизначеним числом, пам'ять також. Інтерфейси теж. Це значно спростить використання ЕОМ в реальній практиці.
Наразі не маю часу більш детально описати.
Булева логіка має до цих проблем безпосереднє відношення. На ній все побудовано + костилі.
Те, що ви описали, це костилі. Яка МВР (мова високого рівня) логічно обробляє переповнення змінної (прапорці процесора це не логічно)?
Ексепшини не панацея, вони створюють ілюзію надійності, насправді криють в собі небезпечні ефекти, помилки в компіляторі й рантаймі, бо ускладнюють систему.
WinAPI — не логічно, забули перевірити — добре що вилетіло, в гіршому випадку отримаєте малозрозумілу поведінку а ще гірше коли отримаєте правдоподібний результат.
Всі ці труднощі накладаються й так на не просту проблему — верифікація алгоритма…
Тому, АРП має підтримувати роботу із невизначеним числом, пам'ять також. Інтерфейси теж. Це значно спростить використання ЕОМ в реальній практиці.
П.Н.
size8bitunsignet a;
a = 255;
//куча коду
a = a + 1; // результат сміття з точки зору додавання, якщо ви використовуєте ефект переповнення числа для якихось своїх цілей то руки вам відірвати треба, для цього необхідно визначати іншу операцію.
>> Булева логіка має до цих проблем безпосереднє відношення. На ній все побудовано + костилі.
А ше у всьому завжди винні регістри, бо не дають такої надійності як хотілось би; винен стек, бо через він є хостом для переповнень з доповнюючими експлойтами; винні процесорні операції переходу, бо дозволяють робити перехід всередину іншої операції, etc. Страшно жити, коротше кажучи, у всьому взагалі винні комп*ютери.
>> Те, що ви описали, це костилі. Яка МВР (мова високого рівня) логічно обробляє переповнення змінної (прапорці процесора це не логічно)?
C#, до прикладу, обробляє. Без усіляких доступних прапорців, чесно. І навіть не сама мова, а BCL/CLR. Взагалі, мова не має відношення до такого, по великому рахунку, оскільки є лише інструментом для формального імперативного запису — і все. Переповнилось шось? Будь ласкавий, оброби, або не допусти такої поведінки на етапі реалізації алгоритму. Я вже про це казав вище. Не подобається стандартний підхід — можна спробувати знайти якусь лібу, а якшо і такої нема — можна написати свою. Мейнстрімові платформи далеко не глупі люди розробляють, і щонайменше надають відповідну базу. А те, як хтось використовує цю базу — особисті речі кожного. Хтось робить це краще, хтось — гірше.
>> Ексепшини не панацея, вони створюють ілюзію надійності, насправді криють в собі небезпечні ефекти, помилки в компіляторі й рантаймі, бо ускладнюють систему.
Небезпеку криє у собі криворукість і нерозуміння концепцій системи. Компілятори, дякувати Богу, дуже навіть надійний генерять код для ексепшенів, в рантаймі помилок в реалізації виняткових ситуацій ще не бачив також — і це тішить. Те, шо система розробки ускладнюється — дуже навіть добре, оскільки дозволяє підіймати рівень мови на вищий щабель. Вас не турбує, шо SQL взагалі розробили декларативним, і шо він дуже навіть складний в реалізації, як і вся його інфрасистема? І невже не є виправданим ускладнення системи написання машинного коду в написання коду на асемблері, шо дуже обурювало «олд-скульників», як це було на початку комп*ютерної ери? А створення FORTRAN, коли програмісти на асемблері рвали на собі волосся? Висновок тут лише один: якшо хочеться писати надійніше, треба розробити розумну концепцію, вдало її реалізувати та вміло застосовувати. Справді. нічого складного.
>> WinAPI — не логічно, забули перевірити — добре що вилетіло, в гіршому випадку отримаєте малозрозумілу поведінку а ще гірше коли отримаєте правдоподібний результат.
Погоджуюсь, шо не логічно. А тому виняткові ситуації — дуже навіть логічно. Ви забули сказати, шо нелогічним було взяти за основу в WinAPI мову C, яка по дефолту маніпулювала лише значеннями, поверненими функціями. Але альтернатив C не було. Майкрософтівська Singularity, реалізована передусім на Sing#, і шось мені підказує, шо код тої осі набагато надійніший.
>> Всі ці труднощі накладаються й так на не просту проблему — верифікація алгоритма…
Це мене наштовхнуло хіба на думку, шо окрім того до C# все ж було би варто додати checked exceptions, як це було здійснено у Java.
>> Тому, АРП має підтримувати роботу із невизначеним числом, пам'ять також. Інтерфейси теж. Це значно спростить використання ЕОМ в реальній практиці.
Цікаво, як би ви кодували невизначене число, і чим вам не подобається стандартизований NaN. ) Справді, дуже навіть цікаво. ) Мене, передусім, цікавлять минулі та сучасні апаратні рішення, бо ж ми говоримо про історію та про досвід боротьби з помилками.
>> size8bitunsignet a;
>> a = 255;
>> //куча коду
>> a = a + 1; // результат сміття з точки зору додавання, якщо ви використовуєте ефект переповнення числа для якихось своїх цілей то руки вам відірвати треба, для цього необхідно визначати іншу операцію.
Нічо це не сміття, а лише модуль результату. І для обчислення CRC32 я буду, звісно ж, використовувати 64-бітні регістри, шоби мені за це мені не відірвали руки? Колись без того обходились, вміли переносити переповнення при обрахунках на листочку в стовчик навіть діти в школі (а вони поняття не мали про булеву алгебру), і зараз обходяться, і кодери на асмі прекрасно використовують carry-прапорець (неважливо, чи то Z80, чи то 8086). І то лише для мов, які не використовують виняткові ситуації. ;) В мене наразі лише одна думка: всі надумані «проблеми» лежать хіба у площині C/C++.
Небезпеку криє в собі нелогічність системи, плодження сутностей.
Операція додавання не може за собою ховати якісь ліві ефекти. І т.д.
С# реалізовує обробку ексепшином, виключення спрацює тільки у разі налаштованого контексту, подальше використовування числа приведе до невірного результату.
С# в Аріан не запхаєш.
стандартизований NaN це в кодуванні IEEE 754. Ще один головний біль з точки зору обчислень.
Закодувати можна третім рівнем. Не знаю чи трійкова система гарно підійде, але думаю якраз там є перспективи + квантові обчислення, невизначений стан вже передбачено.
>> a = a + 1;
>> Нічо це не сміття, а лише модуль результату.
це сміття, а точніше 0; Про який модуль ви говорите? Беззнакове число.
Мені наразі важко судити про логічність чи нелогічність двійкової системи у моделюванні навколишнього світу, проте всі цим успішно так само наразі користуються.
В даному випадку операція додавання якраз не має лівих ефектів, бо відомо, шо результат не завжди може поміститися у результуючий, скажімо, регістр. Скажу ше раз: про перенос знають з першого класу всі, тільки контексти переносу розряду різні — то ролі не грає жодної.
>> С# реалізовує обробку ексепшином, виключення спрацює тільки у разі налаштованого контексту, подальше використовування числа приведе до невірного результату.
Знову ж таки, це вже проблема не використання булевої логіки (чи радше двійкової, я так зрозумів), а загалом арифметики вцілому. Зрештою, налаштування контексту checked говорить про те, шо ми не будемо використовувати можливості переносу, і, швидше всього, будемо застосовувати результат в обчислені якоїсь радше злічуваної величини, якою максимально намагаємось змоделювати шось із реального світу.
>> стандартизований NaN це в кодуванні IEEE 754. Ще один головний біль з точки зору обчислень.
Звісно, якшо плювати на то, шо там тими бітами закодовано і працювати з ними напряму, не розуміючи принципів кодування. Я навіть маю сумнів, шо в сучасних системах на всіх рівнях так важливо самому реалізувати арифметику з плаваючою точкою, хіба нє? Є ж, фактично API, система команд 8087, яка враховує той NaN без головного болю, є .NET Framework зі своїм BCL-ним (про Java не буду говорити, оскільки мало з нею знайомий) зі своїми примітивними структурами, є JavaScript з класом Number. І всім їм, я вас запевнюю, відомо про NaN, і навіть про +Inf та -Inf.
>> Закодувати можна третім рівнем. Не знаю чи трійкова система гарно підійде, але думаю якраз там є перспективи + квантові обчислення, невизначений стан вже передбачено.
З практичної точки зору, не бачу жодних переваг трійкової системи над двійковою в апаратному плані. Якшо мені не зраджує пам*ять, чи не усі спроби створення трійкових машин були чи то не виправдано дорогими чи ше недоцільними, як потім виявлялось (хоча, певно, я тут сильно помиляюсь). Уявляю програмістів, які «пам*ятають» усі правила трійкової логіки, постійно оглядаючись на постери з таблицями. Власне, тестування відбувалось би тоді ше довше. А так мені, та й певно не лише мені, «думати» двійково простіше, ті ж предикати спрощуються, та й їхнє читання теж.
>> це сміття, а точніше 0; Про який модуль ви говорите? Беззнакове число.
Це не сміття. Це 0, значення молодшого байту результату обчислення, причому всьо з математичною точністю.… Про mod (%) говорю.
Про 0, мені не потрібен 0 чи молодший байт, мені потрібно щоб помилку було виявлено вчасно. Про яку математичну точність ви говорите, якщо я переповнив змінну а потім щось на неї поділив це в кращому випадку, а в гіршому ніхто нічого не помітить й тести прекрасно всі пройде а пацієнт отримав смертельну дозу опромінення чи ракета самознищилась.
Так, про переноси знають всі, тільки якось забули, одну бібліотечку прикрутили для інших умов і Аріан накрився мідним тазом. Усі тести прекрасно пройшли :)
Трійкова система спрощує все, від схемотехніки до логіки. Успішна реалізація — ЕОМ «Сетунь». Для розминки вирішіть задачу Баше про набір гирь, нічого в трійковій системі числень нема важкого.
Код HDB-3.
>> Про яку математичну точність ви говорите, якщо я переповнив змінну а потім щось на неї поділив це в кращому випадку, а в гіршому ніхто нічого не помітить й тести прекрасно всі пройде а пацієнт отримав смертельну дозу опромінення чи ракета самознищилась.
А хто комусь винен, шо нема розуміння основ найпростішої бінарної арифметики? В гіршому випадку ви будете винні у тому, шо не читаєте застережних повідомлень компіляторів C/C++, через які тут увесь цей кіпіш. Я взагалі не розумію, переповнень в трайті не може бути? ))) Була би й трійкова була система, все-одно би хтось загинув якшо не через цей, то через інший баг. До речі, ці баги (лінь дивитися в Вікі) ше хз якої бородатості, авжеж, про які ворнінги може бути мова.
>> Так, про переноси знають всі, тільки якось забули, одну бібліотечку прикрутили для інших умов і Аріан накрився мідним тазом. Усі тести прекрасно пройшли :)
Знову ж таки, я так розумію, проблема в тих, хто цього не знає переносів.
>> Трійкова система спрощує все, від схемотехніки до логіки. Успішна реалізація — ЕОМ «Сетунь».
Казанским заводом Математических машин было произведено 50 компьютеров Сетунь (с) Вікі
upd:
А-а-а, так от шо таке той Аріан. ))) Прочитав все ж. 1996 рік, не так вже й давно (переплутав, певно, з куди старішим багом, причиною якого став синтаксис FORTRAN).
Однако при переносе этой системы для использования на новой ракете, разработчиками не были учтены все особенности.
А куди ж без того. ;) Я навіть дозволю собі припустити, шо не надто високорівневу мову використовували. )))
Це вже називається тролінг. В Аріані використовувалась мова Ada. Покладатись на статті у вікі це поганий стиль. Розробники Аріану не дурніші за нас.
Шкода втраченого часу, хоча можливо хтось для себе знайшов щось цікаве…
Не тролінг, а факти. Причому із того, шо ви самі навели в якості прикладу. Пофіг, тріти так тріти. Експепшенів, я так розумію, не було би. Спробуйте змоделювати (а ше краще — реалізувати) мову програмування, заточену під трійкові системи і спробувати обійтися звичайними результатами функцій, як це було у цьому ж нелогічному способі, застосованого у WinAPI. Певно, не обійдеться без прапорців типу Status, IsError, Carry, Overflow, етц. Але ж не лише арифметичні недоліки стають причинами збоїв, чи я неправий? Я це теж згадав вище. Шо бітові «граблі», шо трітові граблі — два чоботи пара по суті, бо до «непривинчиваемого привинчивается» критика техніки обробки можливих помилок в рантаймі (шо вже є суть захисту від помилок в будь-якій системі). Мені не шкода нібито «втраченого» часу. Я для себе почерпнув дешо цікаве. Хоч, і як «троль», не мав би вам дякувати за це. Дякую.
P.S. Мудрий троль в першу чергу скаже, шо троль — хтось інший, а не він. До того ж, він накидає стандартних фраз, які не можна не прокоментувати, та спровокує на дитяче «сам дурний». Щодо Вікі, ви ніяк не вказали, шо наведені факти з «неавторитетної» Вікі хибні. Я це розцінюю як те, шо наведені мною факти залишилися фактами.
Про вікі і факти.
>> Трійкова система спрощує все, від схемотехніки до логіки. Успішна реалізація — ЕОМ «Сетунь».
cyba: Казанским заводом Математических машин было произведено 50 компьютеров Сетунь (с) Вікі
Що ви хотіли цим сказати? Що 50 машин це не успішна реалізація трійкової системи? Та хоч одна машина це успіх, ви б хоча б із предметною областю ознайомились перед висловленням якихось натяків.
Однако при переносе этой системы для использования на новой ракете, разработчиками не были учтены все особенности.
cyba: А куди ж без того. ;) Я навіть дозволю собі припустити, шо не надто високорівневу мову використовували. )))
це тільки загальна думка автора статті, настільки загальна, що із неї нової інформації неможливо отримати. З декількох фраз вам все стало ясно й ви прочитавши статтю з віки припустили, що використовувалась «не надто високорівнева мова», що ця фраза взагалі значить?(можете не відповідати)
Невизначений стан (помилкове значення комірки) обробляється в Excel, можете попрактикуватись, як це допомагає при виявленні помилок.
Щодо бінарної логіки, трійкової логіки, обробки невизначеності, надійності систем, теорії автоматів, тестування пізніше, якщо когось реально цікавить ця тема.
>> Що ви хотіли цим сказати? Що 50 машин це не успішна реалізація трійкової системи?
Я про те, шо машини на такій платформі не стали популярними.
>> можете не відповідати
Відповім. Я зробив хибні припущення щодо реалізації Аріану. Зокрема, воно прогнозувало як і низькорівневість інструменту, так і помилки при використанні надійного інструменту. «Разработчиками не были учтены все особенности» — тепер, я думаю, стало відомо, кому треба відривати руки.
>> Щодо бінарної логіки, трійкової логіки, обробки невизначеності, надійності систем, теорії автоматів, тестування пізніше, якщо когось реально цікавить ця тема.
Мене цікавить. Буду щиро радий прочитати ваші коментарі чи пости на дану тематику.
Я вам говорю ось яблуко (реалізація технології), ви — воно зелене (не популярне). Колір яблука ще недостатня підстава для висновків про його смакові якості(популярність/непопулярність не достатня підстава для висновків про технологію) тим більше, якщо вам не відомий цей сорт.
… cyba: — тепер, я думаю, стало відомо, кому треба відривати руки.
тестерам ;)
…
для затравки, маєте два потоки, один передає визначені дані інший читає й пише кудись. Адреса звісно відома:
1) синхронна передача, потоку відомий розмір ділянки пам'яті, яку треба зчитати за раз
2) асинхронна, потоку відомий розмір буфера й порції даних
Ви маєте змінні із підтримкою невизначеного стану (вся пам'ять підтримує, жодних спецкодувань ви не потребуєте, все на рівні процесора)
Двійкові чи трійкові дані не має значення головне, що є стан невизначеності.
Уявили як просто організувати таку роботу?
П.Н. ця задачка чисто для розминки, висновки про якусь технологію не робіть :)
Про тестерів — не можу знати, чи на Аріані були тестери як такі. Проте відповідальність лежить на плечах розробників. Знову ж таки: не врахували усіх особливостей.
Проблема контролю над складністю й відповідно надійності криється у психології, звичайна людина одночасно може оперувати 7+-2 сутностями. Ось чому настільки складна задача Ейнштейна. Спробуйте вирішити її без використання в голові без використання мнемотехнік.
Коли ми вирішуємо задачу це вже складна задача, інструмент на якому ми маємо вирішити її в ідеалі не має займати наш «оперативний простір», є поняття очікуваної поведінки, якщо одна операція призводить до різних поведінок то зростає складність використання даної операції, якщо ви використовуєте операцію "+" й забули поставити обмеження на вхідні дані, чи для даної ліби не передбачалося вихід за діапазон, й це призвело до неочікуваної поведінки а тестове покриття не здатне це передбачити бо вихідні дані після обробки правдоподібні (в багатьох задачах неможливо створити чітко детерміновані тести вхід — вихід, як правило це діапазони) то нащо плодити сутності без потреби, це означає, що операція "+" має вертати однозначно очікуване число або невизначений стан. І так по всіх операціях. Ще й бінарна логіка сильно нам утруднює реалізацію асинхронних систем.
Щодо логіки почитайте:
Бруснецова (Сетунь)
Яна Лукасевича (польський запис) якщо хватить терпіння то перше, що знайдете :)
Арістотеля, праці із логіки на нього посилаються тому треба бути в курсі. Можете й метафізику почитати.
Операція "+", точніше, саме «процесорний» ADD, цього не враховує. Причина — платформа. Зовсім інший рівень — абстрагування від обмежень базової платформи. Далеко за прикладом ходити не буду: ті самі примітивні типи чисел з плаваючою точкою в .NET BCL та JavaScript. По ходу, FADD так само працює за таким принципом.
За лінки — окреме дякую. Матиму час — обов'язково прочитаю. :)
Ще камін в город двійкових систем. Вони не вміють безпосередньо працювати із від'ємними цілими числами.
Для цілих чисел введено дві сутності: числа зі знаком й числа без знаку, що ще створює різноманітні ефекти/обмеження й програмісту треба це враховувати :)
Це всьо ок, я розумію, шо двійкова система не досконала. Самому не один раз було потрібно в тому ж C шось накшталт int? (Nullable). Не знаю, як там в трійковій системі насправді, але в двійковій знакові і беззнакові числа «симетричні», якшо можна так сказати. І вся відповідальність за інтерпретацію числа лежить виключно на програмістові. Я не так сильно тут захищаю біти, як їхню простоту і популярність на даний момент. Арифметика-арифметикою, але та ж трійкова система не рятує від милиць, від виключних ситуацій. Допустимо, я відкриваю мережевий ресурс. Повертати результат у вигляді закодованого трійкового значення (так-так, тріти ж «мали від цього врятувати») не має сенсу, якшо це стосується «непередбачуваної» обставини, коли метод чи функція не може повернути об'єкт або дескриптор. Винятків у відкритті такого ресурса, по суті, купа: до прикладу, InvalidHostAddressException, CannotResolveHostException, ResourceDoesNotExistException і т.п. і т.д. Тобто, це також реальна задача, і ексепшени тут більше рятують, аніж встромляють палки до коліс. І зовсім нема різниці тут, чи це біти, чи це тріти. До речі, мені не подобається факт, шо переважно методи типу String.IndexOf() повертають -1 у випадку, коли не можуть знайти стрічку у стрічці. Особисто я викидав би шось типу SubstringNotFoundException. Зрештою, я ходжу по колу, розповідаючи це. Більше не буду.
Ні, не «тріти» від цього мали врятювати, а додаткове число «невизначене» й підтримка його архітектурою (трійкова логіка), й не врятувати а зробити поведінку машини прогнозованою. Це можна порівняти із пробілом у письмі, нулем в числах.
Коментарі (26)
RSS згорнути / розгорнутиIhorP
andriyr
Класика: «Структурне програмування», «дисципліна програмування»
Дейкстра розробляє принцип «Доказового програмування»
Тестування не дає гарантії правильного функціонування ПЗ, лише гарантується правильність на тестових прикладах, крок вправо, крок вліво від тестів — кирдик.
Проблема в ІТ взагалі в основах в Булевій алгебрі, вона дефектна й неадекватна реальності. Не передбачає невизначений стан, лише так/ні, і це призводить до створення усіляких костилів (обробка «виключних»/непередбачених ситуацій).
Ділення на ноль страшна проблема, ну й що що ділю на ноль? Результатом має бути невизначене число а не зовнішня дія по відношенню до Булевої алгебри — переривання. В логіці мають бути передбачені такі ситуації а не костилями й латками латати логічні «дири».
Переповнення числа має бути невизначене число а не сміття, ініціалізуватися пам'ять має невизначеним числом. Результат операції із таким числом — невизначене число. Тоді логіка стає так/ні/не визначено.
IhorP
andriyr
1) Щонайменше SQL пропонує BIT NULL і BIT NOT NULL. В .NET 2.0, наприклад, з'явився Nullable. Etc.
2) Виключення було задумано взагалі не для цього. Їхнє призначення — змусити програму реагувати на непередбачені обставини. Не передбачили — до побачення, креш. Передбачили — обробили, виправили і пішли далі. «Невизначений буль», фактично, всюди використовувався у тому ж WinAPI, коли, до прикладу, 0 — не помилка, решта — помилка і її код. Код обростав здоровенними світчами, які себе не так вже й оправдовували. І лише потім збагнули, що сенс використання виключень не полягає у змішуванні статусу виконання функції з тим, що вона повернула. Все має бути окремо і чітко розмежоване.
3) В процесорі 8087, до прикладу, можна було вказати, чи потрібно генерувати переривання при діленні на 0. Мало того, воно було не NaN-ом, а ± Inf. JavaScript, до речі, також дотримується такої семантики.
4) З переповненням сміття не буває, наскільки мені відомо. У таких випадках до уваги беруться молодші біти результату (щонайменше для аддитивних операцій). Мало того, переповнення часто-густо використовуються навмисно для отримання результатів. Знову ж таки, в JavaScript результатом, наприклад, (1 / 0) / (-1 / 0) буде NaN, і якщо його помножити на раціональне число — все одно результатом буде NaN — точно за Вашим ходом думок. Але багів від того не менше. )
cyba
Булева логіка має до цих проблем безпосереднє відношення. На ній все побудовано + костилі.
Те, що ви описали, це костилі. Яка МВР (мова високого рівня) логічно обробляє переповнення змінної (прапорці процесора це не логічно)?
Ексепшини не панацея, вони створюють ілюзію надійності, насправді криють в собі небезпечні ефекти, помилки в компіляторі й рантаймі, бо ускладнюють систему.
WinAPI — не логічно, забули перевірити — добре що вилетіло, в гіршому випадку отримаєте малозрозумілу поведінку а ще гірше коли отримаєте правдоподібний результат.
Всі ці труднощі накладаються й так на не просту проблему — верифікація алгоритма…
Тому, АРП має підтримувати роботу із невизначеним числом, пам'ять також. Інтерфейси теж. Це значно спростить використання ЕОМ в реальній практиці.
IhorP
Булева логіка має до цих проблем безпосереднє відношення. На ній все побудовано + костилі.
Те, що ви описали, це костилі. Яка МВР (мова високого рівня) логічно обробляє переповнення змінної (прапорці процесора це не логічно)?
Ексепшини не панацея, вони створюють ілюзію надійності, насправді криють в собі небезпечні ефекти, помилки в компіляторі й рантаймі, бо ускладнюють систему.
WinAPI — не логічно, забули перевірити — добре що вилетіло, в гіршому випадку отримаєте малозрозумілу поведінку а ще гірше коли отримаєте правдоподібний результат.
Всі ці труднощі накладаються й так на не просту проблему — верифікація алгоритма…
Тому, АРП має підтримувати роботу із невизначеним числом, пам'ять також. Інтерфейси теж. Це значно спростить використання ЕОМ в реальній практиці.
П.Н.
size8bitunsignet a;
a = 255;
//куча коду
a = a + 1; // результат сміття з точки зору додавання, якщо ви використовуєте ефект переповнення числа для якихось своїх цілей то руки вам відірвати треба, для цього необхідно визначати іншу операцію.
IhorP
А ше у всьому завжди винні регістри, бо не дають такої надійності як хотілось би; винен стек, бо через він є хостом для переповнень з доповнюючими експлойтами; винні процесорні операції переходу, бо дозволяють робити перехід всередину іншої операції, etc. Страшно жити, коротше кажучи, у всьому взагалі винні комп*ютери.
>> Те, що ви описали, це костилі. Яка МВР (мова високого рівня) логічно обробляє переповнення змінної (прапорці процесора це не логічно)?
C#, до прикладу, обробляє. Без усіляких доступних прапорців, чесно. І навіть не сама мова, а BCL/CLR. Взагалі, мова не має відношення до такого, по великому рахунку, оскільки є лише інструментом для формального імперативного запису — і все. Переповнилось шось? Будь ласкавий, оброби, або не допусти такої поведінки на етапі реалізації алгоритму. Я вже про це казав вище. Не подобається стандартний підхід — можна спробувати знайти якусь лібу, а якшо і такої нема — можна написати свою. Мейнстрімові платформи далеко не глупі люди розробляють, і щонайменше надають відповідну базу. А те, як хтось використовує цю базу — особисті речі кожного. Хтось робить це краще, хтось — гірше.
>> Ексепшини не панацея, вони створюють ілюзію надійності, насправді криють в собі небезпечні ефекти, помилки в компіляторі й рантаймі, бо ускладнюють систему.
Небезпеку криє у собі криворукість і нерозуміння концепцій системи. Компілятори, дякувати Богу, дуже навіть надійний генерять код для ексепшенів, в рантаймі помилок в реалізації виняткових ситуацій ще не бачив також — і це тішить. Те, шо система розробки ускладнюється — дуже навіть добре, оскільки дозволяє підіймати рівень мови на вищий щабель. Вас не турбує, шо SQL взагалі розробили декларативним, і шо він дуже навіть складний в реалізації, як і вся його інфрасистема? І невже не є виправданим ускладнення системи написання машинного коду в написання коду на асемблері, шо дуже обурювало «олд-скульників», як це було на початку комп*ютерної ери? А створення FORTRAN, коли програмісти на асемблері рвали на собі волосся? Висновок тут лише один: якшо хочеться писати надійніше, треба розробити розумну концепцію, вдало її реалізувати та вміло застосовувати. Справді. нічого складного.
>> WinAPI — не логічно, забули перевірити — добре що вилетіло, в гіршому випадку отримаєте малозрозумілу поведінку а ще гірше коли отримаєте правдоподібний результат.
Погоджуюсь, шо не логічно. А тому виняткові ситуації — дуже навіть логічно. Ви забули сказати, шо нелогічним було взяти за основу в WinAPI мову C, яка по дефолту маніпулювала лише значеннями, поверненими функціями. Але альтернатив C не було. Майкрософтівська Singularity, реалізована передусім на Sing#, і шось мені підказує, шо код тої осі набагато надійніший.
>> Всі ці труднощі накладаються й так на не просту проблему — верифікація алгоритма…
Це мене наштовхнуло хіба на думку, шо окрім того до C# все ж було би варто додати checked exceptions, як це було здійснено у Java.
>> Тому, АРП має підтримувати роботу із невизначеним числом, пам'ять також. Інтерфейси теж. Це значно спростить використання ЕОМ в реальній практиці.
Цікаво, як би ви кодували невизначене число, і чим вам не подобається стандартизований NaN. ) Справді, дуже навіть цікаво. ) Мене, передусім, цікавлять минулі та сучасні апаратні рішення, бо ж ми говоримо про історію та про досвід боротьби з помилками.
>> size8bitunsignet a;
>> a = 255;
>> //куча коду
>> a = a + 1; // результат сміття з точки зору додавання, якщо ви використовуєте ефект переповнення числа для якихось своїх цілей то руки вам відірвати треба, для цього необхідно визначати іншу операцію.
Нічо це не сміття, а лише модуль результату. І для обчислення CRC32 я буду, звісно ж, використовувати 64-бітні регістри, шоби мені за це мені не відірвали руки? Колись без того обходились, вміли переносити переповнення при обрахунках на листочку в стовчик навіть діти в школі (а вони поняття не мали про булеву алгебру), і зараз обходяться, і кодери на асмі прекрасно використовують carry-прапорець (неважливо, чи то Z80, чи то 8086). І то лише для мов, які не використовують виняткові ситуації. ;) В мене наразі лише одна думка: всі надумані «проблеми» лежать хіба у площині C/C++.
cyba
Операція додавання не може за собою ховати якісь ліві ефекти. І т.д.
С# реалізовує обробку ексепшином, виключення спрацює тільки у разі налаштованого контексту, подальше використовування числа приведе до невірного результату.
С# в Аріан не запхаєш.
стандартизований NaN це в кодуванні IEEE 754. Ще один головний біль з точки зору обчислень.
Закодувати можна третім рівнем. Не знаю чи трійкова система гарно підійде, але думаю якраз там є перспективи + квантові обчислення, невизначений стан вже передбачено.
>> a = a + 1;
>> Нічо це не сміття, а лише модуль результату.
це сміття, а точніше 0; Про який модуль ви говорите? Беззнакове число.
IhorP
В даному випадку операція додавання якраз не має лівих ефектів, бо відомо, шо результат не завжди може поміститися у результуючий, скажімо, регістр. Скажу ше раз: про перенос знають з першого класу всі, тільки контексти переносу розряду різні — то ролі не грає жодної.
>> С# реалізовує обробку ексепшином, виключення спрацює тільки у разі налаштованого контексту, подальше використовування числа приведе до невірного результату.
Знову ж таки, це вже проблема не використання булевої логіки (чи радше двійкової, я так зрозумів), а загалом арифметики вцілому. Зрештою, налаштування контексту checked говорить про те, шо ми не будемо використовувати можливості переносу, і, швидше всього, будемо застосовувати результат в обчислені якоїсь радше злічуваної величини, якою максимально намагаємось змоделювати шось із реального світу.
>> стандартизований NaN це в кодуванні IEEE 754. Ще один головний біль з точки зору обчислень.
Звісно, якшо плювати на то, шо там тими бітами закодовано і працювати з ними напряму, не розуміючи принципів кодування. Я навіть маю сумнів, шо в сучасних системах на всіх рівнях так важливо самому реалізувати арифметику з плаваючою точкою, хіба нє? Є ж, фактично API, система команд 8087, яка враховує той NaN без головного болю, є .NET Framework зі своїм BCL-ним (про Java не буду говорити, оскільки мало з нею знайомий) зі своїми примітивними структурами, є JavaScript з класом Number. І всім їм, я вас запевнюю, відомо про NaN, і навіть про +Inf та -Inf.
>> Закодувати можна третім рівнем. Не знаю чи трійкова система гарно підійде, але думаю якраз там є перспективи + квантові обчислення, невизначений стан вже передбачено.
З практичної точки зору, не бачу жодних переваг трійкової системи над двійковою в апаратному плані. Якшо мені не зраджує пам*ять, чи не усі спроби створення трійкових машин були чи то не виправдано дорогими чи ше недоцільними, як потім виявлялось (хоча, певно, я тут сильно помиляюсь). Уявляю програмістів, які «пам*ятають» усі правила трійкової логіки, постійно оглядаючись на постери з таблицями. Власне, тестування відбувалось би тоді ше довше. А так мені, та й певно не лише мені, «думати» двійково простіше, ті ж предикати спрощуються, та й їхнє читання теж.
>> це сміття, а точніше 0; Про який модуль ви говорите? Беззнакове число.
Це не сміття. Це 0, значення молодшого байту результату обчислення, причому всьо з математичною точністю.… Про mod (%) говорю.
cyba
Про 0, мені не потрібен 0 чи молодший байт, мені потрібно щоб помилку було виявлено вчасно. Про яку математичну точність ви говорите, якщо я переповнив змінну а потім щось на неї поділив це в кращому випадку, а в гіршому ніхто нічого не помітить й тести прекрасно всі пройде а пацієнт отримав смертельну дозу опромінення чи ракета самознищилась.
Так, про переноси знають всі, тільки якось забули, одну бібліотечку прикрутили для інших умов і Аріан накрився мідним тазом. Усі тести прекрасно пройшли :)
Трійкова система спрощує все, від схемотехніки до логіки. Успішна реалізація — ЕОМ «Сетунь». Для розминки вирішіть задачу Баше про набір гирь, нічого в трійковій системі числень нема важкого.
Код HDB-3.
IhorP
А хто комусь винен, шо нема розуміння основ найпростішої бінарної арифметики? В гіршому випадку ви будете винні у тому, шо не читаєте застережних повідомлень компіляторів C/C++, через які тут увесь цей кіпіш. Я взагалі не розумію, переповнень в трайті не може бути? ))) Була би й трійкова була система, все-одно би хтось загинув якшо не через цей, то через інший баг. До речі, ці баги (лінь дивитися в Вікі) ше хз якої бородатості, авжеж, про які ворнінги може бути мова.
>> Так, про переноси знають всі, тільки якось забули, одну бібліотечку прикрутили для інших умов і Аріан накрився мідним тазом. Усі тести прекрасно пройшли :)
Знову ж таки, я так розумію, проблема в тих, хто цього не знає переносів.
>> Трійкова система спрощує все, від схемотехніки до логіки. Успішна реалізація — ЕОМ «Сетунь».
Казанским заводом Математических машин было произведено 50 компьютеров Сетунь (с) Вікі
cyba
А-а-а, так от шо таке той Аріан. ))) Прочитав все ж. 1996 рік, не так вже й давно (переплутав, певно, з куди старішим багом, причиною якого став синтаксис FORTRAN).
Однако при переносе этой системы для использования на новой ракете, разработчиками не были учтены все особенности.
А куди ж без того. ;) Я навіть дозволю собі припустити, шо не надто високорівневу мову використовували. )))
cyba
Шкода втраченого часу, хоча можливо хтось для себе знайшов щось цікаве…
IhorP
P.S. Мудрий троль в першу чергу скаже, шо троль — хтось інший, а не він. До того ж, він накидає стандартних фраз, які не можна не прокоментувати, та спровокує на дитяче «сам дурний». Щодо Вікі, ви ніяк не вказали, шо наведені факти з «неавторитетної» Вікі хибні. Я це розцінюю як те, шо наведені мною факти залишилися фактами.
cyba
>> Трійкова система спрощує все, від схемотехніки до логіки. Успішна реалізація — ЕОМ «Сетунь».
cyba: Казанским заводом Математических машин было произведено 50 компьютеров Сетунь (с) Вікі
Що ви хотіли цим сказати? Що 50 машин це не успішна реалізація трійкової системи? Та хоч одна машина це успіх, ви б хоча б із предметною областю ознайомились перед висловленням якихось натяків.
Однако при переносе этой системы для использования на новой ракете, разработчиками не были учтены все особенности.
cyba: А куди ж без того. ;) Я навіть дозволю собі припустити, шо не надто високорівневу мову використовували. )))
це тільки загальна думка автора статті, настільки загальна, що із неї нової інформації неможливо отримати. З декількох фраз вам все стало ясно й ви прочитавши статтю з віки припустили, що використовувалась «не надто високорівнева мова», що ця фраза взагалі значить?(можете не відповідати)
Невизначений стан (помилкове значення комірки) обробляється в Excel, можете попрактикуватись, як це допомагає при виявленні помилок.
Щодо бінарної логіки, трійкової логіки, обробки невизначеності, надійності систем, теорії автоматів, тестування пізніше, якщо когось реально цікавить ця тема.
IhorP
Я про те, шо машини на такій платформі не стали популярними.
>> можете не відповідати
Відповім. Я зробив хибні припущення щодо реалізації Аріану. Зокрема, воно прогнозувало як і низькорівневість інструменту, так і помилки при використанні надійного інструменту. «Разработчиками не были учтены все особенности» — тепер, я думаю, стало відомо, кому треба відривати руки.
>> Щодо бінарної логіки, трійкової логіки, обробки невизначеності, надійності систем, теорії автоматів, тестування пізніше, якщо когось реально цікавить ця тема.
Мене цікавить. Буду щиро радий прочитати ваші коментарі чи пости на дану тематику.
cyba
…
cyba: — тепер, я думаю, стало відомо, кому треба відривати руки.
тестерам ;)
…
для затравки, маєте два потоки, один передає визначені дані інший читає й пише кудись. Адреса звісно відома:
1) синхронна передача, потоку відомий розмір ділянки пам'яті, яку треба зчитати за раз
2) асинхронна, потоку відомий розмір буфера й порції даних
Ви маєте змінні із підтримкою невизначеного стану (вся пам'ять підтримує, жодних спецкодувань ви не потребуєте, все на рівні процесора)
Двійкові чи трійкові дані не має значення головне, що є стан невизначеності.
Уявили як просто організувати таку роботу?
П.Н. ця задачка чисто для розминки, висновки про якусь технологію не робіть :)
IhorP
cyba
Коли ми вирішуємо задачу це вже складна задача, інструмент на якому ми маємо вирішити її в ідеалі не має займати наш «оперативний простір», є поняття очікуваної поведінки, якщо одна операція призводить до різних поведінок то зростає складність використання даної операції, якщо ви використовуєте операцію "+" й забули поставити обмеження на вхідні дані, чи для даної ліби не передбачалося вихід за діапазон, й це призвело до неочікуваної поведінки а тестове покриття не здатне це передбачити бо вихідні дані після обробки правдоподібні (в багатьох задачах неможливо створити чітко детерміновані тести вхід — вихід, як правило це діапазони) то нащо плодити сутності без потреби, це означає, що операція "+" має вертати однозначно очікуване число або невизначений стан. І так по всіх операціях. Ще й бінарна логіка сильно нам утруднює реалізацію асинхронних систем.
Щодо логіки почитайте:
Бруснецова (Сетунь)
Яна Лукасевича (польський запис) якщо хватить терпіння то перше, що знайдете :)
Арістотеля, праці із логіки на нього посилаються тому треба бути в курсі. Можете й метафізику почитати.
IhorP
За лінки — окреме дякую. Матиму час — обов'язково прочитаю. :)
cyba
Для цілих чисел введено дві сутності: числа зі знаком й числа без знаку, що ще створює різноманітні ефекти/обмеження й програмісту треба це враховувати :)
IhorP
cyba
IhorP
«Дисципліна програмування» нажаль не повністю викладено, можна знайти в іншому місці.
IhorP
cyba
Тільки зареєстровані й авторизовані користувачі можуть залишати коментарі.