TL;DR

  • Moggi는 정적 타입·순수 함수형·엄격 평가 언어로, 하나의 .mog 소스를 PHP, JVM, .NET용 배포물이나 네이티브 실행 파일로 컴파일하는 프로젝트임.
  • 대수적 데이터형, GADT, 패턴 매칭, 타입 클래스, 명시적 효과 입출력(IO)을 지원하며, 기본 백엔드는 PHP임.
  • 배포물은 .phar, .jar, .dll 형식이며, GraalVM native-image.NET PublishAot를 이용한 네이티브 빌드도 가능함.
  • 플랫폼별 배포판은 런타임 포함 여부가 다르며, 최소 배포판은 시스템의 PATH에 있는 런타임을 사용함.
  • Moggi는 알파 단계로 언어와 표준 라이브러리가 완성 중이며, 세 백엔드의 출력을 차등 테스트로 바이트 단위까지 동일하게 유지함.

빠른 시작

  • 플랫폼에 맞는 배포판을 릴리스 페이지에서 내려받아 압축을 풀면 완전한 설치본을 사용할 수 있으며, 실행에 별도 설치가 필요하지 않음.
  • moggi version으로 버전을 확인하고, moggi run hello.mog로 프로그램을 컴파일해 실행하거나 moggi run examples/factorial로 제공 예제를 실행할 수 있음.
  • moggi repl은 대화형으로 표현식을 시험하는 명령임.
  • main = putStrLn "Hello, world!" 형태의 프로그램을 실행하면 Hello, world!를 출력하는 예제임.
  • moggi compile hello.mog는 기본 PHP 백엔드용 hello.phar를 만들며, php hello.phar로 실행하는 방식임.
  • --backend jvmhello.jar를 만들고 java -jar hello.jar로 실행하며, --backend dotnethello.dll을 만들고 dotnet hello.dll로 실행하는 방식임.
  • 백엔드별 산출물과 도구 체인은 다음과 같음.
  • php: hello.phar, PHP 8.5 이상
  • jvm: hello.jar, JDK 21 이상
  • dotnet: hello.dllhello.deps.json, hello.runtimeconfig.json, .NET 8 SDK
  • 배포판별 런타임 구성은 다음과 같음.
  • moggi: PHP, .NET SDK, JDK, GraalVM을 포함하며 --native까지 지원
  • moggi-php: PHP 포함
  • moggi-dotnet: PHP와 .NET SDK 포함
  • moggi-jvm: PHP, JDK, GraalVM 포함
  • moggi-minimal: 런타임 미포함, PATH에 있는 런타임 사용
  • -o를 지정하지 않으면 산출물 이름은 진입 소스 파일을 따르며, -o app.phar, -o app.jar, -o app.dll처럼 전체 파일명을 지정할 수도 있음.
  • --unpacked는 패키징하지 않고 생성된 디렉터리 트리를 유지하며, --native는 GraalVM native-image 또는 .NET PublishAot로 네이티브 실행 파일을 빌드하는 옵션임.
  • --tokens, --ast, --typed-ast, --ir, --opt-ir는 컴파일러의 중간 단계를 출력하며, --help는 전체 옵션을 표시함.

문서

  • 문서는 순서대로 읽거나 필요한 주제를 선택해 참고할 수 있음.
  • 실행 시작: docs/quickstart.md
  • 예제로 살펴보는 언어: docs/tour.md
  • 표현식 실행과 타입 확인: docs/repl.md
  • lib/ 탐색: docs/stdlib.md
  • 전체 문법: docs/language.md
  • PHP, JVM, .NET 호출: docs/ffi.md
  • 파생(deriving): docs/deriving.md
  • 오류, 예외, 스택 트레이스: docs/diagnostics.md
  • 컴파일러 단계별 동작: docs/pipeline.md
  • Haskell과의 차이점: docs/differences-to-haskell.md — 라이브러리의 이름은 Haskell을 따르지만 Moggi 사용에 필수적인 문서는 아님
  • 언어 서버(LSP): docs/lsp.md
  • VS Code 확장: moggi-lang/moggi-vscode-plugin
  • 환경 변수: docs/env-vars.md
  • 전체 문서 색인은 docs/README.md이며 컴파일러 자체 문서도 포함함.
  • Moggi는 알파 단계로 언어와 표준 라이브러리가 계속 완성 중이며, 세 백엔드는 차등 테스트를 통해 바이트 단위로 동일하게 유지됨.

개발

  • 이 절은 컴파일러 자체를 개발하는 경우를 다루며, Moggi 언어를 사용하는 데 필요한 내용은 아님.

환경

  • Nix flake는 컴파일러와 테스트에 쓰이는 PHP 8.5, GraalVM 기반 JDK 21 및 native-image, .NET 8 SDK를 고정하며 moggiruntestPATH에 추가함.
  • nix develop으로 개발 환경에 진입할 수 있으며, Nix 개발 환경은 Linux와 macOS용임.
  • Windows 또는 Nix를 사용하지 않는 환경에서는 설치된 도구 체인을 이용해 php moggi.php version으로 컴파일러를 실행하고 php test.php로 테스트를 실행할 수 있음.
  • php moggi.php --help는 컴파일러 명령을, php test.php --help는 테스트 선택 및 보고 옵션을 안내함.

저장소 구성

  • moggi.php: CLI 진입점인 Moggi\CLI\main
  • src/: PHP로 작성된 컴파일러
  • lib/: Moggi로 작성된 표준 라이브러리
  • tests/: 컴파일러 테스트 모음
  • examples/: 실행하고 살펴볼 수 있는 소규모 프로그램
  • dist/, launcher/, scripts/dist/: 릴리스 배포판과 네이티브 런처
  • schnorr/: 런처와 함께 빌드되는 Schnorr 서명 CLI(BIP-340)
  • 편집기 확장은 별도 프로젝트와 릴리스로 관리되는 moggi-lang/moggi-vscode-plugin임.

테스트

  • runtest는 기본 PHP 백엔드 테스트를 실행하며, runtest --backend jvm은 JVM 백엔드 테스트를 실행함.
  • runtest --backend all --native는 모든 백엔드와 네이티브 빌드를 테스트하며, runtest --group semantics는 그룹 하나를 선택하고 그룹 아래 경로를 지정하면 범위를 더 좁힘.
  • runtest --list는 실행 대상 목록을 표시함.
  • 테스트 모음은 사례를 종단 간 컴파일하고, 각 사례가 지정한 백엔드에서 생성 코드, IR, 진단 결과, 프로그램 출력을 기준 파일과 비교함.
  • 사례 구성과 기준 파일 갱신 방법은 docs/development/testing.md에 설명됨.

추가 개발 문서

  • 개발 셸, 디버깅, 편집기 설정: docs/development/development.md
  • 테스트 모음 구성, 사례 작성, 기준 파일: docs/development/testing.md
  • 컴파일러 아키텍처: docs/development/architecture.md
  • 컴파일러 모듈별 단계: docs/development/compiler.md
  • 설계 결정과 불변 조건: docs/development/design.md
  • 최적화 패스: docs/development/optimizations.md
  • 배포판 빌드: dist/README.md

AI 관련 고지

  • 프로젝트의 코드, 테스트, 문서 일부는 대형 언어 모델(LLM)이 생성했으며 사람이 검토함.