Аннотация: В лекции вводится понятие НБФ грамматики, приводится определение порождающей и распознающей грамматики. Дается описание процесса трансляции.
Модели трансляции
Трансляторы
Программа, написанная на языке высокого уровня, перед исполнением должна быть преобразована в программу на «машинном языке». Такой процесс называется трансляцией, или компиляцией. По типу выходных данных различают два основных вида трансляторов:
- компилирующие окончательный выполнимый код;
- компилирующие интерпретируемый код, для выполнения которого требуется дополнительное программное обеспечение.
Окончательным выполнимым кодом являются приложения, реализованные как EXE-файлы, DLL-библиотеки, COM-компоненты. К интерпретируемому коду можно отнести байт-код JAVA-программ, выполняемый посредством виртуальной машины JVM.
Языки, формирующие окончательный выполнимый код, называются компилируемыми языками. К ним относятся языки С, C++, FORTRAN, Pascal. Языки, реализующие интерпретируемый код, называются интерпретируемыми языками. К таким языкам относятся язык Java, LISP, Perl, Prolog.
Как организовать онлайн трансляцию мероприятия?
В большинстве случаев код, получаемый в результате процесса трансляции, формируется из нескольких программных модулей. Программным модулем называется определенным образом оформленный код на языке высокого уровня. Процесс трансляции в этом случае может выполняться как единое целое – компиляция и редактирование связей, или как два отдельных этапа – сначала компиляция объектных модулей, а затем вызов редактора связей, создающего окончательный код. Последний подход более удобен для разработки программ. Он реализован в трансляторах языков С и С++.
Объектный код, создаваемый компилятором, представляет собой область данных и область машинных команд, имеющих адреса, которые в дальнейшем «согласуются» редактором связи (иногда называемым загрузчиком). Редактор связи размещает в едином адресном пространстве все по отдельности откомпилированные объектные модули и статически подключаемые библиотеки.
Будем называть выполнимой формой программы код, получаемый в результате трансляции исходной программы.
Процесс трансляции
Программу, написанную на языке программирования высокого уровня, называют исходной программой, а каждую самостоятельную программную единицу, образующую данную программу, — программным модулем. Для преобразования исходной программы в ее выполняемую форму (выполнимый файл) транслятор выполняет некоторую последовательность действий. Эта последовательность зависит как от языка программирования, так и от конкретной реализации самого транслятора. В ходе трансляции важно не просто откомпилировать программу, а получить при этом достаточно эффективный код.
В процессе трансляции выполняется анализ исходной программы, а затем синтез выполнимой формы данной программы. В зависимости от числа просмотров исходной программы, выполняемых компилятором, трансляторы разделяются на однопроходные, двухпроходные и трансляторы, использующие более двух проходов.
Как найти прямые трансляции на Ютубе на телефоне
К достоинствам однопроходного компилятора можно отнести высокую скорость компиляции, а к недостаткам — получение, как правило, не самого эффективного кода.
Широкое распространение получили двухпроходные компиляторы. Они позволяют при первом проходе выполнить анализ программы и построить информационные таблицы, используемые при втором проходе для формирования объектного кода.
На рисунке 2.1 представлены основные этапы, выполняемые в процессе трансляции исходной программы.
Рис. 2.1. Основные этапы трансляции программы
Фаза анализа программы состоит из:
- лексического анализа;
- синтаксического анализа;
- семантического анализа.
При анализе исходной программы транслятор последовательно просматривает текст программы, представимой как набор символов, выполняя разбор структуры программы.
На этапе лексического анализа выполняется выделение основных составляющих программы – лексем. Лексемами являются ключевые слова, идентификаторы, символы операций, комментарии, пробелы и разделители. Лексический анализатор не только выделяет лексемы, но и определяет тип каждой лексемы. При этом на этапе лексического анализа составляется таблица символов, в которой каждому идентификатору сопоставлен свой адрес. Это позволяет при дальнейшем анализе вместо конкретного значения (строки символов) использовать его адрес в таблице символов.
Процесс выделения лексем достаточно трудоемок и требует применения сложных контекстно-зависимых алгоритмов.
На этапе синтаксического анализа выполняется разбор полученных лексем с целью получения семантически понятных синтаксических единиц, которые затем обрабатываются семантическим анализатором. Так, синтаксическими единицами выступают выражения, объявление, оператор языка программирования, вызов функции.
На этапе семантического анализа выполняется обработка синтаксических единиц и создание промежуточного кода . В зависимости от наличия или отсутствия фазы оптимизации результатом семантического анализа может быть оптимизируемый далее промежуточный код или готовый объектный модуль.
К наиболее общим задачам, решаемым семантическим анализатором, относятся:
- обнаружение ошибок времени компиляции;
- заполнение таблицы символов, созданной на этапе лексического анализа, конкретными значениями, определяющими дополнительную информацию о каждом элементе таблицы;
- замена макросов их определениями;
- выполнение директив времени компиляции.
Макросом называется некоторый предварительно определенный код, который на этапе компиляции вставляется в программу во всех местах указания вызова данного макроса.
На фазе синтеза программы производится:
- генерация кода;
- редактирование связей.
Процесс генерации кода состоит из преобразования промежуточного кода (или оптимизированного кода) в объектный код. При этом в зависимости от языка программирования получаемый объектный код может быть представлен в выполнимой форме или как объектный модуль, подлежащий дальнейшей обработке редактором связей.
Так, процесс генерации кода является неотъемлемой частью фазы синтеза программы, а необходимость выполнения редактора связей зависит от конкретного языка программирования. Следует учесть, что на практике термин «генерация кода» часто применяют ко всем действиям фазы синтеза программы, ведущим к получению выполнимой формы программы.
Редактор связей приводит в соответствие адреса фрагментов кода, расположенных в отдельных объектных модулях: определяются адреса вызываемых внешних функций, адреса внешних переменных, адреса функций и методов каждого модуля. Для редактирования адресов редактор связей использует специальные, создаваемые на этапе трансляции, таблицы загрузчика. После обработки объектных модулей редактором связей генерируется выполнимая форма программы.
Источник: intuit.ru
Зачем нужны онлайн-трансляции?
Сегодня все большей популярностью пользуются онлайн-трансляции, по другому их называют – потоковые видео, Streaming Video (стрим) или лайфстриминг. Эта новая тенденция популярна для бизнес-аудитории и для людей “fear of missing out” (сокращенно FoMO), которые хотят быть всегда первыми, быть в курсе важных событий, происходящих прямо сейчас. В наше время, даже невозможно себе представить, что находясь в любой точке мира, мы сможем пропустить интересное или важное мероприятие. Имея под рукой ноутбук или смартфон, можно самому побывать везде, увидеть и услышать что угодно онлайн, в реальном времени.
Streaming Video, онлайн-трансляции, помогают нам:
- быть в курсе последних новостей прямо с места событий;
- повысить квалификацию в работе, учебе;
- присутствовать на мастер-классах, лекциях, семинарах;
- возможность смотреть концерты, спортивные соревнования, развлекательные шоу и т.д.
Стриминг видео
Сложно представить себя оторванным от информационного поля? Хочешь общаться в онлайн-чате? Смотри стримы.
Онлайн-стриминг это трансляция живого видео, и последние несколько лет смотреть стримы стало очень модно.
Зачем используют стриминг? С помощью стрима, блогеры могут вести обзор видео-игр, показывать своим зрителям окружающую обстановку, рекламировать бренды, путешествовать по всему миру. Зритель присутствует и может комментировать происходящее, общаться с другими участниками прямого эфира.
Сегодня платформы для передачи прямых эфиров имеют многие социальные сети: Facebook Live, Instagram Live, YouTube, Twitch, Live.ly и др.
Мировые бренды уже освоили эти платформы для прямых трансляции, чем привлекли миллионы новых потребителей к своим компаниям. Где, как не в прямом эфире, можно увидеть главу известного бренда и лично задать эму вопрос.
Хотите видеть место события в момент происходящего?
Новостные программы давно используют потоковые видео-трансляции, когда корреспондент передает информацию по ТВ с места события. Раньше телевизионщики были монополистами в этой нише. Теперь прямые трансляции стали доступны любому каналу, сайту, блогеру. Можно жить в городе или деревне и стать участником митинга, семинара, пресс-конференции, происходящих в любой точке мира.
Увидеть своими глазами финальную игру любимой команды, концерт мировой звезды. Стать свидетелем извержения вулкана или запуска космической ракеты.
Когда событие транслируется в реальном времени, тут уже ничего не вырежешь и не смонтируешь, поэтому желающих видеть прямую онлайн-трансляцию, а не видео в записи, становится все больше.
Как онлайн-трансляции помогают повысить квалификацию
Не так давно мы ездили в командировки, чтобы научить или научиться чему-то новому. Сейчас, все чаще стали использовать видео-трансляции высококвалифицированных специалистов для демонстрации новаторских методов работы. Эта современная тенденция применима в разных сферах деятельности, таких как медицина, строительство, нефте- и газо- добывающая промышленность, юриспруденция и судебное производство и др.
Обучение так же стало возможно дистанционно. А с появлением онлайн-трансляций можно присутствовать на лекциях профессоров с мировым именем, которые проводятся для широкой аудитории слушателей, и даже задавать вопросы и получать ответы, сидя дома перед экраном компьютера или передвигаясь на транспорте со смартфоном в руках.
Онлайн мастер-класс, живая реклама, лайфстриминг
Почти каждая известная личность, звезда, имеет свой блог, свою аудиторию в интернете. Никто из фанатов не пропустит интересное мероприятие любимого кумира, на котором можно присутствовать онлайн.
Потоковое видео дает возможность “в живую” увидеть, а это значит присутствовать, на обучающих мастер-классах известного шеф-повара, стилиста или художника и общаться с ними в реальном времени.
Маркетологи заметили, что продвижение товаров и брендов через прямые трансляции, эффективно увеличивает продажи. Последние несколько лет, крупные компании и малый бизнес в Америке и Западной Европе, все чаще инвестируют в живую рекламу. Это стало интереснее для потребителей, чем заезженные рекламные ролики.
Потоковые видео, стримы, хотят смотреть миллионные аудитории. Людям стало лень читать информацию в блогах, социальных сетях, если можно подключиться к онлайн-трансляции и увидеть все своими глазами.
Пора начать это использовать в своем бизнесе, чтобы не отстать от конкурентов. Может быть, в своей нише, вы будете лидером.
Источник: stream-park.ru
ЦП Автоматизированные системы управления и промышленная безопасность
Если языки программирования имеет уже более или менее короткую историю развития, то сама технология подготовки программ, написанных на любом языке программирования, вообще сформировались в начале 60 годов и с тех пор не претерпела существенных изменений. Заложенные тогда принципы оказывают влияние на способы использования стандартных библиотечных функций и разработки больших программ, текст которой содержится в нескольких файлах (модульное программирование).
Подготовка программы начинается с редактирования файла, содержащего текст этой программы, который имеет стандартное расширение для данного языка. Затем выполняется его трансляция, которая включает в себя несколько фаз: препроцессор , лексический, синтаксический, семантический анализ , генерация кода и его оптимизация.
В результате трансляции получается объектный модуль -некий «полуфабрикат» готовой программы, который потом участвует в ее сборке. Файл объектного модуля имеет стандартное расширение «.obj». Компоновка (сборка) программы заключается в объединении одного или нескольких объектных модулей программы и объектных модулей, взятых из библиотечных файлов и содержащих стандартные функции и другие полезные вещи. В результате получается исполняемая программа в виде отдельного файла (загрузочный модуль, программный файл) со стандартным расширением -«.exe», который затем загружается в память и выполняется.
Трансляция и ее фазы
Собственно трансляция начинается с лексического анализа программы. ЛЕКСИКА языка программирования — это правила «правописания слов » программы, таких как идентификаторы, константы, служебные слова, комментарии. Лексический анализ разбивает текст программы на указанные элементы. Особенность любой лексики — ее элементы представляют собой регулярные линейные последовательности символов . Например, ИДЕНТИФИКАТОР — это произвольная последовательность букв, цифр и символа «_», начинающаяся с буквы или «_».
СЕМАНТИКА языка программирования — это смысл, который закладывается в каждую конструкцию языка. Семантический анализ -это проверка смысловой правильности конструкции. Например, если мы в выражении используем переменную, то она должна быть определена ранее по тексту программы, а из этого определения может быть получен ее тип. Исходя из типа переменной, можно говорит о допустимости операции с данной переменной.
Модульное программирование, компоновка
Полученный в результате трансляции ОБЪЕКТНЫЙ МОДУЛЬ включает в себя готовые к выполнению коды команд, адреса и содержимое памяти данных. Но это касается только собственных внутренних объектов программы (функций и переменных).
Обращение к внешним функциям и переменным, отсутствующим в данном фрагменте программы, не может быть полностью переведено во внутреннее представление и остается в объектном модуле в исходном (текстовом) виде. Но если эти функции и переменные отсутствуют, значит, они должны быть каким-то образом получены в других объектных модулях. Самый естественный способ -написать их на том же самом Си и оттранслировать. Это и есть принцип МОДУЛЬНОГО ПРОГРАММИРОВАНИЯ — представление текста программы в виде нескольких файлов, каждый из которых транслируется отдельно. С модульным программированием мы сталкиваемся в двух случаях:
— когда сами пишем модульную программу;
— когда используем стандартные библиотечные функции.
В заключение отметим, что источником объектного модуля может быть не только Си-программа, но и программа, написанная на любом другом языке программирования, например, на Ассемблере. Но в этом случае необходимы дополнительные соглашения по поводу «стыковки» вызовов функций и обращений к данным в различных языках.
Под трансляцией в самом широком смысле можно понимать процесс восприятия компьютером программы, написанной на некотором формальном языке. При всем своем различии формальные языки имеют много общего и, в принципе, эквиваленты с точки зрения принципиальной возможности написать одну и ту же программу на одном из них.
Следовательно, компиляция и интерпретация отличаются не характером и методами анализа и преобразования объектов программы, а совмещением фаз обработки этих объектов во времени. То есть при компиляции фазы преобразования и выполнения действий разнесены во времени, но зато каждая из них выполняется над всеми объектами программы одновременно. При интерпретации, наоборот, преобразование и выполнение действий объединены во времени, но для каждого объекта программы.
Если посмотреть на эти различия несколько с другой стороны, то можно заметить, что интерпретатор непосредственно выполняет действия, связанные с определением или преобразованием объектов программы, а компилятор — переводит их на другой (не обязательно машинный язык). Отсюда можно сделать несколько выводов:
— для выполнения программы, написанной на определенном формальном языке после ее компиляции необходим интерпретатор, выполняющий эту программу, но уже записанную на выходном языке компилятора ;
— в практике построения трансляторов часто встречается случай, когда программа компилируется со входного языка на некоторый промежуточный уровень (внутренний язык), для которого имеется программный интерпретатор. Многие языковые системы программирования, называемые интерпретаторами, на самом деле имеют фазу компиляции во внутренне представление, на котором производится интерпретация.
Выходной язык компилятора может быть машинным языком для компьютера с другой архитектурой, нежели тот, в котором работает компилятор. Такой компилятор называется КРОСС-КОМПИЛЯТОРОМ, а сама система программирования КРОСС-СИСТЕМОЙ. Такие системы используются для разработки программ для архитектур, не имеющих собственных операционных систем или систем программирования (контроллеры, управляющие микропроцессоры).
Таким образом, граница между компиляцией и интерпретацией в трансляторе может перемещаться от входного языка (тогда мы имеем чистый интерпретатор) до машинного кода (тогда речь идет о чистом компиляторе).
Создание слоя программной интерпретации для некоторого промежуточного языка в практике построения трансляторов обычно встречается при попытке обеспечить совместимость для имеющегося многообразия языков программирования, операционных систем, архитектур и т.д. То есть определяется некоторый внутренний промежуточный язык, достаточно простой, чтобы для него можно было написать интепретатор для всего имеющегося многообразия операционных систем или архитектур. Затем пишется одни (или несколько) компиляторов для одного (или нескольких) входных языков на этот промежуточный уровень. Приведем примеры такой стандартизации:
— для обеспечения совместимости и переносимости трансляторов на компьютеры с различной архитектурой или с различными операционными системами был разработан универсальный внутренний язык ( P-код). Для каждой такой архитектуры необходимо реализовать свой интерпретатор P-кода. При этом все разнообразие имеющихся компиляторов с языков высокого уровня на P-код может быть использовано без каких-либо изменений.
— язык программирования Java аналогично был разработан для обеспечения переносимости различных приложений в среде Internet.
Структура транслятора
Самое главное в процессе трансляции состоит в том, что он не является линейным, то есть последовательным преобразованием фрагмента программы одного языка на другой. На процесс трансляции одного фрагмента обязательно оказывают влияние другие фрагменты программы. Поэтому трансляция представляет собой несколько последовательных фаз анализа программы, на каждой из которой текст программы разделяется на все более «тонкие» компоненты, а информация о них группируется в некоторое внутреннее представление программы (деревья, таблицы). Затем, или параллельно с этим осуществляется синтез программы уже на выходном языке программирования с использованием информации из внутреннего представления.
Отдельные фазы трансляции могут быть связаны между собой различным образом, через данные в памяти или через файл, что не меняет сущности процесса:
— каждая фаза транслятора получает файл данных от предыдущей фазы, обрабатывает его (линейным или каким-либо другим, например, рекурсивным алгоритмом), создает внутренние таблицы данных и по ним формирует выходной файл с данными для следующей фазы;
— фазы трансляции вызывают одна другую в процессе обработки соответствующих языковых единиц. Синтаксический анализ является обычно центральным в такой структуре. То есть основной программой транслятора является синтаксический анализатор, который при анализе структурной единицы языка, называемой предложением (выражение, оператор, определение типа или переменной), вызывает лексический анализатор, для чтения очередной лексической компоненты (идентификатора, константы), а по завершении разбора — семантическую процедуру, процедуры генерации кода или интерпретации. Из этой схемы выпадает только препроцессор , который обычно представляет собой независимую предварительную фазу трансляции.
Источник: www.automationlab.ru