logo
Gilyarevsky_R_S_Osnovy_informatiki

Работа с текстом на компьютере о языках программирования

Когда мы по-русски говорим "компьютер", то представляем себе некоторое устройство, которое нужно запрограммировать, чтобы оно заработало. Американцы, которые, естественно, ду­мают на своем английском, представляют себе компьютер сразу состоящим из двух частей – "твердой" ("хардуэр") и "мягкой" ("софтуэр"), что на русский язык казенно переводится как ап­паратные и программные средства вычислительной машины. Это различие в понимании отражает и некоторую реальную ситуацию: у нас первая составляющая компьютера стоит во много раз дороже второй. У них наоборот. Умственный труд они ценят много дороже промышленного, что обычно для развитых стран.

В наши дни особое внимание уделяют составлению текстовых описаний к новым программам, поскольку освоение этих программ требует большого труда и занимает много времени. Возникла на­сущная проблема составления таких описаний к программам, кото­рые были бы понятны обычному или даже начинающему пользователю. Она достигла столь большой остроты, что появилась специальная профессия "технических писателей", так как программисты не мо­гут понять, что именно затрудняет пользователей при освоении их программ.

Не будучи специалистом, трудно говорить о вычислительных машинах, но еще труднее об их программировании. Дело в том, что сама сущность программирования, кажущаяся такой простой на элементарном уровне машинных кодов, оказывается крайне сложной для формулирования. Может быть, поэтому авторы, попу­ляризирующие искусство (или науку, как полагают некоторые) программирования, так любят прибегать к аналогиям, которыми сами почти всегда остаются недовольны.

Сравнение компьютера с автомобилем, а программирования – с управлением механистично и мало что объясняет, компьютера с телевизором, а программы – с передачей, которую он принимает, тоже отражает лишь внешнюю сторону дела. Пожа­луй, ближе всего к существу отношений компьютера с его прог­раммой сравнение их с музыкальным инструментом и нотами. Дей­ствительно, комбинацией нескольких нотных знаков можно записать любое музыкальное произведение, а пределов для творчест­ва композиторов и исполнителей не существует. Так и програм­ма, написанная на одном из специальных языков, в котором ис­пользуется ограниченный набор символов, служит для решения многих творческих задач, от простых вычислений до игры в шах­маты. Но и здесь сходство сводится к идеальности и многооб­разию содержания информации и материальности и ограниченно­сти средств ее фиксации и воспроизведения.

Любая, самая сложная программа формальна и определяется алгоритмом решения задачи. Вместе с тем, возможность или границы формализации человеческого мышления, которое стремятся моделировать при помощи компьютера, пока еще не поддаются определению. В преодолении этого противоречия, в нахождении пу­тей его разрешения скрыт важный фактор дальнейшего развития данной проблемной области. По всей вероятности, задача такого уровня должна решаться не одними программистами и информати­ками, но всем научным сообществом. Это один из серьезных сти­мулов достижения всеобщей компьютерной грамотности. А. Кэй, из статьи которого взяты некоторые сведения о языках программиро­вания, писал об этом в следующих выражениях:

"Грамотность применительно к компьютерам – это проникнове­ние в суть процессов программирования, причем достаточно глубокое, чтобы было легко и приятно производить вычисления и ре­шать различные задачи на ЭВМ, подобно тому, как истинно грамот­ный человек может свободно читать и писать. Как и в любом ис­кусстве, здесь необходимо хорошо знать и любить материал. Ес­ли мы полагаем важным овладеть литературой и искусством для развития человека и общества, то имеем ли мы право меньше уси­лий тратить на то, чтобы сделать вычислительные средства и методы частью нашей жизни"1.

История современных языков программирования насчитывает всего лишь пять десятилетий, если считать от момента создания языка Планкалкюль немецким инженером К. Цузе в 1946 г. С тех пор появились сотни языков программирования, а с вариан­тами, возможно, тысячи. Конечно, не все они употребляются на практике, и если бы их развитие шло другим путем, их могло бы быть и меньше. Но их многообразие оправдано, так как нель­зя создать язык, пригодный для всех случаев. Язык должен быть пригоден для решения данной задачи на данном компьютере и удо­бен для программиста.

При всех различиях языков программирования все они, в ко­нечном счете, сводятся к высоким и низким уровням электриче­ского напряжения, соответствующим единицам и нулям двоичного кода. Комбинации единиц и нулей могут интерпретироваться ком­пьютером как адрес в его памяти, фрагмент обрабатываемых дан­ных или команда выполнить определенное действие. Язык самой машины – машинный код – очевиден и однозначен для каждого ви­да компьютеров. Но эта последовательность нулей и единиц противоестественна для памяти человека, хотя несколько поколений программистов работали толь­ко в машинных кодах. Программа мо­жет состоять из миллионов комбинаций единиц и нулей, и ошиб­ка лишь в одном знаке приведет к неправильной работе всей программы.

Это повело к созданию языков ассемблера, в кото­рых двоичные последовательности были заменены символами и сло­вами. Первым таким языком был ассемблер компьютера "Эдсак", созданный в 1949 г. английским математиком М. Уилксом. Разуме­ется, ассемблеры проще и мнемоничнее машинных кодов, в них можно создавать инструкции для определенных действий. Однако каждая команда должна определяться отдельно и за ее прохожде­нием в машине нужно следить, Кроме того, ассемблер жестко связан с типом компьютера, для которого он создан.

Ограниченность ассемблеров была преодолена в языках более высокого уровня. Первым распространенным языком высокого уро­вня явился Фортран, разработанный в 1954–1957 гг. Дж. Бекусом в фирме IBM и до сих пор применяемый для научных рас­четов. Поскольку его применение занимало много времени "тихо­ходных" в то время машин, для него был создан компилятор, пе­реводивший его программы в машинный код. Это положило начало особым видам программ – т р а н с л я т о р а м, которые для каждого типа компьютеров переводят программы, написанные на языке высокого уровня, в их машинный код.

Они бывают двух видов – компиляторы и интерпретаторы. При использовании к о м п и л я т о р а весь цикл трансляции завершается до начала выполнения программы, так что прохожде­ние этой программы требует меньше времени. Программа, состав­ленная на интерпретаторе, записывается в опе­ративную память в виде команд на языке высокого уровня, каж­дая из которых транслируется в машинный код по мере прохождения программы. Это требует больше времени, но дает оператору возможность контролировать результат каждой операции.

Все исследования в области программирования с 1957 г. сти­мулировались стремлением усовершенствовать Фортран, который подвергался неоднократным переделкам. Стало появляться боль­шое число языков, что беспокоило программистов, которые создали Международный комитет для выработки единого языка прог­раммирования (КОДАСИЛ). Результатом работы комитета явились два языка, до сих пор широко распространенные у пользовате­лей, эксплуатирующих большие машины. Один из них, К о б о л был разработан для выполнении однородных операций над боль­шими массивами чисел. Он применяется в сфере бизнеса и эффек­тивен при простых арифметических вычислениях. Две трети кон­торских программ на Западе все еще написаны на Коболе. Но как универсальный язык, к которому по тем временам все стре­мились, он был неудовлетворителен. Вторым языком стала пер­вая версия А л г о л а (1956 г.), который хотя и не стал же­ланным универсальным языком, но в последующих версиях сохра­няет значение многоцелевого средства.

Тогда же Дж. Маккарти из Массачусетского технологического института создал язык Л и с п, в котором программы и данные представляются в виде списков. Его простота и сила определяются тем, что в нем применяется только один вид команд – вызов функции, а ее значением может быть другая функция. С тех пор он стал популярным в исследованиях по искусственному интеллекту и послужил моделью для многих других языков. Для персональных компьютеров чаще всего используется Б е й с и к, разработанный в 1965 г. Дж. Кемени и Т. Курцем из Дартмутского колледжа в США. Он предназначался для изучения вводного курса программирования, но затем стал популярным среди программист­ов-непрофессионалов. Каждая строка программы на этом языке обозначается номером, а управление прохождением программы в основном осуществляется путем указания этих номеров.

Близок к нему и язык П а с к а л ь, также первоначально созданный для обучения студентов в 1970 г. Н. Виртом, препода­вателем Федерального технологического института в Цюрихе. В отличие от Бейсика в нем необходимо объявлять каждую перемен­ную и указывать ее тип, а процедуры и функции обозначать не номерами строк, а именами функций, что облегчает чтение прог­раммы. Решая какую-либо задачу, специалист не может опериро­вать двоичными кодами, регистрами и адресами машинной памяти. Он мыслит формулами своей науки, например,

"Площадь = длина X ширина",

"Прибыль = доход – затраты".

Действия, описываемые этими формулами, транслируются в машинные коды компиляторами и интерпретаторами, которые можно считать средствами реализа­ции языка программирования. На этом и были основаны такие язы­ки программирования, как Фортран, Паскаль, Бейсик.

Эти и подобные им языки называются процедурными. Каждый та­кой язык как бы предоставляет программисту некую виртуальную (воображаемую) машину. Составляя программу, пользователь ви­дит решение своей задачи как процесс вычисления, осуществля­емый этой виртуальной машиной. Тем самым сразу описывается и задача, и метод ее решения. Появились непроцедурные стили программирования – функциональный, логический – и соответству­ющие языки. Основная идея логического программирования – от­деление описания задачи от процесса ее решения – была выраже­на в уравнении одного из его авторов Р. Ковальского:

"Алгоритм = логика + управление".

Наиболее распространенный язык логического программирова­ния П р о л о г был создан в 1972 г. А. Колмари из Марсельского университета. Программа на Прологе состоит из описаний, задающих объекты и отношения между ними. Например, формула

"Площадь = длина X ширина"

описывается отношением "Произведе­ние, длина, ширина, площадь". Описание это статическое и никаких вычислений оно не задает. Но компьютер производит их сам по запросу, и по любым в данном случае двум величинам может вы­числить третью, т. е. по площади и ширине – длину. Независимо от зарубежных работ в СССР в 70-е годы В. Б. Бор­ще­вым и М. В. Хомяковым (ВИНИТИ) также разрабатывалась версия логического программирования.

Многие современные компьютерные системы используют язык С и, созданный в 1972 г. Д. Риччи в лабораториях "Белл Телефон" корпорации АТТ в Мюррей-хилл (шт. Нью-Джерси). Первоначаль­но он разрабатывался для программировании новой операционной системы Ю н и к с. Операционная система предназначена для приема, хранения и выдачи информации, а также для взаимодей­ствия аппаратных средств компьютера с прикладными программа­ми. Си стал популярным как язык так называемого среднего уро­вня. В нем удобство, краткость и мобильность языков высокого уровня сочетаются с возможностью непосредственного доступа к машине, что традиционно обеспечивалось ассемблером, т. е. язы­ком низкого уровня.

Другая важная тенденция в развитии программирования связа­на с объектно-ориентированными языками. В них процессор маши­ны условно делится на "объекты", которые могут программирова­ться индивидуально, а затем соединяться друг с другом при по­мощи сообщений. В числе подобных языков: С и м у л а - 67 (О. Даль и К. Нигард из Норвежского ВЦ в Осло), С м о л л т о к (1970 г., А. Кей из фирмы Ксерокс, Пало-Альта), Э у р и с к о (1979 г., Д. Ленат из Стэнфордского университета).