mooner:~/resume $ cat projects/neonjs/README.md
NeonJS
JVM용 JavaScript 엔진
Kotlin으로 작성한 JVM용 JavaScript 엔진입니다. 믿을 수 없는 스크립트를 Java/Kotlin 앱 안에서 돌리기 위해 만들었고, 바이트코드 인터프리터와 JVM 바이트코드 JIT, 실행 제한 샌드박스, Java/Kotlin 상호 운용을 갖췄습니다. Android(API 26+)에서도 동작합니다.
mooner:~/resume/projects/neonjs $ tree -L 1
Gradle 모듈 여덟 개로 되어 있습니다. 엔진은 neonjs-core 하나로 돌고, 나머지는 필요할 때 더하는 모듈입니다. Kotlin 코드는 본문 약 58,000줄, 테스트 약 7,400줄입니다.
Intl과 Temporal의 비ISO 달력. 클래스 경로에 두면 켜집니다.fetch와 WebSocket. 허용한 호스트와 주소 대역에만 연결합니다.node: 모듈, require, Buffer. JS 쪽 라이브러리의 상당수는 Node.js v26.11.1 소스를 옮겨 왔습니다.-d8 모듈을 더하면 D8로 dex로 바꿔 메모리에서 올립니다..env 파일을 옵션으로 받습니다.mooner:~/resume/projects/neonjs $ cat docs/architecture.md
소스는 파서 → 스코프 분석 → 바이트코드 순서로 바뀌고, 인터프리터가 먼저 실행합니다. 기본인 적응형 모드에서는 1,000번 넘게 불린 함수나 오래 도는 반복문을 백그라운드 스레드가 JVM 바이트코드로 컴파일해 갈아 끼웁니다.
CodeDefiner 하나에 모았습니다. HotSpot에서는 hidden class로, Android에서는 dx나 D8이 만든 dex로 올리고, 어느 쪽도 쓸 수 없으면 인터프리터만 씁니다.catch와 finally는 종료를 가로채지 못합니다.nightly 브랜치에는 Rhino와 나란히 두 번째 JavaScript 언어로 들어가 있습니다(0.1.3).mooner:~/resume/projects/neonjs $ git log --grep=fix
Check failed: self == thread_running_gc_로 죽었습니다. ART 8.x는 인터페이스 메서드의 유일한 구현을 기록해 두고, 그 구현의 클래스 로더가 내려간 뒤에도 그 기록을 다시 읽습니다. 처음 올리는 시험용 클래스가 바로 그 유일한 구현이었습니다.CompiledCode 구현 두 개를 미리 링크해 ART가 이 메서드를 추적하지 않게 했습니다. 같은 버전에서는 Java.extend 어댑터를 내리지 않고, 기기 스크립트가 크래시 로그의 네이티브 백트레이스를 출력하게 했습니다.Object로 들고 있어서, 산술 연산 한 번마다 Double을 새로 만들었습니다.-0을 그대로 지킵니다.sb.append(null)이 VM에 따라 다른 메서드를 불렀습니다. 2^53을 넘는 long ID는 JS 숫자로 바뀌면서 끝자리가 달라졌습니다.new URL('a:#' + 'x'.repeat(2e6))은 시간 제한으로도 멈출 수 없는 2차 시간 루프를 돌았습니다.NeonTimeoutException을 내고, 엔진의 모든 패키지와 API 클래스를 거부 목록에 넣었습니다. URL 파서는 선형으로 바꾸고 4,096단계마다 인터럽트와 제한을 확인합니다.Accepting requestsAnsan --:-- KST
mooner:~/resume $ ./contact.sh