- Flix는 Aarhus University와 오픈소스 커뮤니티가 개발하는 효과 지향 언어로, 함수형·명령형·논리 프로그래밍을 한 언어 안에서 결합함
- 핵심은 부작용을 타입 수준에서 다루는 효과 시스템이며, 순수성 추적·사용자 정의 효과·핸들러·다중 재개로 모듈성과 추론 가능성을 높임
- 언어 표면은 대수적 데이터 타입, 패턴 매칭, 확장 가능한 레코드, 트레이트, 고차 kind 타입, 연관 타입·효과, 구조적 동시성, Java 상호운용성, 내장 Datalog까지 폭넓음
- 표준 라이브러리는 3,100개 이상 함수를 제공하고, Maven을 통해 Java 생태계에도 접근할 수 있어 연구용 언어에 그치지 않는 사용 범위를 지향함
- 컴파일러는 JVM 바이트코드를 타깃으로 하며 병렬·증분 구조를 갖고, 24코어 머신에서 5x–7x 속도 향상과 Apple M2 Pro/OpenJDK 21 기준 60,159 lines/sec 처리량을 내세움
Flix의 언어 방향
- Flix는 원칙 기반의 효과 지향 언어로, 함수형·명령형·논리 프로그래밍을 결합함
- 개발 주체는 Aarhus University와 오픈소스 기여자 커뮤니티임
- 효과 시스템은 부작용을 명시적으로 모델링해 모듈성과 프로그램 추론을 돕는 정적 타입 언어의 핵심 축임
- 사용자 정의 효과와 핸들러를 통해 프로그래머가 직접 제어 구조를 구현할 수 있음
- Flix는 효과 지향 언어 중 완성도 높은 구현, 넓은 표준 라이브러리, 자세한 문서, 도구 지원을 강점으로 내세움
타입, 순수성, 효과 시스템
- Flix는 함수형 프로그래밍의 기본 요소인 대수적 데이터 타입과 패턴 매칭을 지원함
- 튜플과 레코드를 내장 지원하며, 레코드는 구조적 타이핑을 사용하고 확장 가능함
- 컴파일러는 프로그램 안 모든 표현식의 순수성을 정밀하게 추적함
- 표현식이 순수하면 부작용이 없고 참조 투명하다는 보장을 제공함
- 고차 함수에서도 효과 다형성으로 순수성을 추적함
- 예를 들어
List.map의 순수성은 인자로 받는 함수f의 순수성에 따라 달라짐
- 예를 들어
- 대수적 효과는 사용자 정의 효과와 핸들러를 가능하게 함
- Flix는 특히 multi-shot resumptions를 지원함
- 효과 핸들러는 프로그램 추론, 모듈성, 테스트 가능성을 높이는 데 쓰임
지역 기반 변경과 순수성 반영
- Flix는 지역 기반 로컬 변경을 지원해, 변경 가능한 상태와 파괴적 연산을 내부적으로 쓰면서도 외부에는 순수 함수로 보이게 할 수 있음
- 변경 가능한 데이터로 작성하는 편이 자연스러운 함수나, 정렬 알고리듬처럼 변경 가능한 자료구조가 더 효율적인 경우에 적합함
- 순수성 반영은 고차 함수가 함수 인자의 순수성을 검사하고 그 정보에 따라 동작을 바꾸는 메타프로그래밍 구조임
DelayList.map은 인자 함수의 순수성에 따라 즉시 평가와 지연 평가 사이에서 동작을 바꿈- 라이브러리 내부에서 지연 평가나 병렬 평가를 선택적으로 사용해도 클라이언트 관점의 의미는 바뀌지 않을 수 있음
병렬성, 동시성, 추상화
- Flix는 순수 코드를 병렬로 평가하기 쉽게 만들며,
par구조로List.map의 병렬 구현을 작성할 수 있음 par구조는 내부적으로 경량 VirtualThread를 사용함- 구조적 동시성을 지원해, 특정 지역 안에서 생성된 스레드는 해당 지역의 생명주기를 벗어나 살아남을 수 없음
- 예시에서는
rc라는 새 지역 안에서 두 스레드를 생성함 - 제어 흐름은 두 스레드가 모두 종료되기 전까지 지역을 벗어나지 않음
- 예시에서는
- 공통 연산을 지원하는 타입 추상화에는 트레이트를 사용함
Eq트레이트는 동등성 개념을 표현하며 표준 라이브러리 전반에서 사용됨
- 고차 kind 타입으로 타입 생성자를 추상화할 수 있음
Option과List는 모두Foldable을 구현함- 표준 라이브러리는
Monoid,Functor,Foldable같은 공통 트레이트를 포함함
연관 타입·효과와 for-yield
- Flix는 인스턴스 시그니처의 타입이 인스턴스 타입에 의존할 수 있게 하는 연관 타입을 지원함
Coll트레이트 예시는 연관 타입Elm을 통해 각 컬렉션 인스턴스가 원소 타입을 정의할 수 있게 함
- 연관 효과는 트레이트 멤버의 효과가 인스턴스 타입에 의존하도록 만듦
- 순수 연산과 효과가 있는 연산, 변경 가능한 자료구조와 불변 자료구조를 함께 추상화하기 쉬움
Coll트레이트에 연관 효과Aef를 추가하면 변경 가능한 컬렉션 인스턴스를 추가할 수 있음
forM-yield는 Scala의for-comprehension, Haskell의do표기와 유사한 단항 구조임Monad트레이트가 제공하는point와flatMap을 쓰기 위한 문법 설탕임
forA는Applicative트레이트 기반의 적용형 표현식임Validation[e, t]데이터 타입을 사용하는 오류 처리 코드를 쉽게 작성하도록 돕는 구조임
Java 상호운용성과 Datalog
- Flix는 Java Standard Library와 Java 생태계 코드를 재사용할 수 있는 Java 상호운용성을 지원함
- Maven을 통한 생태계 접근을 포함함
- 객체 생성, 메서드 호출, 예외, 클래스·인터페이스 확장을 지원함
- 내장 Datalog 지원은 Flix의 고유 기능 중 하나임
- Datalog는 그래프 도달 가능성 문제를 포함한 여러 고정점 문제를 간결하게 표현할 수 있음
- Datalog 제약은 일급 값임
- 함수에 전달하거나 함수에서 반환할 수 있음
- 자료구조에 저장할 수 있음
- 다른 Datalog 제약과 합성하고 해결할 수 있음
- 이를 통해 Datalog 프로그램 계열을 표현할 수 있음
- Flix는 격자 의미론이 풍부해진 Datalog 제약도 지원함
- 부품과 하위 구성품의 배송일을 계산하는 예시가 있음
- 자동차는 섀시와 엔진에 의존하며, 각 구성품 조립을 기다린 뒤 자동차를 조립할 수 있음
- 하위 구성품도 다른 하위 구성품에 의존할 수 있어 문제가 재귀적임
- 격자 의미론을 포함한 Datalog 제약은 Flix의 고급 기능 중 하나이며, 격자 이론과 고정점 배경지식이 필요함
표준 라이브러리와 기능 목록
- Flix는 3,100개 이상 함수를 제공하는 표준 라이브러리를 포함함
List모듈은 100개 이상 함수를 제공함Foldable트레이트는 47개 이상 함수를 제공함- 전체 라이브러리는 api.flix.dev에서 탐색할 수 있음
- 기능 목록에는 다음이 포함됨
- 대수적 데이터 타입, 패턴 매칭, 일급 함수
- 확장 가능한 레코드, 매개변수 다형성
- 트레이트, 고차 kind 타입, 연관 타입과 효과
- 효과 다형성과 하위 효과, 순수성 반영
- CSP 스타일 동시성, 버퍼 있는 채널과 버퍼 없는 채널
- 일급 Datalog 제약, Java 상호운용성
- 언박스드 원시 타입, 키워드 기반 문법
forM,forA, 표현식 hole- JVM 바이트코드 컴파일, 완전한 꼬리 호출 제거
- 탄력적·병렬 컴파일러 구조, 사람이 읽기 쉬운 오류
컴파일러 구조와 성능
- Flix 컴파일러는 탄력적·증분·병렬 구조를 갖춤
- 모든 컴파일러 단계가 병렬이며, 24코어 머신에서 각 단계의 속도 향상을 활용할 수 있음
- 멀티코어 머신에서는 5x–7x 속도 향상이 가능함
- 같은 컴파일러 인스턴스에서 이미 컴파일된 코드를 다시 컴파일할 때 증분 컴파일로 상당한 속도 향상을 얻을 수 있음
- Apple M2 Pro 10코어 CPU와 OpenJDK 21 기준 성능 수치는 다음과 같음
- 전체 컴파일러 처리량: 60,159 lines/sec
- 프런트엔드 전용 처리량: 140,382 lines/sec
- 재현 명령은
java -jar flix.jar Xperf --n 21및java -jar flix.jar Xperf --frontend --n 21
- 이 성능은 타입·효과 추론, 단형화, 전체 프로그램 최적화 같은 비용이 큰 언어 기능을 지원하면서 달성한 수치임
- 컴파일러 성능은 주로 CPU 성능과 메모리 대역폭에 의해 결정됨
Visual Studio Code 지원과 도구 통합
- Flix 컴파일러는 Visual Studio Code와 통합되어 개발 환경을 제공함
- VSCode 확장은 실제 Flix 컴파일러를 사용하므로 확장과 컴파일러 사이에 1:1 대응이 있음
- VSCode가 오류를 보고하지 않으면 오류가 없음
- 오류가 없을 때 VSCode가 가짜 오류를 보고하지 않음
- VSCode 확장은 다음 기능을 지원함
- 의미 기반 구문 강조
- 인라인 컴파일러 오류 진단
- 입력 중 자동완성, 문맥 인식 자동완성, 트레이트 인스턴스 자동완성, 타입 기반 hole 완성
- 스니펫과 인레이 힌트
- 표현식의 타입과 효과를 보여주는 hover
- 함수, 지역 변수, enum 정의로 이동
- 함수·지역 변수·enum 참조 찾기와 트레이트 구현 찾기
- 문서·워크스페이스 심볼 목록
- 지역 변수와 함수 이름 변경
- 에디터에서 main 실행과 테스트 실행
- Flix는 많은 도구를 컴파일러에 직접 내장함
- OCaml은 LSP로
ocaml-lsp, REPL로utop, 빌드 도구로dune, 패키지 관리자로opam을 사용함 - Haskell은 LSP로
HLS, REPL로ghci, 빌드 도구와 패키지 관리자로cabal,stack, 패키지 저장소로Hackage를 사용함 - Flix는 컴파일러, LSP, REPL, 빌드 도구, 패키지 관리자를 모두
flix로 제공하며 패키지 저장소는 GitHub임
- OCaml은 LSP로
개발 상태, JVM 타깃, 프로젝트 규모
- Flix는 덴마크 Aarhus University의 프로그래밍 언어 연구자들이 개발·유지함
- 협력 기관은 캐나다 University of Waterloo, 독일 University of Tubingen, 덴마크 Copenhagen University임
- 전 세계 오픈소스 기여자 커뮤니티의 개발 참여가 늘고 있으며, 기여를 초대함
- 프로젝트 통계는 다음과 같음
- 병합된 Pull Request: 4,900개 이상
- 해결된 이슈: 3,100개 이상
- 기여자: 70명 이상
- 컴파일러 코드베이스: 272,000줄 이상
- Flix는 JVM을 타깃으로 함
- JVM에는 OpenJDK, J9, Azul, Graal 등 검증된 오픈소스·상용 구현이 있음
- Mac, Linux, Windows에서 사용할 수 있음
- 현대 JVM은 여러 최신 가비지 컬렉터를 제공함
- Java 21의 경량 스레드를 포함해 동시성과 병렬성 지원이 좋음
- 디버거와 프로파일러를 포함한 도구 지원이 있음
- Maven 통합을 통해 Java 플랫폼의 풍부한 패키지 생태계에 접근할 수 있음
- 총 펀딩은 110만 유로이며, 프로젝트의 연속성과 독립성을 보장하는 데 도움을 줌