Сколько регистров в кастомной ВМ?
Я создаю собственную виртуальную машину, и мне интересно, сколько регистров мне следует использовать. Изначально у меня было 255, но я немного беспокоюсь о том, чтобы сохранять 255 указателей (целых КБ) в стеке или куче каждый раз, когда я вызываю функцию, когда большинство из них даже не используются. Сколько регистров я должен использовать?
4 ответа
Извините ребята. Я сделал глупость на этом. Оказывается, у меня уже был вектор регистров для оптимизации доступа к стеку, о котором я полностью забыл. Вместо того, чтобы дублировать их, я просто устанавливаю регистры в состоянии, чтобы они были ссылкой на регистры стека. Теперь все, что мне нужно сделать, это специализировать нажатие, чтобы толкнуть прямо в регистр, и проблема решается очень эффективно. Эти регистры также никогда не будут нуждаться в поддержке, поскольку в них нет ничего зависящего от функции, и они будут расти в полном соответствии с моим стеком. Мне просто никогда не приходило в голову, что я могу помещать значения в них, не помещая эквивалентное значение в стек.
Абсолютно отвратительный шаблонный беспорядок, в который это превращается для простых концепций дизайна, хотя делает меня чрезвычайно несчастным. Хочу купить: статические if и variadic шаблоны.
Возможно, вы захотите заглянуть в окна регистров, которые позволяют сократить количество "активных" регистров, доступных одновременно, при сохранении большого количества регистров в ядре.
Сказав это, вы можете обнаружить, что использование стековой архитектуры более удобно. Некоторые крупные виртуальные машины, предназначенные для реализации в программном обеспечении (JVM, CLR, Python и т. Д.), Используют архитектуру стека. Конечно, проще написать компилятор для стека, чем искусственно ограниченный набор регистров.
Как правило, это зависит от того, сколько вы думаете, вам нужно. Я подвергаю сомнению полезность 255 регистров в практических приложениях.
Последняя машина регистра, которую я построил, была нацелена на поддержку небольшого языка программирования, и при планировании я смотрел на типы приложений, методологии проектирования, которые я хотел, чтобы люди могли использовать, сопоставляя все это с проблемами производительности при разработке реестра. файл.
Это не то, на что легко ответить без более подробной информации, но если вы остановитесь и подумаете о том, что вы пытаетесь сделать, и уравновесите все это с теми аспектами, которые вы считаете важными, вы придете к выводу, что сможете жить с, и это, вероятно, имеет смысл.
Какое бы количество регистров вы ни выбрали, у вас, вероятно, будет слишком много для большинства подпрограмм и слишком мало для нескольких подпрограмм. (Это всего лишь предположение. Однако, учитывая, сколько вещей в программировании следует распределению степенных законов - входящие ссылки на объекты, модули, классы, исходящие ссылки из объектов, модулей, классов, цикломатическая сложность подпрограмм, сложность подпрограмм NPath, SLOC длина подпрограмм, время жизни объектов, размер объектов - разумно предположить, что то же самое верно для количества регистров для подпрограммы, особенно если вы считаете, что, вероятно, существует корреляция между сложностью / длиной и количеством регистров.)
Виртуальная машина Parrot нашла довольно простой выход из этой загадки: у них бесконечное количество регистров. Очевидно, что эти регистры не хранятся в бесконечном массиве, скорее, они лениво материализуют достаточно регистров для любой отдельной подпрограммы. Таким образом, они никогда не исчерпывают регистры, и они никогда не тратят впустую никакого места.