TL;DR

  • LangZoo.js는 Janet, Java, Lua, PHP, Python, Ruby, Tcl의 런타임을 휴대용 실행 파일(APE)로 각 패키지에 포함해 Node.js에서 실행하는 APEBind 데모임.
  • 일곱 언어 모두 각자의 번들 런타임으로 실행되며, JavaScript로 언어를 재구현한 방식이 아님.
  • 데모는 게시된 패키지를 기다리지 않고 저장소에 포함된 로컬 패키지 아카이브를 설치해 실행 가능함.
  • Java는 컴파일러가 아닌 런타임을 포함하므로 애플리케이션 클래스를 빌드 과정에서 컴파일한 뒤 클래스 경로와 메인 클래스를 전달해야 함.
  • 이 프로젝트는 패키징 및 바인딩 데모이며, 신뢰할 수 없는 코드의 샌드박스나 모든 서드파티 언어 패키지의 번들을 보장하지 않음.

LangZoo.js

  • LangZoo.js는 별도의 Janet, Java, Lua, PHP, Python, Ruby, Tcl 런타임 설치 없이 Node.js에서 일곱 언어를 실행하는 작은 데모임.
  • APEBind로 생성한 JavaScript 패키지 일곱 개가 각 언어의 런타임을 실제 휴대용 실행 파일(Actually Portable Executable, APE)로 번들링함.

일곱 언어 모두 실행하기

  • demo 디렉터리에서 npm install --ignore-scripts --no-audit --no-fund를 실행해 의존성을 설치한 다음 node run-all.mjs를 실행하면 됨.
  • 예상 출력은 Janet, Java, Lua, PHP, Python, Ruby, Tcl 모두 '42'임.
  • 각 언어는 자체 번들 런타임을 통해 실행되며, JavaScript 패키지는 해당 런타임에 연결하는 바인딩이지 JavaScript로 작성한 언어 재구현이 아님.

런타임 호출 방식

  • Python 패키지의 run 함수에 code: 'print(6 * 7)'과 isolated: true를 전달하고, 반환 결과의 표준 출력에서 공백을 제거하면 42가 출력됨.
  • 데모는 저장소에 포함된 로컬 패키지 아카이브를 설치하므로 npm 레지스트리에 패키지가 게시될 때까지 기다리지 않고 실행 가능함.
  • 개별 패키지가 게시된 뒤에는 npm install python-ape와 같은 일반적인 방식으로 설치 가능함.

일곱 패키지

  • Janet: janet-ape, 생성 API는 run({ code })임.
  • Java: java-ape, 생성 API는 run({ classPath, mainClass })임.
  • Lua: lua-ape, 생성 API는 run({ code })임.
  • PHP: php-ape, 생성 API는 run({ code })임.
  • Python: python-ape, 생성 API는 run({ code })임.
  • Ruby: ruby-ape, 생성 API는 run({ code })임.
  • Tcl: tcl-ape, 생성 API는 run({ file })임.
  • Java에 번들된 APE는 컴파일러가 아닌 런타임이므로, 애플리케이션 클래스를 빌드 과정에서 컴파일한 뒤 클래스 경로와 메인 클래스를 java-ape에 전달해야 함.
  • Tcl 데모는 인라인 코드가 아니라 스크립트 파일을 실행함.

이 데모가 보여주는 것

  • APEBind는 이식 가능한 명령줄 프로그램을 위한 JavaScript 바인딩을 생성함.
  • LangZoo.js는 APEBind를 사용해 서로 다른 일곱 언어 런타임을 익숙한 Node.js API로 패키징하며, 각 패키지는 호출할 실행 파일을 포함함.
  • 검토된 YAML 스키마와 독립 실행형 런타임 예제는 APEBind의 언어 예제에 있으며, 이 저장소에는 생성된 패키지 아카이브와 일곱 언어 통합 데모가 포함됨.
  • 범위는 패키징 및 바인딩 데모이며, 신뢰할 수 없는 코드를 위한 샌드박스가 아니고 모든 서드파티 언어 패키지가 번들된다는 보장도 아님.
  • 플랫폼 호환성은 번들 런타임과 대상 환경에 따라 달라짐.
  • LangZoo.js는 컬렉션의 표시 이름이며, 저장소 슬러그와 개별 npm 패키지 이름은 소문자 케밥 표기법을 사용함.