Примечание G [a] — это компьютерный алгоритм , написанный Адой Лавлейс , который был разработан для вычисления чисел Бернулли с использованием гипотетической аналитической машины . Примечание. G, как правило, считается первым алгоритмом, специально предназначенным для компьютера, [1] [2] [3] [4] и в результате Лавлейс считается первым программистом . [5] [6] [7] [8] Алгоритм был последней заметкой в серии, обозначенной от A до G, которую она использовала в качестве наглядных пособий для сопровождения своего английского перевода французской транскрипции Луиджи Менабреа 1842 года лекции Чарльза Бэббиджа по аналитическому анализу. двигатель в Туринском университете , «Notions sur la Machine Analytique de Charles Babbage» («Элементы аналитической машины Чарльза Бэббиджа»). [7] [9] Note G Лавлейса никогда не тестировался, так как двигатель так и не был построен. Ее заметки вместе с переводом были опубликованы в 1843 году. [6] [7]
В современную эпоху , благодаря более доступному компьютерному оборудованию и ресурсам программирования, алгоритм Лавлейса был протестирован после «перевода» на современные языки программирования. Эти тесты независимо пришли к выводу, что в сценарии произошла ошибка из-за незначительной опечатки, что сделало алгоритм в его исходном состоянии непригодным для использования. [10] [11]
В 1840 году Чарльза Бэббиджа пригласили провести в Турине семинар , посвященный его аналитической машине, [12] единственное публичное объяснение, которое он когда-либо давал по поводу этой машины. [13] Во время лекции Бэббиджа математик Луиджи Менабреа написал отчет о двигателе на французском языке. [12] Друг Бэббиджа, Чарльз Уитстон , предложил Лавлейсу перевести отчет Менабреа, чтобы внести свой вклад. [12] [14] Бэббидж предложил ей дополнить отчет приложениями, которые она составила в конце своего перевода в виде серии из семи «примечаний», помеченных как AG. Ее перевод был опубликован в августе 1843 года, [12] в «Научных мемуарах Тейлора» , [14] [15] , где имя Лавлейс было подписано «AAL». [12] [b] В этих заметках Лавлейс описал возможности аналитической машины Бэббиджа, если бы ее можно было использовать для вычислений, изложив более амбициозный план для машины, чем даже сам Бэббидж. [3] [15] [16]
Примечания Лавлейса к статье были в три раза длиннее самой статьи. [17] В первых заметках она выходит за рамки числовых амбиций, которые Бэббидж имел в отношении машины, и предполагает, что машина могла бы воспользоваться преимуществами вычислений, чтобы справиться с сферами музыки, графики, [18] и языка. [8] [19] [20]
Опять же, он мог бы воздействовать и на другие вещи, помимо числа, если бы были найдены объекты, взаимные фундаментальные отношения которых могли быть выражены отношениями абстрактной науки об операциях и которые также могли бы быть приспособлены к действию рабочих обозначений и механизма двигателя. . Предположим, например, что фундаментальные отношения тональных звуков в науке о гармонии и музыкальной композиции допускают такое выражение и адаптацию, и машина может создавать сложные и научные музыкальные произведения любой степени сложности и размера.
- Ада Лавлейс, Заметки к мемуарам «Очерк аналитической машины, изобретенной Чарльзом Бэббиджем», написанные переводчиком Адой Августой, графиней Лавлейс, Примечание А.
Она объясняет читателям , как аналитическая машина была отделена от более ранней разностной машины Бэббиджа [21] и сравнивает ее функцию с машиной Жаккарда [22] в том смысле, что она использовала двоичные перфокарты для обозначения машинного языка . В примечании C этот момент подкрепляется тем фактом, что машина может выполнять одновременные и повторяющиеся действия, гарантируя, что любая карта или набор карт может быть использована несколько раз для решения одной задачи, [20] по существу предвосхищая современные методы управления потоком и циклами. [17] [23] Эти идеи были доведены до апогея в последней заметке G, где Лавлейс стремился продемонстрировать пример вычислений .
Примечание G использовало только четыре арифметических операции : сложение, вычитание, умножение и деление, реализация видения Бэббиджа:
Ввиду невозможности здесь объяснить процесс, посредством которого достигается эта цель, мы должны ограничиться допущением, что первые четыре арифметических действия, то есть сложение, вычитание, умножение и деление, могут быть выполнены непосредственным образом посредством вмешательства машины. При этом машина способна выполнять любые виды числовых вычислений, поскольку все такие вычисления в конечном итоге сводятся к четырем операциям, которые мы только что назвали.
- Чарльз Бэббидж, «Очерк аналитической машины, изобретенной Чарльзом Бэббиджем»
Он также использует идею Бэббиджа о хранении информации в столбцах дисков, каждый из которых обозначается (для переменной ) и индексным номером, обозначающим, к какому столбцу относится ссылка.
Лавлейс использовала рекурсивное уравнение для расчета чисел Бернулли, [12] при этом она использовала предыдущие значения в уравнении для создания следующего. ее метод заключался в следующем: [24]
где - биномиальный коэффициент ,
Числа Бернулли можно рассчитать разными способами , но Лавлейс сознательно выбрала сложный метод, чтобы продемонстрировать мощность двигателя. В примечании G она заявляет: «Мы завершим эти примечания, детально проследив шаги, с помощью которых машина могла вычислить числа Бернулли, поскольку это (в той форме, в которой мы выведем их) довольно сложный пример полномочия». [20] Конкретный алгоритм, использованный Лавлейс в примечании G, генерирует восьмое число Бернулли (обозначенное как , поскольку она начала с .) [24]
В таблице алгоритма каждая команда упорядочена. Каждая команда обозначает одну операцию , выполняемую над двумя терминами. Во втором столбце указывается только используемый оператор. Переменные обозначаются как " ", [c] , где верхний индекс перед ним представляет количество различных значений, которым присвоена переменная, а нижний индекс после него представляет порядковый номер переменной, то есть, какая это переменная. (Например, относится ко второму присвоению переменной номера 4. Любые переменные, до сих пор не определенные, имеют верхний индекс 0.) Переменные нумеруются, начиная с . Третий столбец сообщает компьютеру, какая именно команда выполняется (например, в строке 1 выполняется команда « » - первая итерация переменной 2 умножается на первую итерацию переменной 3.) и включает только одну операцию. между двумя терминами в строке. В столбце 4 – «Переменные, получающие результаты» указывается, где должен храниться результат операции в столбце 3. Таким образом, у любых переменных в этом столбце их верхний индекс каждый раз увеличивается на единицу. (например, в строке 1 результат присваивается переменным , и .)
В столбце 5 указывается, была ли изменена какая-либо из переменных, используемых в работе команды. Заключенные в фигурные скобки две строки на команду помещают исходную переменную слева от знака равенства, а новую переменную - с другой стороны - то есть, если переменная была изменена, ее верхний индекс увеличивается на единицу, а если нет, оно остается прежним. (например, в третьей строке результат присваивается второй итерации переменной , а пятый столбец отражает это, отмечая;
изменилось, но нет.
В столбце 6 «Отчет о результатах» результат, присвоенный переменной в столбце 4, отображается в его точном значении, основанном на значениях двух ранее присвоенных терминов. (например, в строке 1 - - было установлено в начале как , а было установлено как переменная . Следовательно, в математической записи .) Этот столбец якобы не вычисляется движком и, по-видимому, больше предназначен для ясности и способность читателя следовать шагам программы. (Например, в строке 5 есть дробь, разделенная на два, которая обозначается как умноженная на половину, вероятно, для согласованности и типографской сложности вложенной дроби.) В ней также используется отдельная запись переменных вне программы. , переменные и , которые последовательно умножаются, чтобы найти окончательное значение, таким образом: [10]
Помимо этого, в каждом последующем столбце показаны значения данной переменной с течением времени. Каждый раз, когда переменная либо изменяется, либо ее значение становится значимым из-за ее присутствия в качестве одного из терминов в текущей команде, ее значение указывается или пересчитывается в соответствующем столбце. В противном случае оно помечается многоточием , чтобы обозначить его нерелевантность. Это, по-видимому, имитирует потребность компьютера в только соответствующей информации, тем самым отслеживая значение переменной при анализе программы . [10]
Программа стремилась вычислить то, что в современной традиции известно как восьмое число Бернулли, обозначаемое как , поскольку Лавлейс начинает отсчет с . [24]
В операции 4 предположительно происходит деление " ", которое будет сохранено в переменной . Однако в «Отчете о результатах» сказано, что разделение должно быть:
На самом деле разделение происходит наоборот; является второй итерацией , как видно из операции 2. Аналогично, это вторая итерация , как видно из операции 3. Таким образом, операция 4 должна быть не , а скорее . Эта ошибка означает, что если движок когда-либо запустит этот алгоритм в этом состоянии, он не сможет правильно сгенерировать числа Бернулли и обнаружит, что его конечное целевое значение ( восьмое число Бернулли ) равно .
Программа Лавлейс может быть реализована на современном языке программирования , однако из-за указанной выше ошибки при точной расшифровке она вернет неправильное конечное значение для . Исходная программа, обобщенная в псевдокоде , выглядит следующим образом:
В[1] = 1В[2] = 2V[3] = n (n = 4 в программе Лавлейса.)В[4] = В[4] - В[1]В[5] = В[5] + В[1]В[11] = В[5] / В[4]В[11] = В[11] / В[2]В[13] = В[13] - В[11]В[10] = В[3] - В[1]В[7] = В[2] + В[7]В[11] = В[6] / В[7]В[12] = В[21] * В[11]В[13] = В[12] + В[13]В[10] = В[10] - В[1]В[6] = В[6] - В[1]В[7]= В[1] + В[7]//Завершить позже
Реализация в псевдокоде подчеркивает тот факт, что компьютерные языки определяют переменные в стеке , что устраняет необходимость отслеживания и указания текущей итерации переменной. Кроме того, программа Лавлейс позволяла определять переменные только путем выполнения сложения , вычитания , умножения или деления двух членов, которые ранее были определенными переменными. Современный синтаксис позволит выполнять каждое вычисление более кратко. Это ограничение проявляется в нескольких местах, например, в команде 6 ( ). Здесь Лавлейс определяет до сих пор неопределенную переменную ( ), тем самым предполагая, что все неопределенные переменные автоматически равны 0, тогда как большинство современных языков программирования возвращают ошибку или перечисляют переменную как нулевую . Она намеревалась сказать " ", но ограничилась использованием только переменных в качестве терминов. Аналогично, в команде 8 ( ) строгая запись двухчленной арифметики становится громоздкой, так как для определения как 2 Лавлейс присваивает себе его значение (0) плюс (2). Именно из-за этих ограничительных обозначений оно определяется таким образом.