Сложнее построить: эмулятор или компилятор? - PullRequest
8 голосов
/ 01 апреля 2009

Учитывая опытного разработчика с 10-20-летним опытом, который никогда не создавал ни компилятор, ни эмулятор, что было бы более сложной задачей?

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

Спасибо.

Ответы [ 9 ]

10 голосов
/ 03 апреля 2009

Эмуляция и компиляция весьма различны, но имеют тенденцию смешиваться из-за того, что оба считаются "низкоуровневыми".

Эмуляция простой архитектуры, такой как 6502 или Z80, будет довольно простой для работы с ЦП, но будет существенный кусок кода для записи, так как вам нужно иметь функцию для каждой инструкции. Вы захотите автоматизировать это каким-то образом, начиная со спецификации набора команд со всеми временными интервалами и тому подобным, так как ввод всего этого будет очень утомительным :) Старые спецификации набора инструкций процессора легко найти, так что это очень помогает при сборке эмуляторов.

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

Компиляция будет включать в себя какую-то языковую спецификацию любого языка, для которого вы собираетесь реализовывать компилятор, и цель, для которой вы будете стремиться выводить код. Вывод может быть прямым в двоичный, может быть сборкой или даже другим языком (на самом деле это просто переводчик, но он считается компиляцией, когда цель считается «достаточно» низкоуровневой). Поскольку вы будете работать на каком-либо оборудовании или платформе VM, вам вряд ли придется беспокоиться об обработке прерываний и подобных вещах.

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

Помните, что с обоими этими элементами вы должны иметь возможность создавать входные данные для их тестирования, и если вы не можете создать простые входные данные, то вам будет очень трудно получить отладку с самого начала. Это само по себе облегчает работу компилятора, imho (Это и то, что вы захотите иметь что-то, что эмулирует полную консоль или что-то сразу:)

8 голосов
/ 02 апреля 2009

Я написал оба и скажу, что при прочих равных условиях (сложность языка или набора инструкций), способ проще написать эмулятор, особенно если вы пытаетесь написать интересный эмулятор или компилятор.

Причина в том, что с эмулятором вы пытаетесь симулировать низкоуровневую вещь с другой, похожей низкоуровневой вещью. Это не так уж плохо. С помощью компилятора вы можете пытаться реализовать идеи очень высокого уровня (например, объекты, первоклассные функции, управляемую память, сканирование строк) с помощью инструментов очень низкого уровня (машинные слова и машинные инструкции). Эта задача намного сложнее.

Конечно, для веселых банд вы можете написать эмулятор, который работает с динамическим двоичным переводом , который представляет собой компиляцию машинного кода для эмулируемой архитектуры в машинный код для нативной архитектуры. Таким образом, вы получите удовольствие от обоих - и сможете создавать действительно быстрые эмуляторы, такие как QEMU или опоздающий Digital FX! 32.

6 голосов
/ 01 апреля 2009

Я написал оба и сказал бы, что эмулятор, как правило, проще. Конечно, это во многом зависит от того, что вы пытаетесь эмулировать (эмуляция мэйнфрейма IBM на iPhone может быть сложной задачей) и того, что вы пытаетесь скомпилировать (небольшой компилятор C довольно прост, полный компилятор C ++ почти невероятно сложно.

3 голосов
/ 01 апреля 2009

Это во многом зависит от того, что вы эмулируете, и что вы компилируете.

  • Эмулятор, который эмулирует очень простую систему (например, калькулятор с 4 функциями) в очень функциональной системе (например, современный ПК), будет легко написать.
  • Компилятор, который компилирует очень простой язык для одной цели (например, что-то, что отображается почти непосредственно в выходную сборку), будет легко написать.
  • Эмулятор, который эмулирует очень сложную систему (например, большую проприетарную вычислительную систему) в очень простой системе (например, КПК), будет очень трудно написать
  • Компилятор, который компилирует язык очень высокого уровня (например, полный C ++) для многих целей, будет очень трудно написать
2 голосов
/ 02 апреля 2009

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

При разработке языка XX необходимо учитывать множество факторов, не говоря уже об оптимизации вывода кода, сгенерированного компилятором, который сам по себе является черным искусством. С эмулятором у вас уже есть четко определенная среда с в основном четко определенным языком, который вы хотите реализовать.

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

РЕДАКТИРОВАТЬ: Я думаю, что оба навыка очень полезны, и на самом деле их можно комбинировать - они не XOR.

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

Я также согласен с тем, что если платформа неизвестна, т. Е. Вы что-то реинжинирируете, то эмулятор сделать гораздо сложнее, но OTOH - не тот вопрос, о котором говорил OP, не так ли?

1 голос
/ 17 июля 2009

Вне контекста не может быть однозначных ответов: все зависит от того, чего вы хотите достичь, и от того, с чем вы соревнуетесь .

Если это просто "доказательство концепции", то в обоих случаях это довольно просто.

Но если вы пытаетесь эмулировать сложное аппаратное обеспечение или с высокой точностью, или если вы хотите добиться качества компиляции AAA, все может быстро стать ужасно сложной. Сложность будет проявляться не только в алгоритмах / теории «основного» кода, но и во всех инструментах поддержки, которые вам придется создавать (отладчики, дизассемблеры, профилировщики и т. Д.), Чтобы вы могли перейти к следующему шагу.

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

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

1 голос
/ 04 июля 2009

Написание эмулятора для известной эмулируемой платформы не так сложно (вы также можете использовать готовый эмулятор процессора и получить немного времени на разработку).

Написание эмулятора для неизвестного эмулируемого оборудования намного сложнее и переносит трудности в области, отличные от разработки кода: математика, криптоанализ, протоколы безопасности и т. Д. терпение для проб и ошибок, вовлеченных в процесс.

В качестве примера, просто подумайте, сколько времени CPS2 требуется для эмуляции (ПЗУ CPS2 были зашифрованы).

1 голос
/ 28 мая 2009

Эмуляция программного обеспечения довольно проста и относительно проста, но может быть утомительной.

Написание компилятора может быть очень трудным, но его можно упростить, если у вас есть хорошие рабочие знания или хороший набор спецификаций (например, нотация формы Бэкуса-Наура) языка, для которого вы пишете компилятор.

Эмуляция аппаратного обеспечения может быть чрезвычайно сложной, если ваша цель - заставить эмулятор работать на многих разных платформах (например, запуск эмуляции синхронизации дисковода гибких дисков может работать под MSDOS с использованием правильных констант выдумки, но эмуляция завершается неудачно на многозадачной платформе, такой как Vista или Linux). Аппаратная эмуляция также чрезвычайно трудна, когда недостаточно знаний о том, как ее режим работы контролируется программным обеспечением. Это заставляет долго и досадно перепроектировать, прежде чем прогресс может быть достигнут.

В целом, я считаю, что эмуляция сложнее.

0 голосов
/ 01 апреля 2009

Написание компилятора ОЧЕНЬ сложнее, так как вы имеете дело с вещами более низкого уровня (связывание, сборка, специфичная для вашей архитектуры и т. Д.).

Эмулятор просто должен выполнять логику каждой поданной инструкции (и я знаю, что упрощаю это, но я предполагаю, что у вас есть спецификации для набора инструкций), теперь, написание эмулятора FAST НАМНОГО сложнее.

...