0
을 사용하는 방법을 호출하고 다음과 같이 I는, 인수를 사용하여 메소드를 호출 할 :는 재스민 내가 재스민 코드를 생성하는 컴파일러를 쓰고 있어요 인수
.class public helloworld
.super java/lang/Object
.method public <init>()V
aload_0
invokenonvirtual java/lang/Object/<init>()V
return
.end method
.method public test(I)I
.limit stack 4
.limit locals 3
iload 1
ireturn
.end method
.method public static main([Ljava/lang/String;)V
.limit stack 4
.limit locals 3
aload_0
ldc 1
invokevirtual helloworld/test(I)I
return
.end method
:
val test(val x) {
return x;
}
val main (string[] args) {
test(1);
}
이로 컴파일
그러나 다음과 같은 오류가 발생합니다. 여기서 내가 뭘 잘못하고 있니?
java.lang.VerifyError: (class: helloworld, method: main signature: ([Ljava/lang/String;)V) Incompatible object argument for function call
고마워, 그 방법은 내 문제를 해결 정적 만드는 것. 컴파일러를 작성하는 언어는 내가 직접 만든 언어입니다. 그러나, 나는 또 하나의 오류를 낳기 때문에 질문이 하나 더있다. Java에서 동일한 프로그램을 다시 작성하고 javap 명령으로 디스 어셈블하면 iload_1 (iload_0이 아닌) 함수의 첫 번째 인수가로드됩니다. 0 레지스터가 자체에 대한 참조라고 생각했기 때문에 (다른 질문에서 설명한 것처럼 함수를 호출 할 때 aload_0로로드하는 이유는 무엇입니까?) – appel
이것은 정적 메서드이므로 0 레지스터가 첫 번째 변수입니다. 그것이 인스턴스 메소드 일 때, 0은'this'입니다. – wvdz
설명해 주셔서 감사합니다. – appel