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 jvm은hello.jar를 만들고java -jar hello.jar로 실행하며,--backend dotnet은hello.dll을 만들고dotnet hello.dll로 실행하는 방식임.- 백엔드별 산출물과 도구 체인은 다음과 같음.
php:hello.phar, PHP 8.5 이상jvm:hello.jar, JDK 21 이상dotnet:hello.dll및hello.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를 고정하며
moggi와runtest를PATH에 추가함. 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\mainsrc/: 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)이 생성했으며 사람이 검토함.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요