Смекни!
smekni.com

Курс лекций (стр. 10 из 24)

Результаты

Элементы A-60 Паскаль ТП2 ТП5 ТП5.5 ТП6 ОП М2 О О2 Си Си++ Java Ада
Лексемы 1085 1012 1184 1331 1410 1488 1825 887 765 726 917 1662 1771 2206
Нетерминалы 119 110 124 127 135 143 180 70 62 43 917 126 174 226
Терминалы 92 84 87 87 87 89 90 88 90 91 123 131 121 102
Служебные слова 25 35 42 48 52 55 83 39 32 34 27 47 48 63

Результаты приведены на рис. 4. Линия Вирта, начинающаяся от Алгола-60 и образованная языками Паскаль, Модула-2, Оберон и Оберон-2, автором которых является Никлаус Вирт, и, что самое главное, линия, которой Вирт неуклонно придерживается: наращивание мощи языка без его усложнения. Паскаль намного богаче Алгола, но не сложнее его. Модула существенно мощнее и совершеннее Паскаля, но проще. Оберон обогатил Модулу средствами объектно-ориентированного программирования – расширяемыми записями, и при этом не только не стал более сложным, но заметно упрощен. Удивительным выглядит то, что Оберон-2 оказался проще Оберона, расширением которого является.

В отношении размера определения синтаксиса так оно и есть. Да и по существу нововведения Оберона-2 оформлены очень экономно. Кроме того авторы языка объединили отдельные правила для каждой разновидности операторов в одно правило для нетерминала "Оператор". То же сделано в отношении правил для типов. По-другому, более компактно, определен синтаксис некоторых конструкций. И хотя получившееся упрощение отчасти формальное, но экономия понятий – это именно то, к чему и следует стремиться, как заметил еще У.Оккам почти 700 лет назад. Кроме того, что остаются простыми формальные описания синтаксиса языков Н.Вирта, очень лаконичны и полные тексты спецификаций этих языков. Сравнивая авторское описание Паскаля, тоже очень небольшое, и описания языков Оберон и Оберон-2, можно увидеть как маэстро совершенствовал свое мастерство. Я очень рекомендую специалистам по Си++ и Яве почитать спецификацию Оберона, даже если вы не собираетесь использовать этот язык. Всего 20 страниц! И при том, это документ, необходимый и достаточный для реализации языка. Сравните с аналогичного назначения книгами Б. Строуструпа и Д. Гослинга по Си++ и Яве.

Линия Борланд берет начало от виртовского Паскаля, а дальше "все выше и выше и выше...". Версии Турбо - Борланд - Объектного Паскаля становятся сложнее и сложнее. По другому просто не может быть, поскольку, избрав однажды путь расширения старого языка с сохранением обратной совместимости, язык можно только усложнять. Отказаться от чего-либо уже невозможно. Недаром по линии Борланд идет монотонный рост всех без исключения критериев.

Что же в результате. Из простого и изящного Паскаля получился язык, приближающийся по сложности к языку Ада. По большому счету Паскаль в версии Борланд (Inprise) уже не может считаться общемировым языком программирования. Это фирменный язык одной не очень большой американской компании. В этом смысле он ничем не отличается от Бейсика, языка другой, правда более крупной фирмы. Отсутствие переносимости даже делает не вполне правомерным сравнение этого языка с Си, Си++, Явой, Модулой, Обероном и Адой.

Одним из неожиданных результатов измерений стало то, что Си оказался не простым, а очень простым языком. По некоторым параметрам он даже проще Оберона. Недаром же он завоевал в свое время такую популярность. И в самом деле Си весьма гармоничен. И хотя поощряемый им стиль принимают не все, но в изяществе языку не откажешь. Ничего хорошего в смысле простоты нельзя сказать про Си++. Сейчас признание чрезмерной сложности этого языка стало общим местом. Так что неожиданностей наши измерения не дали. Разве что можно заявить о том, что Си++ сложнее Си практически вдвое. Вообще, если Си – конструкция весьма цельная, то Си++ представляется достаточно противоестественным соединением языка с незамаскированными понятиями низкого уровня и высокоуровневой концепции объектов. К тому же, мне кажется, что популярность Си возникла естественным путем., а Си++ – искусственно "раскрученный" язык.

Судя по вычисленным нами критериям Ява не только не может считаться простым, но является одним из самых сложных языков, более сложным чем Си++, и вдвое более сложным чем Оберон.

Трансляция

Перевод с языков высокого уровня в машинные коды выполняют программы, которые называются трансляторами, которые существенно более сложны, чем ассемблеры. Различают два типа трансляторов.

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

Интерпретатор транслирует и выполняет последовательно один оператор за другим. Этот метод требует значительно большего времени процессора. Внесение изменении значительно проще. На практике используют сочетание этих методов. Во время отладки - используют интерпретатор, после отладки - компилятор.

Схема работы компилятора приведена на рис.3.

Среди этапов транслирования можно выделить следующие.

Лексический анализ. Задача этого этапа сделать программу понятной для других этапов. Литеры исходного кода читаются одна за другой, а сканер (лексический анализатор) в соответствии с грамматическими правилами языка объединяет литеры в группы, определяя их смысл. Для каждой смысловой группы генерируется символ - лексема. Большинство лексем имеют фиксированный смысл (ключевые слова указывают на действия, задаваемые синтаксисом языка - начало, если, конец,…, операции указывают на арифметические и др. действия, пересылку данных - +, :=…., числа задают числовые значения - 5,7,…, знаки пунктуации помогают разобраться в структуре программы). Другая разновидность лексем - индентификаторы, которые не имеют фиксированного смысла - имя программы, слова для именования переменных или констант. Сканер дает каждой лексеме метку и заносит в таблицу.

Синтаксический анализ. Синтаксический аналзатор получает от сканера лексемы и располагает их в виде структуры, позволяющей компьютеру разобраться в логике программы. Группы лексем объединяются в операторы - основные структурные единицы программы. Построением структуры управляет набор явно записанных правил; каждой последовательности лексем соответствует один единственный способ разещения их в структуре. Встречая последовательность лексем, которая не укладывается ни в одно правило, синтаксический анализатор выдает предупреждение об ошибке. В интерпретаторе отбирается ровно столько лексем, сколько надо для обработки логически сязанного фрагмента программы.

Контроль типов. Направлен на выявление ошибок, связанных с несовсестимость типов.

Генерация кода. Генератор превращает лексемы в последовательность машинных команд.

Убедиться в правильности работы программы можно только во время ее тестирования – пробных запусках программы и при анализе полученных результатов.

В среднем, каждая строка кода в языках программирования систем транслируется примерно в пять машинных команд, сравнительно с одной командой на строку в ассемблерной программе.

4. Алгоритмы и структурное программирование

Алгоритмом называется четкое описание последовательности действий, которое необходимо выполнить для решения задачи. Так как решение практически любой задачи требует получения результата по заданным исходным данным, то можно сказать, что алгоритм описывает процесс преобразования исходных данных в результат.

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

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

1. Дискретность. Алгоритм представляет процесс решения задачи как последовательность выполнения простых (или заранее определенных) шагов-этапов. Для выполнения каждого эпата требуется определенное время, т.е. преобразование исходных данных в результат происходит дискретно во времени.