Искусственный интеллект
Шрифт:
Допустим, я хочу написать программу, которая бы выводила «Hello, world!» на экран десять раз. В этом случае я могу 10 раз написать команду:
Ой, нет. Я уже устала, забудем об этом. Нажимать Ctrl + P на клавиатуре еще восемь раз – слишком много нажатий кнопок. (Чтобы думать, как программист, нужно научиться быть ленивым.) Большинство программистов уверены, что печатать на клавиатуре скучно и утомительно, поэтому они стараются делать это как можно реже. Вместо перепечатывания, копирования и вставки единственной строки кода я введу оператор цикла, чтобы компьютер повторил команду 10 раз.
Что
Я задала значение х, равное 1, и добавила оператора цикла WHILE, который и будет повторять программу до тех пор, пока она не достигнет значения х > 10. В первом цикле х = 1. Программы выводит текст, затем следует разрыв строки или знак конца строки, обозначенный \n (обратный слеш n). Обратный слеш – важный знак в языке Python. Интерпретатор языка «знает», что, как только в коде появляется этот знак, после него должно произойти что-то особенное. В нашем случае я прошу компьютер начать с новой строки. Это было бы мукой – начинать каждый раз с нуля и программировать каждый тупой кусок металла для выполнения одних и тех же базовых функций, таких как чтение текста и преобразование его в двоичную форму или выполнение определенных задач в соответствии с соглашениями синтаксиса выбранного нами языка программирования. Мы ничего и никогда не закончили бы такими темпами! Более того, в каждом компьютере присутствуют как изначально встроенные функции, так и возможность добавлять новые. Я использую слово «знает», потому что оно удобное, но, пожалуйста, не забывайте, что компьютеры не «знают» подобно тому, как «знают» сознательные существа. Внутри компьютера нет никакого сознания, есть только задачи, выполняемые бесшумно, быстро и хорошо.
В следующей строке кода, х+=1, я увеличиваю значение х на единицу. Подобное синтаксическое решение мне кажется весьма изящным. В программировании приходится писать х=х+1 при каждом увеличении значения переменной на единицу для выполнения следующего шага цикла. Разработчики Python решили, что писать так каждый раз слишком утомительно, и придумали более короткий путь. Поэтому x+=1 аналогично x=x+1. Это решение было позаимствовано из языка C, где значение переменной может быть увеличено на единицу еще и при помощи конструкций х++ или ++х. Подобные быстрые команды существуют почти в каждом языке программирования, поскольку разработчикам действительно постоянно приходится сталкиваться с увеличением значения переменной на единицу.
Итак, после первого прибавления мы получаем х=2, и компьютер добирается до последних строчек кода. Отступы строки под командой while как раз обозначают элемент цикла. И каждый раз достигая конца цикла в коде, компьютер возвращается к его началу – строке while – и вновь сверяется с условием: х<=10? Да. Следовательно, компьютер снова и снова повторяет инструкции, выводя «Hello, world! \ n», что отображается на экране как:
Hello, world!
Затем он снова увеличивает на единицу значение х. Теперь x=3. Компьютер возвращается в начало цикла снова и снова до тех пор, пока значение не достигнет х=11. При значении х=11 срабатывает условие остановки, и цикл заканчивается. На это можно посмотреть иначе:
Каждая функция (или подпрограмма) – это маленькое действие. И, собирая множество таких функций воедино, можно свершать великие дела. Программисты прекрасно научились разбивать крупные задачи на маленькие и программировать компьютер на выполнение каждой из них. Затем вы собираете все части воедино, немного колдуете над ними, чтобы они заработали вместе, и вскоре видите работающую компьютерную программу. Современные программы – модульные. Это значит, что при работе над программой один программист может отвечать за первый модуль, другой – за второй и оба модуля впоследствии смогут работать вместе, если их правильно соединить.
Сейчас, когда мы написали программу, стоит поговорить о данных. Данные могут быть как на входе, так и на выходе программы. Мы производим данные (то есть информационные точки или единицы информации) о мире различными способами. Национальная служба погоды собирает данные о высоких и низких температурах в тысячах мест Америки каждый день. Шагомер считает количество шагов, пройденных вами за день, собирая результаты по пройденным шагам за день, за неделю или за год. Мой знакомый воспитатель детского сада просит детей по понедельникам считать общее количество карманов у присутствующих в классе. Данные могут рассказать, сколько людей купили определенную шляпу, сколько белых носорогов осталось в дикой природе, какова скорость таяния полярных льдов. Данные увлекают, они помогают осознать мир и выявляют нечто, что пока находится за пределами нашего понимания. (Хотя, если вы достаточно взрослые, чтобы читать эту книгу, надеюсь, вы уже поняли идею о карманах других людей.)
И, хотя информация собирается множеством разных способов, есть одна общая особенность: все данные производятся людьми. Это касается абсолютно всех данных. В конце концов собранная информация попадает к людям, подсчитывающим результаты. И если не задумываться над этим, то может показаться, что данные, полностью отфильтрованные и качественные, попадают в мир из, скажем, головы Зевса. Мы предполагаем, что есть данные и они правдивы. Поэтому первый принцип этой книги звучит так: данные – это социальный конструкт. И, пожалуйста, забудьте о том, что данные создаются кем-то, кроме людей.
«А как насчет компьютерных данных?» – может поинтересоваться смышленый детсадовский сборщик данных о карманах. Данные, произведенные компьютерами, в конечном счете также социально сконструированы, поскольку компьютеры созданы людьми. Математика – это система знаков, полностью разработанная людьми. А компьютеры – это машины, выполняющие вычисления: они производят миллионы математических операций. Компьютеры не созданы на основе каких-либо абсолютных вселенских или природных принципов, это – машины, являющиеся продуктом миллионов небольших намеренных проектных решений, принятых людьми, работающими в определенных организационных контекстах. Наши представления о данных и компьютерах, которые данные создают и обрабатывают, должны основываться на понимании социального и технического контекста, позволяющего людям производить компьютеры, производящие данные.
Один из способов понять то, что выходит из компьютеров, – понять, что в них входит. Компьютеру соответствуют определенные физические реалии. Большая часть компьютеров имеет прочный корпус, внутри которого расположены электронные платы и прочие штуковины. Позвольте конкретизировать, что именно имеется в виду под штуковинами. Важными частями являются источники питания, соединение с монитором, транзисторы, постоянная и перезаписываемая память. Все эти вещи относятся к категории аппаратного обеспечения, компьютерного железа. Оно, железо – физическая составляющая компьютера. А программное обеспечение – все, что работает, используя железо в качестве базы.
Впервые я узнала о физической составляющей компьютеров в 1990-х гг., когда училась в средней школе. Я занималась по особой технической программе для детей, спонсируемой Lockheed Martin. В моем городке в штате Нью-Джерси появился производственный объект этой корпорации. Форма здания напоминала военный корабль, на многие километры окруженный бесхозными фермами. В то время ходил слух, будто там делали ядерное оружие, а янтарные поля зерновых служили прикрытием для боеголовок, готовых в любой момент активироваться в случае атаки со стороны Советского Союза. Это было как раз перед окончанием холодной войны, тогда все смотрели фильм «На следующий день» (The Day After) – о последствиях ядерного апокалипсиса, так что мы нередко обсуждали, где расположены боеголовки, где упадут ракеты Советов и что случится потом. Несколько раз в месяц я ездила на школьном автобусе в Lockheed Martin, где вместе с другими детьми из местных школ изучала технику.