ЗАМЕЧАНИЕ
Метод решения задачи может быть записан разными способами.
Помимо того, что язык служит средством общения и передачи
информации, он является и механизмом мышления. Многие полиглоты
отмечали, что в зависимости от того, на каком языке они думают в данный
момент, они формулируют идеи по-разному, идут к выводам несколько
разными путями и даже получают различные умозаключения. Дуглас
Хофштадтер написал: «Я обнаружил, что, когда я «думаю по-французски»
мне в голову приходят совсем иные мысли, чем когда я «думаю по-
14
английски»! Мне захотелось понять, что же главнее, язык или мысли?» [2].
Карлу V Габсбургу, императору Священной Римской империи,
приписывают высказывание: «Если бы я хотел говорить с мужчинами, я
говорил бы по-французски, если бы я хотел говорить с женщинами, я
использовал бы итальянский, если бы я хотел говорить с моей лошадью, я
бы говорил на немецком, если бы я хотел говорить с Богом, я бы говорил
по-испански».
Физики, математики, химики, ботаники и даже астрологи для описания
своих задач и методов их решения используют специфичные языки,
удобные в каждом конкретном случае. Жан-Луи Лорьер отмечает [4], что
привычный всем со школы современный язык математики, кажущийся
столь логичным и естественным, рождался в муках на протяжении
тысячелетий. В современном виде он существует совсем недавно, причем в
некоторых разделах науки (скажем, в математической логике, где можно
для обозначения одного и того же действия встретить запись и →, и ⊃, и
⇒
) до сих пор не существует единой общепринятой системы обозначений!
Вычисления в Древнем Египте или Вавилоне были гораздо более
громоздкими и трудоемкими просто в силу используемых форм записи.
Для примера Лорьер приводит два математических выражения — в записи
Франсуа Виета (1540–1603):
−
− +
in
in
aequebit ur
H
B
F
D
A
F
D
и принятой сейчас:
−
=
+
.
ay
by
x
b
y
Контрольные вопросы и упражнения
1.
Что такое программирование?
2.
Что такое язык?
3.
В чем заключается разница между естественным и искусственным
языками?
4.
Какие языки, используются в искусстве, технике, других областях?
Приведите свой пример.
5.
Что такое знак (символ)?
6.
В чем заключается синтаксический аспект языка?
7.
В чем заключается семантический аспект языка?
15
8.
В чем заключается прагматический аспект языка?
9.
Каковы функции различных языков?
16
История развития языков
программирования
При формулировании понятия «программирование» мы упоминали о том,
что здесь подразумевается подготовка программ для ЭВМ, или
компьютера. Попробуем рассказать подробнее, что под этим понимается.
Компьютер — некая машина, способная выполнять различные действия в
соответствии с заложенной в нее программой. Именно программа
определяет возможность полезного применения ЭВМ, без нее она остается
практически ненужной грудой «железа» — проводов, микросхем,
пластмассы. Благодаря возможности менять исполняемые программы,
закладываемые в память машины без изменения ее электронной схемы,
мы получаем удивительное и не характерное для ранее созданных
человеком машин свойство — универсальность, то есть способность одной
и той же машины выполнять разные функции.
Программа представляет собой некую систематизированную совокупность
инструкций (команд), которые входят в перечень доступных (исполнимых)
для конкретной ЭВМ. Набор доступных команд (система команд)
современного компьютера обычно довольно примитивен и состоит из
элементарных действий, подобных сложению или пересылке данных,
производимых над содержимым ячеек памяти ЭВМ. Потрясающе, но
именно выполнение большого (действительно большого!) количества этих
элементарных действий в нужном порядке позволяет современным ЭВМ
вычислять траектории полета космических аппаратов к Юпитеру, весьма
правдоподобно имитировать сражение на Курской дуге, обыгрывать
чемпиона мира по шахматам, анализировать тайны мира элементарных
частиц и выполнять иные столь же сложные задачи.
Программист — человек, занятый программированием, иными словами —
маг и чародей, который способен заставить компьютер выполнять все
перечисленное (и еще то, что пока не заставили выполнить компьютер, но
замысел чего уже появился в голове читателя). Но, конечно, любой маг
должен знать нужные заклинания. В нашем случае заклинания — это
языки программирования, на которых составляются программы.
К какому моменту можно отнести появление первого программируемого
компьютера (подчеркнем это слово, поскольку машины для автоматизации
счета известны с глубокой древности — вспомним абак, но управление
процессом вычислений производилось вручную)? Первым программистом
в истории человечества часто называют леди Лавлейс, составившую для
так называемой аналитической машины Чарльза Бэббиджа несколько
предписаний, в том числе самое сложное, с вложенными циклами (причем
17
Ада Лавлейс, фактически, и ввела такое фундаментальное понятие
программирования, как цикл!), по расчету чисел Бернулли.
Справедливости ради отметим, что аналитическая машина существовала
лишь в проекте. Основывалась она не на электричестве, а на механических
узлах и должна была оснащаться паровым двигателем (да, именно это
было вершиной техники в 1830-е годы, когда создавался этот выдающийся
проект). Однако если бы машина была построена, она стала бы первым
программируемым компьютером. Для ввода программы в машину
предполагалось использовать карты с отверстиями (перфокарты), подобно
тому, как программируются узоры, создаваемые на ткацком станке.
Фактически, программа Ады Лавлейс (кстати, в честь этой хрупкой
женщины назван язык программирования, разработанный по заказу
министерства обороны США) представляет собой набор карт, а не некую
запись в виде текста.
Заметим, что к числу гениальных прозрений леди Лавлейс следует отнести
и то, что она предвидела возможность машины оперировать не только
числами, но и произвольными объектами, выраженными, например,
алгебраически в символьной форме (то есть то, что ныне называется
символическими вычислениями, или компьютерной алгеброй), и даже
звуками, представляемыми нотами.
Тем не менее машина Бэббиджа не была построена. В какой же стране и
когда появился действительно функционировавший компьютер? Был он
электронным или механическим? И какой язык программирования
применялся? Из одной книги по информатике в другую кочует
укоренившийся миф, гласящий, что страна — США, машина —
электронная, а год — 1946-й. Это не соответствует действительности. Еще
в 1938 году немецкий инженер Конрад Цузе построил Z1 — первую из
трех модификаций своей вычислительной машины. Элементной базой
служили списанные с телефонной станции реле — фактически, машина
была электромеханической. Программа должна была задаваться с
помощью ленты с отверстиями — перфоленты.
Однако Цузе, как и леди Лавлейс за век до него, увлекла идея создания
универсальной машины, способной решать задачи не только
вычислительные, но и из других областей. Он назвал этот свой проект
логической машиной. Жаль, что она, как и аналитическая машина
Бэббиджа, так и не была построена (правда, по чертежам и записям
Бэббиджа базовые части аналитической машины были реализованы
энтузиастами позже, уже в XX веке).
В 1945 году, по окончании Великой Отечественной войны, Цузе переехал
из Берлина в Баварские Альпы, где и занялся определением языка для
будущей логической машины. Язык, названный им Plankalkül (по-русски
18
произносится «планкалкюль», приблизительно означает «планирующее
исчисление»), фактически, представляет собой языком программирования
высокого уровня с такими современными чертами:
наличие повторно вызываемых функций;
встроенные типы данных;
массивы;
аналог условного оператора;
аналог оператора assert;
исключения;
цикл
ПОКА.
Аналога оператора безусловного перехода GOTO в языке не было — в
полном соответствии с разработанными спустя десятилетия строгими
принципами структурного программирования!
Весьма любопытной особенностью языка Plankalkül являлась двумерная
запись программы, что роднит его с некоторыми современными так
называемыми эзотерическими языками (BeFunge и пр.) и, вероятно, может
рассматриваться как признак его более высокого уровня (!), но весьма
усложняет построение транслятора. Однако, по крайней мере, для
подмножества (причем линеаризованного) оригинального языка —
Plankalkül 2000, энтузиастами компилятор (на машинный код современной
ЭВМ)
был
создан,
как
и
эмулятор
машины
(см.
http://www.zib.de/zuse/Inhalt/Programme/Plankalkuel/Plankalkuel-
Report/Plankalkuel-Report.htm
).
Далее приводится пример программы на этом языке (сортировка):
P6 sort (V0[:6.8.0]) => R0[:6.8.0]
W1[0](4)[
V0[i0:8.0] => Z0[i0:8.0]
1 => Z4[:32.0]
W1[1](i0)
[
(V0[i0:8.0] < Z0[i1:8.0]) & (Z4[:32.0]=1) →
[
i0-i1 => Z1[:32.0]
W1[2](Z1[:32.0])
[
i0 — i2 — 1 => Z3[:32.0]
i0 — i2 => Z2[:32.0]
19
Z0[Z3[:32.0]:8.0] => Z0[Z2[:32.0]:8.0]
]
V0[i0:8.0] => Z0[i1:8.0]
0 => Z4[:32.0]
]
]
]
END
Цузе и сам предполагал создать автоматический преобразователь (аналог
современных трансляторов с языков высокого уровня в машинный код)
программы на Plankalkül в исполнимую на его предполагаемой машине
перфоленту, но это не было им воплощено в реальность. Однако Цузе
составил 49 страниц программ на Plankalkül для оценки шахматных
позиций.
На заре вычислительной техники программы вводились в память ЭВМ с
пульта, перемычками или тумблерами. Программа писалась в машинных
кодах — а память ЭВМ и тогда, и сейчас может хранить лишь двоичные
представления. Пример программы в машинном коде (это настоящий код
архитектуры PDP-11/СМ ЭВМ, предполагающий прибавление 64 к
содержимому первого регистра процессора):
0110010111000001
0000000000000100
0000000000000000
К сожалению, машинный язык весьма неудобен для человека,
которомуприходилось запоминать, какие команды кодируются какими
последовательностями нулей и единиц, в ячейках с какими номерами
хранятся промежуточные результаты вычислений и пр. Неудивительно,
что программирование было занятием непростым, доступным немногим, в
программы по невнимательности вносилось большое количестве ошибок.
Достарыңызбен бөлісу: |