Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Языки программирования. Практический сравнитель...doc
Скачиваний:
31
Добавлен:
09.09.2019
Размер:
2.68 Mб
Скачать

3.9. Средства конфигурирования

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

Инструментальные средства управления исходными текстами (source control) или управления изменениями (revision control) используются для от­слеживания и регистрации всех изменений модулей исходного текста. Это важно, потому что при проектировании больших систем часто необ­ходимо отменить изменение, которое вызвало непредвиденные пробле­мы, либо проследить изменения для конкретной версии или сделанные конкретным программистом. Кроме того, разным заказчикам могут по­ставляться различные версии программы, а без программных средств при­шлось бы устранять общую ошибку во всех версиях. Инструментальные средства управления изменениями упрощают эти задачи, поскольку сохра­няют изменения (так называемые дельты) относительно первоначальной версии и позволяют на их основе легко восстановить любую предыдущую версию.

3.10. Интерпретаторы

Интерпретатор — это программа, которая непосредственно выполняет код исходной программы. Преимущество интерпретатора перед компилятором состоит в чрезвычайной простоте использования, поскольку не нужно вызы­вать всю последовательность инструментальных средств: компилятор, ком­поновщик, загрузчик, и т.д. К тому же интерпретаторы легко писать, по­скольку они могут не быть машинно-ориентированными; они непосредст­венно выполняют программу, и у них на выходе нет никакого машинного ко­да. Таким образом, интерпретатор, написанный на стандартизированном языке, является переносимым. Относительная простота интерпретаторов связана также с тем, что они традиционно не пытаются что-либо оптими­зировать.

В действительности провести различие между интерпретатором и компи­лятором бывает трудно. Очень немногие интерпретаторы действительно вы­полняют исходный код программы; вместо этого они переводят (то есть ком­пилируют) исходный код программы в код некой воображаемой машины и за­тем выполняют абстрактный код (рис. 3.2).

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

Первоначально Pascal-компилятор был написан для получения ма­шинного кода конкретной машины (CDC 6400). Немного позже Никлаус Вирт создал компилятор, который вырабатывал код, названный Р-кодом, для абстрактной стековой машины. Написав интерпретатор для Р-кода или компилируя Р-код в машинный код конкретной машины, можно создать интерпретатор или компилятор для языка Pascal, затратив относительно небольшие усилия. Компилятор для Р-кода был решающим фактором в превращении языка Pascal в широко распространенный язык, каким он яв­ляется сегодня.

Язык логического программирования Prolog (см. гл. J7) рассматривался вначале как язык, пригодный только для интерпретации. Дэвид Уоррен (David Warren) создал первый настоящий компилятор для языка Prolog, опи­сав абстрактную машину (абстрактная машина Уоррена, или WAM), которая управляла основными структурами данных, необходимыми для выполнения программы на языке. Как компиляцию Prolog в WAM-программы, так и ком­пиляцию WAM-программы в машинный код проделать не слишком трудно; достижение Уоррена состояло в том, что он сумел между двух уровней опреде­лить правильный промежуточный уровень — уровень WAM. Многие исследо­вания по компиляции языков логического программирования опирались на WAM.

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