Динамический тип вызываемых динамических аргументов


Для поддержки динамических типов и диспетчеризации методов мой язык программирования вводит тип под названием dynamic. При вызове метода для вызываемого объекта, тип которого dynamic, компилятор сначала помещает вызываемый объект и все аргументы в стек, а затем генерирует инструкцию invokedynamic вместо обычной инструкции invoke*. Инструкция указывает на специальный метод bootstrap в классе под названием DynamicLinker, но при его вызове доступны только статические типы.

Моя проблема : как мне получить тип времени выполнения аргументов, переданных в инструкцию invokedynamic?

2 2

2 ответа:

"динамическая" Частьinvokedynamic не означает, что аргументы метода могут иметь динамические типы. Это скорее означает, что поведение инструкции invoke может быть настроено. Точные типы аргументов invokedynamic известны во время компиляции.

Суть invokedynamic не в том, что JVM собирается реализовать систему динамического типа. Это было бы радикальным изменением, которое затрагивает множество частей JVM и может привести к снижению производительности даже в местах, не использующих эту функцию, с очень малой пользой: в конце концов, каждый динамический язык имеет различное представление о системе типов.

Вместо этого, invokedynamic позволяетвам реализовать вашу систему динамических типов. Вы можете делать именно то, что делают JVM и hotspot optimizer, но с помощью вашего собственная семантика. Таким образом, вы реализуете диспетчер вызова динамического метода, как вы бы сделали без invokedynamic. При первом вызове вы свяжетесь с тем динамическим диспетчером, который будет использовать типы времени выполнения аргументов для поиска цели. Но он также может записывать цели, и если он обнаружит, что конкретный сайт вызова имеет мономорфное поведение, его цель может быть перенаправлена к оптимизированному диспетчеру или даже непосредственно к целевому методу, в зависимости от того, как вы защищаетесь от последующих действий. изменения в поведении. Например, если среда выполнения обнаружит недействительность связанных инвариантов, например, загрузив новый тип в среду выполнения, вы можете связать сайт вызова непосредственно с целью и изменить цель (снова), когда произойдет событие, делающее цель недействительной. Или вы направляете вызов к коду sentinel, который проверяет предварительные условия для оптимизированного вызова перед его выполнением, предполагая, что проверка на известное предварительное условие выполняется быстрее, чем полная динамика уважать.

Как уже было сказано, это похоже на методы оптимизации, JVM использует себя для вызовов, несущих семантику Java. Но у вас есть контроль над существующими видами призывов и как их разрешить. Конечно, вы можете реализовать все это без инструкции invokedynamic, используя обычные объектные структуры, моделирующие вашу систему типов, однако инструкция invokedynamic позволяет сообщить JVM семантику вызывающего и вызываемого объекта, которая затем может быть использована оптимизатором HotSpot для сделайте прямую связь между ними.