Комментарии 35
Спасибо за интересный пост. Нужно попробовать реализовать на C#
Уффф… аж зацепило. Вспомнились красноглазые ночи, в попытках эмулировать Z80.
Умели ж тогда писать… Интерпретатор байткода в 512 байт, вирусы под DOS в 376 байт и вроде бы даже меньше… А щас ухают по два метра, чтобы нарисовать простой квадрат =(
376 байт… Мммм, у меня не получилось меньше 720 байт, как не оптимизировал )) Правда там около 100 байт занимало текстовое послание…
Люди давно запутались во множестве языков, и юзают первый попавшийся для любой задачи, и пишут на нем как попало. Что-то вроде макаки с телевизором в качестве молотка.
И все же есть умельцы, хорошо пользующиеся большим набором инструментов, но Толпа макак никогда не будет на их стороне )
И все же есть умельцы, хорошо пользующиеся большим набором инструментов, но Толпа макак никогда не будет на их стороне )
К сожалению, эти умельцы зачастую стремятся использовать свои умения всегда: и по делу, и не очень, создавая совершенно неподдерживаемый код. И когда в большом проекте видишь что-то страшное и совершенно непохожее на остальной код, сразу понимаешь: либо код откуда-то взят (соисполнители, СПО, интернет), либо здесь побывал такой умелец.
Сейчас мало кого волнует качество кода и вообще понятие о том, что код можно написать по-разному, стремясь к тому или иному способу реализации. Большинство стремится накодить лишь бы результат был, и не важно, с какими ресурсными затратами и дальнейшей ценой сопровождения.
Как из той старой шутки про измерение объема башни барометрами путем засыпания ее барометрами доверха, а потом умножения объема барометра на их кол-во и пр. Никто, например, не будет измерять башню и вспоминать формулы с Пи.
Просто никто не хочет стараться…
Как из той старой шутки про измерение объема башни барометрами путем засыпания ее барометрами доверха, а потом умножения объема барометра на их кол-во и пр. Никто, например, не будет измерять башню и вспоминать формулы с Пи.
Просто никто не хочет стараться…
Возможно, вы правы… Только не забывайте, пожалуйста, что благими намерениями выстлана дорога в ад.
В нашей команде реально очень много внимания уделяется качеству кода и в особенности правильному проектированию. Проблема в том, что внимания этому уделяется слишком много. И огромное количество времени ушло на проектирование и реализацию монструозных и излишне универсальных (но красивых и в теории правильных) решений.
Так что везде нужно равновесие. И экономия килобайтов (не мегабайтов) кода в реальных приложениях (для которых это не является самоцелью) на мой взгляд является опасным и бессмысленным занятием.
В нашей команде реально очень много внимания уделяется качеству кода и в особенности правильному проектированию. Проблема в том, что внимания этому уделяется слишком много. И огромное количество времени ушло на проектирование и реализацию монструозных и излишне универсальных (но красивых и в теории правильных) решений.
Так что везде нужно равновесие. И экономия килобайтов (не мегабайтов) кода в реальных приложениях (для которых это не является самоцелью) на мой взгляд является опасным и бессмысленным занятием.
Ну это какой-то монстр, насколько помню из описания Лозинского, самый маленький overwrite был в 33 байта. Ну а под Win95 самый маленький — 156 байт.
НЛО прилетело и опубликовало эту надпись здесь
Спасибо за великолепный пост, коих мало на хабре!
О, одна из моих любимых тем =)
Z80 правда не эмулировал, но некую часть AVR делал.
Сейчас работаю на симулятором своего самодельного проца.
Z80 правда не эмулировал, но некую часть AVR делал.
Сейчас работаю на симулятором своего самодельного проца.
Windows 95 там можно запустить? :)
Сейчас что-то мода пошла на всем Windows запускать… На мобилах, читалках, планшетах… Вобщем, везде, где он вообще ну никак не нужен…
Сейчас что-то мода пошла на всем Windows запускать… На мобилах, читалках, планшетах… Вобщем, везде, где он вообще ну никак не нужен…
НЛО прилетело и опубликовало эту надпись здесь
Навеяло извращенную мысль, что можно написать эмулятор, а на нём уже написать эмулятор другого эмулятора и так далее, для истинных гиков, и кто дальше.
Эмулятор SNES для J2ME — это вот примерно оно :)
На самом деле так сейчас все и работает. Ваш CPU, на самом деле, внутри является некой RISC машиной, а привычные x86 инструкции он эмулирует, точнее, транслирует в более простые внутренние микрокоманды. Запускаете, скажем, VirtualBox, чтоб загрузить Windows из Linux — еще один уровень эмуляции. Стартуете Java программу — JVM на лету транслирует байткод в инструкции процессора. А сама программа, вероятно, тоже что-то эмулирует :)
НЛО прилетело и опубликовало эту надпись здесь
О, интерпретаторы! Моя любимая тема и безграничное поле для деятельности! На ней можно всю информатику выучить :)
Для начала скажу, что цикл с большим switch/case по опкодам, как правило, неэффективный способ для написания интерпретатора. Лучше использовать таблицы перехода. Кроме того, и сам цикл не нужен (лишний безусловный переход) — реализация каждого опкода может заканчиваться прыжком на следующий опкод (например, при помощи computed goto в GNU C). Разумеется, для данного конкретного эмулятора это необязательно, но в образовательных целях можно и с него начать. Если опкодов слишком много, иногда имеет смысл разбить один case на два меньших: с частыми и редкими опкодами, как сделано в классической JVM. Указатель (PC) лучше кэшировать в локальной переменной. Память устройства можно эффективно эмулировать средствами виртуальной памяти ОС (VirtualAlloc, mmap). Ну, а потом потихоньку переходить к JIT, сначала однопродному, потом с промежуточным представлением и т.д.
В общем, замечательная тема. Удачи!
Для начала скажу, что цикл с большим switch/case по опкодам, как правило, неэффективный способ для написания интерпретатора. Лучше использовать таблицы перехода. Кроме того, и сам цикл не нужен (лишний безусловный переход) — реализация каждого опкода может заканчиваться прыжком на следующий опкод (например, при помощи computed goto в GNU C). Разумеется, для данного конкретного эмулятора это необязательно, но в образовательных целях можно и с него начать. Если опкодов слишком много, иногда имеет смысл разбить один case на два меньших: с частыми и редкими опкодами, как сделано в классической JVM. Указатель (PC) лучше кэшировать в локальной переменной. Память устройства можно эффективно эмулировать средствами виртуальной памяти ОС (VirtualAlloc, mmap). Ну, а потом потихоньку переходить к JIT, сначала однопродному, потом с промежуточным представлением и т.д.
В общем, замечательная тема. Удачи!
Хм, всегда думал, что правильно оформленный switch/case компилируется в таблицу переходов, разве не так?
Да, но далеко не всегда это делается оптимальным образом. Например, если есть пропуски/повторения индексов, генерируется вспомогательная таблица и дополнительная инструкция
movzx eax, BYTE PTR $indextable[eax]
Если же используются, скажем, 30 опкодов из 32 возможных, появляется лишний условный переход
cmp eax, 29
ja $loopstart
movzx eax, BYTE PTR $indextable[eax]
Если же используются, скажем, 30 опкодов из 32 возможных, появляется лишний условный переход
cmp eax, 29
ja $loopstart
Кстати, почему в программе все массивы по 17 элементов, 2049, 4097?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Создаем эмулятор приставки