Компиляция и интерпретация программ

Интерпретация - это процедура пооператорного выполнения программы.

Алгоритм работы простого интерпретатора следующий:

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

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

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

Достоинства интерпретации

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

Недостатки интерпретации

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

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

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

  • C++ - сложный и крайне гибкий компилируемый язык, используемый для решения широчайшего спектра задач, начиная от программирования микросхем и заканчивая написанием программ для обычных компьютеров. С помощью данного языка удается писать очень эффективные приложения, но для этого требуется хорошая сноровка и много усилий. Для решения простых задач, где производительность не является критической, например, для создания веб-сайтов, удобно пользоваться менее сложными языками.
  • Java - мощнейший язык программирования, используемый для создания очень широкого спектра приложений. Код программы, написанной на Java, компилируется в так называемый байт-код, который затем исполняется на специальном интерпретаторе - виртуальной машине Java. Главной отличительной особенностью байт-кода является его кроссплатформенность: байт-код выполняется на всех виртуальных машинах Java, которые могут быть установлены на любых устройствах, начиная с мобильных телефонов и заканчивая компьютерами, вне зависимости от операционной системы.
  • Javascript является интерпретируемым языком и используется прежде всего для программирования элементов веб-страниц, отображаемых с помощью браузера. Javascript интерпретируется и выполняется прямо внутри браузера. Без Javascript невозможно было бы создать функцию автодополнения в строке поиска, интерактивный чат в социальных сетях, слайд-шоу для показа изображений и многие другие приложения.
  • PHP также является интерпретируемым языком, используемым для создания веб-сайтов, но ключевое отличие от Javascript заключается в том, что интерпретатор находится на стороне сервера. Сервер - это тот компьютер, который формирует веб-страницы в ответ на запрос веб-браузера. PHP является одним из наиболее популярных языков, используемых для создания веб-сайтов.
  • Actionscript - интерпретируемый язык, выполняющий те же функции, только не в браузере, как Javascript, а в Flash-контейнере. Другими словами, интерпретатором для Actionscript является флеш-конейнер. Все flash-приложения, в том числе и показ видео на YouTube, написаны на языке Actionscript.
  • Pascal является достаточно простым, но весьма удобным языком программирования. Легость его освоения и широкая распространенность средств для работы с этим языком сделали его крайне популярным в образовательных целях. Кроме того, Паскаль положен в основу других языков программирования. Именно им мы будем пользоваться для освоения нашего курса.

Какие компоненты образуют язык программирования?

Алфавит - это фиксированный для данного языка набор основных символов, из которых должен состоять любой текст, написанный на данном языке.

Синтаксис - это правила построения фраз, которые определяют, какие комбинации являются осмысленными предложениями на данном языке.

Семантика определяет смысловое значение предложений языка. Семантика определяет, определяет, какие последовательности действий описываются теми или иными фразами языка.

Понятия алгоритмических языков

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

  1. Имена (идентификаторы) - употребляются для обозначения объектов программы (переменных, массивов, функций и др.)
  2. Операции:
    • Арифметические +, -, *, / и др.
    • Логические и, или, не
    • Операции отношения <, >, <=, >=, <>
    • Операции сцепки (конкатенации, присоединения), обозначаются знаком "+".
  3. Данные - величины, обрабатываемые программой. Имеется три основных вида данных: константы, переменные и массивы.
    • Константы - это данные, которые зафиксированы и не меняются в процессе выполнения программы. Примеры констант:
      • Числовые: 3.14, 1
      • Логические: да (истина), нет (ложь)
      • Символьные: "А", "?"
      • Литерные (содержат произвольное количество символов): "Занятие №2", "" (пустая строка)
    • Переменные - это данные, которые могуть меняться в ходе выполнения программы. Например, в процессе выполнения программы изменяется переменная счетчика цикла с параметром.
    • Массивы - это последовательности однотипных элементов, число которых фиксировано и которым присвоено одно имя. Доступ к элементам в массиве можно получить с помощью его индекса. Например, в массиве могут храниться строки с именами учащихся данной группы.
  4. Выражения - предназначаются для выполнения необходимых вычислений, состоят из констант, переменных, указателей функций (см. ниже), объединенных знаками операций.
    • Арифметические выражения служат для определения одного числового значения.
      (1+sin(x))/2
    • Логические выражения описывают условия, которые могут удовлетворяться и не удовлетворяться.
      Рассмотрим логическое выражение x*x + y*y < r*r, определяющее принадлежность точки с координатами (x,y) внутренней области круга радиусом r с центром в начале координат. При x=1, y=1, r=2 значение этого выражения "истина", при x=2, y=2, r=1 - "ложь".
    • Строковые (литерные) выражения, значениями которых являются тексты.
      Рассмотренная выше операция конкатенации является примером литерного выражения. Если A = "куст", а B = "зеленый", то значение выражения A + B есть "куст зеленый".
  5. Команды - это наиболее крупное и содержательное понятие языка: каждая команда представляет собой законченную фразу языка и определяет вполне законченный этап обработки данных.
    • Неисполняемые команды - те команды, которые предназначены для описания данных и структуры программы (например, объявление переменных).
    • Исполняемые команды - те команды, которые выполняют различные действия над данными.

Среда разработки

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

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

Консольные и графические приложения

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

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

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

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

Структура программы в Паскале

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

Во-первых, любая программа должна начинаться так:

  program <имя_программы>;
  begin;

А заканчиваться должна так:

  end.

Скорее всего, в программе потребуется воспользоваться теми или иными переменными. Для их объявления используется директива var, которая помещается между после слова program и до слова begin, относящегося к началу программы:

  program test;
  var
    x: integer;
    y: real;
  begin
    ...
  end.

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

Для лучшей читаемости операторы размещаются на разных строках. Иначе получилось бы что-то такое:

  program test;var x:integer;y:real;begin;...;end.

Кроме того, необходимо отметить, что Паскаль не чувствителен к регистру букв, т.е. ключевые слова и прочие конструкции программы можно писать как заглавными, так и строчными буквами, а также в используя сочетание тех и других. Например, слово program можно писать так: Program, и так: PROGRAM, и так: PrOgRaM - и ничего не изменится.

Типы переменных в Паскале

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

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

  var
    r: Real; { переменная вещественного типа (с плавающей точкой) }
    i: Integer { переменная целого типа }
    c: Char { переменная-символ }
    b: Boolean { логическая переменная }
    s: String { переменная строки }

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

Дано натуральное трехзначное число. Найти сумму его цифр.

      program test;
      var
        a, d1, d2, d3 : integer; { di - "digit i", "цифра i" }
      begin
        write('Введите натуральное трехзначное число: ');
        readln(a);
        d1 := a div 100;
        d2 := a mod 100;
        d3 := d2 mod 10;
        d2 := d2 div 10;
        write('Сумма цифр числа ', a, ': ', d1 + d2 + d3);
      end.
    

Для того, чтобы найти цифры трехзначного числа, записанного в десятичной системе счисления (основание с.с. 10), необходимо сделать следующее: поделить исходное число на 100, чтобы найти, сколько сотен укладывается в заданном числе. Далее необходимо посчитать остаток от этого деления, чтобы потом найти количество десятков в числе и количество единиц. Количество десятков есть частное деления остатка на 10, а количество единиц - остаток от этого деления. При этом в программе единицы считаются сначала, а десятки потом - для того, чтобы не вводить лишние переменные.

Считать с клавиатуры 4 числа и вывести их одно под другим.

      program test;
      var a,b,c,d : integer;
      begin
        writeln('Введите четыре числа:');
        readln(a,b,c,d);
        writeln('Вот:');
        write(inttostr(a) + #13#10 + inttostr(b) + #13#10
          + inttostr(c) + #13#10 + inttostr(d));
        { #13 - возврат каретки, #10 - перенос строки }
      end.
    

Функция inttostr превращает целое число в строку. Если этого превращения не сделать, возникнет ошибка, т.к. программа попытается сложить (знак "+") целые числа со строками "#13#10".

Считать с клавиатуры 4 числа и вывести их в виде двух строк по два числа в каждой строке. Числа в рамках строки должны быть разделены знаком табуляции.

      program test;
      var a,b,c,d : integer;
      begin
        writeln('Введите четыре числа:');
        readln(a,b,c,d);
        writeln('Вот:');
        write(inttostr(a) + #9 + inttostr(b) + #13#10
          + inttostr(c) + #9 + inttostr(d));
        { #9 - знак табуляции }
      end.
    

Функция inttostr превращает целое число в строку. Если этого превращения не сделать, возникнет ошибка, т.к. программа попытается сложить (знак "+") целые числа со строками "#13#10".

Стандартные математические функции

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

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

Таблица стандартных функций алгоритмического языка

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

Название и математическое обозначение функции
Указатель функции
  Абсолютная величина (модуль)    | х |     abs(x)  
  Корень квадратный     sqrt(x)
Степень y числа x   xy     power(x,y)
  Натуральный логарифм    ln x   ln(x)
  Экспонента (степень числа е ~ 2.72)   ex   exp(x)
  Целая часть х (т.е. максимальное целое число,не превосходящее х)     int(x)
  Остаток от деления целого х на целое y     x mod y
  Случайное число в диапазоне от 0 до х (не включая x)     rnd(x)
  Синус (угол в радианах)    sin x   sin(x)
  Косинус (угол в радианах)   cos x   cos(x)
  Тангенс (угол в радианах)   tg x   tg(x)
  Котангенс (угол в радианах)   ctg x   ctg(x)
  Арксинус (главное значение в радианах)   arcsin x    arcsin(x)
  Арккосинус (главное значение в радианах)   arccos x   arccos(x)
  Арктангенс (главное значение в радианах)   arctg x   arctg(x)
  Арккотангенс (главное значение в радианах)    arcctg x   arcctg(x)

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

  • sin(3.14)
  • sin(x)
  • min(a,5)
  • max(a+b, a*b)
  • sin((exp(x)+1)*2)

Правила записи арифметических выражений

Арифметические выражения записываются по следующим правилам:

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

Примеры записи арифметических выражений

Математическая запись Запись на школьном алгоритмическом языке
x * y / z
x / ( y * z )   или   x / y / z
( power(a,3) + power(b,3) ) / ( b*c )
( a[i+1] + b[i-1] ) / ( 2*x*y )
( -b + sqrt(b*b - 4*a*c)) / ( 2*a )
0.49 * exp(a*a - b*b) + ln(cos(a*a)) ** 3
x/(1 + x*x/(3 + power(2*x,3)))

Типичные ошибки в записи выражений:

  • 5x + 1 Пропущен знак умножения между 5 и x
  • a + sin x Аргумент x функции sin не заключен в скобки
  • ((a + b)/power(c,3) Не хватает закрывающей скобки

Домашнее задание

  • Установить PascalABC.NET
  • 1.17 в,д,е,ж,з,и,л,м,н,о,п,с; 1.21
  • Ответить на вопросы
    1. Что такое интерпретация и компиляция?
    2. Каков алгоритм работы интерпретатора?
    3. Каковы достоинства интерпретации?
    4. Каковы недостатки интерпретации?
    5. Дайте определение понятиям "алфавит", "синтаксис" и "семантика".
    6. Что такое среда разработки?
    7. Что означают понятия "консольное приложение" и "графическое приложение"?
Использованные материалы

Дата последнего изменения: 26 декабря 2014