Программи́рование — в обычном понимании, это процесс создания компьютерных программ.
Программирование позволяет настроить компьютер или иное программируемое логическое устройство на те или иные действия. Обычно программа вводится в компьютер программистами, и первые программы создавались математиками и логиками, конструировавшими компьютеры. Когда еще не было средств вывода на экран, программа выдавала результат просто в печатном виде на принтере. Ввод в компьютер также производился несколько иначе. В любом случае, со временем стало понятно, что программировать компьютер каждый раз «с нуля» после каждой его перезагрузки — неразумно. Поэтому начали появляться средства запоминания программ и данных. Но первые компьютеры были все-таки не цифровыми, а аналоговыми. Проще говоря, они были сначала механическими, потом электромеханическими и, уже потом, электронными. (Первые электронные компьютеры и прочие вычислители работали на электронных лампах.) Конечно это не совсем компьютер в современном понимании. Программированием также называют настройку электронных устройств и программно-аппаратных комплексов. Например: программирование цифровых АТС, программирование бытовых приборов конечным пользователем, запись информации в ПЗУ. Разработку логической схемы для ПЛИС тоже называют программированием. В общем понимании, программирование — это процесс описания функционирования устройства, который может быть выражен либо в структуре самого устройства, либо в виде набора команд, выполняемых устройством. Программирование сочетает в себе элементы науки (логики, математики, информатики, кибернетики), инженерной дисциплины и искусства (авторской творческой деятельности).
В узком смысле (так называемое кодирование) под программированием понимается написание инструкций — программ — на конкретном языке программирования (часто по уже имеющемуся алгоритму — плану, методу решения поставленной задачи). Соответственно, люди, которые этим занимаются, называются программистами (на профессиональном жаргоне — кодерами), а те, кто разрабатывает алгоритмы — алгоритмистами, специалистами предметной области, математиками.
В более широком смысле под программированием понимают весь спектр деятельности, связанный с созданием и поддержанием в рабочем состоянии программ — программного обеспечения ЭВМ. Более точен современный термин — «программная инженерия» (также иначе «инженерия ПО»). Сюда входят анализ и постановка задачи, проектирование программы, построение алгоритмов, разработка структур данных, написание текстов программ, отладка и тестирование программы (испытания программы), документирование, настройка (конфигурирование), доработка и сопровождение.
Программирование для ЭВМ основывается на использовании языков программирования, на которых записывается программа. В настоящее время для того, чтобы программа могла быть понята и исполнена ЭВМ, требуется специальный инструмент — транслятор. (Можно, конечно, обойтись и без транслятора. Но тогда программу придется кодировать непосредственно на языке машинных команд, а это весьма трудоемкое занятие.) Существуют два вида трансляторов — компиляторы и интерпретаторы. (Составная часть компилятора, выполняющая собственно трансляцию программы на языке программирования (например на С++ или языке ассемблера), также называется транслятором.) В настоящее время активно используются так называемые интегрированные среды разработки программ, включающие в свой состав также редактор для ввода и редактирования текстов программ, отладчики для поиска и устранения ошибок в программах, трансляторы с различных языков программирования, компоновщики для сборки программы из нескольких модулей, и другие служебные [[подпрограмма|подпрограммы]. Текстовый редактор среды программирования может иметь специфичную функциональность, такую как индексация имен, отображение документации, средства визуального создания пользовательского интерфейса. С помощью текстового редактора программист производит набор и редактиктирования текста содаваемой программы, который называют исходным кодом («исходник» — на профессиональном жаргоне). Язык программирования определяет синтаксис и изначальную семантику исходного кода, семантика языка программирования может расширяться текстом программы, дополнительными библиотеками и программно-аппаратным окружением, в котором выполняется программа. Компилятор преобразует текст программы в машинный код, непосредственно исполняемый электронными компонентами компьютера. Интерпретатор либо явно не преобразует текст программы в машинный код, либо неявно делает такое преобразование в процессе выполнения программы.
Программирование в широком смысле можно разбить на несколько стадий:
- Анализ,
- Проектирование — разработка комплекса алгоритмов,
- Кодирование и компиляцию — написание исходного текста программы и преобразование его в исполнимый код с помощью компилятора,
- Тестирование и отладку — выявление и устранение ошибок в программах,
- Испытания и сдачу программ,
- Сопровождение.
Антикитерский механизм из Древней Греции был калькулятором использовавшим шестерни различных размеров и конфигурации обусловливавших его работу, по отслеживанию метонова цикла, до сих пор использующегося в Лунно-солнечный календарях. Аль-Джазари построил программируемый автомат-гуманоид в 1206 году. Одна система, задействованная в этих устройствах, использовала зажимы и кулачки помещённые в деревянный ящик в определённых местах, которые последовательно задействовали рычаги, которые, в свою очередь управляли ударными инструментами.
Языки программирования
Большая часть работы программистов связана с написанием исходного кода, тестированием и отладкой программ на одном из языков программирования. Исходные тексты и исполняемые файлы программ являются объектами авторского права и являются интеллектуальной собственностью их авторов и правообладателей.
Различные языки программирования поддерживают различные стили программирования (т. е. парадигмы программирования). Отчасти искусство программирования состоит в том, чтобы выбрать язык программирования, наиболее полно подходящий для решения поставленной задачи. Разные языки требуют от программиста различного уровня внимания к деталям при реализации алгоритма, результатом чего часто бывает компромисс между простотой и производительностью (или между временем программиста и временем пользователя).
Единственный язык, напрямую выполняемый ЭВМ — это машинный язык (также называемый машинным кодом и языком машинных команд). Изначально все программы писались в машинном коде, но сейчас этого практически уже не делается. Вместо этого программисты пишут текст исходный код на том или ином языке программирования, затем используя компилятор или интерпретатор транслируют его, в один или несколько этапов в машинный код, готовый к исполнению на целевом процессоре, или в промежуточное представление, которое может быть исполнено специальным интерпретатором — виртуальной машиной. Но это справедливо только для языков высокого уровня. Если требуется полный низкоуровневый контроль над системой на уровне машинных команд и отдельных ячеек памяти, программы пишут на языке ассемблера, мнемонические инструкции которого преобразуются один к одному в соответствующие инструкции машинного языка целевого процессора ЭВМ. (По этой причине трансляторы с языков ассемблера — ассемблера — получаеются алгоритмически простейшими трансляторами.)
В некоторых языках вместо машинного кода генерируется интерпретируемый двоичный код «виртуальной машины», также называемый байт-кодом (byte-code). Такой подход применяется в Forth, некоторых реализациях Lisp, Java, Perl, Python, языках для .NET Framework.
Программные средства
Программные средства, используемые при разработке программ, делятся на системные и инструментальные, лицензионные и безлицензионные, свободно распространяемые и проприетарные. На практики безлицензионные средства разработки в настоящее время редкость. Все без исключения проприетарные средства разработки лицензионные, и распространяются по ограниченным лицензия, часто небесплатным. Практически все современные свободно распространяемые средства разработки лицензионные и распространяются по различныем публичным (также генеральным, свободным) лицензиям разрешающим свободное распространение как самих этих средств так и их исходных кодов (в том числе их доработку). (Свободно распространяемые лицензионные программы чаще всего распространяются по лицензиям: GPL, FSF или EULA.)
В системном обеспечении основными являются операционные системы, инструментальные средства и технологии Windows, Mac OS X и Linux и прочих операционных систем.
Свободно распространяемые инструментальные средства (в том числе лицензионные совободно разпространяемые) можно устанавливать и использовать на любых компьютерах с любой операционной системой (часто это Windows, Mac OS X, Linux, UNIX). На олимпиадах по информатике и программированию с успехом используются только свободно распространяемые лицензионные инструментальные средства (в большинстве своем распространяеются по лицензии GNU), работающие в среде Windows, Mac OS X и Linux и позволяющие разрабатывать программное обеспечение без ошибок. Из языков программирования на олимпиадах по программированию последние годы часто использовуются языки программирования Паскаль, C/C++ и Java.
Для ведения документации при разработках программ вполне могут использоваться как свободно распространяемые (как распространяются по лицензии GPL) так и проприетарные офисные пакеты программ (например OpenOffice.org и Microsoft Office соотвественно). Файлы документации, создаваемые в современных проприетарных и свободно распространяемых офисных программах, информационно совместимы.