Pull to refresh

Comments 35

Спасибо за интересный пост. Нужно попробовать реализовать на C#
Всегда пожалуйста. Будет что-то непонятно, обращайтесь. Можно даже в ICQ.
обязательно напишу, надо же начинать что-то писать, а не только комментировать
Уффф… аж зацепило. Вспомнились красноглазые ночи, в попытках эмулировать Z80.
Умели ж тогда писать… Интерпретатор байткода в 512 байт, вирусы под DOS в 376 байт и вроде бы даже меньше… А щас ухают по два метра, чтобы нарисовать простой квадрат =(
376 байт… Мммм, у меня не получилось меньше 720 байт, как не оптимизировал )) Правда там около 100 байт занимало текстовое послание…
Нанотехнолог детектед. Шли бы вы… в Сколково!
Свободно ужимались в 342 байта для .com файлов на C--.

Рекорд если не ошибаюсь остается за 163 байтным tiny (из распространенных) Хотя помнятся теоретические екземпляры в 93 и 62 байта (нужно полистать IV)
Люди давно запутались во множестве языков, и юзают первый попавшийся для любой задачи, и пишут на нем как попало. Что-то вроде макаки с телевизором в качестве молотка.
И все же есть умельцы, хорошо пользующиеся большим набором инструментов, но Толпа макак никогда не будет на их стороне )
К сожалению, эти умельцы зачастую стремятся использовать свои умения всегда: и по делу, и не очень, создавая совершенно неподдерживаемый код. И когда в большом проекте видишь что-то страшное и совершенно непохожее на остальной код, сразу понимаешь: либо код откуда-то взят (соисполнители, СПО, интернет), либо здесь побывал такой умелец.
Сейчас мало кого волнует качество кода и вообще понятие о том, что код можно написать по-разному, стремясь к тому или иному способу реализации. Большинство стремится накодить лишь бы результат был, и не важно, с какими ресурсными затратами и дальнейшей ценой сопровождения.
Как из той старой шутки про измерение объема башни барометрами путем засыпания ее барометрами доверха, а потом умножения объема барометра на их кол-во и пр. Никто, например, не будет измерять башню и вспоминать формулы с Пи.
Просто никто не хочет стараться…
Возможно, вы правы… Только не забывайте, пожалуйста, что благими намерениями выстлана дорога в ад.

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

Так что везде нужно равновесие. И экономия килобайтов (не мегабайтов) кода в реальных приложениях (для которых это не является самоцелью) на мой взгляд является опасным и бессмысленным занятием.
Ну это какой-то монстр, насколько помню из описания Лозинского, самый маленький overwrite был в 33 байта. Ну а под Win95 самый маленький — 156 байт.
UFO just landed and posted this here
Спасибо за великолепный пост, коих мало на хабре!
О, одна из моих любимых тем =)
Z80 правда не эмулировал, но некую часть AVR делал.
Сейчас работаю на симулятором своего самодельного проца.
Windows 95 там можно запустить? :)
Сейчас что-то мода пошла на всем Windows запускать… На мобилах, читалках, планшетах… Вобщем, везде, где он вообще ну никак не нужен…
Нет, процик очень примитивный с нестандартной архитектурой, да и ТТЛ логика ограничена по частоте.
Жаль только то, что я не могу написать статью на хабр…
UFO just landed and posted this here
Навеяло извращенную мысль, что можно написать эмулятор, а на нём уже написать эмулятор другого эмулятора и так далее, для истинных гиков, и кто дальше.
Эмулятор SNES для J2ME — это вот примерно оно :)
На самом деле так сейчас все и работает. Ваш CPU, на самом деле, внутри является некой RISC машиной, а привычные x86 инструкции он эмулирует, точнее, транслирует в более простые внутренние микрокоманды. Запускаете, скажем, VirtualBox, чтоб загрузить Windows из Linux — еще один уровень эмуляции. Стартуете Java программу — JVM на лету транслирует байткод в инструкции процессора. А сама программа, вероятно, тоже что-то эмулирует :)
UFO just landed and posted this here
UFO just landed and posted this here
О, интерпретаторы! Моя любимая тема и безграничное поле для деятельности! На ней можно всю информатику выучить :)
Для начала скажу, что цикл с большим 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
Ну потому я и говорил про «правильно оформленный» ;)
Кстати, почему в программе все массивы по 17 элементов, 2049, 4097?
С запасом взял )) Ну конечно простые опечатки, спасибо что заметили.
UFO just landed and posted this here
Sign up to leave a comment.

Articles