Выразительный JavaScript - страница 2

стр.

Для некоторых из нас программирование – это увлекательная игра. Программа – это мысленная конструкция. Ничего не стоит её построить, она ничего не весит, и она легко вырастает под нашими пальцами.

Если не быть осторожным, размер и сложность выходят из-под контроля, запутывая даже того, кто её пишет. Это основная проблема программирования: сохранять контроль над программами. Когда программа работает – это прекрасно. Искусство программирования – это умение контролировать сложность. Большая программа находится под контролем, и выполнена просто в своей сложности.

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

Что за враждебность по отношению к богатству программирования – попытки принизить его до чего-то прямолинейного и предсказуемого, наложить табу на всякие странные и прекрасные программы! Ландшафт техник программирования огромен, увлекателен своим разнообразием, и до сих пор изучен мало. Это опасное путешествие, заманивающее и запутывающее неопытного программиста, но это всего лишь означает, что вы должны следовать этим путём осторожно и думать головой. По мере обучения вам всегда будут встречаться новые задачи и новые неизведанные территории. Программисты, не изучающие новое, стагнируют, забывают свою радость, их работа наскучивает им.

Почему язык имеет значение

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

>00110001 00000000 00000000

>00110001 00000001 00000001

>00110011 00000001 00000010

>01010001 00001011 00000010

>00100010 00000010 00001000

>01000011 00000001 00000000

>01000001 00000001 00000001

>00010000 00000010 00000000

>01100010 00000000 00000000

Это программа, складывающая числа от 1 до 10, и выводящая результат (1 + 2 + … + 10 = 55). Она может выполняться на очень простой гипотетической машине. Для программирования первых компьютеров было необходимо устанавливать большие массивы переключателей в нужные позиции, или пробивать дырки в перфокартах и скармливать их компьютеру. Можете представить, какая это была утомительная, подверженная ошибкам процедура. Написание даже простых программ требовало большого ума и дисциплины. Сложные программы были практически немыслимы.

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

Каждая строка указанной программы содержит одну инструкцию. На обычном языке их можно описать так:

>1. записать 0 в ячейку памяти 0

>2. записать 1 в ячейку памяти 1

>3. записать значение ячейки 1 в ячейку 2

>4. вычесть 11 из значения ячейки 2

>5. если у ячейки 2 значение 0, тогда продолжить с пункта 9.

>6. добавить значение ячейки 1 к ячейке 0

>7. добавить 1 к ячейке 1

>8. продолжить с пункта 3.

>9. вывести значение ячейки 0

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

>  установить ‘total’ в 0

>  установить ‘count’ в 1

>[loop]

>  установить ‘compare’ в ‘count’

>  вычесть 11 из ‘compare’

>  если ‘compare’ равно нулю, перейти на [end]

>  добавить ‘count’ к ‘total’

>  добавить 1 к ‘count’

>  перейти на [loop]

>[end]

>  вывести ‘total’

Вот теперь уже не так сложно понять, как работает программа. Справитесь? Первые две строки назначают двум областям памяти начальные значения. >total будет использоваться для подсчёта результата вычисления, а >count будет следить за числом, с которым мы работаем в данный момент. Строчки, использующие >‘compare’, наверно, самые странные. Программе нужно понять, не равно ли >count 11, чтобы прекратить подсчёт. Так как наша воображаемая машина довольно примитивна, она может только выполнить проверку на равенство переменной нулю, и принять решение о том, надо ли перепрыгнуть на другую строку. Поэтому она использует область памяти под названием