Programing

JVM 프로그래밍 언어 만들기

lottogame 2020. 9. 12. 11:18
반응형

JVM 프로그래밍 언어 만들기


루프, 함수 내부 함수 선언, 재귀 호출 등을 지원하는 동적 형식 프로그래밍 언어를 위해 C (lex & bison 사용)로 컴파일러를 만들었습니다. 또한 컴파일러에서 만든 중간 코드를 실행하는 가상 머신을 만들었습니다.

나는 이제 내 자신의 중간 코드로 컴파일하는 대신 자바 바이트 코드로 컴파일하는 것을 생각하고 있었다.

JVM 언어 생성에 대한 질문이 이미 제기 된 것을 보았지만 그에 대한 답은 그리 유익하지 않습니다.

그래서 여기 내 질문이 있습니다.

  1. JVM을위한 언어를 만들려면 반드시 JVM 사양서 를 읽는 것이 필요 하다고 생각합니다. 다른 책을 제안 할 수 있습니까 (물론 Dragon Book 제외)? 일반적으로 컴파일러가 아닌 JVM 언어를 만드는 방법에 대한 책이나 자습서에 주로 관심이 있습니다.
  2. jclasslib , bcel , gnu bytecode 등과 같은 .class 파일을 읽고, 쓰고, 변경할 수있는 많은 Java 라이브러리 가 있습니다. 어떤 것을 제안 하시겠습니까? 또한 동일한 작업을 수행하는 C 라이브러리를 알고 있습니까?
  3. Clojure, Jython 또는 JRuby와 같은 JVM을 대상으로하는 다른 언어를 살펴볼 생각이었습니다. 그러나 이러한 모든 언어는 매우 수준이 높고 복잡합니다 (그들을위한 컴파일러를 만들기 위해). JVM을 대상으로하는 더 간단한 프로그래밍 언어 (알 수 없거나 사용되지 않은 경우 상관 없음)를 찾고 있었으며 컴파일러는 오픈 소스입니다. 어떤 아이디어?

나는 또한 ASM을 추천하고 싶지만 Jasmin을 살펴 보았고 , 대학 프로젝트에 사용했거나 (또는 ​​사용해야했는데) 꽤 잘 작동하고, 렉서 / 파스 / 분석기 / 최적화 기 / 생성기 조합을 작성했습니다. Java와 jasmin을 사용하는 프로그래밍 언어이므로 JVM 코드를 생성합니다. 여기 에 코드를 업로드했는데 흥미로운 부분은 소스 코드 자체 여야 합니다 . "bytecode / InsanelyFastByteCodeCreator.java"폴더에서 AST 트리를 재스민 어셈블러의 입력 형식으로 변환하는 코드를 찾을 수 있습니다. 아주 간단합니다.

소스 언어 (Lexer + Parser + Analyzer에 의해 AST로 변환 됨)는 MiniJava라는 Java의 하위 집합입니다. 상속, 생성자, 정적 메서드, 개인 필드 / 메서드와 같은 일부 "복잡한"기능이 없습니다. 이러한 기능 중 구현하기 어려운 것은 없지만 X86 백엔드를 작성하는 또 다른 작업이있었습니다 (따라서 머신 어셈블러를 생성하기 위해). 일부 작업을 처리하는 JVM이 없으면 이러한 작업이 어려워지는 경향이 있습니다.

이상한 클래스 이름이 궁금한 경우 : 대학 프로젝트의 작업은 AST를 SSA 그래프 (입력 코드를 나타내는 그래프)로 변환 한 다음 그래프를 최적화 한 다음 그래프를 자바 바이트 코드로 바꾸는 것이 었습니다 . 이것은 프로젝트 작업의 약 3/4이었고 InsanlyFastByteCodeCreator는 모든 것을 테스트하는 지름길이었습니다.

Jon Meyer와 Troy Downing의 "Java Virtual Machine"책을 살펴보십시오. 이 책은 Jasmin-Assembler를 많이 참조하므로 JVM 내부를 이해하는 데 매우 유용합니다.


지난 학기에 "컴파일러 구성"과정에 참석했습니다. 우리 프로젝트는 정확히 당신이하고 싶은 일이었습니다.

제 언어를 작성하는 데 사용한 언어는 Scala 입니다. JVM에서 실행되지만 Java가 지원하지 않는 많은 고급 기능을 지원합니다 (여전히 순수 Java JVM과 완전히 호환 됨).

Java 바이트 코드를 출력하기 위해 Scala CAFEBABE 라이브러리를 사용했습니다 . 잘 문서화되어 있으며 수행 할 작업을 이해하기 위해 Java 클래스에 깊이 들어갈 필요가 없습니다.

책 외에도 우리가 과정 중에 수행 한 실습통해 많은 정보를 찾을 수 있다고 생각합니다 .


ASM 은 바이트 코드 생성을위한 솔루션이 될 수 있습니다. 시작하려면 매뉴얼 에서 요소 생성에 대한 주제를 확인하십시오 .


Clojure, Jython 또는 JRuby와 같은 JVM을 대상으로하는 다른 언어를 살펴볼 생각이었습니다. 그러나 이러한 모든 언어는 매우 수준이 높고 복잡합니다 (그들을위한 컴파일러를 만들기 위해).

제안 : Lua Programming Language를 살펴볼 수 있으며 LuaJ 와 같은 JVM 구현이 있습니다 .

기본, 문자열, 테이블, 패키지, 수학, io, os, 디버그 및 코 루틴 패키지, 컴파일러 , luajava 바인딩 및 JSR-233 플러그 형 스크립팅 엔진을 위한 라이브러리를 포함하는 J2ME 및 J2SE 용으로 작성된 가볍고 빠른 Java 중심 Lua 인터프리터 바인딩.

(JNI 접근 방식으로 네이티브 라이브러리를 사용하는 LuaJava와 혼동하지 마십시오.)


지난 주말, 장난감 언어를 JVM으로 이식하는 것과 같은 질문을했습니다.

정보를 검색하는 데 몇 시간 밖에 걸리지 않으므로이 참고 자료를 염두에 두십시오.

  • 언어 구현 패턴 . 나는 개미를 싫어하지만이 책은 아주 좋아 보인다. antlr도 좋아하지 않는다면 "Parsing Techniques. A Practical Guide"를 구문 분석하는 것이 좋습니다.

    구성 파일 판독기, 데이터 판독기, 모델 기반 코드 생성기, 소스-소스 변환기, 소스 분석기 및 인터프리터를 구축하는 방법을 배웁니다. 컴퓨터 과학에 대한 배경 지식이 필요하지 않습니다. ANTLR 제작자 인 Terence Parr는 언어 구현을 가장 일반적인 디자인 패턴으로 분류하여 설명합니다. 패턴별로 자신의 컴퓨터 언어를 구현하는 데 필요한 핵심 기술을 배우게됩니다.

    10 장은이 주제를 30 페이지 (고속 IMO)로 다룹니다. 그러나 아마도 당신이 관심을 가질만한 다른 장이 있습니다.

    • 10 바이트 코드 인터프리터 구축
      • 10.1 바이트 코드 해석기 프로그래밍. .
      • 10.2 어셈블리 언어 구문 정의
      • 10.3 바이트 코드 머신 아키텍처. . . . .
      • 10.4 여기에서 이동할 위치. . . . . . . . . .
      • P.26. 바이트 코드 어셈블러. . . . . . . . . . .
      • P.27. 스택 기반 바이트 코드 인터프리터. . .
      • P.28. Register-Based Bytecode Interpreter
      http://pragprog.com/titles/tpdsl/language-implementation-patterns
    • The Implementation of Lua 5.0 This is a great paper about register- based bytecode machines. Go an read it even for the sake of it.

    • Lisp in Small Pieces. This book teach how to write a 2 schme compailers that compile to C. So many lessons can be learned from this book. I own a copy of this book and it is really good for anyone interesting is lisp, but maybe not your cup of tea.

      This is a comprehensive account of the semantics and the implementation of the whole Lisp family of languages, namely Lisp, Scheme and related dialects. It describes 11 interpreters and 2 compilers ...

    http://www.amazon.com/Lisp-Small-Pieces-Christian-Queinnec/dp/0521562473

Check the Dalvik7 VM, a register-based VM. The DVM operates on bytecodes that are transformed from the Java Class files compiled by a Java compiler.

There is a mailing list about the topic, jvm-languages.

Are you planning to upload the code to anyplace? I would like to take a look.


I would recommend that you first learn how JVM assembly works, if you don't already know it.

Many instructions have the form ?name, where ? is i if the instruction works on with an integer type and a if it works with a reference type.

Basically, JVM is a stack machine with no registers, so all instructions work with data directly on the stack. You can push/pop data with ?push/?pop and move data between local variables (stack locations referenced by offsets) and the top of the stack using ?store/?load. Some other important instructions are invoke??? and if_???.

For my university's compiler course we used Jasmin to assemble the programs. I don't know if this is the best way, but at least it is an easy place to start.

Here is an instruction reference for an old version of the JVM, which might contain fewer instructions than a new one.


The best resource for the beginning might be Ola Bini's presentation. Grab the slides as well.


First I'd back off, modify my compiler to output actual Java instead of Java byte codes (which means creating more of a translator than compiler), and compile the Java output with whatever Java environment is convenient (which would probably generate better object code than my own compiler).

You could use the same technique (eg, compile to C#) to generate CLI byte codes, or compile to Pascal to generate P-code, etc.

It's not clear why you're considering Java codes instead of using your own VM, but if it's for performance then of course you should also consider compiling to actual machine code.


Of course once could use Java to write a new language. With the Java reflection-API You can achive a llot. If speed don't matters too much, I would give Java the preference instead of ASM. Programming is easier and less error-prone in Java (IMHO). Take a look at the RPN language 7th. It is entirely written in Java.

참고URL : https://stackoverflow.com/questions/3380498/create-a-jvm-programming-language

반응형