Главная /
Разработка компиляторов
Разработка компиляторов - ответы на тесты Интуит
В данном курсе рассматриваются теоретические основы и практические методы создания компиляторов языков программирования. Изложение ведется на основе языка программирования C# и платформы .NET.
Список вопросов:
- # Когда появилась платформа .NET?
- # В .NET исходные тексты программ компилируются в специальное промежуточное представление, которое называется:
- # Во время трансляции в .NET промежуточное представление не интерпретируется, а вместо этого используется механизм::
- # В .NET все сервисы, предоставляемые программисту платформой, оформлены в виде:
- # С помощью какого механизма в .NET происходит обработка ошибок?
- # При создании .NET основной упор был сделан на следующие языки:
- # Существуют следующие версии MSIL:
- # Извлечение из MSIL исходных текстов путем дизассемблированя вряд ли имеет смысл, так как имена локальных переменных, констант и параметров сохраняются только:
- # Для изучения сгенерированного MSIL-кода можно использовать утилиту:
- # В единой объектно-ориентированная модель классов .NET которой все классы унаследованы от:
- # Основные сервисы .NET сосредоточены в пространстве имен:
- # В .NET единая модель объектов распространяется сразу на:
- # В первом приближении сборка - это:
- # Причиной появления понятия сборки можно считать:
- # Для того чтобы сборки действительно были независимыми от системы и от других сборок, необходимо, чтобы они сопровождались явным описанием:
- # Манифест: описание сборки позволяет:
- # Каждая сборка имеет уникальное имя, которое состоит из следующих частей:
- # Общие сборки сопровождаются номером версии в следующем формате:
- # Типами проверок безопасности в .NET являются:
- # Поддерживает ли .NET удаленный вызов объектов?
- # Моделями обеспечения безопасности в .NET являются:
- # В Common Type System все типы делятся на следующие категории:
- # Какие типы данных являются основными в системе типов данных .NET:
- # В С# возможно определение:string s = "Hello C#";под которым подразумевается следующее присваивание:
- # Типы данных, напрямую поддержанные компилятором и допускающие определенные сокращения записи - это:
- # Полный набор примитивных типов .NET поддерживает:
- # В C# объявить value type можно так:
- # Для типа-значения верно:
- # При создании ссылочные типы инициализируются значением:
- # В C# ссылочные типы можно создать так:
- # В следующем примере:ArrayList a = new ArrayList(); for (int i=0; i < 10; i++) { Point p; p.x = p.y = i; a.Add(p); } мы добавляем тип-значение:
- # Процесс преобразования типа-значения в ссылочный тип называется:
- # В ходе распаковки проверяется, что исходная ссылочная переменная:
- # В данном примере:public static void Main() { Int32 v = 5; Object o = v; v = 123; Console.WriteLine (v + ", " + (Int32) o); }операция упаковки производится:
- # Языки программирования C# или Visual Basic.NET, поддерживают операции упаковки и распаковки:
- # При недостаточном понимании происходящих "за кадром" процессов операции упаковки и распаковки, прозрачных для программиста, может потерять:
- # Управление памятью с точки зрения компилятора существенно ограничено возможностями:
- # Управление памятью при разработке компилятора является вопросом одновременно:
- # На компилятор языка программирования возлагается ответственность:
- # Основными фазами работы с памятью являются:
- # К проблемам управления пмятью можно отнести:
- # Освобождение ресурсов, ассоциированных с какими-либо внешними сущностями, обычно требует:
- # Необходимо различать:
- # Примерами различных путей доступа к структуре являются:
- # Какие противоположные полюсы существует у проблемы утилизации мусора:
- # Данный пример:void* p = malloc (32000); p = q;иллюстрирует:
- # Информация, известная во время компиляции - это:
- # Какие языки разрешают описание массивов с границей, неизвестной во время компиляции:
- # В языке C используется следующая методика управления памятью:
- # Где используется сборка мусора, как методика управления памятью:
- # В последнее время в развитии языков программирования наблюдается полный или частичный отказ от предоставления программисту:
- # Недостатком неявного управления памятью является:
- # Когда большинство исследователей было уверено, что неявное управление памятью окончательно вытеснило все остальные методы:
- # Что помогло неявному управлению памятью возвратить себе позиции среди практических языков программирования:
- # Фазами управления памятью являются:
- # Перемещение указателя стека - это:
- # Можно выделить следующие основные методы управления памятью:
- # Для статического управления памятью верны следующие утверждения:
- # Простые переменные, структуры и массивы фиксированного размера, составляют набор данных следующих языков:
- # В Фортране вся память может быть выделена статически и во время выполнения программы будут меняться только значения простых переменных и элементы массива, а для этого каждая функция транслируется:
- # В сложных языках программирования для распределения памяти приходится отталкиваться от значений, которые:
- # Для стекового управления память верны следующие утверждения:
- # Языками, пригодными для стекового управления памятью, являются:
- # Данная программа:var in : integer; function Digits (integer n) : integer; var m : integer; begin if n < 10 then return n else begin m := n div 10; return n - m*10 + Digits (m); end; end; begin read (in); writeln(Digits(in)); end. используется:
- # Невозможно гарантировать последовательность выходов из процедур и потому чисто стековый механизм управления памятью недостаточен:
- # Блок памяти, части которого выделяются и освобождаются способом, не подчиняющимся какой-либо структуре - это:
- # Самая сложная часть управления кучей - это:
- # Самый простой способ отслеживания свободной памяти заключается в приписывании:
- # В отличие от счетчиков ссылок, механизм разметки памяти не приводит:
- # В каком году Шорром и Уэйтом был предложен алгоритм с обращением указателей?
- # Исследования показали, что для большинства программ верны следующие предположения:
- # Основными механизмом работы с памятью в .NET являются:
- # Последовательность эквивалентных преобразований исходной программы, уменьшающих ее стоимость - это:
- # Эффективность оптимизации зависит от:
- # Полезность применения оптимизации обусловлена следующими причинами:
- # Применение оптимизаций способствует:
- # В зависимости от уровня представления программы различают следующие виды оптимизации:
- # С точки зрения эффективности наиболее предпочтительной является:
- # В зависимости от размера фрагмента оптимизации различают следующие виды оптимизации:
- # Возможны следующие зависимости между оптимизирующими преобразованиями:
- # Преобразования T1 и T2 называются независимыми, если применение одного из них к программе:
- # Если преобразование T1 открывает дополнительные возможности для проведения преобразования T2, то - это:
- # Стадиями оптимизации являются:
- # Выделение некоторого участка программы, к которому может быть применено преобразование - это:
- # Задачу фрагментации решает:
- # Одним из самых простых видов оптимизаций является:
- # Для реализации покадровой оптимизации используют понятие:
- # Пара конечных множеств (V, E), называемых соответственно множествами вершин и дуг, при этом множество дуг представляет собой совокупность пар вершин - это:
- # Программу для оптимизации удобно представлять в виде:
- # Граф потока управления удовлетворяет следующим требованиям:
- # В качестве алфавита операторов данной программы:int F (int a, int b) { int g = a, m = b; if (a < b) {g = b; m = a;} while (m) { int s = g; g = m; m = s % m; } return g; } выступает следующее множество:
- # При описании программ с использованием потока управления необходимо, чтобы разметка графа потока управления сопоставляла пустой оператор только тем вершинам, для которых число исходящих дуг:
- # При описании программ с использованием потока управления, два слова в алфавите операторов объявляются эквивалентными в том и только том случае, когда:
- # При использовании def-use chains необходимо, чтобы множества входов и выходов для разных операторов:
- # При использовании def-use chains отображение DU описывает, как:
- # Для формализации удаления пустого оператора требуется представление программы в виде:
- # При формализации удаления пустого оператора вершина графа, помеченная пустым оператором:
- # В данном примере: jmp .L1 .L1: movl buffer, %eax addl %edx, %eax movl buffer, %eax addl %edx, %eaxпроисходит:
- # В данном примере: jne .L1 movl buffer, %eax jmp .L3 .L1: jmp .L2 jne .L2 movl buffer, %eax jmp .L3 происходит:
- # Удаление мертвого кода заключается в удалении такого оператора, у которого:
- # Для проведения чистки циклов вверх необходима фрагментация программы на уровне:
- # При чистке циклов вниз, выходной вершиной является такая вершина, среди непосредственных преемников которой есть вершина:
- # Границы, переменная и инкремент циклов должны быть одинаковыми, что является контекстным условием корректности:
- # Раскрутка циклов заключается в дублировании:
- # Замена (в частных случаях) использования более дорогих операций более дешевыми - это:
- # К упрощениям выражений можно отнести:
- # Если среди всех вычисляемых на участке экономии выражений выделяются эквивалентные, и затем их вхождения заменяются на вхождение новой переменной, хранящей заранее вычисленное значение этого общего выражения, то это:
- # При глобалной оптимизации данного фрагмента исходной программы:y = f(x); a = y*2; if (y == f(x)) z = y*2+a; else z = f(x)*2+a; t = f(x)*2+a+z;возможной остаточной программой будет:
- # В задачу анализа потока управления входит определение свойств:
- # Анализ потока управления производится над:
- # Основное употребление анализа потока управления в оптимизации - это:
- # Основным способом представления потока управления программы является:
- # Последовательность вершин, такая, что между каждой последующей и предыдущей вершиной в графе существует ребро - это:
- # Любая вершина обязательно предшествует:
- # Отношение обязательного предшествования обозначается символом:
- # Отношение обязательного предшествования:
- # Отношение непосредственного предшествования - это:
- # Задачи проверки сводимости и построения статической формы единственного присваивания могут быть решены с помощью:
- # Взаимно однозначное отображение множества вершин графа на отрезок натурального ряда [1..|V|] называется:
- # Дерево, содержащее все вершины графа и некоторые его дуги:
- # Глубинное остовное дерево - это:
- # Существует следующие типы дуг графа по отношению к данному глубинному остовному дереву:
- # Необходимо различать:
- # Дуги, которые входят в состав остовного дерева - это:
- # Дуги, чей конец достижим из начала в остовном дереве называются:
- # Дуги, чье начало достижимо из конца в остовном дереве называются:
- # Состояние вершины, когда вершина еще не рассматривалась алгоритмом обозначается:
- # Состояние вершины, когда вершина еще рассматривается алгоритмом обозначается:
- # Для определения типа дуги используется:
- # Каждая обратная дуга определяет в графе потока управления:
- # Произвольный подграф графа управления называется:
- # Альтом называется:
- # Алгоритм выделения максимального альта, для которого данная вершина p является начальной, включает следующие шаги:
- # Свойства альтов дают возможность использовать их для определения:
- # Луч - это:
- # Множество максимальных лучей образует:
- # Сильно связный подграф - это:
- # Множества входных и начальных вершин для компонент сильной связности:
- # Для выделения сильно связных подграфов, достаточно научиться:
- # Компонента сильной связности, являющееся областью своей вершины, имеющей минимальный номер в нумерации Post среди всех остальных вершин этой компоненты называется:
- # Набор областей всех вершин при нумерации Post является:
- # Иерархия вложенных зон - это один из способов:
- # Стягивание линейных компонент переводит граф:
- # Признаком чего является то, что вершина со следующим номером - во-первых, является бивершиной, а во-вторых, ее номер - максимальный среди номеров всех потомков вершин текущей линейной компоненты:
- # Задачей анализа потоков данных является:
- # Общая семантика присваивания заключается в вычислении выражения, стоящего:
- # В случае, когда выражение в правой части не имеет побочных эффектов, а переменная в левой части более нигде не используется, данный оператор становится:
- # Идея анализа потока управления заключается в следующем:
- # На смысл каждой конструкции может оказывать влияние любая конструкция, из которой:
- # Для правильного учета контекста необходимо учесть влияние всех путей до данной вершины, сначала определив влияние каждого пути, а затем:
- # При наличии контуров множество всех путей в графе управления становится:
- # С помощью какого способа можно решать задачи анализа потоков данных?
- # В данном примере:struct S {int a; int b}; int F (int n, struct S * v) { int i, s = 0; for (i=0; i<n; i++) { int q = (v+i)->a - (v+i)->b; --- 1 if (q < 0) s += (v+i)->a + (v+i)->>b; --- 2 else (v+i)->b = q; (v+i)->a = (v+i)->b; --- 3 } return s; } эквивалентны следующие вхождения выражения (v+i)->b:
- # Для каждого вхождения переменной требуется определить множество присваиваний, такое, что для каждого из них существует путь, в котором между ним и данным вхождением отсутствуют другие присваивания той же переменной - так формулируется задача:
- # В выяснении, где именно устанавливаются значения того или иного вхождения данной переменной заключается:
- # К классическим задачам анализа потоков данных можно отнести:
- # Cледующим свойством: существует путь через данную вершину, начинающийся присваиванием данной переменной и кончающийся ее использованием, не содержащий иных присваиваний той же переменной - обладают:
- # Анализ потоков данных состоит из следующих стадий:
- # В учете влияния отдельного оператора в предположении, что уже имеется решение задачи анализа потоков данных перед этим оператором заключается:
- # На какой стадии анализа потоков данных, происходит решение задачи анализа для каждого пути, ведущего в данную вершину и затем выделение общей части всех таких решений:
- # Поточечное распространение отношений равенства и порядка вводит:
- # Разметку Us назовем неподвижной точкой отображения функции перехода F тогда и только тогда, когда:
- # Разметка представляет собой некоторый:
- # Набор потоковых утверждений - это:
- # Процесс решения задачи анализа потоков данных может быть описан как:
- # Основной проблемой разметки и потоковых функции является:
- # Для определения завершаемости алгоритма используется принцип:
- # Если функция сохраняет отношение порядка, то она называется:
- # Если функция является гомоморфизмом относительно полурешеточной операции, то она называется:
- # Дистрибутивная функция всегда:
- # Если L - ограниченная полурешетка конечной высоты, f - монотонная функция, то тогда можно показать что:
- # Набор монотонных функций f1,f2,...,fk соответственно на полурешетках L1,L2,...,Lk индуцирует:
- # Полурешетка конечной высоты L, представляет собой:
- # Если фактически разметка before ассоциируется с входящими ребрами вершины, а разметка after - с исходящими, то такая задача называется:
- # Достижимые определения являются:
- # В качестве полурешетки потоковых фактов фиксируется:
- # Живые переменные - это:
- # Итеративный подход дает:
- # При итеративном перевычислении разметок с использованием рабочего списока вершин - опустошение списка свидетельствует о том, что:
- # Следующие шаги, необходимы для решения задачи анализа потока данных с помощью итеративного подхода:
- # Трансляторы, ориентированные на платформу .NET, должны генерировать код:
- # MSIL, является:
- # Программы на MSIL переводятся в исполняемый код реального процессора:
- # Программы на MSIL переводятся в исполняемый код реального процессора c помощью:
- # Основными чертами архитекутры виртуальной машины MSIL являются:
- # В MSIL существуют следующие варианты хранения переменных:
- # Статическая область памяти предназначена:
- # Локальная память выделяется:
- # Куча предназначена для хранения:
- # При реализации языков со вложенными процедурами и процедурными значениями, необходимо обеспечить доступ:
- # Если язык допускает использование вложенных процедур в качестве переменных процедурного типа, то единственным способом для реализации такого механизма в безопасном режиме является:
- # Машина MSIL ориентирована на безопасность работы:
- # В безопасном режиме указатели на локальные переменные могут быть только:
- # Присваивание указателей на локальные переменные в другие переменные:
- # В .NET SDK входит программа PEVerify, которая осуществляет:
- # Какая команда MSIL осуществляет загрузку константы:
- # Какая команда MSIL осуществляет загрузку адреса статического поля:
- # Какая команда MSIL осуществляет загрузку адреса поля объекта:
- # Для загрузки значений на стек предназначены следующие команды MSIL:
- # Команда stind берет со стека адрес значения вместе с самим значением:
- # Команды stloc, stfld, stsfld эквивалентны следующим парам команд:
- # Команды целочисленной арифметики существуют в:
- # К командам целочисленной арифметики относятся:
- # В MSIL существуют следующие команды вызова:
- # Если команда вызова снабжена префиксом tail, то это означает, что значение, возвращаемое вызываемой процедурой, является также:
- # Какие команды MSIL реализуют функциональность упаковки и распаковки значений:
- # MSIL содержит следующие команды для обработки исключений:
- # Следующая программа:using System; class Fib { public static void Main (String[] args) { int a = 1, b = 1; for (int i = 1; i != 10; ++i) { Console.WriteLine (a); int c = a + b; a = b; b = c; } } }вычисляет:
- # В .NET предусмотрен специальный механизм доступа к метаданным приложения, который называется:
- # Классы с каким суффиксом предназначены для генерации описываемых сущностей?
- # Структура MSIL задает определенную последовательность генерации кода, в которой код генерируется в во время следующих проходов:
- # Данная программа:class LowLevelSample { public static void Run() { int i; i = 0; try { Start: if (i == 10) throw new Exception(); Console.WriteLine (i); i = i + 1; goto Start; } catch (Exception) { Console.WriteLine ("Finished"); } } }может использоваться в качестве примера:
- # Атрибут RunAndSave означает, что:
- # В случае наличия вложенных блоков их рекомендуется ограничивать вызовами:
- # Какой метод по массиву, содержащему типы параметров конструктора, находит в типе соответствующий конструктор:
- # Какой метод завершает генерацию try-catch блока:
- # Выбор инструкций - это:
- # В задачу выбора инструкций входит:
- # Для решения задачи построения генератора кода применяется теория:
- # Деревянные языки позволяют описать:
- # Выписыванием пометок вершин при простом обходе дерева слева-направо и сверху-вниз можно получить:
- # Через root(t) обозначается:
- # Для определения операции подстановки, в одном из двух деревьев выбирается лист, который затем:
- # Одним из способов задания деревянных языков являются:
- # Деревянная грамматика в нормальной форме - это четверка, содержащая:
- # В отличие от обычных контекстно-свободных грамматик, в деревянной грамматике в правой части правила находится:
- # В деревянном образце нетерминалами могут быть помечены:
- # Тривиальное дерево, состоящее из одной вершины, является:
- # Правила грамматики в нормальной форме содержат в правой части:
- # Образцом в данной последовательности троек:(p1,v1,R1),(p2,v2,R2),…,(pk,vk,Rk)будет:
- # Данная грамматика:G=(A, N, Expr, R) A={‘+’, ‘-’, const, var} N={Expr, Opnd} R={ Opnd: const, Opnd: var, Expr: Opnd Expr: ‘+’ (Expr, Expr), Expr: ‘-’ (Expr) }порождает деревья выражений из:
- # Две грамматики назовем эквивалентными, если совпадают:
- # Любая деревянная грамматика может быть приведена к эквивалентной:
- # Для деревянной грамматики, у которой в правой части правил находятся образцы произвольного вида, существует:
- # Для представления множества выводов можно построить разметку C, которая вершине дерева v и нетерминалу K сопоставляет:
- # Чтобы проверить применимость правила для текущей вершины, проверяется соответствие этой вершины образцу в правой части правила - для этого используется функция:
- # После вывода нового нетерминала в разметке строится ее замыкание относительно цепных правил с помощью функции:
- # Пусть задана грамматика G=(A,N,S,R) и дерево t. Индукцией по числу шагов можно доказать, что приведенный алгоритм действительно:
- # Дерево t выводится в грамматике G=(A,N,S,R) тогда и только тогда, когда:
- # Деревянные грамматики лежат в основе:
- # BURS на сегодняшний день являются одним из наиболее распространенных способов описания:
- # BURS позволяет построить алгоритм выбора инструкций, который:
- # Деревянные грамматики представляются естественным выбором как механизм описания выбора команд, поскольку являются:
- # В системе восходящего переписывания деревьев язык интерпретируется как:
- # Поскольку системы команд предоставляют большое разнообразие способов вычислений, ожидается, что:
- # В грамматиках восходящего переписывания каждое правило описывает либо:
- # Поскольку BURS-грамматика однозначна, каждый нетерминал может быть выведен:
- # Стоимость вывода аддитивна относительно:
- # Построение замыкания по цепным правилам аналогично:
- # Извлечение оптимального вывода из разметки - это:
- # Действия на каком шаге позволяют от исходного размеченного дерева перейти к дереву, в котором вершины уже соответствуют машинным инструкциям, но их операнды еще известны не полностью:
- # Входной файл lburg поделен на следующие секции:
- # Для языка C# верны следующие утверждения:
- # Упрощение языка C# выразилось в:
- # Fall-through в C# - это:
- # C# поддерживает структурную обработку исключений с помощью конструкций:
- # В C# значениям переменных булевского типа:
- # Все ссылочные типы произведены от базового типа object, являющегося точным эквивалентом класса:
- # Ссылочными типами в C# являются:
- # Классы в C# предоставляют следующие возможности:
- # В C# имеются следующие модификаторы:
- # Модификаторами класса в C# являются:
- # Корректными примерами конструкторов являются следующие:
- # Все активные действия программ на C# выполняются:
- # Проверку допустимости присваиваемого значения можно провести с помощью следующего кода:
- # Данный пример:private int m_stateOfVeryCriticalResource; public int stateOfVeryCriticalResource { get { if (IsAllowedUser()) return m_stateOfVeryCriticalResource; } set { if (IsAdmin()) m_stateOfVeryCriticalResource = value; } } ... stateOfVeryCriticalResource = vcrCompletelyScrewedUp;позволяет проверить достаточность полномочий запрашивающего приложения:
- # При таком описании класса:public class Matrix { public const int n = 10; public int[,] elements = new int[n,n]; public int this[int i, int j] { get { return elements[i,j]; } set { elements[i,j] = value; } } } допустимо следующее использование:
- # Для реализации модели "публикация/подписка" в C# используются:
- # В данном примере:using System; public delegate void EventHandler (string strText); class EventSource { public event EventHandler TextOut; public void TriggerEvent() { if (TextOut != null) TextOut("Event triggered..."); } } class TestApp { public static void Main() { EventSource evsrc = new EventSource(); evsrc.TextOut += new EventHandler(CatchEvent); evsrc.TriggerEvent(); evsrc.TextOut -= new EventHandler(CatchEvent); evsrc.TriggerEvent(); TestApp theApp = new TestApp(); evsrc.TextOut += new EventHandler(theApp.InstanceCatch); evsrc.TriggerEvent(); } public static void CatchEvent(string strText) { WriteLine(strText); } public void InstanceCatch(string strText) { WriteLine("Instance "+strText); } происходят:
- # Какая операция используется для того, чтобы сократить и привести к привычному виду запись операций над объектами, определенными программистом?
- # В данном случае:int v2 = v1; происходит:
- # В C# есть специальное ключевое слово params, которое позволяет:
- # Для params верно:
- # Для препроцессор C# верны следующие утверждения:
- # Из привычного набора макросов в препроцесоре C# оставлены следующие:
- # В C# механизм условной компиляции, основан на директивах:
- # Атрибуты в C# представляют собой:
- # В C# информация, записанная в атрибутах, во время компиляции:
- # С помощью какого атрибута в данном примере:using System.Runtime.InteropServices; public class AppMain { [DllImport("user32.dll")] public static extern int MessageBoxA(int handle, string message, string caption,int flags); public static void Main(){ MessageBoxA(0,"Hello World","Native Message Box",0); } [conditional("DEBUG")] public static void SayHello() { Console.WriteLine("Hello, World!"); return; } } обеспечивается взаимодействие с функцией MessageBoxA из Win32 API:
- # Для того, чтобы определить собственные, пользовательские атрибуты достаточно создать класс, унаследованный от:
- # Информация, записанная в пользовательских атрибутах, может быть использована во время исполнения программы с помощью:
- # Для написания опасного кода необходимо пометить метод или блок ключевым словом:
- # Какие механизмы реализованы в C#:
- # Отключить контроль переполнения можно с помощью ключевого слова:
- # Язык Cи-бемоль был разработан:
- # Из типов данных язык Cи-бемоль поддерживает следующие:
- # Из управляющих конструкций в языке Cи-бемоль допускаются:
- # Если оператор языка ассемблера отображается при трансляции чаще всего в одну машинную инструкцию, предложения языков более высокого уровня отображаются
- # Трансляторы бывают следующих типов:
- # Какая часть компилятора разбивает исходную программу на составляющие ее элементы и создает промежуточное представление исходной программы:
- # Можно сказать, что результатом работы интерпретатора является:
- # Для интерпретатора верны следующие утверждения:
- # Цепочка символов, составляющая исходную программу на языке программирования является:
- # Крайне важной частью процесса трансляции является:
- # Объектная программа может быть:
- # Создание единого перемещаемого объектного сегмента из набора различных сегментов осуществляется программой, которая называется:
- # Подход при котором применяется трансляция программы в ассемблер:
- # Преимуществами трансляции в ассамблер являются:
- # Для представления компилятора мы можем использовать так называемые:
- # Написание компилятора может потребоваться в следующих условиях:
- # Методиками разработки компиляторов являются следующие:
- # В каком году Вирт написал с использованием раскрутки транслятор языка Pascal:
- # Для того, чтобы справиться с проблемой большой потери времени при написании и отладке компилятора на языке ассемблера был разработан:
- # Под переносимой (portable) программой понимается программа, которая:
- # Компиляторы генерирующие объектную программу на языке более высокого уровня, чем язык ассемблера называют:
- # Одна из первых широко известных виртуальных машин была разработана в 70-х годах Н. Виртом:
- # Сегодня идея виртуальных машин приобрела широкую известность благодаря языку:
- # Компиляторы языка Java генерируют:
- # Для того, чтобы увеличить скорость работы приложений, была разработана технология:
- # Использование какой связки позволяет заметно повысить скорость выполнения исходной программы:
- # Процесс создания компилятора можно свести к решению нескольких задач, которые принято называть:
- # Обычно компилятор состоит из следующих фаз:
- # В разборе входной цепочки и выделении некоторых более "крупных" единиц, которые удобнее для последующего разбора заключается задача:
- # На этапе лексического анализа обычно выполняются такие действия, как:
- # После синтаксического анализа можно считать, что исходная программа преобразована:
- # В дереве разбора программы внутренние узлы соответствуют:
- # Видозависимый анализ иногда называют:
- # Обязательность описания переменных может служить примером:
- # Наиболее распространенными оптимизациями являются:
- # На этапе генерации кода необходимо решить множество следующих сопутствующих проблем:
- # Какие фазы иногда объединяют вместе под названием front-end?
- # Процесс обработки всего, возможно, уже преобразованного, текста исходной программы называется:
- # Backpatching - это:
- # Одна из первых задач, возникающих в процессе компиляции - это:
- # Идея создания некоторого обобщенного алгоритма, проверяющего за конечное число шагов принадлежность данной цепочки языку является альтернативой:
- # Грамматики представляют собой:
- # Получение любого предложения языка в грамматике начинается с этого:
- # В формальном определении грамматики нетерминалы обозначаются:
- # Различные грамматики могут порождать:
- # Несмотря на эквивалентность определяемых языков, одна грамматика может быть значительно удобнее другой с точки зрения ее использования:
- # Определение грамматик не накладывает никаких ограничений на количество:
- # Иерархия Хомского - это классификация грамматик согласно:
- # Согласно иерархии Хомского, если любое правило из P имеет вид A->xB или A->x, где A, B - нетерминалы, а x - терминал, то грамматика G называется:
- # Согласно иерархии Хомского, если любое правило из P имеет вид A->a, где A - нетерминал, a - нетерминал или терминал то грамматика G называется:
- # Обобщенный алгоритм, позволяющий определить некоторое множество и использующий в своей работе следующие компоненты: входную ленту, управляющее устройство с конечной памятью и дополнительную рабочую память - это:
- # В качестве примеров распознавателей можно назвать:
- # Путем задания некоторого множества допустимых заключительных состояний распознавателя определяется:
- # Основная часть конечного автомата - это:
- # В конечных автоматах цепочка считается принадлежащей языку, если хотя бы одна из последовательностей шагов:
- # Язык распознается конечным автоматом, если:
- # Удобная форма записи конечных автоматов – это:
- # Следующий набросок программы:q = q0; c = GetChar(); while (c != eof) { q = move (q, c); c = GetChar(); } if (q is in F) return "yes"; else return "no"; демонстрирует (предполагается, что входная лента заканчивается символом end_of_file):
- # Два детерминированных автомата называются эквивалентными, если они:
- # Если мы предположим, что начальные состояния конечных автоматов эквивалентны, то мы можем получить:
- # Следующий алгоритм: удаление всех недостижимые состояния, разбивка множества всех достижимых состояний на классы эквивалентности неразличимых состояний, из каждого класса эквивалентности берется только по одному представителю - это:
- # Классы языков, определяемых праволинейной грамматикой являются:
- # Класс языков, задаваемых праволинейными грамматиками, очень удобен в задачах:
- # Если существует, по крайней мере, одна выводимая в грамматике цепочка, для которой существует более одного вывода, то такая грамматика является:
- # Любая КС-грамматика может быть приведена к нормальному виду Хомского, в котором все правила имеют один из следующих видов:
- # В нормальной форме Грейбах все правые части правил начинаются:
- # Магазинные автоматы, известны также как:
- # На каждом шаге работы МП-автомат может либо:
- # МП-автоматы обладают одним существенным недостатком:
- # Детерминированные МП-автоматы описывают только подмножество всего класса КС-языков - это подмножество называется:
- # Форма Бэкуса-Наура был разработана для описания:
- # При определении синтаксиса языков Pascal и Modula-2 Вирт использовал расширенную форму Бэкуса-Наура (EBNF):
- # Следующее правило:REF to MODE NEST assignation: REF to MODE NEST destination, becomes token, MODE NEST source. определяет:
- # Синтаксические диаграммы или синтаксические схемы имеют форму:
- # Во время лексического анализа программа разбивается на:
- # Множество лексем разбивается:
- # Во время синтаксического анализа все идентификаторы можно считать:
- # В большинстве языков программирования имеются следующие лексические классы:
- # В следующем операторе языка Pascalconst pi = 3.1416;";" представляет лексический класс:
- # В следующем операторе языка Pascalconst pi = 3.1416;"pi" представляет лексический класс:
- # Основной тенденцией современных языков программирования является:
- # В Алголе 68 и Фортране, пробелы являются значащими только:
- # Какие особенности некоторых языков могут существенно затруднять лексический анализ:
- # Сколько атрибутов обычно имеет лексема:
- # Если определен тип, соответствующий указателю в эту таблицу - ReprInd, и тип, служащий для представления позиции в исходном файле - FilePos, то можно полностью определить лексему следующим образом:
- # Процесс замены идентификаторов на ссылку в таблицу представлений называется:
- # Простейший вид таблицы представлений – это:
- # Какой специальный класс содержит система классов .NET, с помощью которого легко реализовать функциональность хэш-таблиц:
- # Для настройки хэш-таблицы на необходимый тип данных нужно реализовать методы:
- # На практике чаще используется эквивалентный праволинейным грамматикам механизм:
- # Пустое множество и множество, состоящее только из пустой строки, являются:
- # Для любых регулярных выражений P и Q следующие множества также являются регулярными выражениями:
- # По имеющемуся регулярному выражению легко написать:
- # Lex, состоит из:
- # Спецификации лексического анализатора на языке Lex подготавливаются в виде программы:
- # В Lex действия, связанные с реакцией на встреченные регулярные выражения, пишутся непосредственно на:
- # Большинство средств для создания лексических анализаторов основывается:
- # Общая схема работы Lex заключается в преобразовании Lex-программы:
- # Lex-программа состоит из следующих частей:
- # В Lex-программе секция описаний включает:
- # В Lex-программе функция yywrap() определяет:
- # В регулярных выражениях в Lex-программе специальные символы записываются после префикса:
- # В регулярных выражениях в Lex-программе допустимы следующие способы кодирования символа а:
- # Следующая грамматика регулярного выражения:<p><p> в Lex-программе обозначает:
- # В Lex-программе регулярному выражению< соответствует следующий лексический класс:
- # В Lex'е указателем на отождествленную цепочку символов, оканчивающуюся нулем является:
- # В Lex'е вернуть последние n символов цепочки обратно во входной поток можно с помощью:
- # При лексическом анализе программ на C# после прочтения символа > необходимо прочитать:
- # В .NET использовать механизм регулярных выражений можно с помощью следующих клссов:
- # В данном примере:void DumpHrefs(String inputString) { Regex r; Match m; r = new Regex("href\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))", RegexOptions.IgnoreCase|RegexOptions.Compiled); for (m = r.Match(inputString); m.Success; m = m.NextMatch()) { Console.WriteLine("Found href " + m.Groups[1] + " at " + m.Groups[1].Index); } } класс Regex:
- # Наиболее удобным формализмом для описания синтаксических конструкций языка программирования являются:
- # Грамматики представляют собой мощный формализм:
- # Компиляторы, разработанные на базе грамматик:
- # Если программа выводима в грамматике, это еще не означает, что она полностью:
- # Процесс, который определяет, принадлежит ли некоторая последовательность лексем языку, порождаемому грамматикой называется:
- # Анализаторы реально используемых языков обычно имеют:
- # Дерево разбора и таблицы - это:
- # Синтаксический анализатор обращается к лексическому анализатору каждый раз, когда у него появляется потребность:
- # Большинство методов анализа принадлежит к следующим классам:
- # В узлах синтаксического дерева корнем являются:
- # В узлах синтаксического дерева листьями являются:
- # От корня к листьям узлы синтаксического дерева строятся:
- # От листьев к корню узлы синтаксического дерева строятся:
- # LL-грамматики обладают следующими свойствами:
- # С восходящими анализаторами связаны:
- # С помощью каких грамматик можно определить большинство использующихся в настоящее время языков программирования?
- # Одним из наиболее популярных методов нисходящего синтаксического анализа является:
- # Можно разделить все формулы на следующие классы:
- # К простейшим формулам можно отнести:
- # К формулам, содержащим операции типа умножения можно отнести:
- # Следующая процедура:int Factor () { char ch = getChar(); if (isDigit (ch)) return getValue(ch); if (ch == '(') { int result = Formula (); if (getChar() == ')') return result; error ("Неожиданный символ"); return 0; } return error ("Неожиданный символ"); } вычисляет значение:
- # Обрабатывать формулы, содержащие операции типа умножения будет процедура:
- # Как мы можем понять, что имеем дело с формулой, содержащей операции типа умножения?
- # Общий вид формулы, содержащей операции типа сложения:
- # Обрабатывать формулы, содержащие операции типа сложения будет процедура:
- # Параметром процедуры Expression является:
- # Метод getChar:
- # Метод returnChar:
- # Метод рекурсивного спуска без возвратов можно использовать только для:
- # Для данной грамматики:S -> B A A -> +B A A -> e B -> D C C -> * D C C -> e D -> (S) D -> a множества FIRST определяются следующим образом:
- # В LL(k)-грамматике для любых двух левых выводов:S =>* wAv => wuv =>* wx S =>* wAv => wu1v =>* wyдля которых FIRSTk (x) = FIRSTk (y)вытекает, что:
- # Грамматика называется леворекурсивной, если среди ее нетерминалов имеется по крайней мере один:
- # Леворекурсивные грамматики не обладают свойством:
- # Данная грамматика:E -> T | TE' E' -> +T | +TE' T -> F | FT' T'-> *F | *FT' F -> (E) | num обладает свойством:
- # Синтаксический разбор в демонстрационном компиляторе Си-бимоль реализован с помощью:
- # Предназначен для построения дерева разбора, начиная с листьев и двигаясь вверх к корню дерева разбора:
- # Процесс построения дерева разбора, начиная с листьев и двигаясь вверх к корню дерева разбора может быть представлен как:
- # В следующей грамматике:S->aABe A->Abc A->b B->d цепочка abbcde может быть свернута в аксиому следующим образом:
- # LR(k) означает, что:
- # При LR(k)-анализе применяется метод:
- # Метод "перенос-свертка" использует:
- # Символы входной цепочки переносятся в магазин до тех пор, пока на вершине магазина не накопится цепочка, совпадающая с правой частью какого-нибудь из правил:
- # LR(k)-анализатор состоит из:
- # Управляющая программа:
- # Комбинация символа состояния на вершине магазина и текущего входного символа используется:
- # Функция goto получает:
- # LR(0)-анализатор принимает решение о своих действиях только на основании содержимого магазина:
- # LR(0)-ситуации не должны содержать:
- # Входная цепочка может начинаться с любого:
- # Данная ситуация:[S'->.S] [S-gt;.x] [S-gt;.(L)]определяет состояние:
- # Данная ситуация:[S->x.]определяет состояние:
- # Данная ситуация:[S->(.L)] [L->.L, S] [L->.S] [S->.(L)] [S->.x]определяет состояние:
- # Данная ситуация:[S'->S.$]определяет состояние:
- # Какая операция добавляет ситуации к множеству ситуаций, у которых точка стоит слева от нетерминала:
- # В данном примере: goto (I, X) { J={}; for (каждой ситуации [A->w.Xv] из I) { J+=[A->wX.v]; } return closure (J); }происходит:
- # Поскольку для символа $ операция goto (I, $) не определена, можно выполнить:
- # В данном примере:R = empty set; for (each state I in T) { for (each item [A->w.] in I) { R+={(I, A->w)}; } }вычисляется:
- # Алгоритм построения управляющей таблицы автомата состоит из следующих шагов:
- # Сколько символов входной цепочки использует для принятия решения LR(1)-анализатор:
- # LR(1)-ситуация состоит из:
- # Для данной грамматики:(1) E->T (2) E->T (3) T->T*F (4) T->F (5) F-> (E) (6) F->idsi - это:
- # При пополнении какой грамматики правилом S' -> Sможно получить следующие состояния:0: {[S'-gt;.S, $], [S-gt;.AA, $], [A-gt;.aA, a], [A-gt;.aA, b], [A-gt;.b, a], [A-gt;.b, b]} 1: {[S'-gt;S., $]} 2: {[S'-gt;A.A, $], A-gt;.aA, $], [A-gt;.b, $]} 3: {[A-gt;a.A, a], [A-gt;a.A, b], [A-gt;.a.A, a], [A-gt;.a.A, b], [A-gt;.b, a], [A-gt;.b, b]} 4: {[A-gt;b., a], [A-gt;b., b]} 5: {[S-gt;AA. $]} 6: {[A-gt;a.A, $], [A-gt;.aA, $], [A-gt;.b, $]} 7: {[A-gt;b., $]} 8: {[A-gt;aA.,a], [A-gt;aA.,b]} 9: {[A-gt;aA.,$]}:
- # LALR анализатор имеет значительное преимущество в размере таблиц по сравнению с:
- # Неоднозначность грамматики приводит:
- # Имеется следующая входная цепочка: if E1 then if E2 then S1 else S2, при содержимом стека - $ if E1 then if E2 then S1 необработанной частью входной цепочки является:
- # Конфликт перенос-свертка может быть решен следующими методами:
- # Альтернативой построению новой грамматики может служить "соглашение", что в случае конфликта перенос-свертка:
- # Конфликт перенос-перенос возникает, когда на вершине стека анализатора возникает строка терминалов, к которой:
- # В процессе разбора входной цепочки id (id, id), при содержимом стека - $ id (id, необработанная часть представляет собой:
- # В данной грамматике:E –> id | num | E* E | E + E операции сложения и умножения выполняются:
- # При анализе строки 1+2+3 (содержимое стека - $E+) необработанная часть входной цепочки будет представлять собой:
- # Программа, которая строит LALR- анализаторы - это:
- # Генератор анализаторов YACC был разработан:
- # Генератор анализаторов YACC был создан для следующих операционных систем:
- # YACC - это имя генератора в операционной системе UNIX, в остальных операционных системах программа называется:
- # Входом программы YACC является:
- # На вход YACC получает файл со спецификациями, который должен иметь расширение:
- # Выходом YACC могут быть файлы:
- # Какой из следующих файлов содержит сгенерированную YACC'ом программу анализатора:
- # Какой из следующих файлов создается при задании параметра -h, - описания, которые также генерирует YACC:
- # Файл со спецификациями name.y должен быть устроен следующим образом:
- # В файле name.y секция описаний содержит:
- # Описания переменных языка C в файле name.y заключаются в:
- # Примером определения типов, значения которых возвращаются как значения семантик является:
- # Объявлением нетерминальных символов грамматики являются:
- # Секция грамматических правил, состоит из правил, которые записываются следующим образом:
- # В следующем правиле (секция грамматических правил файла name.y):A: production_body;именем нетерминала является:
- # В секции правил грамматики литерал может состоять:
- # Backslash в секции правил грамматики используется:
- # Какая литера может использоваться для объединения всех правил в одно, если имеется несколько грамматических правил с одинаковой левой частью:
- # Аксиому можно определить в секции объявлений так:
- # Фрагменты программ на языке С, заключенные в фигурные скобки - это:
- # Для того, чтобы нетерминал мог иметь значение некоторого типа, который указан в объединении, определенном в секции объявлений, он должен быть объявлен следующим образом:
- # Все имена и литералы, содержащиеся в правой части правила нумеруются:
- # Данное правило:A: B { $$ = 1; } C { x = $2; y = $3; } ;эквивалентно следующему:
- # Какая из секций является необязательной:
- # Какая из процедур реализует лексический анализ и возвращает лексический класс лексемы:
- # При использовании какого параметра программы YACC будет построен заголовочный файл с именем f:
- # Данная функция:int yylex (void) { int ch; while ((ch = getchar ()) == ' '); if (isdigit (ch)) { ungetc (ch, stdin); scanf (%i, &yylval); return NUMBER_LC; } return ch; } вычисляет следующую пару значений:
- # Для того, чтобы получить управляющую таблицу анализатора достаточно запустить программу YACC с ключом:
- # Ошибки, которых в программе на самом деле нет, могут возникнуть в результате не совсем корректной работы транслятора после обнаружения какой-нибудь ошибки - это:
- # Лексический анализатор в следующем контексте:fi (x == y) { ... }:
- # Обычно, фазы оптимизации и генерации:
- # Контроль типов осуществляется во время обхода:
- # 60% ошибок в программе - это:
- # Error-правила в YACC'е имеет один из следующих видов:
- # Правила, которые будут использоваться в случае ошибки называются:
- # Задача, решение которой необходимо для проверки правильности использования типов:
- # Нельзя убедиться в правильности использования типов в какой-нибудь конструкции до тех пор, пока не определены:
- # Чтобы выяснить правильность оператора присваивания надо знать:
- # Чтобы выяснить, каков тип идентификатора, являющегося, получателем присваивания, надо понять:
- # Каждое вхождение идентификатора в программу является либо:
- # Определяющим вхождением идентификатора является:
- # Использующим вхождением идентификатора является:
- # Цель идентификации идентификаторов - это:
- # Если все определяющие вхождения идентификаторов должны быть расположены текстуально перед использующими вхождениями, то:
- # Таблица идентификаторов содержит:
- # Таблица внешних представлений содержит:
- # Элемент таблицы идентификаторов можно организовать так:
- # Обработка определяющего вхождения идентификатора происходит:
- # При занесении информации об идентификаторе в таблицу идентификаторов синтаксическим анализатором, происходят следующие действия:
- # В программе следующей структуры:{int n; …; n++; .. {float n; … n = 3.14; … } …n--; … }при входе во внешний блок:
- # В программе следующей структуры:{int n; …; n++; .. {float n; … n = 3.14; … } …n--; … }после входа во внутренний блок будет добавлен еще один элемент:
- # Примитивными типами являются:
- # Для построения более сложных типов из примитивных обычно используются следующие конструкторы:
- # Конструктор struct применяется к кортежу пар:
- # Тип row строится из примитивных типов следующим образом:
- # Функция, определенная как:function f (a, b: char) : ^integer;имеет тип:
- # К способам представления типов можно отнести:
- # Использование dag'ов более предпочтительно, чем деревьев, поскольку в этом случае происходит:
- # Какой способ кодирования типов был использован в компиляторе C, разработанном Ричи (D.M.Ritchie)?
- # При кодировании типов с использованием битовых шкал <boolean> имеет значение:
- # Можно выделить следующие виды контроля типов:
- # Если контроль типов осуществляется во время трансляции программы, то - это:
- # Если контроль типов производится во время исполнения объектной программы, то - это:
- # Эквивалентность типов бывает:
- # Если два типа структурно эквивалентны тогда и только тогда, когда они идентичны, то - это:
- # Преобразование, при котором программист должен написать что-нибудь для того, чтобы это преобразование было выполнено называется:
- # Промежуточный язык можно воспринимать как интерфейс между:
- # Подход, в котором один входной язык проецируется сразу на множество целевых платформ с помощью единого промежуточного языка называется:
- # Атрибутное дерево разбора является, самой распространенной формой организации:
- # Выражение (a+b)*(c-d) в польской записи может быть представлено как:
- # Низкоуровневые формализмы записи промежуточного представления программы, приближающие программу к объектному коду - это: