Несмотря на свою относительную надежность и высокую скорость вычислений, компьютер хуже человека, по крайней мере, в одном – он неспособен самостоятельно решить какую-либо проблему. Человек, сталкиваясь с проблемой, может придумать, как ее решить, но компьютер «думать» не может. Более того, он способен выполнять только команды, расписанные достаточно подробно: ему нужно все разжевывать и четко указывать шаги, необходимые для решения задачи.
Последовательность шагов (действий), в результате выполнения которых решается определенная задача, называется алгоритмом. Как правило, алгоритм имеет одну точку входа и одну точку выхода. На входе в алгоритм могут поступать входные данные, а на выходе он производит выходные данные. Понятие алгоритма связано не только с программированием: мы неявно сталкивается с алгоритмами каждый день. Например, для приготовления чая можно использовать следующий алгоритм:
Вскипятить воду.
Заварить чай.
Налить чай в чашку.
Алгоритмы могут различаться по степени подробности. В частности, шаг 1 «Вскипятить воду» можно рассмотреть как отдельную задачу и составить алгоритм ее решения:
1. Налить воду в чайник.
2. Включить чайник.
3. Дождаться, пока чайник закипит.
Детализацию можно продолжить, например, развернув шаг «Налить воду в чайник»:
1. Взять сосуд, на котором написано «Braun».
2. Поднести сосуд к раковине.
3. Повернуть ручку с синим кружочком.
4. Поднести сосуд к струе воды.
5. Дождаться, пока шарик поднимется до уровня «MAX».
Обратите внимание, что с каждым новым этапом детализации мы все дальше уходим от исходной цели, т.е. приготовления чая. Некоторые уже, наверное, даже забыли, что мы готовим: чай или кофе.
Этот пример должен вас подтолкнуть к отличию уровня команд. Есть команды высокого, среднего и низкого уровня. Например, команда «Построить дом» – это команда высокого уровня. Команды «Заложить фундамент», «Возвести этажи с 1 по 16» и «Соорудить крышу» – это команды среднего уровня. Наконец, команды «Выкопать яму», «Забить сваи», «Положить кирпич», «Вставить стекло» – это команды низкого уровня.
Конечно, деление команд на уровни относительно и зависит от исходной задачи. Например, если исходная задача «Улучшить жилищные условия молодых ученых», то задача «Построить дом» может оказаться командой среднего или низкого уровня. Уровень команд определяется тем, кому они адресованы: они должны быть такого уровня, чтобы тот, кому они адресованы, понял их. По этому принципу делятся и языки. Существуют высокоуровневые языки (C#, Java, C++, Object Pascal), языки среднего (Си, Fortran, Pascal) и низкого уровня (Ассемблер). Как правило, высокоуровневые языки понимают конструкции языков среднего уровня, а языки среднего уровня допускают низкоуровневые вставки. Наверное, вы замечали, что умный человек часто все понимает с полуслова, а менее сообразительному индивиду приходится все разжевывать и объяснять очень подробно. Однако, если вы объясните подробно умному человеку, он все равно поймет.
При разработке крупных приложений, как правило, используются высокоуровневые языки, поскольку они позволяют сократить размер кода. Низкоуровневые языки и языки среднего уровня используются тогда, когда необходимо улучшить производительность программы или отдельных ее элементов. Например, сетевые и веб-приложения обычно пишутся на языках Java, C#, С++, в то время для разработки компиляторов, а также вычислительных программ используются языки Ассемблер, Си и Fortran. Тем не менее, стоит заметить, что по-настоящему оценить преимущества разных языков можно только, имея определенный опыт разработки.