1

Предположим, у нас есть язык программирования foo. foo имеет компилятор для System A, но не для System B. Теперь разработчик System B может либо написать собственный компилятор для foo, либо написать эмулятор System A, который работает на System B и может использовать компилятор, написанный для System A. Очевидным преимуществом эмулятора является то, что он не ограничивается запуском компилятора и открывает System B другим программам System A. Очевидным недостатком в большинстве случаев является производительность и сложность в зависимости от систем.Развитие языка программирования и базовая архитектура

Что мне интересно узнать, какой из этих подходов легче поддерживать. Например, пусть php будет языком, о котором идет речь, и предположим, что phc является единственным компилятором, доступным для данного языка. Этот компилятор работает только в Unix-подобных средах. Поэтому возникает вопрос: проще ли поддерживать новый компилятор для Windows (например, phc-win)? или поддерживать Unix-подобную среду, которая работает в Windows (например, Cygwin)?

+1

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

ответ

3

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

Однако системы - это не просто наборы инструкций. Приложение работает на виртуальной машине, состоящей из машинных инструкций System A, которые она использует напрямую, и вызывает ее системную ОС. Для запуска приложений System A в системе B вы не только эмулируете инструкции A, но и операционную систему System A. И учитывая сложность современных операционных систем, это может быть очень большим усилием.

Линукс ВИНО (WINdows Emulator) делает именно это; это запускает двоичные файлы Windows под Linux (в различных формах). WINE эмулирует инструкции Windows x86 благодаря использованию только систем x86 только для Linux, что означает, что он позволяет процессору выполнять эмуляцию инструкций. Затем он эмулирует много вызовов ОС Windows. Это большая программа, которая постоянно развивается (вот уже более десяти лет), и она постоянно меняется, чтобы не отставать от изменений в Windows, которые делает Microsoft. И у него все еще есть список пожеланий/ошибок для вещей, которые он не делает хорошо.

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

Отмечу, что создание компилятора также не решает проблему эмуляции ОС; исходный код приложения теперь может компилироваться в собственные инструкции System B, но вызовы ОС это делает ... компилятор не обрабатывает. Как инженеры-компиляторы, вы решаете проблему переносимости кода, нажимая проблему эмуляции ОС у владельцев приложений. Это более простая проблема: они только эмулируют аспекты системных вызовов ОС, от которых они зависят; им не нужно эмулировать каждый аспект этих вызовов.

+0

Хороший ответ, также возможно, в зависимости от компилятора для системы A, использовать его выходной код промежуточного байта в качестве отправной точки для генератора кода системы B, что означает, что стоимость реализации полного компилятора System B ниже поскольку он использует часть компилятора System A. –

Смежные вопросы