Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика лекции.doc
Скачиваний:
12
Добавлен:
11.11.2018
Размер:
881.66 Кб
Скачать

Общие замечания к интерпретаторам

Разработка интерпретаторов для интерпретации программ на заданном исходном языке является одной из основных задач информатики. Сте­пень трудности проблемы реализации интерпретатора зависит от сложно­сти исходного языка и степени его отличия от базисного языка, на кото­ром должен быть записан сам интерпретатор.

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

Особое положение занимают интерактивные, инкрементальные (поша­говые) интерпретаторы. Для них не обязательно требуется сначала подго­товить всю программу целиком, включая вводимые данные, и только по­том ее интерпретировать. При интерактивной интерпретации можно программу и входные данные приготовить отдельными частями и полу­ченную часть - насколько это возможно - тут же проинтерпретировать (ЯП ВASIC специально ориентирован на инкрементальную интерпретацию).

Сейчас все ближе подходят к созданию интерпретаторов для таких языков, которые выглядят не так, как классические ЯП, ориентирован­ные на вычисления. В частности, в результате длительных исследований стала возможной интерпретация определенных языков, ориентированных скорее на спецификации, а не на вычисления (например, язык ПРОЛОГ, который служит для составления программ в машинно-интерпретируемой логике). Впрочем, для таких языков имеются определенные непре­одолимые преграды из-за границ вычислимости и сложности, которые для многих постановок задач делают практически невозможным исполь­зование этих языков.

Компиляция языков программирования

Компилятор берет программу на исходном языке в качестве своих входных данных и вырабатывает программу на объектном языке, понятном машине.

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

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

ЯП определяется его синтаксисом и семантикой. В процессе компи­ляции или интерпретации программа, понимаемая как синтаксический объект, берется в качестве входных данных и в соответствии с ее семан­тикой превращается в программу на другом языке или в последователь­ность действий (процесс выполнения).

Языки программирования бывают высокого и низкого уровней.

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

Языки высокого уровня позволяют задавать желаемые действия в программе с по­мощью определенного набора операторов. Они значительно ближе и понятнее человеку, чем компьютеру. Каждая команда такого языка может состоять из десятка и более команд микропроцессо­ра. Писать программы на ЯП ВУ легче.

1 – машинно-зависимые (Ассемблер). Языки низкого уровня.

2 – машинно-ориентированные (Си)

3 – универсальные (Фортран, Паскаль, Basic)

4 - проблемно-ориентированные (GPSS, Лого, объектно-ориентированные (форт, Смолток))

5,6,7 – (Пролог, Лисп, СНОБОЛ).

Си, Си++ - вся машинно-зависимая часть программы достаточно легко локализуется и модифицируется при переносе программы на другую архитектуру.

Фортран – первый язык высокого уровня (1958г., фирма IBM), используется и до сих пор, поддерживает модульное программирование, особенно предпочитается математиками.

Паскаль – один из наиболее популярных в учебных целях (Н.Вирт), реализует большинство идей структурного программирования.

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

Лого, среди проблемно-ориентированных языков – используется в основном для целей обучения. Это диалоговый процедурный язык (простой синтаксис).

GPSS – ориентирован на моделирование систем с помощью событий. Применяется там, где результаты исследований выражаются в терминах времени ожидания, длины очереди, использование ресурсов.

Смолток – один из ранних ОО ЯП, основная конструкция – это объект и действия с ним, предназначен для нечисловых задач (при построении систем искусственного интеллекта).

Форт – используется при решении задач имитационного моделирования в графических системах.

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

Пролог – язык ИИ, даются термины и связи, а с его помощью создаются новые.

Лисп – имеет мощные графические конструкции, позволяет создавать программы проектирования (деталей, например). Он ориентирован на конструкторскую деятельность. Имеет библиотеку примитивов.

СНОБОЛ – язык ИИ.

Поколения языков программирования

Все языки программирования принято делить на 5 поколений.

1. Начало 50-х годов. Появились первые компьютеры и первые языки ассемблера, в которых программирование велось по принципу «Одна инструкция - одна строка».

2. Конец 50-х начало 60-х годов. Разработан символический Ассемблер, в котором появилось понятие переменной. Возросла скорость разработки и надежность программ.

3. 60-е года. Рождение языков высокого уровня. Простота программирования, не­зависимость от конкретного компьютера, новые мощные языковые конструк­ции.

4. Начало 70-х и по настоящее время. Проблемно-ориентированные языки, опери­рующие конкретными понятиями узкой предметной области. Мощные операто­ры, для которых на языках младшего поколения потребовались тысячи строк исходного кода.

5. Середина 90-х. Системы автоматического создания прикладных программ с помощью визуальных средств разработки, без знания программирования. Инст­рукции вводятся в компьютер в наглядном виде с помощью методов, наиболее удобных для человека незнакомого с программированием.

В нашем институте на различных курсах вы научитесь программировать на различных языках программирования.

12