Основные уровни:
Давайте посмотрим на вещи на самом простом и самом базовом уровне.
По математике имеем:
2 + 3 = 5
Я узнал об этом, когда был очень, очень молод. Я могу взглянуть на самые основные элементы: два объекта и три объекта. Отлично.
Для компьютерного программирования большинство людей склонны использовать язык высокого уровня. Некоторые языки высокого уровня могут даже «компилироваться» в один из языков низкого уровня, например, C. Затем можно перевести на язык ассемблера. Затем язык ассемблера преобразуется в машинный код. Многие думают, что на этом сложность заканчивается, но это не так: современные процессоры принимают машинный код за инструкции, а затем запускают «микрокод», чтобы фактически выполнить эти инструкции.
Это означает, что на самом базовом уровне (имея дело с простейшими структурами) мы сейчас имеем дело с микрокодом, который встроен в аппаратное обеспечение и который большинство программистов даже не использует напрямую и не обновляет. На самом деле, не только большинство программистов не касаются микрокода (на 0 уровней выше, чем микрокод), большинство программистов не касаются машинного кода (на 1 уровень выше микрокода) и даже сборки (на 2 уровня выше, чем микрокод) ( кроме, возможно, для небольшого формального обучения в колледже). Большинство программистов будут тратить время только на 3 или более уровней выше.
Кроме того, если мы посмотрим на сборку (которая является настолько низкой, насколько обычно получают люди), каждый отдельный шаг обычно понятен людям, которые прошли обучение и имеют ресурсы для интерпретации этого шага. В этом смысле Assembly намного проще, чем язык более высокого уровня. Тем не менее, сборка настолько проста, что выполнять сложные задачи или даже посредственные задачи очень утомительно. Языки верхнего уровня освобождают нас от этого.
В законе о «обратном проектировании» судья заявил, что даже если теоретически можно обрабатывать код по одному байту за раз, современные программы занимают миллионы байтов, поэтому некоторые виды записей (например, копии кода) должны создаваться только для таких целей. усилие быть выполнимым. (Поэтому внутренняя разработка не считалась нарушением обобщенного правила об авторском праве «не делать копии».) (Возможно, я думаю о создании несанкционированных картриджей Sega Genesis, но, возможно, думаю о чем-то, что было сказано во время дела Game Genie. )
Модернизация:
Вы запускаете код, предназначенный для 286? Или вы запускаете 64-битный код?
Математика использует основы, которые уходят в глубь тысячелетий. С компьютерами люди обычно считают, что инвестиции в нечто более двух десятилетий бесполезно расточительно. Это означает, что математика может быть намного более тщательно проверена.
Стандарты используемых инструментов:
Меня научил (мой друг, который прошел более формальное обучение компьютерному программированию, чем я), что не существует такого понятия, как компилятор C без ошибок, отвечающий спецификациям 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;}"
Однако типичные компьютерные программы намного длиннее. Кроме того, во многих современных программах используется другой код, который может быть подвергнут менее тщательному тестированию или даже с ошибками. Современные системы намного сложнее, чем то, что можно легко обдумать, за исключением того, что вручную отмахиваются от множества мелочей как «деталей, обрабатываемых более низкими уровнями».
Эта обязательная сложность и уверенность в работе со сложными и даже неправильными системами делает компьютерное программирование большим количеством оборудования для проверки, чем математика, где все сводится к гораздо более простым уровням.
Когда вы разбираете вещи в математике, вы попадаете на отдельные части, которые дети могут понять. Большинство людей доверяют математике; хотя бы базовая арифметика (или, как минимум, подсчет).
Когда вы действительно разбиваете компьютерное программирование, чтобы увидеть, что происходит под капотом, вы в конечном итоге получаете сломанные реализации нарушенных стандартов и код, который в конечном итоге выполняется электронным способом, и эта физическая реализация находится всего на один шаг ниже микрокода, который делают большинство компьютерных специалистов, обучающихся в университете. не смей трогать (если они даже знают об этом).
Я говорил с некоторыми программистами из колледжа или недавними выпускниками, которые прямо возражают против идеи, что код без ошибок может быть написан. Они списали такую возможность, и хотя они признают, что некоторые впечатляющие примеры (которые мне удалось показать) являются убедительными аргументами, они считают такие образцы непредставительными редкими случайностями и все же отвергают возможность подсчета на наличие таких более высоких стандартов. (Гораздо, совсем другое отношение, чем гораздо более надежное основание, которое мы видим в математике.)