Бесплатная библиотека, читать онлайн, скачать книги txt

БОЛЬШАЯ БЕСПЛАТНАЯ БИБЛИОТЕКА

МЕЧТА ЛЮБОГО КНИГОЛЮБА

Вторник, 11 июня, 17:55

Авторизация    Регистрация
Дамы и господа! Электронные книги в библиотеке бесплатны. Вы можете их читать онлайн или же бесплатно скачать в любом из выбранных форматов: txt, jar и zip. Обратите внимание, что качественные электронные и бумажные книги можно приобрести в специализированных электронных библиотеках и книжных магазинах (Litres, Read.ru и т.д.).

ПОСЛЕДНИЕ ОТЗЫВЫ О КНИГАХ

Михаил (19.04.2017 - 06:11:11)
книге:  Петля и камень на зелёной траве

Потрясающая книга. Не понравится только нацистам.

Антихрист666 (18.04.2017 - 21:05:58)
книге:  Дом чудовищ (Подвал)

Классное чтиво!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Ладно, теперь поспешили вы... (18.04.2017 - 20:50:34)
книге:  Физики шутят

"Не для сайта!" – это не имя. Я пытался завершить нашу затянувшуюся неудачную переписку, оставшуюся за окном сайта, а вы вын... >>

Роман (18.04.2017 - 18:12:26)
книге:  Если хочешь быть богатым и счастливым не ходи в школу?

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

АНДРЕЙ (18.04.2017 - 16:42:55)
книге:  Технология власти

ПОЛЕЗНАЯ КНИГА. Жаль, что мало в России тех, кто прочитал...

Читать все отзывы о книгах

Обои для рабочего стола

СЛУЧАЙНОЕ ПРОИЗВЕДЕНИЕ

Писать стихи гораздо проще
когда голодный ты и тощий,
А если грузен ты и сыт,
то трепетная мысль спит.

06.09.10 - 13:01
Наталья Городецкая

Читать онлайн произведения


Хотите чтобы ваше произведение или ваш любимый стишок появились здесь? добавьте его!

Поделись ссылкой

Давайте создадим компилятор!   ::   Креншоу Джек

Страница: 5 из 139
 
Но если процедура Expression сохраняет свои результаты в регистре D0, то где процедура Term сохранит свои результаты? Ответ: на том же месте. Мы окажемся перед необходимостью сохранять первый результат процедуры Term где-нибудь, прежде чем мы получим следующий.

В основном, что нам необходимо сделать – создать процедуру Term, выполняющую то что раннее выполняла процедура Expression. Поэтому просто переименуйте процедуру Expression в Term и наберите новую версию Expression:



{–}

{ Parse and Translate an Expression }

procedure Expression;

begin

Term;

EmitLn('MOVE D0,D1');

case Look of

'+': Add;

'-': Subtract;

else Expected('Addop');

end;

end;

{–}



Затем выше Expression наберите следующие две процедуры:



{–}

{ Recognize and Translate an Add }

procedure Add;

begin

Match('+');

Term;

EmitLn('ADD D1,D0');

end;

{–}

{ Recognize and Translate a Subtract }

procedure Subtract;

begin

Match('-');

Term;

EmitLn('SUB D1,D0');

end;

{–}



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

Term (старая версия Expression)

Add

Subtract

Expression

Теперь запустите программу. Испробуйте любую комбинацию, которую вы только можете придумать, из двух одиночных цифр, разделенных «+» или «-». Вы должны получить ряд из четырех инструкций на ассемблере. Затем испытайте выражения с заведомыми ошибками в них. Перехватывает анализатор ошибки?

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

MOVE #n,D0

MOVE D0,D1

неэффективна. Если бы мы писали этот код вручную, то, возможно, просто загрузили бы данные напрямую в D1.

Вывод: код, генерируемый нашим синтаксическим анализатором, менее эффективный, чем код, написанный вручную. Привыкните к этому. Это в известной мере относится ко всем компиляторам. Ученые посвятили целые жизни вопросу оптимизации кода и существуют методы, призванные улучшить качество генерируемого кода. Некоторые компиляторы выполняют оптимизацию достаточно хорошо, но за это приходится платить сложностью и в любом случае это проигранная битва… возможно никогда не придет время, когда хороший программист на ассемблере не смог бы превзойти компилятор. Прежде чем закончится этот урок, я кратко упомяну некоторые способы, которые мы можем применить для небольшой оптимизации, просто, чтобы показать вам, что мы на самом деле сможем сделать некоторые улучшения без излишних проблем. Но запомните, мы здесь для того, чтобы учиться, а не для того, чтобы узнать насколько компактным мы можем сделать код. А сейчас и на протяжении всей этой серии мы старательно будем игнорировать оптимизацию и сконцентрируемся на получении работающего кода.

Но наш код не работает! В коде есть ошибка! Команда вычитания вычитает D1 (первый аргумент) из D0 (второй аргумент). Но это неправильный способ, так как мы получаем неправильный знак результата. Поэтому исправим процедуру Subtract с помощью замены знака следующим образом:



{–}

{ Recognize and Translate a Subtract }

procedure Subtract;

begin

Match('-');

Term;

EmitLn('SUB D1,D0');

EmitLn('NEG D0');

end;

{–}



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

Итак, на данном этапе мы имеем синтаксический анализатор, который может распознавать сумму или разность двух цифр. Ранее мы могли распознавать только одиночные цифры. Но настоящие выражения могут иметь любую форму (или бесконечность других). Вернитесь и запустите программу с единственным входным символом “1”.

1<<456>>139


В тексте попалась красивая цитата? Добавьте её в коллекцию цитат!
Французские дети не капризничают. Уни...Кэтрин Кроуфорд99 руб.
Завещание рождественской уткиДарья Донцова89,90 руб.
Пятьдесят оттенков свободыЭ. Л. Джеймс149,90 руб.
Географ глобус пропилАлексей Иванов99,90 руб.


copyright © Бесплатная библиотека,    контакты: [email protected]