Более трудный создать: Эмулятор или компилятор?

Человек, ваш return dateFormat.format(new Date()); вызывает проблему: /

Ваша правильная реализация должна быть return dateFormat.format(date);

8
задан Helen 17 July 2009 в 21:09
поделиться

9 ответов

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

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

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

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

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

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

10
ответ дан 5 December 2019 в 05:19
поделиться

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

6
ответ дан 5 December 2019 в 05:19
поделиться

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

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

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

8
ответ дан 5 December 2019 в 05:19
поделиться

Запись компилятора НАМНОГО более трудна, так как Вы имеете дело с намного более низким материалом уровня (соединение, блок, это характерно для Вашей архитектуры, и т.д.).

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

0
ответ дан 5 December 2019 в 05:19
поделиться

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

  • Эмулятор, который эмулирует очень простую систему (например, калькулятор с 4 функциями) в очень способной системе (например, современный ПК) будет легко записать.
  • Компилятор, который компилирует очень простой язык для единой цели (например, что-то, что отображается почти непосредственно на выходной блок) будет легко записать.
  • Эмулятор, который эмулирует очень сложную систему (например, большая, собственная вычислительная система) в очень простой системе (например, КПК) будет очень трудно записать
  • Компилятор, который компилирует очень высокоуровневый язык (например, полный C++) для многих целей, будет очень трудно записать
3
ответ дан 5 December 2019 в 05:19
поделиться

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

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

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

Править: Я думаю, что оба навыков очень полезны, и можно на самом деле объединить их - они не XOR.

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

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

2
ответ дан 5 December 2019 в 05:19
поделиться

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

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

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

1
ответ дан 5 December 2019 в 05:19
поделиться

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

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

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

1
ответ дан 5 December 2019 в 05:19
поделиться

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

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

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

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

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

1
ответ дан 5 December 2019 в 05:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: