Введение в концепции программирования. Series 2. Episode 2

И. Л. Мусабиров, П. В. Окопный,
при участии канд. пед. наук, доц. Н. Г. Дмошинской

План лекции

  • Ранее в “Концепциях программирования”
  • Языки программирования. Как всё работает?
  • Языки разметки. Трансляция
  • Операционная система. Командный интепретатор. Unix Pipeline

Компьютер и Языки программирования. Как всё работает?

Что такое перевод? (Проблема, потребности стейкхолдера)

Человек и Машина: трудности перевода

Проблема:

  • Изначально компьютер (ср.: computing) – только для вычислений (“быстрые счёты”)
  • Компьютер оперирует числами и низкоуровневыми операциями (в двоичном коде), человек – нет
  • “Язык” компьютера привязан к типу процессора
  • Человек делает все операции по формальному описанию, сведению цифр и т.д. (ср.: счёты)

Человек и Машина: трудности перевода - 2

Решение:

  • Идея Грейс Хоппер (среди прочих):
    • Машиннонезависимый язык программирования
    • Пусть компьютер переводит сам себе (Компилятор)
  • Ричард Хэмминг:

Человек и Машина: трудности перевода - 3

Пишем на высокоуровневом ЯП, специальная программа (транслятор) переводит инструкции для процессора

Транслятор

Чем устный перевод отличается от перевода документов?

Транслятор. Определения

  • Translator (Транслятор) – система, осуществляющая перевод с одного языка на другой с сохранением смысла
  • Компилятор (Compiler) – система (ПО), осуществляющая перевод с одного языка на другой (обычно с ЯП высокого уровня в машинный код)
  • Интерпретатор (Interpreter) – система (ПО), компилирующая и выполняющая выражения ЯП одно за другим

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

Каков алгоритм перевода и что нужно знать чтобы переводить?

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

  • Syntax (Синтакс) – Алфавит (множество символов) и набор правил, определяющих отношения между символами и множествами символов в ЯП (Строение конструкций без учёта значения)
  • Semantics (Семантика)Значение, приписываемое символам и множествам символов в ЯП.

Компилятор

  • Аналогия: перевод законченного документа (включая структуру, оформление и т.д.)
  • Что делает: Преобразует программу на высокоуровневом ЯП в машинный код для конкретной архитектуры процессора
  • Примеры компилируемых языков: C, C++, Fortran, …
  • Достоинства комп. языков:
    • Высокая скорость
    • Исполнение независимо от средств исходного языка
  • Недостатки комп. языков:
    • Более длиный цикл разработки
    • Не подходят для интерактивной работы
    • Компиляция – ресурсоёмкий процесс

Компилятор: как работает?

  • На входе – программа (текстовый файл с исходным кодом на ЯП)
  • Процессинг:
    • Lexical analyzer
    • Syntactic Analyzer
    • Semantic Analyzer
    • Code generator + Optimizer
  • На выходе: Машинный код

Lexical analyzer (Лексический анализатор)

На входе: программный код

Что делает: Осуществляет высокоуровневый разбор программы, выделяя сл. элементы:

  • операторы (выражения)
  • блоки операторов (Напр., в фигурных или операторных скобках)
  • идентификаторы (имена переменных и т.д.)
  • логические части программы (процедуры, функции и т.д.)

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

Syntax analyzer (Синтаксический анализатор)

На входе: Токенизированный программный код

Что делает:

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

На выходе: Объектные модули и метки для линкера (linker)

Semantic analyzer (Семантический анализатор)

На входе: Объектные модули

Что делает:

  • Преобразование синтаксических конструкций в семантические (“вычленяем смысл из предложений”)
  • Последний этап, который зависит от ЯП, на следующем этапе машинный код зависит от архитектуры процессора

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

Code generator + Optimizer (Генератор машинного кода и оптимизатор)

На входе: Объектные модули

Что делает:

  • Выбор инструкций машинного кода
  • Определение порядка выполнения инструкций
  • Сопоставление регистров процессора переменным
  • Добавление данных для отладки

На выходе: Готовая исполняемая программа на языке, понятном конкретному процессору (точнее, архитектуре) (машинный код). Может исполняться без каких-либо дополнительных программ (в отличие от интерпретатора)

Компилятор: заключение

  • Достоинства: скорость выполнения, независимость от исходного ЯП
  • Недостатки: более длиный цикл разработки, не пригоден для интерактивного взаимодействия
  • Процессы: лексический, синтаксический, семантический анализ, генерация кода и оптимизация
  • На входе: программа на высокоуровневом ЯП, на выходе: машинный код для конкретной архитектуры

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

  • Аналогия: устный перевод диалога
  • Что делает: компилирует и выполняет выражения ЯП одно за другим (возможно, в диалоговом режиме)
  • Примеры интерпретируемых языков: R, Python, PHP …
  • Достоинства интерпретируемых языков:
    • Более высокая скорость разработки
    • Возможна интерактивная работа
  • Недостатки интерпретируемых языков:
    • Низкая скорость
    • Более высокие требования к ресурсам (делаем многие операции в памяти во время выполнения)
    • Привязка к программной платформе – нужен интерпретатор

Трансляторы и ЯП: заключение

  • Процесс трансляции, как и предполагает название, похож на перевод (передача смысла)
  • Компиляторы и интерпретаторы (и соотв. ЯП) влекут достоинства и недостатки
  • Нужно сочетание достоинств (скорость выполнения, скорость работы, интерактивность)
  • Существуют смешанные типы (напр., Java, Python): компиляция в промежуточное представление (байт-код). Выполняются в вирт. машине
  • В том числе для диалогового взаимодействия, напр. Julia – для анализа данных
  • Частично байт-компиляцию начинает поддерживать и R

Языки разметки: трансляция

Markdown:

  • Синтаксис?
  • Семантика?

Компьютер и Языки программирования. Как всё работает?

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

Как быть с диалогом и мультизадачностью?

Архитектура информационных систем: пример

Проблема:

  • Для каждой задачи писать гигантскую программу – неудобно и неэкономично
  • Есть типовые блоки задач и операций – нужно повторное использование
  • Человек лучше думает в диалоге, и работает часто тоже

Решение:

  • Развитие CompSci/IT – развитие абстракций и средств диалога:
    • Операционная система – управление доступом к аппаратным ресурсам
    • Протоколы и форматы –взаимодействие гетерогенных компонент

Как работает наша рабочая среда?

Обсудим на примере нашего стека технологий

  • Взаимодействие ПО через веб
  • ОС, интерпретатор

Взаимодействие ПО через веб

UC: Пользователь запросил в браузере веб-страничку (напр., из вашего публичного каталога)

Взаимодействие ПО через веб

  • Осуществляется доставка запроса на сервер (DNS, routing, протокол TCP/IP)
  • Сервер (машина) передает запрос по нужному порту серверу (программе)
  • Веб-сервер(программа) ожидает коммуникации по определённому протоколу (HTTP)
  • Веб-сервер определяет домен (doctor10.nosoc.io) и где искать набор правил
  • Веб-сервер разбирает ресурс (/p01/LOGIN/path), это файл
  • Веб-сервер находит его в файловой системе и возвращает
  • Браузер пытается обработать ответ, отображает HTML

Взаимодействие ПО через веб

  • Наличие стандартизованных форматов данных и протоколов обмена информацией позволяет экономно выстраивать гибкие и сложные архитектурно ИС из разнородных компонент
  • Протокол HTTP (Hyper-text transfert protocol), изначально предназначенный для отдачи (статических) веб-страниц в силу гибкости стал основой для многих распределённых информационных систем

ОС, интерпретатор

  • Операционная система: особенности
  • Интерпретатор командной строки

Операционная система

Рождение UNIX: управление ограниченными ресурсами (ещё одна история из Хэмминга)

[…] no single program or idea makes it work well. […] what makes it effective is […] a philosophy of using the computer. […] at its heart is the idea that the power of a system comes more from the relationships among programs than from the programs themselves. Many UNIX programs do quite trivial things in isolation, but, combined with other programs, become general and useful tools.

B. Kernighan, R. Pike

Операционная система: особенности

  • Гибкое управление ресурсами
  • Набор простых, но мощных абстракций (Всё – это файл, pipeline)
  • Изначальная нацеленность на многопользовательский режим и разделение ресурсов

Интерпретатор командной строки

  • Отвечает за организацию диалога, где отдельные предложения – это программы
  • Единый формат ввода-вывода (текст) и интерфейсы программ (stdin, stdout, stderr)
  • Набор мелких утилит-соединителей, выполняющих только одну операцию, “но хорошо”

Архитектура ИС -- заключение

Устойчивые архитектурные паттерны – возможность создания мелких разнородных функциональных элементов и единые интерфейсы коммуникации:

  • на уровне работы через интернет форматы и протоколы
  • на уровне операционной системы утилиты, форматы и pipeline
  • В чём преимущества?

Мышление разбиением на изолированые операции и взаимодействие через интерфейсы критически важно в анализе данных

  • Почему?

То же видим и в социальных системах – diversity при сохранении совместимости ведёт к появлению новых, эмерджентных свойств

Анонс сл. лекции

  • Домашнее задание: консоль (работа с текстом) + RMarkdown ~ 1–1,5 часа, до четверга
  • Сл. семинар: консоль (повторение) + выражения в R
  • Сл. лекция: начало цикла Множества. Логика. Дискретная вероятность. + Типы данных в R

Спасибо за внимание! Вопросы?

  • Лекцию читал: Илья Леонидович Мусабиров
  • Лекция подготовлена: И. Л. Мусабиров, П. В. Окопный,
    при участии канд. пед. наук. доц Н. Г. Дмошинской
  • Сайт курса: http://courses.nosoc.io
  • E-mail курса: intrpro2013@nosoc.io

NOSoc.io