Основні рівні:
Давайте розглянемо речі на найпростішому та найосновнішому рівні.
Для математики маємо:
2 + 3 = 5
Я дізнався про це, коли був дуже-дуже молодим. Я можу переглянути найосновніші елементи: два об’єкти та три об’єкти. Чудово.
Для комп'ютерного програмування більшість людей, як правило, використовують мову високого рівня. Деякі мови високого рівня можуть навіть "скластись" в одну з нижчих мов високого рівня, наприклад C. C потім може бути переведена на мову складання. Мова збірки потім перетворюється в машинний код. Багато людей думають, що на цьому складність закінчується, але це не так: Сучасні процесори приймають машинний код як інструкцію, а потім виконують "мікрокод", щоб фактично виконати ці інструкції.
Це означає, що на самому базовому рівні (маючи справу з найпростішими структурами) ми зараз маємо справу з мікрокодом, який вбудований в апаратне забезпечення і який більшість програмістів навіть не використовує безпосередньо, не оновлює. Насправді, не тільки більшість програмістів не торкаються мікрокоду (0 рівнів вище мікрокоду), більшість програмістів не торкаються машинного коду (на 1 рівень вище мікрокоду), навіть навіть складання (2 рівня вище мікрокоду) ( крім, мабуть, для трохи офіційного навчання під час коледжу). Більшість програмістів витратять час лише на 3 і більше рівні.
Крім того, якщо ми подивимось на збори (які настільки ж низькі, як зазвичай отримують люди), кожен окремий крок, як правило, зрозумілий людям, які пройшли навчання та мають ресурси для тлумачення цього кроку. У цьому сенсі збірка набагато простіша, ніж мова вищого рівня. Однак складання настільки просте, що виконання складних завдань або навіть посередніх завдань дуже стомлююче. Мови верхнього рівня звільняють нас від цього.
У законі про "зворотну інженерію" суддя заявив, що навіть якщо кодом теоретично можна обробляти один байт, сучасні програми включають мільйони байтів, тому для подібних записів (наприклад, копії коду) потрібно робити саме такі намагання бути здійсненним. (Тому внутрішня розробка не вважалася порушенням узагальненої норми закону про авторське право "не роби копій".) (Я, мабуть, думаю про створення несанкціонованих картриджів Sega Genesis, але, можливо, я думаю про щось, що було сказано під час справи "Ігровий джин". )
Модернізація:
Ви запускаєте код, призначений для 286? Або ви запускаєте 64-бітний код?
Математика використовує основи, що тривають тисячоліття. За допомогою комп'ютерів люди, як правило, вважають інвестиції у щось двадцять років марним марнотратством ресурсів. Це означає, що математика може бути набагато більш ретельно перевірена.
Стандарти використовуваних інструментів:
Мене навчили (товариш, який пройшов більш офіційне навчання комп'ютерному програмуванню, ніж я), що немає такого поняття, як компілятор C, що не потребує помилок, який би відповідав специфікаціям C. Це тому, що мова С в основному передбачає можливість використання нескінченної пам'яті для цілей стека. Очевидно, від такої неможливої вимоги довелося відхилитися від того, коли люди намагалися зробити корисні компілятори, які працювали з фактичними машинами, які мають трохи більш обмежений характер.
На практиці я виявив, що за допомогою JScript у Windows Script Host я зміг досягти багато хорошого, використовуючи об’єкти. (Мені подобається середовище, тому що набір інструментів, необхідний для випробування нового коду, вбудований у сучасні версії Microsoft Windows.) Під час використання цього середовища я виявив, що іноді немає легкодоступної документації про те, як працює об’єкт. Однак використання об’єкта настільки вигідно, що я так чи інакше роблю. Тож, що я б робив, це написати код, який може бути баггі як гніздо шершнів, і робити це в чудово пісочне середовищі, де я можу побачити ефекти та дізнатися про поведінку об'єкта під час взаємодії з ним.
В інших випадках, іноді лише після того, як я з'ясував, як поводиться об'єкт, я виявив, що об'єкт (в комплекті з операційною системою) є помилковим, і що це відома проблема, яку Microsoft навмисно вирішив, що не буде виправлена .
У таких сценаріях я покладаюся на OpenBSD, створений майстерними програмістами, які регулярно (двічі на рік) створюють нові випуски за розкладом, із відомим записом безпеки "лише два віддалені дірки" за 10+ років? (Навіть у них виправлені помилки для менш важких питань.) Ні, ні в якому разі. Я не покладаюся на такий продукт з такою вищою якістю, тому що я працюю в бізнесі, який підтримує бізнес, який постачає людей машинами, які використовують Microsoft Windows, тому над цим повинен працювати мій код.
Практичність / зручність використання вимагають, щоб я працював на платформах, які люди вважають корисними, і це платформа, яка, як відомо, погано впливає на безпеку (навіть незважаючи на те, що з перших днів тисячоліття величезні вдосконалення були зроблені, коли продукція цієї ж компанії була набагато гіршою) .
Підсумок
Існує чимало причин, за якими комп'ютерне програмування є більш схильним до помилок, і це прийнято спільнотою користувачів комп'ютерів. Насправді більшість кодів написано в середовищах, які не переносять зусиль, що не мають помилок. (Деякі винятки, такі як розробка протоколів безпеки, можуть зайняти в цьому плані трохи більше зусиль.) Окрім поширених думок про причини бізнесу, які не хочуть інвестувати більше грошей, та пропуску штучних термінів, щоб зробити клієнтів щасливими, є вплив марш технологій, який просто стверджує, що якщо ви витратите занадто багато часу, ви будете працювати на застарілій платформі, оскільки все значно зміниться протягом десятиліття.
Я, нагадаю, здивувався тому, наскільки короткими були дуже корисні та популярні функції, коли я побачив якийсь вихідний код для strlen та strcpy. Наприклад, strlen, можливо, був на кшталт "int strlen (char * x) {char y = x; while ( (y ++)); return (yx) -1;}"
Однак типові комп’ютерні програми значно довші. Також багато сучасних програмувань використовуватимуть інший код, який може бути менш ретельно перевірений або навіть відомий як баггі. Сьогоднішні системи набагато досконаліші, ніж те, що легко можна продумати, за винятком того, як відмахуючи рукою багато деталей, як "деталі, оброблені нижчими рівнями".
Ця обов'язкова складність і визначеність роботи зі складними і навіть неправильними системами робить комп'ютерне програмування набагато апаратним для перевірки, ніж велику кількість математики, де речі, як правило, зводяться до набагато простіших рівнів.
Коли ви розбиваєте речі з математики, ви переходите до окремих творів, які діти можуть зрозуміти. Більшість людей довіряють математиці; принаймні основна арифметика (або, принаймні, підрахунок).
Коли ви справді розбиваєте комп’ютерне програмування, щоб побачити, що відбувається під кришкою, ви в кінцевому підсумку порушуєте реалізацію порушених стандартів та коду, що в кінцевому підсумку виконується в електронному вигляді, і ця фізична реалізація - це лише на крок нижче мікрокоду, на який поступає більшість підготовлених університетом комп'ютерних вчених Не смію торкатися (якщо вони навіть про це знають).
Я спілкувався з деякими програмістами, які навчаються в коледжі, або з останніми випускниками, які відверто заперечують проти думки про те, що код без помилок можна записати. Вони списали можливість, і хоча вони визнають, що деякі вражаючі приклади (які мені вдалося показати) є певними переконливими аргументами, вони вважають такі зразки рідкісними представниками нерепрезентативних флюс, і все ж відкидають можливість їх підрахунку. щодо таких вищих стандартів. (Багато, набагато інше ставлення, ніж набагато більш надійний фундамент, який ми бачимо в математиці.)