Как уже упоминалось в другом месте, это не то, что ggplot2
будет хорошо работать, поскольку сломанные оси обычно считаются сомнительными.
Другие стратегии часто считаются лучшими решениями этой проблемы. Брайан упомянул несколько (огранки, два сюжета, посвященные различным наборам ценностей). Еще один вариант, который слишком часто игнорируют люди, особенно для штрих-кодов, заключается в создании таблицы :
[/g2]
Глядя на фактические значения, 500 не скрывает различия в других значениях! По какой-то причине таблицы не получают достаточного уважения в качестве метода визуализации. Вы можете возразить, что ваши данные имеют много и много категорий, которые становятся громоздкими в таблице. Если это так, вполне вероятно, что на вашей гистограмме будет слишком много баров, чтобы быть разумным.
И я не спорю о таблицах все времени. Но они определенно должны что-то учитывать, если вы создаете баррикады с относительно небольшим количеством баров. И если вы делаете барчарты с множеством баров, вам может потребоваться переосмыслить это в любом случае.
Наконец, есть также функция axis.break
в пакете plotrix
, которая реализует сломанные оси. Однако из того, что я собираюсь, вам придется вручную указывать метки и позиции оси.
Эмуляция является многоаспектной областью. Вот основные идеи и функциональные компоненты. Я собираюсь разломать его на кусочки и затем заполнить детали через редактирования. Многие вещи, которые я собираюсь описать, потребуют знания внутренних работ процессоров - знание блока необходимо. Если я немного слишком неопределенен на определенных вещах, задайте вопросы, таким образом, я могу продолжить улучшать этот ответ.
Эмуляция работает путем обработки поведения процессора и отдельных компонентов. Вы создаете каждую отдельную часть системы и затем соединяетесь, части во многом как провода делают в аппаратных средствах.
существует три способа обработать эмуляцию процессора:
Со всеми этими путями, у Вас есть та же полная цель: выполните часть кода, чтобы изменить состояние процессора и взаимодействовать с 'аппаратными средствами'. Состояние процессора является скоплением регистров процессора, обработчиков прерываний, и т.д. для данной цели процессора. Для этих 6502 у Вас было бы много 8-разрядных целых чисел, представляющих регистры: A
, X
, Y
, P
, и S
; у Вас также было бы 16-разрядное PC
регистр.
С интерпретацией, Вы запускаете в IP
(указатель команд - также названный PC
, счетчик команд) и читаете инструкцию из памяти. Ваш код анализирует эту инструкцию и использует эту информацию для изменения состояния процессора, как определено процессором. Базовая проблема с интерпретацией состоит в том, что это очень медленно; каждый раз, когда Вы обрабатываете данную инструкцию, необходимо декодировать ее и выполнить необходимую операцию.
С динамической перекомпиляцией, Вы выполняете итерации по коду во многом как интерпретация, но вместо того, чтобы просто выполнить коды операций, Вы создаете список операций. Как только Вы достигаете команды перехода, Вы составляете этот список операций к машинному коду для Вашей серверной платформы, тогда Вы кэшируете этот скомпилированный код и выполняете его. Тогда при ударе данной группы инструкции снова только необходимо выполнить код от кэша. (BTW, большинство людей на самом деле не составляет список инструкций, но компилирует их в машинный код на лету - это делает более трудным оптимизировать, но это вне объема этого ответа, если достаточному количеству людей не интересно)
Со статической перекомпиляцией, Вы делаете то же как в динамической перекомпиляции, но Вы следуете за ответвлениями. Вы заканчиваете тем, что создали блок кода, который представляет весь код в программе, которая может тогда быть выполнена без дальнейшей интерференции. Это было бы большим механизмом если бы не следующие проблемы:
, Они объединяются для создания статической перекомпиляции абсолютно неосуществимой в 99% случаев. Для получения дополнительной информации Michael Steil провел некоторое большое исследование в статическую перекомпиляцию - лучшее, которое я видел.
другая сторона к эмуляции процессора является путем, которым Вы взаимодействуете с аппаратными средствами. Это действительно имеет две стороны:
платформы Certain - особенно более старые консоли как NES, SNES, и т.д. - требуют, чтобы Ваш эмулятор имел строгую синхронизацию, чтобы быть абсолютно совместимым. С NES у Вас есть PPU (пиксельный блок обработки), который требует, чтобы ЦП поместил пиксели в свою память в точные моменты. При использовании интерпретации можно легко считать циклы и эмулировать надлежащую синхронизацию; с динамической/статичной перекомпиляцией вещами является/lot/более сложное.
Прерывания являются основным механизмом, который ЦП передает с аппаратными средствами. Обычно Ваши аппаратные компоненты скажут ЦП, что прерывает его заботы о. Это довольно просто - когда Ваш код бросает данное прерывание, Вы смотрите на таблицу обработчика прерываний и называете соответствующий обратный вызов.
существует две стороны к эмуляции данного устройства:
Берут случай жесткого диска. Функциональность эмулирована путем создания внешней памяти, считайте/пишите/форматируйте стандартные программы и т.д. Эта часть обычно очень проста.
фактический интерфейс устройства немного более сложен. Это обычно - некоторая комбинация регистров с отображенной памятью (например, части памяти, которую устройство наблюдает за изменениями, чтобы сделать передачу сигналов), и прерывания. Для жесткого диска у Вас может быть область с отображенной памятью, куда Вы помещаете команды чтения, записи, и т.д., затем считывают эти данные назад.
я вдавался бы в большее количество подробностей, но существует миллион путей, которыми можно пойти с ними. Если у Вас есть какие-либо конкретные вопросы здесь, не стесняйтесь спрашивать, и я добавлю информацию
я думаю, что дал довольно хорошее введение здесь, но существует тонна из дополнительных областей. Я более, чем рад помочь с любыми вопросами; я был очень неопределенен в большей части из этого просто из-за огромной сложности.
Это был хорошо более чем год, с тех пор как этот ответ был отправлен, и со всем вниманием это добиралось, я полагал, что пора обновить некоторые вещи.
, Возможно, самая захватывающая вещь в эмуляции прямо сейчас libcpu, запущенный вышеупомянутым Michael Steil. Это - библиотека, предназначенная для поддержки большого количества ядер процессора, которые используют LLVM для перекомпиляции (статичный и динамичный!). Это имеет огромный потенциал, и я думаю, что это сделает большие вещи для эмуляции.
на документы страуса эму также обратили мое внимание, который содержит большой репозиторий документации по системе, которая очень полезна для целей эмуляции. Я не провел много времени там, но похоже, что у них есть много больших ресурсов.
я рад, что это сообщение было полезно, и я надеюсь, что могу выйти своей задницы и закончить мою книгу по предмету к концу года в следующем году / ранний в следующем году.
Да, необходимо интерпретировать целую двоичную путаницу машинного кода "вручную". Не только, что, большую часть времени также необходимо моделировать некоторые экзотические аппаратные средства, которые не имеют эквивалента на целевой машине.
простой подход должен интерпретировать инструкции один за другим. Это работает хорошо, но это медленно. Более быстрый подход является перекомпиляцией - перевод исходного машинного кода для предназначения для машинного кода. Это более сложно, поскольку большинство инструкций не отобразится непосредственный. Вместо этого необходимо будет сделать тщательно продуманные обходные решения, которые включают дополнительный код. Но в конце это намного быстрее. Большинство современных эмуляторов делает это.
При разработке эмулятора, Вы интерпретируете блок процессора, что система продолжает работать (Z80, 8080, ЦП PS, и т.д.).
также необходимо эмулировать все периферийные устройства, которые система имеет (видеовыход, контроллер).
необходимо начать писать эмуляторы для simpe систем как старое доброе Game Boy (которые используют процессор Z80, я не не путающий), ИЛИ для C64.
Эмуляция может казаться пугающей, но на самом деле вполне легче, чем моделирование.
Любой процессор обычно имеет правильно написанную спецификацию, которая описывает состояния, взаимодействия, и т.д.
, Если бы Вы не заботились о производительности вообще, тогда Вы могли бы легко эмулировать большинство процессоров прежних модификаций с помощью очень изящных объектно-ориентированных программ. Например, процессору X86 было бы нужно что-то для поддержания состояния (легких) регистров, что-то для поддержания состояния (легкой) памяти, и что-то, что примет каждое входящее управление и применит его к текущему состоянию машины. Если бы Вы действительно хотели точность, Вы также эмулировали бы переводы памяти, кэширование, и т.д., но это выполнимо.
На самом деле, многие микрочип и тестовые программы производителей ЦП против эмулятора микросхемы и затем против самой микросхемы, которая помогает им узнать, существуют ли проблемы в спецификациях микросхемы, или в фактической реализации микросхемы в аппаратных средствах. Например, возможно записать спецификацию микросхемы, которая привела бы к мертвым блокировкам, и когда крайний срок происходит в аппаратных средствах, важно видеть, могло ли это быть воспроизведено в спецификации, так как это указывает на большую проблему, чем что-то в реализации микросхемы.
, Конечно, эмуляторы для видеоигр обычно заботятся о производительности, таким образом, они не используют наивные реализации, и они также включают код, который взаимодействует через интерфейс с ОС хост-системы, например, для использования рисунка и звука.
Рассмотрение очень медленной производительности старых видеоигр (NES/SNES, и т.д.), эмуляция легка на довольно современных системах. На самом деле еще более удивительно, что Вы могли просто загрузить ряд каждой игры SNES когда-либо или любой игры Atari 2600 когда-либо, полагая, что то, когда эти системы были популярным свободным доступом наличия к каждому картриджу, будет осуществленной мечтой.
boost::optional<T>
, чтобы указать, есть ли у Вас допустимый объект T или нет. Это будет препятствовать тому, чтобы Вы звонили x.foo()
когда x.IsEmpty()==true
– MSalters
14 June 2010 в 12:07
Парень по имени Victor Moya del Barrio записал свой тезис по этой теме. Большая хорошая информация на 152 страницах. Можно загрузить PDF здесь .
, Если Вы не хотите регистрироваться в scribd, можно погуглить для заголовка PDF, "Исследование методов для эмуляции, программируя" . Существует несколько других источников для PDF.
Совет относительно эмуляции реальной системы или Вашей собственной вещи? Я могу сказать, что эмуляторы работают путем эмуляции ВСЕХ аппаратных средств. Возможно, не вниз к схеме (поскольку перемещающиеся биты как HW сделали бы. Перемещение байта является конечным результатом, настолько копирующим байт, прекрасен). Эмулятор очень трудно создать, так как существует много взломов (как в необычных эффектах), синхронизируя проблемы, и т.д. что необходимо моделировать. Если один (вход) часть является неправильной, что вся система может недооценить или в лучшем случае иметь ошибку/незначительный сбой.
Также посетите сайт Darek Mihocka Emulators.com , где вы найдете полезные советы по оптимизации на уровне инструкций для JIT и многие другие полезные советы по созданию эффективных эмуляторов.
Эмулятор очень сложно создать, так как существует множество хаков (например, необычных эффектов), проблем с синхронизацией и т. Д., Которые необходимо моделировать. .
Для примера см. http://queue.acm.org/detail.cfm?id=1755886 .
Это также покажет вам, почему вам «нужен» много-ГГц процессор для эмуляции 1-мегагерцового.
Эмулятор устройства с общим исходным кодом содержит собираемый исходный код для эмулятора PocketPC / Smartphone (требуется Visual Studio, работает в Windows). Я работал над версиями V1 и V2 двоичной версии.
Он решает многие проблемы эмуляции: - эффективная трансляция адресов из гостевых виртуальных в гостевые физические в виртуальные хосты - JIT-компиляция гостевого кода - моделирование периферийных устройств, таких как сетевые адаптеры, сенсорный экран и аудио - Интеграция пользовательского интерфейса для основной клавиатуры и мыши - сохранение / восстановление состояния, для моделирования выхода из режима пониженного энергопотребления
Я знаю, что этот вопрос немного устарел, но я хотел бы добавить кое-что к обсуждению. Большинство ответов здесь сосредоточено вокруг эмуляторов, интерпретирующих машинные инструкции систем, которые они эмулируют.
Однако существует очень известное исключение из этого, называемое "UltraHLE" (статья в WIKIpedia). UltraHLE, один из самых известных эмуляторов, когда-либо созданных, эмулировал коммерческие игры Nintendo 64 (с приличной производительностью на домашних компьютерах) в то время, когда это считалось невозможным. На самом деле, когда UltraHLE был создан, Nintendo все еще выпускала новые игры для Nintendo 64!
Впервые я увидел статьи об эмуляторах в печатных журналах, тогда как раньше я видел их обсуждение только в Интернете.
Концепция UltraHLE заключалась в том, чтобы сделать невозможное возможным, эмулируя вызовы библиотеки C вместо вызовов машинного уровня.
Создав свой собственный эмулятор микрокомпьютера BBC 80-х годов (введите VBeeb в Google), следует знать несколько вещей.
Практически говоря, вы обычно стремитесь писать для скорости и точности эмуляции. Это связано с тем, что программное обеспечение на целевой системе будет (может) работать медленнее, чем исходное оборудование на исходной системе. Это может ограничить выбор языка программирования, компиляторов, целевой системы и т.д.
Кроме того, вы должны ограничить то, что вы готовы эмулировать, например, нет необходимости эмулировать состояние напряжения транзисторов в микропроцессоре, но, вероятно, необходимо эмулировать состояние набора регистров микропроцессора.
Вообще говоря, чем меньше уровень детализации эмуляции, тем больше верности оригинальной системе вы получите.
Наконец, информация для старых систем может быть неполной или вообще отсутствовать. Поэтому необходимо приобрести оригинальное оборудование или, по крайней мере, раздобыть еще один хороший эмулятор, который написал кто-то другой!