Р.У. Себеста - Основные копцепции языков программирования (2001) (1160794), страница 15
Текст из файла (страница 15)
Взвесьте достоин- ства н недостатки обоих подходов в соответствии с приведенными в данной главе критериями. Глава1. Вводныв замечания 17. В языке Рааса! точка с запятой используется лля разделения выражений, а в языке этой главе хронологически прослеживается развитие некоторых языков про- В граммирования, исследуется среда, в которой каждый из них разрабатывался, особое внимание обращается на вклад языка в компьютерные науки и причины, привелшие к его возникновению. Глава не содержит полного описания языков, рассматриваются только новые свойства, которыми они отличаются друг от друга. Особый интерес вызывают свойства, оказавшие наибольшее влияние на языки пропэаммирования, разработанные позднее, или на компьютерные науки в целом.
В данную главу не включено подробное обсуждение какого-либо языкового свойства нли концепции: эти вопросы будут рассмотрены в следующих главах. Мы считаем, что краткого неформального объяснения свойств будет достаточно лля нашего обзора истории развития этих языков. Выбор языков, обсужлаемых в этой главе, был субъективным, и многие читатели с сожалением отметят отсутствие одного или нескольких излюбленных языков.
Тем не менее, для того чтобы этот исторический обзор не выхолил за разумные пределы, было необходиью исключить из рассмотрения несколько языков, высоко ценимых некоторыми программистами. Наш выбор основывался на оценке важности каждого языка лля развития языков программирования и компьютерных наук в целом. В этой главе также рассматриваются некоторые другие языки, упоминающиеся далее в книге. В главе содержатся листинги 11 полностью завершенных примеров программ, все онн написаны на различных языках. Ни одна из этих программ в главе не описывается; они приводятся просто для иллюстрации внешнего вила программы на конкретном языке.
Читатели. знакомые с любым из распространенных императивных языков, смогуг прочесть и понять большинство команд этих программ, за исключением программ, написанных на языках 1.!БР, СОВОК и Бшайга1К Пример программы на языке !.!БР рассматривается в главе 14; на языке Зпзайгайс — в главе !1. Программы на языках РОйТКА)Ч, АБООБ 60, Р1Л, ВАЫС, Разов!, С, Ада и Зача решают одну и ту же задачу.
Генеалогическое древо развития языков программирования высокого уровня, рассматриваемых в этой главе, приведено на рис. 2.1. 2.1. Язык Р!аЫсайсШ Конрада Цузе Первый из обсужлаемых в этой главе языков в некоторых отношениях крайне необычен. Во-первых, он никогда не был реализован. Более того, хотя он был разработан в 1945 году, его описание не публиковалось вплоть до 1972 года. Из-за всеобщего игнорирования языка Р!апйайЫ! некоторые его возможности не использовались в других языках программирования в течение 15 лет после его разработки.
2.3.1. Исторические предпосылки Между 1936 и 1945 годами немецкий ученый Конрад Цузе (Копгад Ецзе) на основе электромеханических реле создал рял сложных и изощренных компьютеров. К 1945 году война привела к разрушению всех этих компьютеров, за исключением одной из последних моделей — компьютера У4. Цузе отправился в удаленное баварское селение Хинтерштейн (н!пгегзге)п), а остальные члены его исследовательской группы разъехались в разные стороны. Глава 2. Обзор основных языков программирования 1957 ЕОЯТЯАН1 56 ЕОЯТЯАН 9 59 60 61 62 ЕОАТЯАН Н 63 64 65 66 67 66 69 то 71 72 тз 74 75 76 тт 76 ЕОЙТяАн77 79 во В! вг вэ 64 65 66 67 66 9 еоятцнвт 91 92 92 94 6НОВО! 1СОН ОН Ыв АНВ~ С Рис.
21. Генеатагня распространенных языков нрарацинровання высокова уровня 2.1.2. Обзор языка Язык Р)вп!Тай401 был необыкновенно полным и обладал нескоэькичн очень перспективными свойствами в области структур данных. Простейшим тнпом данных в языке Р!ап!4а! Тй! был отдельный бит. На основе этого типа создавались типы для представления целых чисел и чисел с плаваюшей точкой. Для представления чисел с плавающей точкой использовались дополнительный код числа в двоичной системе и схема "скрытого бита", в настояшее время применяемая для того, чтобы не хранить в памяти старший значаший бит в нормализованной мантиссе числа.
2.1. Язык Р!ап!Та!!ТВ! Конрада Цузв Работая самостоятельно. Цузе направил свои усилия на разработку языка для выражения вычислений, продолжив проект. начатый илт в 1943 году с целью написания докторской диссертации. Новый язык он назвал Р1ап!Тай!. что означает "программное исчисление". В объемной рукописи. датированной 1945 годом. но не п)бчнковавшейся до 1972 года 12цве, 1972), Цузе дал определение языка Р!ап!4ай О1 и использовал этот язык для написания аягоритмов решения множества задач. Кроме этих обычных скалярных типов.
язык Р(ап(са1(гй( содержал массивы и записи. 11ри работе с записями для включения в них других записей в качестве элементов допускалось использование рекурсии. Хозя язык и не содержал явного оператора досо, он имел оператор цикла, подобный оператору хох языка Разса). В языке также имелась команда Рдц, верхний индекс которой означал выход из внутреннего цикла на указанное число вложенных итерационных циклов или к начазу нового итерашюнного цикла.
Язык Р!ап)сайгц! содержал оператор ветвления. не содержащий оператора о1во. 1(нтереснейшей особенностью программ Конрада Цузе было включение математических выражений. показывающих отношения между переменными в программе. Эти выражения устанавливазш что именно в процессе выполнения должно быть истинным в тех точках программы. гле находились данные выражения. Сами эти выражения очень похожи иа утверждения. используемые в современном языке программирования Е(йе( (Мсуег. 1992) и аксиоматичсской семантике. рассматриваемой в главе 3. Рукопись Цузе содержала программы. которые были значительно сложнее программ, написанных ло !945 года.
В ией были приведены программы сортировки массивов целых чисел: проверки связности заданного графа; программы, выполняющие действия с пелылги числал~и н с числами с плавающей точкой. в том числе извлечение квадратного корня: программы. которые производили синтаксический анализ логических формул, содержащих скобки и операторы с шестью различными уровнями приоритета, Вероятно, самыми примечательнылш были принадлежащие Цузе 49 страниц алгоритмов игры в шахматы (игры.
в которой сам Бузе специкчистом не был). Если бы в начале 1950-х годов какой-нибудь специалист по компьютерным наукам обнаружил созланное Цузе описание языка Р!ап) айг01. то елинственным аспектом, который бы затр>лнил реализацию этого языка в описанном виде. была бы форма записи. Каждый оператор состоял из двух-трех строк колганл. Первая строка была очень похожа на операторы современных языков программирования. Вторая строка, которая была необягательной. солсржала сгпюок инлексов массивов.
упоминающихся в первой строке. Инзересно отмстить. что тот же лгетод указания инлексов использовался Чарльзом Бэббилжем (СЬаг1ез ВаЬЬайс) в программах. написанных им для его -аналитической машины" в ссрелине Х!Х столетия. Последняя строка каждого выражения на языке Р!ап(гайгй! содержала названия типов переменных. упоминаемых в первой строке. На первый взгляд. подобная запись выглялит устрашающе. Для иллюстрашш описанной формы записи ниже приводится пример оператора, присваиваюшего значения выражения А(4)+2 переменной А(5). Строка, помеченная буквои: . содержит инлексы, а строка, помеченная буквой я, — типы ланных.
Запись 1. и в данном примере означает целое число. состоящее из и битов: !Аь'=>А у 5 Б ! 1.п ).п Сейчас мы можем только гадать, по какому пути пошло бы развитие языков программирования и компьютеров, если бы работа Конрада Цузе стала бы широко известной в 1945 или даже в 1950 году. Также интересно предположить, как отличалась бы сделанная Цузе работа, если бы она выполнялась в мирное время в коллективе ученых. а не в фактической изоляции в Германии 1945 года. 60 Глава 2. Обзор основных языков программирования 2.2. Минимальное программирование на аппаратном уровне: псевдокоды Компьютеры, появившиеся в конце 1940-х и начале 1950-х голов.
были далеко нс такими удобными, как современные. Кроме того что они были очень медленнычи. ненадежными, дорогими и имели крайне матый объел| памяти. программировать на них было очень сложно из-за недостатка программной поддержки. Не существовало языков программирования высокого уровня или. по крайней мере. языков ассемблера, поэтому программирование выполнялось в машинных колах. что было кропотливой и подверженной ошибкам работой. Среди возникавших проблем можно назвать использование целочисленных колов для указания кочана Например, команда А()() (" прибавить" ) должна была определяться колом 14.
а не напрашивающимся текстовым обозначением, лаже состоящим из одного символа. Это значительно усложняло чтение программы. Более существенной проблемой являлась абсолютная адресания, усложнявшая молификацию программ. Предположим, что у нас в памяти имеется программа в машинных кодах. Многие кол~анды такой программы ссылаются на другие ячейки памяти вне программы. обычно на справочные ланные. или указывают цели команд ветвления.
Введение команды не в конец программы. а в произвольное место внутри нее, сводит на нет правильность ссылок на адреса, находящиеся за точкой ввоза новой команды, поскольку для прелоставления л1еста новой команде эти адреса должны соответствующим образом уведичиться. Для того чтобы введение новой команды не нарушало структуры уже существующей программы. программист должен найти и изменить все команды, ссылающиеся на алреса. находящиеся за дополнительно введенной командой.