Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЯП - половина готово.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
298.5 Кб
Скачать

Разница между компилятором и интерпретатором

Как Компилятор так и Интерпретатор имеют одно предназначение — конвертировать инструкции языка высокого уровня (как C или Java) в бинарную форму, понятную компьютеру. Это программное обеспечение, используемое для запуска высокоуровневых программ и кодов выполняемых различные задачи. Для разных высокоуровневых языков разработаны специфичные компиляторы/интерпретаторы. Не смотря на то что как компилятор так и интерпретатор преследуют одну и ту же цель, они отличаются способом выполнения своей задачи, то есть конвертирования высокоуровневого языка в машинные инструкции. В этой статье мы поговорим о базовой работе обоих и выделим главные отличия между компилятором и интерпретатором.

Компилятор

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

На картинке показано базовое очертание процесса компиляции. Тут программа написанная на языке высокого уровня показана как «Исходный код», а сконвертированный называется «Исполняемый код».

Интерпретатор

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

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

Ниже перечислены главные отличия между компилятором и интерпретатором:

  • Интерпретатор берет одну инструкцию, транслирует и выполняет ее, а затем берет следующую инструкцию. Компилятор же транслирует всю программу сразу, а потом выполняет ее.

  • Компилятор генерирует отчет об ошибках после трансляции всего, в то время как интерпретатор прекратит трансляцию после первой найденной ошибки.

  • Компилятор по сравнению с интерпретатором требует больше времени для анализа и обработки языка высокого уровня.

  • Помимо времени на обработку и анализ, общее время выполнения кода компилятора быстрее в сравнении с интерпретатором.

  1. Виды (технологии) программирования.

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

Программирование

Императивное

Декларативное

функциональное

логическое

Императивные языки программирования – Бейсик, Паскаль, Си и прочие (включая объектно-ориентированные).

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

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

Если задача описывается последовательным исполнением операций ("открыть кран, набрать воды"), то такие задачи идеальные кандидаты на императивную реализацию.

Декларативные языки программирования:

Функциональные языки программирования – LISP , ISWIM ( If you See What I Mean ), ML ( Meta Language ), Miranda, Haskel

В языках функционального программирования основными конструктивными элементами являются функции. Тексты программ на функциональных языках программирования описывают «как решить задачу», но не предписывают последовательность действий для решения.

Способ решения задачи описывается при помощи зависимости функций друг от друга (в том числе возможны рекурсивные зависимости) без указания последовательности шагов.

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

Логические языки программирования – Prolog.

В логическом программировании программа представляет из себя некоторую теорию (описанную на достаточно ограниченном языке), и утверждение, которое нужно доказать. В доказательстве этого утверждения и будет заключаться исполнение программы.

Логическое программирование и язык Пролог появились в результате исследования группы французских ученых под руководством Колмерье в области анализа естественных языков. В последствии было обнаружено, что логическое программирование столь же эффективно в реализации других задач искусственного интеллекта, для чего оно в настоящий момент, главным образом, и используется. Но логическое программирование оказывается удобным и для реализации других сложных задач; например, диспетчерская система лондонского аэропорта Хитроу в настоящий момент переписывается на Прологе. Оказывается, логическое программирование является достаточно выразительным средством для описания сложных систем.

Программирование

Процедурное

Объектно-ориентированное

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

Ада, Бейсик, Си, C++, С# (из Microsoft) КОБОЛ, Паскаль, Delphi, Фортран, Java, Перл, Visual Basic, PHP

Объектно-ориентированные подход к программированию - это подход к разработке программного обеспечения, основанный на объектах, а не на процедурах.

Java, Си, Visual Basic

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

Объект – это базовое понятие ООП. Любой объект принадлежит одному или нескольким классам, которые в свою очередь определяют, описывают поведение объекта.

Примеры классов : "Гном", "Хоббит", "Маг".

Примеры объектов : "хоббит по имени Фродо Бэггинс", "маг по имени Гэндальф".

Каждый объект характеризуется свойствами, методами и событиями .

Свойства – описание объекта. Примеры атрибутов: "имя", "рост". Набор конкретных значений определяет текущее состояние объекта.

Метод – это действие объекта, изменяющее его состояние или реализующее другое его поведение. Пример методов: "назвать свое имя", "стать невидимым". При разработке методов используются принципы процедурного программирования.

Объект, класс, метод, свойства, события – это базовые понятия ООП.

Программирование

Неструктурное

Структурное

Неструктурное программирование не накладывает никаких ограничений на структуру программы, т.е. допускает использование в явном виде команды безусловного перехода (в большинстве языков GOTO). Типичные представители неструктурных языков - ранние версии Бейсика и Фортрана. Однако в языках высокого уровня наличие команды перехода влечет за собой массу серьезных недостатков: программа превращается в "спагетти" с бесконечными переходами вверх-вниз, ее очень трудно сопровождать и модифицировать.

Неструктурный стиль программирования не позволяет разрабатывать большие проекты.

Структурное программирование

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

  • как доказал Э. Дейкстра, любой алгоритм можно реализовать, используя лишь три управляющие конструкции:

    • последовательное выполнение

    • ветвление

    • цикл

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

  1. Алгоритм и его свойства.

Понятие алгоритма

Понятие алгоритма в программировании является фундаментальным.

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

Перед решением любой задачи с помощью персонального компьютера (ПК) выполняются следующие этапы:

  • постановка задачи,

  • алгоритмизация,

  • программирование.

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

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

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

Математическое обеспечение – программные средства, которые могут быть предоставлены пользователю для решения его задачи с помощью ПК. Оно включает в себя:

  • алгоритмическое обеспечение – методы и алгоритмы, модели решения задач,

  • лингвистическое обеспечение – языки программирования,

  • программное обеспечение – систему автоматизации программирования,

  • информационное обеспечение – структуры данных и базы данных.

Программирование – это описание алгоритма на языке программирования.

Алгоритм – точное и понятное для исполнителя описание последовательность элементарных действий, обеспечивающие решение поставленной задачи.

Алгоритм применительно к ПК – точное предписание или последовательность команд, обеспечивающих преобразование некоторых исходных данных в решение задачи.

Команда алгоритма – это предписание о выполнении отдельного законченного действия исполнителя.

Термин алгоритм происходит от имени узбекского ученого IX в. Аль-Хорезми, который в своем труде ″Арифметический трактат″, переведенном в XII в. с арабского на латынь, изложил правила арифметических действий над числами в позиционной десятичной системе счисления. Эти правила и называли алгоритмами. Таким образом, правила сложения, вычитания, деления, умножения чисел, правила преобразования алгебраических выражений, правила построения геометрических фигур, грамматические правила правописания слов и предложений – все это алгоритмы.

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

- механические алгоритмы, или детерминированные, жесткие (например, алгоритм работы машины, двигателя и т. п.);

- гибкие алгоритмы, например стохастические, т. е. вероятностные и эвристические.

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

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

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

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

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

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

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

Типичный пример эквивалентного преобразования алгоритмов – перевод с одного алгоритмического языка на другой.

Свойства алгоритма

При составлении и записи алгоритма необходимо обеспечить, чтобы он обладал рядом свойств. Рассмотрим эти свойства на следующем примере: пусть требуется вычислить сумму двух целых чисел и вывести на экран результат.

Однозначность алгоритма, под которой понимается единственность толкования исполнителем правил выполнения действий и порядка их выполнения. Чтобы алгоритм обладал этим свойством, он должен быть записан командами из системы команд исполнителя.

Для нашего примера исполнитель алгоритма должен понимать такую запись действий, как сложить числа А и В.

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

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

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

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

Определенность алгоритма. Каждый шаг алгоритма должен быть определен.

Входные данные алгоритма. Алгоритм должен иметь некоторое (может быть равное 0) число входных данных.

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

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

  1. Типовые структуры алгоритмов.

Типовые структуры алгоритмов

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

Структура алгоритма является линейной, если она образована последовательностью операторов (команд).

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

Как правило, алгоритмы линейной структуры состоят из трех частей: ввод исходных данных, вычисления результатов по формулам, вывод значений результатов. Это самые простые алгоритмы.

ПРИМЕР 1. Найти сторону и диагональ квадрата, если известна его площадь.

Математическая постановки задачи. Введем математические обозначения величин: a - сторона квадрата, d - его диагональ, s - площадь.

Исходными данными задачи является только величина s (она должна быть известна, т.е. введена в начале алгоритма). Величины a, d являются результатом решения задачи.

Теперь надо вспомнить формулы, связывающие эти величины:

s = a 2           - формула площади квадрата,

a 2 + a 2 = d 2                               - теорема Пифагора.

Выбор метода решения задачи. Метод очень простой - прямое вычисление сначала стороны квадрата, а затем его диагонали по формулам:

a =  ,               d = a .

Разработка алгоритма. Схема алгоритма решения задачи приведена на рис.5. Каждое элементарное действие обозначено в схеме отдельным символом - блоком.

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

Рис. 5

Порядок выполнения блоков, как уже было сказано, определяют линии потока. По схеме видно, что при вводе совершенно различных исходных данных (по смыслу задачи, конечно, s>0) все действия этого алгоритма будут выполняться всегда в одном и том же порядке.

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

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

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

Вспомогательные алгоритмы

При построении новых алгоритмов могут использоваться алгоритмы, составленные ранее. Алгоритмы, целиком используемые в составе других алгоритмов, называют вспомогательными (или подчиненными) алгоритмами.

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

В некоторых случаях при наличии одинаковых последовательностей указаний (команд) для различных данных с целью сокращения записи также выделяют вспомогательный алгоритм.

Вспомогательные алгоритмы описываются отдельно, в терминах так называемых формальных параметров, которые представлены обозначениями и характеризуют требуемый порядок выполнения алгоритма. Например, алгоритм поиска большего из двух чисел α и β (обозначим БИД) может быть записан следующим образом:

Обращение к вспомогательному алгоритму организуется с помощью специального оператора вызова, содержащего имя вспомогательного алгоритма и список, фактических параметров. При этом число, тип и порядок перечисления фактических параметров в списке должны полностью соответствовать числу, типу и порядку перечисления формальных параметров в заголовке вспомогательного алгоритма. Так, вызов вспомогательного алгоритма для поиска большего из трех чисел (обозначим его БИТ) можно составить в форме двукратного обращения к алгоритму БИД:

Фактические параметры a, b, c, y полностью соответствуют по смыслу формальным параметрам α, β, γ. Поэтому после исполнения вспомогательных алгоритмов в основном алгоритме можно воспользоваться переменной y как результатом наибольшего из трех чисел.

Наряду со стандартными функциями sin (x), cos (x), In (x) и т. п., значения которых вычисляются по известным правилам, для определения значений других функций в АЯ вводится особый класс вспомогательных алгоритмов, которые выделяются и оформляются специальным образом.

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

Указатель функции является элементом арифметического или логического выражения. В указателе функции записывается имя вспомогательного алгоритма и список фактических параметров, передаваемых в качестве аргументов: Integfun

(a, b, h), ploshtr(a, b, c).

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

вует в дальнейшем вычислении значения выражения. Так, выполнение опера-

тора: у := интегфун (a, b, h) приведет к обращению к вспомогательному алго-

ритму вычисления интеграла функции, а выполнение оператора: s := ploshtr(a,

b, c) приведет к обращению к вспомогательному алгоритму вычисления пло-

щади треугольника, при этом результатом обращения будут значения функций,

соответствующие заданным фактическим аргументам.

Функции можно представить только как вспомогательные алгоритмы.

Объясняется это тем, что результат функции рассматривается как одно из про-

межуточных значений, необходимых для вычисления выражения. Чтобы вос-

пользоваться этим результатом, функцию необходимо не просто исполнить, а

вызвать из какого-то алгоритма.

Особенности оформления функций заключаются в описании параметров. В

список формальных параметров функций включаются только аргументы. Тип

результата, получаемого функцией, указывается в заголовке перед именем вспо-

могательного алгоритма аналогично тому, как если бы это был тип алгоритма в

целом. Тем самым вызов функции заменяет обращение к переменной соответст-

вующего типа. Однако следует четко понимать, что тип относится не к самой

функции, а к ее результату.

Примером описания вспомогательного алгоритма-функции является алго-

ритм вычисления площади треугольника по трем его сторонам:

вещ ploshtr(арг вещ a, b, c, рез вещ ploshtr)

нач вещ р

р := (a + b + c)/2

ploshtr := sqrt (p·(p a)·(p b)·(p с))

кон

Имя результата с точки зрения вызывающего алгоритма совпадает с

именем функции. Поэтому может показаться естественным использование име-

ни функции в качестве имени результата и в самой функции. Однако при этом

становится невозможным рекурсивное обращение функции к самой себе, так как

это обращение будет восприниматься как использование текущего значения ре-

зультата. Поэтому в качестве имени результата при рекурсивных вызовах в АЯ

используется специальное ключевое слово знач.__

  1. Этапы решения задач на ЭВМ

Этапы решения задач на ЭВМ (программирования)

Процесс подготовки задачи к решению на вычислительной машине называется программированием и условно включает следующие этапы.

1) Математическая формулировка задачи.

2) Выбор метода решения задачи.

3) Разработка алгоритма.

4) Запись алгоритма на алгоритмическом языке.

5) Тестирование программы.

6) Проведение расчетов, анализ результатов.

Не все этапы являются обязательными.

Первый этап состоит в анализе проблемы и в построении математической модели. На основе выделенных закономерностей, характеризующих моделируемое явление, уточняются входные и выходные данные и связи между ними.

«Математическая модель — приближенное описание какого-либо класса явлений внешнего мира, выраженное с помощью математической символики» (академик АК Тихонов). Таким образом, на этапе математической формулировки задача описывается в виде некоторой математической конструкции.

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

Третий этап представление выбранного метода решения в форме алгоритма. Алгоритм д.б. представлен так, чтобы каждая его операция была реализуема для ЭВМ.

На четвертом этапе алгоритм записывается в виде программы.

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

Наиболее типичные ошибки (исключения) принадлежат к двум классам ошибок: синтаксические и семантические.

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

Семантические ошибки проявляется на этапе выполнения программы в форме аварийных остановов работы и неправдоподобных результатов. Выявляют такие ошибки с помощью трассировки – пошагового исполнения команд программы.

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

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

«Экспериментальное тестирование программ может служить для доказательства наличия ошибок, но никогда не докажет их отсутствия» (Э. Дейкстра)

На шестом этапе программа поступает в эксплуатацию.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]