Компьютерное программирование
Часть серии о |
Разработка программного обеспечения |
---|
Компьютерное программирование или кодирование — это совокупность последовательностей инструкций, называемых программами , которым компьютеры могут следовать для выполнения задач. [1] [2] Он включает в себя разработку и реализацию алгоритмов , пошаговые спецификации процедур путем написания кода на одном или нескольких языках программирования . Программисты обычно используют языки программирования высокого уровня , которые более понятны человеку, чем машинный код , который непосредственно выполняется центральным процессором . Опытное программирование обычно требует знаний в нескольких различных предметах, включая знание предметной области , деталей языков программирования и библиотек общего кода , специализированных алгоритмов и формальной логики .
Вспомогательные задачи, сопровождающие программирование и связанные с ним, включают анализ требований , тестирование , отладку (исследование и устранение проблем), внедрение систем сборки и управление производными артефактами программ , такими как машинный код . Хотя иногда это называют программированием, часто термин «разработка программного обеспечения» используется для обозначения этого более широкого общего процесса, а термины «программирование» , «реализация » и «кодирование» зарезервированы для написания и редактирования кода как такового. Иногда разработку программного обеспечения называют инженерией программного обеспечения , особенно когда она использует формальные методы или следует процессу инженерного проектирования .
История
[ редактировать ]Программируемые устройства существуют уже много столетий. Еще в 9 веке программируемый музыкальный секвенсор был изобретен персидскими братьями Бану Муса , которые описали автоматизированный механический флейтист в « Книге изобретательных устройств» . [3] [4] В 1206 году арабский инженер Аль-Джазари изобрел программируемую драм-машину , в которой можно было заставить музыкальный механический автомат воспроизводить различные ритмы и рисунки барабанов с помощью колышков и кулачков . [5] [6] В 1801 году жаккардовый ткацкий станок мог производить совершенно другие переплетения, изменив «программу» — серию картонных карточек с пробитыми в них отверстиями.
Алгоритмы взлома кода также существовали на протяжении веков. В 9 веке арабский математик Аль-Кинди описал криптографический алгоритм расшифровки зашифрованного кода в «Рукописи по расшифровке криптографических сообщений» . Он дал первое описание криптоанализа с помощью частотного анализа , самого раннего алгоритма взлома кода. [7]
Первая компьютерная программа обычно датируется 1843 годом, когда математик Ада Лавлейс опубликовала алгоритм расчета последовательности чисел Бернулли , который должен был выполняться Чарльза Бэббиджа аналитической машиной . [8] Однако сам Чарльз Бэббидж написал свою первую программу для АЭ в 1837 году. [9] [10]
В 1880-х годах Герман Холлерит изобрел концепцию хранения данных в машиночитаемой форме. [11] Позже панель управления (штепсельная плата), добавленная к его табулятору Type I 1906 года, позволила программировать его для различных задач, а к концу 1940-х годов такое записывающее оборудование , как IBM 602 и IBM 604 , программировалось с панелей управления аналогичным образом. кстати, как были первые электронные компьютеры . Однако с появлением в 1949 году концепции компьютера с хранимой программой и программы , и данные одинаково сохранялись и обрабатывались в памяти компьютера . [12]
Машинный язык
[ редактировать ]Машинный код был языком ранних программ, написанных в наборе команд конкретной машины, часто в двоичной записи. Вскоре были разработаны языки ассемблера , которые позволяли программисту задавать инструкции в текстовом формате (например, ADD X, TOTAL) с сокращениями для каждого кода операции и значимыми именами для указания адресов. Однако, поскольку язык ассемблера — это не что иное, как разные обозначения машинного языка, две машины с разными наборами команд также имеют разные языки ассемблера.
Языки компилятора
[ редактировать ]Языки высокого уровня сделали процесс разработки программы более простым и понятным, а также менее привязанным к базовому оборудованию . Первый инструмент, связанный с компилятором, A-0 System , был разработан в 1952 году. [13] Грейс Хоппер , которая также ввела термин «компилятор». [14] [15] ФОРТРАН , первый широко используемый язык высокого уровня, имеющий функциональную реализацию, вышел в 1957 году. [16] Вскоре были разработаны многие другие языки, в частности COBOL, предназначенный для коммерческой обработки данных, и Lisp для компьютерных исследований.
Эти скомпилированные языки позволяют программисту писать программы в более синтаксически более богатых терминах и более способных абстрагировать код, что позволяет легко ориентироваться на различные наборы машинных инструкций с помощью объявлений компиляции и эвристики . Компиляторы использовали возможности компьютеров, чтобы упростить программирование [16] позволяя программистам задавать вычисления путем ввода формулы с использованием инфиксной записи .
Запись исходного кода
[ редактировать ]Ввод программ в основном осуществлялся с помощью перфокарт или бумажной ленты . К концу 1960-х годов устройства хранения данных и компьютерные терминалы стали достаточно недорогими, и программы можно было создавать путем ввода текста непосредственно в компьютеры. Были также разработаны текстовые редакторы , которые позволяли вносить изменения и исправления гораздо проще, чем с помощью перфокарт .
Современное программирование
[ редактировать ]Требования к качеству
[ редактировать ]Каким бы ни был подход к развитию, окончательная программа должна удовлетворять некоторым фундаментальным свойствам. К числу наиболее важных относятся следующие свойства: [17] [18]
- Надежность : насколько часто результаты программы верны. Это зависит от концептуальной правильности алгоритмов и минимизации ошибок программирования, таких как ошибки в управлении ресурсами (например, переполнение буфера и условия гонки ) и логические ошибки (например, ошибки деления на ноль или отклонения на единицу ).
- Надежность : насколько хорошо программа предвидит проблемы из-за ошибок (не ошибок). Сюда входят такие ситуации, как неверные, неподходящие или поврежденные данные, недоступность необходимых ресурсов, таких как память, службы операционной системы и сетевые подключения, ошибки пользователя и непредвиденные отключения электроэнергии.
- Юзабилити : эргономика программы: легкость, с которой человек может использовать программу по ее прямому назначению или, в некоторых случаях, даже в непредвиденных целях. Такие проблемы могут повлиять на успех или разрушить его, даже независимо от других проблем. Это включает в себя широкий спектр текстовых, графических, а иногда и аппаратных элементов, которые улучшают ясность, интуитивность, связность и полноту пользовательского интерфейса программы.
- Переносимость : диапазон компьютерного оборудования и платформ операционных систем и запущен исходный код программы , на которых может быть скомпилирован / интерпретирован . Это зависит от различий в средствах программирования, предоставляемых различными платформами, включая ресурсы аппаратного обеспечения и операционной системы, ожидаемого поведения оборудования и операционной системы, а также наличия компиляторов для конкретной платформы (а иногда и библиотек) для языка исходного кода.
- Сопровождаемость : легкость, с которой программа может быть изменена ее нынешними или будущими разработчиками с целью внесения улучшений или настройки, исправления ошибок и дыр в безопасности или адаптации ее к новым средам. Передовая практика [19] во время первоначальной разработки имеют значение в этом отношении. Это качество может быть неочевидно для конечного пользователя, но оно может существенно повлиять на судьбу программы в долгосрочной перспективе.
- Эффективность / производительность : мера системных ресурсов, потребляемых программой (время процессора, объем памяти, медленные устройства, такие как диски, пропускная способность сети и в некоторой степени даже взаимодействие с пользователем): чем меньше, тем лучше. Сюда также входит тщательное управление ресурсами, например очистка временных файлов и устранение утечек памяти . Это часто обсуждается в контексте выбранного языка программирования. Хотя язык, безусловно, влияет на производительность, даже более медленные языки, такие как Python , могут выполнять программы мгновенно с человеческой точки зрения. Скорость, использование ресурсов и производительность важны для программ, которые являются узким местом системы, но эффективное использование времени программистов также важно и связано с затратами: больше оборудования может оказаться дешевле.
Использование автоматических тестов и фитнес-функций может помочь сохранить некоторые из вышеупомянутых атрибутов. [20]
Читабельность исходного кода
[ редактировать ]В компьютерном программировании читабельность означает легкость, с которой читатель-человек может понять назначение, поток управления и работу исходного кода . Это влияет на вышеуказанные аспекты качества, включая портативность, удобство использования и, что наиболее важно, ремонтопригодность.
Читабельность важна, поскольку программисты тратят большую часть своего времени на чтение, попытки понять, повторное использование и изменение существующего исходного кода, а не на написание нового исходного кода. Нечитаемый код часто приводит к ошибкам, неэффективности и дублированию кода . Исследование показало, что несколько простых преобразований читабельности сделали код короче и значительно сократили время на его понимание. [21]
Следование единообразному стилю программирования часто помогает улучшить читабельность. Однако читабельность — это больше, чем просто стиль программирования. Многие факторы, практически не имеющие отношения к способности компьютера эффективно компилировать и выполнять код, способствуют удобочитаемости. [22] Некоторые из этих факторов включают в себя:
- Различные стили отступов (пробелы)
- Комментарии
- Разложение
- Соглашения об именах объектов (таких как переменные, классы, функции, процедуры и т. д.)
Аспекты представления (такие как отступы, разрывы строк, выделение цветом и т. д.) часто обрабатываются редактором исходного кода , но аспекты содержания отражают талант и навыки программиста.
Различные языки визуального программирования также были разработаны с целью решить проблемы читаемости за счет применения нетрадиционных подходов к структуре и отображению кода. Интегрированные среды разработки (IDE) призваны интегрировать всю такую помощь. Такие методы, как рефакторинг кода, могут улучшить читаемость.
Алгоритмическая сложность
[ редактировать ]И академическая область, и инженерная практика компьютерного программирования в основном связаны с обнаружением и реализацией наиболее эффективных алгоритмов для данного класса задач. Для этой цели алгоритмы классифицируются по порядкам с использованием так называемой нотации Big O , которая выражает использование ресурсов, таких как время выполнения или потребление памяти, с точки зрения размера входных данных. Опытные программисты знакомы с множеством хорошо зарекомендовавших себя алгоритмов и их сложностью и используют эти знания для выбора алгоритмов, которые лучше всего подходят для конкретных обстоятельств.
Методологии
[ редактировать ]Первым шагом в большинстве формальных процессов разработки программного обеспечения является анализ требований , за которым следует тестирование для определения ценности моделирования, реализации и устранения ошибок (отладки). Для каждой из этих задач существует множество различных подходов. Одним из популярных подходов к анализу требований является анализ вариантов использования . Многие программисты используют формы гибкой разработки программного обеспечения , в которых различные этапы формальной разработки программного обеспечения более интегрированы в короткие циклы, которые занимают несколько недель, а не лет. Существует множество подходов к процессу разработки программного обеспечения.
Популярные методы моделирования включают объектно-ориентированный анализ и проектирование ( OOAD ) и модельно-ориентированную архитектуру ( MDA ). Унифицированный язык моделирования ( UML ) — это нотация, используемая как для OOAD, так и для MDA.
Похожий метод, используемый для проектирования базы данных, — это Entity-Relationship Modeling ( ER Modeling ).
Методы реализации включают императивные языки ( объектно-ориентированные или процедурные ), функциональные языки и логические языки .
Измерение использования языка
[ редактировать ]Очень сложно определить, какие современные языки программирования наиболее популярны. Методы измерения популярности языка программирования включают: подсчет количества объявлений о вакансиях, в которых упоминается этот язык, [23] количество проданных книг и курсов обучения этому языку (это переоценивает важность новых языков) и оценки количества существующих строк кода, написанных на этом языке (это недооценивает количество пользователей бизнес-языков, таких как COBOL).
Некоторые языки очень популярны для определенных типов приложений, в то время как некоторые языки регулярно используются для написания множества различных типов приложений. Например, COBOL по-прежнему силен в корпоративных центрах обработки данных. [24] часто на больших мэйнфреймах , Fortran в инженерных приложениях, языки сценариев в веб- разработке и C во встроенном программном обеспечении . Многие приложения при создании и использовании используют смесь нескольких языков. Новые языки обычно разрабатываются на основе синтаксиса предыдущего языка с добавлением новых функций (например, C++ добавляет объектно-ориентированность в C, а Java добавляет управление памятью и байт-код в C++, но в результате теряет эффективность и способность к низкому уровню производительности). манипулирование на уровне).
Отладка
[ редактировать ]Отладка — очень важная задача в процессе разработки программного обеспечения, поскольку наличие дефектов в программе может иметь серьезные последствия для ее пользователей. Некоторые языки более склонны к некоторым ошибкам, поскольку их спецификация не требует от компиляторов такого большого количества проверок, как другие языки. Использование инструмента статического анализа кода может помочь обнаружить некоторые возможные проблемы. Обычно первым шагом в отладке является попытка воспроизвести проблему. Это может быть нетривиальная задача, например, с параллельными процессами или какими-то необычными программными ошибками. Кроме того, специфическая пользовательская среда и история использования могут затруднить воспроизведение проблемы.
После воспроизведения ошибки ввод программы, возможно, придется упростить, чтобы облегчить ее отладку. Например, когда ошибка в компиляторе может привести к его сбою при анализе какого-то большого исходного файла, упрощения тестового примера, в результате которого из исходного исходного файла будет всего несколько строк, может быть достаточно для воспроизведения того же сбоя. Необходим метод проб и ошибок/разделяй и властвуй: программист попытается удалить некоторые части исходного тестового примера и проверить, существует ли проблема по-прежнему. При отладке проблемы в графическом интерфейсе программист может попытаться пропустить некоторые действия пользователя из исходного описания проблемы и проверить, достаточны ли оставшиеся действия для появления ошибок. Сценарии и точки останова также являются частью этого процесса.
Отладка часто выполняется с помощью IDE . Также используются автономные отладчики, такие как GDB , которые часто предоставляют меньше визуальной среды, обычно используя командную строку . Некоторые текстовые редакторы, такие как Emacs, позволяют вызывать GDB через них, обеспечивая визуальную среду.
Языки программирования
[ редактировать ]Различные языки программирования поддерживают разные стили программирования (так называемые парадигмы программирования ). Выбор используемого языка зависит от многих факторов, таких как политика компании, соответствие задаче, наличие сторонних пакетов или индивидуальные предпочтения. В идеале будет выбран язык программирования, наиболее подходящий для поставленной задачи. Компромиссы от этого идеала включают в себя поиск достаточного количества программистов, знающих язык для создания команды, наличие компиляторов для этого языка и эффективность, с которой выполняются программы, написанные на данном языке. Языки образуют приблизительный спектр от «низкоуровневого» до «высокоуровневого»; Языки «низкого уровня» обычно более машинно-ориентированы и выполняются быстрее, тогда как языки «высокого уровня» более абстрактны и просты в использовании, но выполняются менее быстро. Обычно легче программировать на языках «высокого уровня», чем на языках «низкого уровня».Языки программирования необходимы для разработки программного обеспечения. Они являются строительными блоками для всего программного обеспечения, от самых простых приложений до самых сложных.
Аллен Дауни в своей книге «Как думать как ученый-компьютерщик» пишет:
- Детали выглядят по-разному на разных языках, но несколько основных инструкций есть практически на каждом языке:
- Ввод: сбор данных с клавиатуры, файла или другого устройства.
- Вывод: Отображение данных на экране или отправка данных в файл или другое устройство.
- Арифметика: выполнение основных арифметических операций, таких как сложение и умножение.
- Условное выполнение: проверьте наличие определенных условий и выполните соответствующую последовательность операторов.
- Повторение: многократное выполнение какого-либо действия, обычно с некоторыми вариациями.
Многие компьютерные языки предоставляют механизм вызова функций, предоставляемых разделяемыми библиотеками . При условии, что функции в библиотеке соответствуют соответствующим соглашениям времени выполнения (например, методу передачи аргументов ), тогда эти функции могут быть написаны на любом другом языке.
Программисты
[ редактировать ]Программисты — это те, кто пишет компьютерное программное обеспечение. Их работа обычно включает в себя:
- Прототипирование
- Кодирование
- Отладка
- Документация
- Интеграция
- Обслуживание
- Анализ требований
- Архитектура программного обеспечения
- Тестирование программного обеспечения
- Спецификация
Хотя программирование представлено в средствах массовой информации как предмет, отчасти математический, некоторые исследования показывают, что хорошие программисты обладают хорошими навыками владения естественными человеческими языками и что обучение программированию похоже на изучение иностранного языка . [26] [27]
См. также
[ редактировать ]- Код запаха
- Компьютерные сети
- Соревновательное программирование
- Лучшие практики программирования
- Системное программирование
Ссылки
[ редактировать ]- ^ Беббингтон, Шон (2014). «Что такое кодирование» . Тамблер . Архивировано из оригинала 29 апреля 2020 года . Проверено 3 марта 2014 г.
- ^ Беббингтон, Шон (2014). «Что такое программирование» . Тамблер . Архивировано из оригинала 29 апреля 2020 года . Проверено 3 марта 2014 г.
- ^ Коэтсьер, Теун (2001). «О предыстории программируемых машин: музыкальных автоматов, ткацких станков, калькуляторов». Теория механизма и машин . 36 (5). Эльзевир: 589–603. дои : 10.1016/S0094-114X(01)00005-2 .
- ^ Капур, Аджай; Карнеги, Дейл; Мерфи, Джим; Лонг, Джейсон (2017). «Дополнительные громкоговорители: история электроакустической музыки без громкоговорителей» . Организованный звук . 22 (2). Издательство Кембриджского университета : 195–205. дои : 10.1017/S1355771817000103 . ISSN 1355-7718 .
- ^ Фаулер, Чарльз Б. (октябрь 1967 г.). «Музей музыки: история механических инструментов». Журнал музыкальных педагогов . 54 (2): 45–49. дои : 10.2307/3391092 . JSTOR 3391092 . S2CID 190524140 .
- ^ Ноэль Шарки (2007), Программируемый робот 13-го века , Университет Шеффилда
- ^ Дули, Джон Ф. (2013). Краткая история криптологии и криптографических алгоритмов . Springer Science & Business Media. стр. 12–3. ISBN 9783319016283 .
- ^ Фуэги, Дж.; Фрэнсис, Дж. (2003). «Лавлейс и Бэббидж и создание «заметок» 1843 года ». IEEE Анналы истории вычислений . 25 (4): 16. doi : 10.1109/MAHC.2003.1253887 .
- ^ Рохас, Р. (2021). «Компьютерные программы Чарльза Бэббиджа». IEEE Анналы истории вычислений . 43 (1): 6–18. дои : 10.1109/MAHC.2020.3045717 .
- ^ Рохас, Р. (2024). «Первая компьютерная программа» . Коммуникации АКМ . 67 (6): 78–81. дои : 10.1145/3624731 .
- ^ да Круз, Франк (10 марта 2020 г.). «История вычислений Колумбийского университета - Герман Холлерит» . Колумбийский университет . Колумбия.edu. Архивировано из оригинала 29 апреля 2020 года . Проверено 25 апреля 2010 г.
- ^ «Память и хранилище | Хронология истории компьютеров | Музей истории компьютеров» . www.computerhistory.org . Архивировано из оригинала 27 мая 2021 года . Проверено 3 июня 2021 г.
- ^ Риджуэй, Ричард (1952). «Составление регламентов». Материалы национального собрания ACM 1952 года (Торонто) на тему - ACM '52 . стр. 1–5. дои : 10.1145/800259.808980 . ISBN 9781450379250 . S2CID 14878552 .
- ^ Морис В. Уилкс . 1968. Компьютеры тогда и сейчас. Журнал Ассоциации вычислительной техники, 15 (1): 1–7, январь. п. 3 (комментарий в скобках добавлен редактором): «(Я не думаю, что термин «компилятор» тогда [1953] широко использовался, хотя на самом деле он был введен Грейс Хоппер.)»
- ^ [1] Первые в мире компиляторы COBOL. Архивировано 13 октября 2011 г. в Wayback Machine.
- ^ Jump up to: а б Бергштейн, Брайан (20 марта 2007 г.). «Умер создатель Фортрана Джон Бэкус» . Новости Эн-Би-Си . Архивировано из оригинала 29 апреля 2020 года . Проверено 25 апреля 2010 г.
- ^ «NIST разработает дорожную карту облачных технологий» . Информационная неделя . 5 ноября 2010 г.
Инициатива в области вычислительной техники направлена на устранение барьеров на пути внедрения облачных технологий в области безопасности, совместимости, портативности и надежности.
- ^ «На чем это основано». Компьютерный мир . 9 апреля 1984 г. с. 13.
Основано ли оно на... Надежности Портативности. Совместимость
- ^ «Программирование 101: Советы, как стать хорошим программистом — Wisdom Geek» . Мудрость Гик . 19 мая 2016 года. Архивировано из оригинала 23 мая 2016 года . Проверено 23 мая 2016 г.
- ^ Основы архитектуры программного обеспечения: инженерный подход . О'Рейли Медиа. 2020. ISBN 978-1492043454 .
- ^ Элсхофф, Джеймс Л.; Маркотти, Майкл (1982). «Улучшение читаемости компьютерных программ для облегчения модификации» . Коммуникации АКМ . 25 (8): 512–521. дои : 10.1145/358589.358596 . S2CID 30026641 .
- ^ Несколько (вики). «Читаемость» . Докфорж . Архивировано из оригинала 29 апреля 2020 года . Проверено 30 января 2010 г.
- ^ Энтикнап, Николас (11 сентября 2007 г.). «Еженедельный обзор зарплат в сфере SSL/Computer в сфере ИТ: финансовый бум стимулирует рост рабочих мест в сфере ИТ» . Архивировано из оригинала 26 октября 2011 года . Проверено 24 июня 2009 г.
- ^ Митчелл, Роберт (21 мая 2012 г.). «Утечка мозгов из Кобола» . Компьютерный мир. Архивировано из оригинала 12 февраля 2019 года . Проверено 9 мая 2015 г.
- ^ «Фотография любезно предоставлена Центром надводных боевых действий ВМС, Дальгрен, Вирджиния, из журнала National Geographic, сентябрь 1947 года» . 15 июля 2020 года. Архивировано из оригинала 13 ноября 2020 года . Проверено 10 ноября 2020 г.
- ^ Прат, Шантель С.; Мадхьястха, Тара М.; Моттарелла, Малайка Дж.; Куо, Чу-Сюань (2 марта 2020 г.). «Связь способностей к естественному языку с индивидуальными различиями в изучении языков программирования» . Научные отчеты . 10 (1): 3817. Бибкод : 2020НатСР..10.3817П . дои : 10.1038/s41598-020-60661-8 . ISSN 2045-2322 . ПМК 7051953 . ПМИД 32123206 .
- ^ «Для мозга чтение компьютерного кода — это не то же самое, что чтение языка» . Новости Массачусетского технологического института | Массачусетский технологический институт . 15 декабря 2020 г. Проверено 29 июля 2023 г.
Источники
[ редактировать ]- Серуцци, Пол Э. (1998). История вычислений . Кембридж, Массачусетс: MIT Press. ISBN 9780262032551 – через EBSCOhost.
- Эванс, Клэр Л. (2018). Широкий диапазон: нерассказанная история женщин, создавших Интернет . Нью-Йорк: Портфолио/Пингвин. ISBN 9780735211759 .
- Гюрер, Дениз (1995). «Женщины-новаторы в области компьютерных наук» (PDF) . Коммуникации АКМ . 38 (1): 45–54. дои : 10.1145/204865.204875 . S2CID 6626310 . Архивировано (PDF) из оригинала 9 октября 2022 г.
- Смит, Эрика Э. (2013). «Признание коллективного наследия через историю женщин в области вычислений» . CLCWeb: Сравнительная литература и культура: WWWeb-журнал . 15 (1): 1–9 – через EBSCOhost.
Дальнейшее чтение
[ редактировать ]- А.К. Хартманн, Практическое руководство по компьютерному моделированию , Сингапур: World Scientific (2009).
- А. Хант, Д. Томас и У. Каннингем, Программист-прагматик. От подмастерья к мастеру , Амстердам: Аддисон-Уэсли Лонгман (1999)
- Брайан В. Керниган, Практика программирования , Pearson (1999).
- Вайнберг, Джеральд М. , Психология компьютерного программирования , Нью-Йорк: Ван Ностранд Рейнхольд (1971).
- Эдсгер В. Дейкстра , Дисциплина программирования , Прентис-Холл (1976)
- О.-Ж. Даль, Э.Дейкстра , К.АР. Хоар, Структурное программирование , Academic Press (1972)
- Дэвид Грис , «Наука программирования» , Springer-Verlag (1981)
Внешние ссылки
[ редактировать ]- СМИ, связанные с компьютерным программированием, на Викискладе?
- Цитаты, связанные с программированием , на Wikiquote
- Разработка программного обеспечения в Curlie