Efficient compound values in virtual machines
- Compound values are not universally supported in virtual machine (VM)-based programming systems and languages. However, providing data structures with value characteristics can be beneficial. On one hand, programming systems and languages can adequately represent physical quantities with compound values and avoid inconsistencies, for example, in representation of large numbers. On the other hand, just-in-time (JIT) compilers, which are often found in VMs, can rely on the fact that compound values are immutable, which is an important property in optimizing programs. Considering this, compound values have an optimization potential that can be put to use by implementing them in VMs in a way that is efficient in memory usage and execution time. Yet, optimized compound values in VMs face certain challenges: to maintain consistency, it should not be observable by the program whether compound values are represented in an optimized way by a VM; an optimization should take into account, that the usage of compound values can exhibit certainCompound values are not universally supported in virtual machine (VM)-based programming systems and languages. However, providing data structures with value characteristics can be beneficial. On one hand, programming systems and languages can adequately represent physical quantities with compound values and avoid inconsistencies, for example, in representation of large numbers. On the other hand, just-in-time (JIT) compilers, which are often found in VMs, can rely on the fact that compound values are immutable, which is an important property in optimizing programs. Considering this, compound values have an optimization potential that can be put to use by implementing them in VMs in a way that is efficient in memory usage and execution time. Yet, optimized compound values in VMs face certain challenges: to maintain consistency, it should not be observable by the program whether compound values are represented in an optimized way by a VM; an optimization should take into account, that the usage of compound values can exhibit certain patterns at run-time; and that necessary value-incompatible properties due to implementation restrictions should be reduced. We propose a technique to detect and compress common patterns of compound value usage at run-time to improve memory usage and execution speed. Our approach identifies patterns of frequent compound value references and introduces abbreviated forms for them. Thus, it is possible to store multiple inter-referenced compound values in an inlined memory representation, reducing the overhead of metadata and object references. We extend our approach by a notion of limited mutability, using cells that act as barriers for our approach and provide a location for shared, mutable access with the possibility of type specialization. We devise an extension to our approach that allows us to express automatic unboxing of boxed primitive data types in terms of our initial technique. We show that our approach is versatile enough to express another optimization technique that relies on values, such as Booleans, that are unique throughout a programming system. Furthermore, we demonstrate how to re-use learned usage patterns and optimizations across program runs, thus reducing the performance impact of pattern recognition. We show in a best-case prototype that the implementation of our approach is feasible and can also be applied to general purpose programming systems, namely implementations of the Racket language and Squeak/Smalltalk. In several micro-benchmarks, we found that our approach can effectively reduce memory consumption and improve execution speed.…
- Zusammengesetzte Werte werden in VM-basierten Programmiersystemen und -sprachen nicht durchgängig unterstützt. Die Bereitstellung von Datenstrukturen mit Wertemerkmalen kann jedoch von Vorteil sein. Einerseits können Programmiersysteme und Sprachen physikalische Größen mit zusammengesetzten Werten, wie beispielsweise bei der Darstellung großer Zahlen, adäquat darstellen und Inkonsistenzen vermeiden. Andererseits können sich Just-in-time-Compiler, die oft in VMs zu finden sind, darauf verlassen, dass zusammengesetzte Werte unveränderlich sind, was eine wichtige Eigenschaft bei der Programmoptimierung ist. In Anbetracht dessen haben zusammengesetzte Werte ein Optimierungspotenzial, das genutzt werden kann, indem sie in VMs so implementiert werden, dass sie effizient in Speichernutzung und Ausführungszeit sind. Darüber hinaus stehen optimierte zusammengesetzte Werte in VMs vor bestimmten Herausforderungen: Um die Konsistenz zu erhalten, sollte das Programm nicht beobachten können, ob zusammengesetzte Werte durch eine VM in einerZusammengesetzte Werte werden in VM-basierten Programmiersystemen und -sprachen nicht durchgängig unterstützt. Die Bereitstellung von Datenstrukturen mit Wertemerkmalen kann jedoch von Vorteil sein. Einerseits können Programmiersysteme und Sprachen physikalische Größen mit zusammengesetzten Werten, wie beispielsweise bei der Darstellung großer Zahlen, adäquat darstellen und Inkonsistenzen vermeiden. Andererseits können sich Just-in-time-Compiler, die oft in VMs zu finden sind, darauf verlassen, dass zusammengesetzte Werte unveränderlich sind, was eine wichtige Eigenschaft bei der Programmoptimierung ist. In Anbetracht dessen haben zusammengesetzte Werte ein Optimierungspotenzial, das genutzt werden kann, indem sie in VMs so implementiert werden, dass sie effizient in Speichernutzung und Ausführungszeit sind. Darüber hinaus stehen optimierte zusammengesetzte Werte in VMs vor bestimmten Herausforderungen: Um die Konsistenz zu erhalten, sollte das Programm nicht beobachten können, ob zusammengesetzte Werte durch eine VM in einer optimierten Weise dargestellt werden; eine Optimierung sollte berücksichtigen, dass die Verwendung von zusammengesetzten Werten bestimmte Muster zur Laufzeit aufweisen kann; und dass wertinkompatible Eigenschaften vermindert werden sollten, die nur aufgrund von Implementierungsbeschränkungen notwendig sind. Wir schlagen eine Verfahrensweise vor, um gängige Muster der Verwendung von zusammengesetzten Werten zur Laufzeit zu erkennen und zu komprimieren, um die Speichernutzung und Ausführungsgeschwindigkeit zu verbessern. Unser Ansatz identifiziert Muster häufiger zusammengesetzter Wertreferenzen und führt für sie abgekürzte Formen ein. Dies ermöglicht es, mehrere miteinander verknüpfte zusammengesetzte Werte in einer eingebetteten Art und Weise im Speicher darzustellen, wodurch der Verwaltungsaufwand, der sich aus Metadaten und Objektreferenzen ergibt, reduziert wird. Wir erweitern unseren Ansatz um ein Konzept der eingeschränkten Veränderbarkeit, indem wir Zellen verwenden, die als Barrieren für unseren Ansatz dienen und einen Platz für einen gemeinsamen, schreibenden Zugriff mit der Möglichkeit der Typspezialisierung bieten. Wir entwickeln eine Erweiterung unseres Ansatzes, die es uns ermöglicht, mithilfe unserer ursprünglichen Technik das automatische Entpacken von primitiven geboxten Datentypen auszudrücken. Wir zeigen, dass unser Ansatz vielseitig genug ist, um auch eine andere Optimierungstechnik auszudrücken, die sich auf einzigartige Werte in einem Programmiersystem, wie beispielsweise Booleans, stützt. Darüber hinaus zeigen wir, wie erlernte Nutzungsmuster und Optimierungen über Programmausführungen hinweg wiederverwendet werden können, wodurch die Auswirkungen der Mustererkennung auf die Leistung reduziert werden. Wir zeigen in einem Best-Case-Prototyp, dass unser Ansatzes umsetzbar ist und auch auf allgemeinere Programmiersysteme wie Racket und Squeak/Smalltalk angewendet werden kann. In mehreren Mikro-Benchmarks haben wir festgestellt, dass unser Ansatz den Speicherverbrauch effektiv reduzieren und die Ausführungsgeschwindigkeit verbessern kann.…