LINUX.ORG.RU

Интерпретатор языка высокого уровня в машинный код


0

2

Дали тему курсовой работы «Интерпретатор языка высокого уровня в машинный код», которую нужно написать на С++. Насколько я понял машинный код это двоичная система счисления. Посоветуйте с чего начать, может план работы или литературой (желательно русскую) .

Зарание спасибо!

Ответ на: комментарий от BattleCoder

И про то, что в машинный код - писать необязательно... слово «компилятор» это подразумевает.

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

Deleted
()
Ответ на: комментарий от Deleted

(hint: какой код ты будешь генерить на токены class, struct, pulblic, private?)

При чём тут, вообще, эти токены? o_O

Вы не представляете языки без них, что ли? :)

Впрочем, даже с ними — в чём проблема? Тот же Форт взять, какой там «нормальный анализ»?

KRoN73 ★★★★★
()
Ответ на: комментарий от Deleted

Мда, с матчастью опять не важно у лоровцев.

Запомни, мой обезьяний друг:

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

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

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

geekless ★★
()
Ответ на: комментарий от nokachi

хреновый это компилятор если все

А тебе надо, чтобы он еще при этом бельё постирал и посуду помыл? Определение термина хреновый компилятор из книжки Ахо не приведешь? :}

geekless ★★
()
Ответ на: комментарий от KRoN73

Абстрактное дерево синтаксического анализа.

Deleted
()
Ответ на: комментарий от KRoN73

не знаю я что такое форт. Просто привел любые токены какие в голову пришли. Какой будет перевод в машинный код токена ; ? По-моему никакой.

nokachi
()
Ответ на: комментарий от geekless

в той книжке хреновые компиляторы не рассматриваются (-: Мне б надо чтобы он хотя бы сделал некоторые оптимизации что в той книжке описаны и сгенерировал pipelined код в циклах

nokachi
()
Ответ на: комментарий от KRoN73

Вы не представляете языки без них, что ли? :)

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

Впрочем, даже с ними — в чём проблема?

В том, что я не получил ответа: что мне генерировать, если я наткнусь на токен «class»? А что делать с вложенностью?

Тот же Форт взять, какой там «нормальный анализ»?

Форт низкоуровневый, что бы кто ни говорил. И неестественный для человека.

Deleted
()
Ответ на: комментарий от nokachi

Какой будет перевод в машинный код токена ; ? По-моему никакой.

Ты ещё скажи, что интерпретаторы не существуют. Или программу исполняют, работая не машинным кодом, а через libastral :)

KRoN73 ★★★★★
()
Ответ на: комментарий от Deleted

В том, что я не получил ответа: что мне генерировать, если я наткнусь на токен «class»?

Значит, считаешь, объектные интерпретируемые ЯВУ невозможны? ;)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

существуют, понятное дело. В итоге исполняется машинный код, понятное дело. Но вы ведь можете написать интерпретатор бейсика и дергать код на джаве, не правда ли? А как вы узнаете на какую строчку какой код дергать? Строчку наверно надо распарсить сначала. Если мы ограничимся языками с совершенно однообразным форматом команд вроде ассемблера, то ежу понятно что мы этот парсинг даже не заметим. Но компиляторы и интерпретаторы обычно пишут для чего-то более интересного.

nokachi
()
Ответ на: комментарий от Deleted

что мне генерировать, если я наткнусь на токен «class»? А что делать с вложенностью?

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

Или спор о языке, в котором каждая лексема не привязана к контексту и однозначно переводится в байткод? Ну и такое можно сделать для любого языка, только это будет байткод из лексем, и гипотетическому рантайму придется делать часть работы компилятора — этот код собирать.

note173 ★★★★★
()
Ответ на: комментарий от nokachi

А как вы узнаете на какую строчку какой код дергать? Строчку наверно надо распарсить сначала.

Всё правильно. Хорошо, не нравится сужение процесса до токенов, можно переформулировать мысль в «оттранслировал чанк в машинный код или код ВМ и исполнил, перешёл к следующему токену».

Но компиляторы и интерпретаторы обычно пишут для чего-то более интересного.

В исходной задаче ничего про «интересность» не было. Во фразе «интерпретация в код» тоже никаких граничных условий «интересности».

KRoN73 ★★★★★
()
Ответ на: комментарий от aedeph_

Название шараги^W ВУЗа в студию.

Это не ВУЗ, а обычный технарь в Белоруссии, в котором готовят техников-программистов

Most_Guard
() автор топика
Ответ на: комментарий от KRoN73

Воозможны, но работают они тем же способом: генерируют AST.

Deleted
()
Ответ на: комментарий от note173

что мне генерировать, если я наткнусь на токен «class»? А что делать с вложенностью?

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

На то и нужен синтаксический анализ нормальный с AST. Вложенность же. Хотя... можно и построчно, а АСТ никуда не сохранять, но это неоптимально.

Deleted
()
Ответ на: комментарий от Deleted

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

note173 ★★★★★
()
Ответ на: комментарий от note173

Что есть «линейная»? Если без control flow-операций, то зачем оно нужно? В ином случае - за счет чего быстрее?

Deleted
()
Ответ на: комментарий от Deleted

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

note173 ★★★★★
()
Ответ на: комментарий от note173

Добавь к «без циклических операций» еще goto и рекурсию. Если такая программа есть, то да, интерпретатор должен быть быстрее. Но зачем такие программы вообще нужны?

Deleted
()
Ответ на: комментарий от KRoN73

Forth без него прекрасно обходится :)

Учитывая что AST выглядит как обратная польская запись, то да обходится, т.к. ты его (ast) реализуешь ручками.

sdio ★★★★★
()
Ответ на: комментарий от ono

Может быть «Трех приближений» правильнее?

в русскоязычной литературе уже устоялся именно такой термин (иногда в форме проекций Футамуры-Турчина)

jtootf ★★★★★
()
Ответ на: И "интерпретатор тут ни к месту" от Most_Guard

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

Люди могут один и тот же текст интерпретировать по-разному (например, ошибочно).

В computer science это слово чаще употребляется, когда код на ЯП НЕ транслируется в машинный, а исполняется СРАЗУ, виртуальной машиной, интерпретатором, или как ещё...

BattleCoder ★★★★★
()
Ответ на: комментарий от Deleted

Зачем у вас одинаковые аватарки? %) я вас и перепутать могу...

BattleCoder ★★★★★
()
Ответ на: И "интерпретатор тут ни к месту" от Most_Guard

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

Если есть время - почитай «книгу дракона» (второе издание, можно и не в английском оригинале). Сделаешь свой интерпретатор «правильно». И заодно о слабом поле на время забудешь. Вот такая замечательная книга.

Если нет времени - почитай, что есть ассемблерные макросы, и слабай по образу и подобию. На С++ :) Boost::Spirit слово ключевое знай.

malbolge ★★
()
Ответ на: комментарий от aedeph_

+1. Кстати, пора создать blacklist таких вузов и публиковать где-нибудь на lor-wiki. Как вам идея?

Для всех соменвающихся абитуриентов - куда НЕ поступать.

BattleCoder ★★★★★
()
Ответ на: комментарий от BattleCoder

Вопросы топикстартера разве еще не отвечены?

Deleted
()

Насколько я понял машинный код это двоичная система счисления.

Мощно.

Впечатлило.

Иди в кулинарный лучше, сделай добро людям.

ak369260
()
Ответ на: комментарий от ak369260

Просто я у препода спросил, что он собой представляет, он и ответил это 0 и 1, потому так и подумал.

Most_Guard
() автор топика
Ответ на: комментарий от ak369260

Иди в кулинарный лучше, сделай добро людям.

Кстати, очень хороший и практичный совет. Сам жалею, что не пошел туда, когда выбор был. Сейчас был бы собственный ресторан и все такое... ;) Ну его нафиг это програмированние.

gensym ★★
()

Специализировать интерпретатор в машинный код - это суперкомпиляция. Неплохая задача для курсовой, но C++ тут не подходит абсолютно, даже с clang + llvm задолбаешься специализацию писать.

anonymous
()

тех кто книгу дракона советовал не слушай они бы ещё 2ух томник Ахо, Ульман - Теория синтаксического анализа перевода и компиляции рекомендовали бы тебе осилить.

вот : начни с 1. Д. Креншоу Пишем компилятор 293 стр

если захочется «почище» c расширямыми типами и другими блекджэками 2. Н. Вирт Построение комприляторов 190стр

если по хардкорнее то 3. Д. Хендрикс Компилятор языка Си для Микро ЭВМ 238стр

ну и посмотри как сделаны tcc и Go опосля

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

тех кто книгу дракона советовал не слушай

Всем хватит странички с википедии про метод рекурсивного спуска и построение автоматов? Ну-ну. Если тебе весь дракон не нужен, необязательно его читать от начала до конца.

Deleted
()
Ответ на: комментарий от geekless

Компилятор — это программа, строящая по входной программе на языке A эквивалентную программу на языке B.

Disassembler, decompiler - тоже компиляторы?

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

Если полученное представление будет эквивалентно изначальному, то в таком определении слова «компилятор» - да.

Но покажи мне такие дизассемблеры и декомпиляторы, которые уже в 100% случаев дают код, который после сборки ведет себя так же, как и изначальный дизассемблированный/декомпилированный бинарник.

Deleted
()
Ответ на: facepalm.asm от geekless

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

Зачем он тебе без рантайма? Главное что он там есть, этот результат, а значит и компилятор тоже.

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

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

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.