Динамический тип вызываемых динамических аргументов
Для поддержки динамических типов и диспетчеризации методов мой язык программирования вводит тип под названием dynamic
. При вызове метода для вызываемого объекта, тип которого dynamic
, компилятор сначала помещает вызываемый объект и все аргументы в стек, а затем генерирует инструкцию invokedynamic
вместо обычной инструкции invoke*
. Инструкция указывает на специальный метод bootstrap в классе под названием DynamicLinker
, но при его вызове доступны только статические типы.
Моя проблема : как мне получить тип времени выполнения аргументов, переданных в инструкцию invokedynamic
?
2 ответа:
"динамическая" Часть
invokedynamic
не означает, что аргументы метода могут иметь динамические типы. Это скорее означает, что поведение инструкцииinvoke
может быть настроено. Точные типы аргументовinvokedynamic
известны во время компиляции.
Суть
invokedynamic
не в том, что JVM собирается реализовать систему динамического типа. Это было бы радикальным изменением, которое затрагивает множество частей JVM и может привести к снижению производительности даже в местах, не использующих эту функцию, с очень малой пользой: в конце концов, каждый динамический язык имеет различное представление о системе типов.Вместо этого,
Как уже было сказано, это похоже на методы оптимизации, JVM использует себя для вызовов, несущих семантику Java. Но у вас есть контроль над существующими видами призывов и как их разрешить. Конечно, вы можете реализовать все это без инструкцииinvokedynamic
позволяетвам реализовать вашу систему динамических типов. Вы можете делать именно то, что делают JVM и hotspot optimizer, но с помощью вашего собственная семантика. Таким образом, вы реализуете диспетчер вызова динамического метода, как вы бы сделали безinvokedynamic
. При первом вызове вы свяжетесь с тем динамическим диспетчером, который будет использовать типы времени выполнения аргументов для поиска цели. Но он также может записывать цели, и если он обнаружит, что конкретный сайт вызова имеет мономорфное поведение, его цель может быть перенаправлена к оптимизированному диспетчеру или даже непосредственно к целевому методу, в зависимости от того, как вы защищаетесь от последующих действий. изменения в поведении. Например, если среда выполнения обнаружит недействительность связанных инвариантов, например, загрузив новый тип в среду выполнения, вы можете связать сайт вызова непосредственно с целью и изменить цель (снова), когда произойдет событие, делающее цель недействительной. Или вы направляете вызов к коду sentinel, который проверяет предварительные условия для оптимизированного вызова перед его выполнением, предполагая, что проверка на известное предварительное условие выполняется быстрее, чем полная динамика уважать.invokedynamic
, используя обычные объектные структуры, моделирующие вашу систему типов, однако инструкцияinvokedynamic
позволяет сообщить JVM семантику вызывающего и вызываемого объекта, которая затем может быть использована оптимизатором HotSpot для сделайте прямую связь между ними.