Компьютерное программирование - Computer programming

Компьютерное программирование - это процесс проектирования и создания исполняемой компьютерной программы для достижения определенного результата вычислений или выполнения определенной задачи. Программирование включает в себя такие задачи, как: анализ, создание алгоритмов , точность алгоритмов профилирования и потребление ресурсов, а также реализация алгоритмов на выбранном языке программирования (обычно называемом кодированием ). Исходный код программы написан на одном или нескольких языках, которые понятны для программистов , а не машинный код , который непосредственно выполняемой центральным процессором . Цель программирования - найти последовательность инструкций, которая автоматизирует выполнение задачи (которая может быть такой же сложной, как операционная система ) на компьютере , часто для решения данной проблемы. Таким образом, для профессионального программирования часто требуется опыт в нескольких различных предметах, включая знание области приложения , специализированных алгоритмов и формальной логики .

Сопровождающие и связанные с программированием задачи включают: тестирование , отладку , обслуживание исходного кода , внедрение систем сборки и управление производными артефактами , такими как машинный код компьютерных программ. Их можно рассматривать как часть процесса программирования, но часто термин « разработка программного обеспечения» используется для этого более крупного процесса, а термин « программирование» , « реализация» или « кодирование» зарезервирован для фактического написания кода. Программная инженерия сочетает инженерные методы с практикой разработки программного обеспечения. Обратный инжиниринг - это связанный процесс, используемый дизайнерами, аналитиками и программистами для понимания и воссоздания / повторной реализации.

История

Ада Лавлейс , примечания которой добавлены в конец статьи Луиджи Менабреа , включала первый алгоритм, разработанный для обработки с помощью аналитической машины . Ее часто называют первым компьютерным программистом в истории.

Программируемые устройства существуют веками. Еще в 9 веке программируемый музыкальный секвенсор был изобретен персидскими братьями Бану Муса , которые описали автоматизированный механический флейтист в Книге изобретательных устройств . В 1206 году арабский инженер Аль-Джазари изобрел программируемую драм-машину, в которой музыкальный механический автомат можно было заставить воспроизводить различные ритмы и паттерны ударных с помощью колышков и кулачков . В 1801 году жаккардовый ткацкий станок мог производить совершенно разные переплетения, изменяя «программу» - серию картонных карт с пробитыми в них отверстиями.

Алгоритмы взлома кода также существуют веками. В IX веке арабский математик Аль-Кинди описал криптографический алгоритм для расшифровки зашифрованного кода в «Рукописи по расшифровке криптографических сообщений» . Он дал первое описание криптоанализа с помощью частотного анализа , самого раннего алгоритма взлома кода.

Первая компьютерная программа , как правило , приурочены к 1843 году, когда математик Ада Лавлейс опубликовал алгоритм для вычисления последовательности чисел Бернулли , предназначенных для осуществляться Чарльз Бэббидж «s Analytical Engine .

Когда-то данные и инструкции хранились на внешних перфокартах , которые хранились в порядке и располагались в виде программных колод.

В 1880-х годах Герман Холлерит изобрел концепцию хранения данных в машиночитаемой форме. Позже панель управления (коммутационная панель), добавленная к его табулятору 1906 года типа I, позволила программировать его для различных задач, а к концу 1940-х годов оборудование для записи единиц, такое как IBM 602 и IBM 604 , было запрограммировано панелями управления аналогичным образом. Кстати, как и первые электронно-вычислительные машины . Однако с появлением в 1949 году концепции компьютера с хранимыми программами и программы, и данные хранились и обрабатывались в памяти компьютера одинаково .

Машинный язык

Машинный код был языком ранних программ, написанных в наборе команд конкретной машины, часто в двоичной нотации. Вскоре были разработаны языки ассемблера, которые позволили программисту указывать инструкции в текстовом формате (например, ADD X, TOTAL) с сокращениями для каждого кода операции и значимыми именами для указания адресов. Однако, поскольку язык ассемблера - это не что иное, как разные обозначения машинного языка, любые две машины с разными наборами инструкций также имеют разные языки ассемблера.

Проводная панель управления для бухгалтерской машины IBM 402 .

Языки компилятора

Языки высокого уровня сделали процесс разработки программы более простым и понятным и менее привязанным к базовому оборудованию. Первый инструмент, связанный с компилятором, A-0 System , был разработан в 1952 году Грейс Хоппер , которая также ввела термин «компилятор». FORTRAN , первый широко используемый язык высокого уровня с функциональной реализацией, вышел в 1957 году, и вскоре были разработаны многие другие языки, в частности COBOL, предназначенный для коммерческой обработки данных, и Lisp для компьютерных исследований.

Эти скомпилированные языки позволяют программисту писать программы, используя синтаксически более богатые термины и более способные абстрагироваться от кода, что упрощает нацеливание на различные наборы машинных инструкций с помощью объявлений компиляции и эвристики. Компиляторы использовали возможности компьютеров, чтобы упростить программирование, позволив программистам определять вычисления, вводя формулу с использованием инфиксной записи .

Ввод исходного кода

Программы по-прежнему вводились с использованием перфокарт или бумажной ленты . К концу 1960-х годов устройства хранения данных и компьютерные терминалы стали достаточно дешевыми, чтобы программы можно было создавать, вводя их непосредственно в компьютеры. Также были разработаны текстовые редакторы , которые позволяли вносить изменения и исправления намного проще, чем с перфокартами.

Современное программирование

Требования к качеству

Каким бы ни был подход к разработке, окончательная программа должна удовлетворять некоторым фундаментальным свойствам. Следующие свойства являются одними из самых важных:

  • Надежность : как часто результаты программы верны. Это зависит от концептуальной правильности алгоритмов и минимизации ошибок программирования, таких как ошибки в управлении ресурсами (например, переполнение буфера и состояния гонки ) и логических ошибок (таких как деление на ноль или ошибки «нет на единицу» ).
  • Надежность : насколько хорошо программа предвидит проблемы из-за ошибок (а не ошибок). Сюда входят такие ситуации, как неправильные, несоответствующие или поврежденные данные, недоступность необходимых ресурсов, таких как память, службы операционной системы и сетевые соединения, ошибка пользователя и неожиданные отключения электроэнергии.
  • Удобство использования : эргономичность программы: легкость, с которой человек может использовать программу по прямому назначению или в некоторых случаях даже для непредвиденных целей. Такие проблемы могут привести к успеху или помешать ему даже вне зависимости от других проблем. Это включает в себя широкий спектр текстовых, графических и иногда аппаратных элементов, которые улучшают ясность, интуитивность, связность и полноту пользовательского интерфейса программы.
  • Переносимость : диапазон компьютерного оборудования и платформ операционных систем, на которых исходный код программы может быть скомпилирован / интерпретирован и запущен. Это зависит от различий в средствах программирования, предоставляемых разными платформами, включая ресурсы оборудования и операционной системы, ожидаемого поведения оборудования и операционной системы, а также наличия компиляторов для конкретных платформ (а иногда и библиотек) для языка исходного кода.
  • Ремонтопригодность : легкость, с которой программа может быть изменена ее нынешними или будущими разработчиками для внесения улучшений или настройки, исправления ошибок и дыр в безопасности или адаптации ее к новым средам. В этом отношении важны передовые практики на начальном этапе разработки. Это качество может не быть очевидным для конечного пользователя, но оно может существенно повлиять на судьбу программы в долгосрочной перспективе.
  • Эффективность / производительность : измерение системных ресурсов, потребляемых программой (время процессора, объем памяти, медленные устройства, такие как диски, пропускная способность сети и в некоторой степени даже взаимодействие с пользователем): чем меньше, тем лучше. Это также включает в себя тщательное управление ресурсами, например очистку временных файлов и устранение утечек памяти . Это часто обсуждается в тени выбранного языка программирования. Хотя язык определенно влияет на производительность, даже более медленные языки, такие как Python , могут мгновенно выполнять программы с точки зрения человека. Скорость, использование ресурсов и производительность важны для программ, которые создают узкие места в системе, но эффективное использование времени программиста также важно и связано с затратами: большее количество оборудования может быть дешевле.

Читаемость исходного кода

В компьютерном программировании под удобочитаемостью понимается легкость, с которой человек-читатель может понять цель, поток управления и работу исходного кода. Это влияет на вышеперечисленные аспекты качества, включая портативность, удобство использования и, самое главное, ремонтопригодность.

Удобочитаемость важна, потому что программисты тратят большую часть своего времени на чтение, пытаясь понять и изменить существующий исходный код, а не писать новый исходный код. Нечитаемый код часто приводит к ошибкам, неэффективности и дублированию кода . Исследование показало, что несколько простых преобразований для удобства чтения сделали код короче и значительно сократили время, необходимое для его понимания.

Следование последовательному стилю программирования часто способствует удобочитаемости. Однако удобочитаемость - это больше, чем просто стиль программирования. Многие факторы, мало или совсем не связанные со способностью компьютера эффективно компилировать и выполнять код, способствуют удобочитаемости. Некоторые из этих факторов включают:

В презентации аспекты этого (например, отступы, переносы строк, цвет подсветки, и т.д.) часто обрабатываются редактором исходного кода , но аспекты содержания отражают талант и мастерство программиста.

Различные языки визуального программирования также были разработаны с целью решения проблем читабельности путем принятия нетрадиционных подходов к структуре и отображению кода. Интегрированные среды разработки (IDE) стремятся объединить всю такую ​​помощь. Такие методы, как рефакторинг кода, могут улучшить читаемость.

Алгоритмическая сложность

Академическая область и инженерная практика компьютерного программирования в значительной степени связаны с обнаружением и реализацией наиболее эффективных алгоритмов для данного класса проблем. Для этого алгоритмы классифицируются по порядкам с использованием так называемой нотации Big O , которая выражает использование ресурсов, таких как время выполнения или потребление памяти, с точки зрения размера ввода. Опытные программисты знакомы с множеством хорошо зарекомендовавших себя алгоритмов и связанных с ними сложностей и используют эти знания для выбора алгоритмов, которые лучше всего подходят для конкретных обстоятельств.

Шахматные алгоритмы на примере

«Программирование компьютера для игры в шахматы» - это статья 1950 года, в которой оценивался «минимаксный» алгоритм , являющийся частью истории алгоритмической сложности; курс IBM Deep Blue (шахматный компьютер) является частью учебной программы по информатике в Стэнфордском университете .

Методологии

Первым шагом в большинстве формальных процессов разработки программного обеспечения является анализ требований , за которым следует тестирование для определения модели ценности, внедрения и устранения сбоев (отладки). Для каждой из этих задач существует множество разных подходов. Одним из популярных подходов к анализу требований является анализ вариантов использования . Многие программисты используют формы гибкой разработки программного обеспечения, в которых различные этапы формальной разработки программного обеспечения более интегрированы в короткие циклы, которые занимают несколько недель, а не лет. Есть много подходов к процессу разработки программного обеспечения.

Популярные методы моделирования включают объектно-ориентированный анализ и проектирование ( OOAD ) и архитектуру, управляемую моделями ( MDA ). Унифицированный язык моделирования ( UML ) - это обозначение, используемое как для OOAD, так и для MDA.

Аналогичный метод, используемый для проектирования баз данных, - это моделирование отношений сущностей ( моделирование ER ).

Методы реализации включают императивные языки ( объектно-ориентированные или процедурные ), функциональные языки и языки логики .

Измерение использования языка

Определить самые популярные современные языки программирования очень сложно. Методы измерения популярности языков программирования включают: подсчет количества объявлений о вакансиях, в которых упоминается этот язык, количество проданных книг и курсов, обучающих языку (это переоценивает важность новых языков), а также оценки количества существующих строк написанного кода. в языке (это недооценивает количество пользователей деловых языков, таких как COBOL).

Некоторые языки очень популярны для определенных типов приложений, в то время как некоторые языки регулярно используются для написания множества различных типов приложений. Например, COBOL по-прежнему силен в корпоративных центрах обработки данных, часто на больших мэйнфреймах , Fortran - в инженерных приложениях, языки сценариев - в веб- разработке и C - во встроенном ПО . Многие приложения при создании и использовании используют сочетание нескольких языков. Новые языки обычно разрабатываются на основе синтаксиса предыдущего языка с добавлением новых функций (например, C ++ добавляет объектную ориентацию в C, а Java добавляет управление памятью и байт-код в C ++, но в результате теряет эффективность и способность -уровневая манипуляция).

Отладка

Первой известной фактической ошибкой, вызывающей проблему в компьютере, была моль, застрявшая внутри мэйнфрейма Гарварда, что было зарегистрировано в журнале регистрации от 9 сентября 1947 года. «Ошибка» уже была обычным термином для обозначения дефекта программного обеспечения, когда эта ошибка была обнаружена. .

Отладка - очень важная задача в процессе разработки программного обеспечения, поскольку наличие дефектов в программе может иметь серьезные последствия для ее пользователей. Некоторые языки более подвержены некоторым видам ошибок, потому что их спецификация не требует, чтобы компиляторы выполняли такую ​​же тщательную проверку, как другие языки. Использование инструмента статического анализа кода может помочь обнаружить некоторые возможные проблемы. Обычно первым шагом в отладке является попытка воспроизвести проблему. Это может быть нетривиальная задача, например, с параллельными процессами или некоторыми необычными программными ошибками. Кроме того, конкретная пользовательская среда и история использования могут затруднить воспроизведение проблемы.

После воспроизведения ошибки ввод программы может потребоваться упростить, чтобы упростить отладку. Например, когда ошибка в компиляторе может привести к его сбою при синтаксическом анализе большого исходного файла, упрощения тестового примера, в результате которого в исходном исходном файле будет всего несколько строк, может быть достаточно для воспроизведения того же сбоя. Необходим метод проб и ошибок / разделяй и властвуй: программист попытается удалить некоторые части исходного тестового примера и проверить, существует ли проблема. При отладке проблемы в графическом интерфейсе программист может попытаться пропустить некоторые действия пользователя из исходного описания проблемы и проверить, достаточно ли оставшихся действий для появления ошибок. Создание сценариев и установка точек останова также являются частью этого процесса.

Отладка часто выполняется с помощью IDE . Также используются автономные отладчики, такие как GDB , и они часто предоставляют меньше визуальной среды, обычно с использованием командной строки . Некоторые текстовые редакторы, такие как Emacs, позволяют вызывать GDB через них, чтобы обеспечить визуальную среду.

Языки программирования

Разные языки программирования поддерживают разные стили программирования (называемые парадигмами программирования ). Выбор используемого языка зависит от многих факторов, таких как политика компании, соответствие задачам, доступность сторонних пакетов или индивидуальные предпочтения. В идеале будет выбран язык программирования, наиболее подходящий для поставленной задачи. Компромиссы от этого идеала включают поиск достаточного количества программистов, знающих язык, для создания команды, наличие компиляторов для этого языка и эффективность выполнения программ, написанных на данном языке. Языки образуют приблизительный спектр от «низкого уровня» до «высокого уровня»; «низкоуровневые» языки обычно более ориентированы на машины и быстрее выполняются, тогда как «высокоуровневые» языки более абстрактны и проще в использовании, но выполняются медленнее. Обычно кодировать на «высокоуровневых» языках проще, чем на «низкоуровневых».

Аллен Дауни в своей книге « Как думать как компьютерный ученый» пишет:

Детали выглядят по-разному на разных языках, но несколько основных инструкций есть практически на каждом языке:
  • Ввод: сбор данных с клавиатуры, файла или другого устройства.
  • Вывод: отображение данных на экране или отправка данных в файл или другое устройство.
  • Арифметика: выполняйте основные арифметические операции, такие как сложение и умножение.
  • Условное выполнение: проверьте наличие определенных условий и выполните соответствующую последовательность операторов.
  • Повторение: выполняйте какое-либо действие несколько раз, обычно с некоторыми вариациями.

Многие компьютерные языки предоставляют механизм для вызова функций, предоставляемых разделяемыми библиотеками . Если функции в библиотеке следуют соответствующим соглашениям во время выполнения (например, метод передачи аргументов ), то эти функции могут быть написаны на любом другом языке.

Программисты

Программисты - это те, кто пишет компьютерное программное обеспечение. В их работу обычно входят:

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

Смотрите также

использованная литература

Источники

дальнейшее чтение

внешние ссылки