← 목록으로

Show GN: Lowent – 함수의 서명만 읽어도 무엇을 하는지 아는 시스템 프로그래밍 언어

요약
  • Lowent는 함수의 서명만으로 동작을 명확히 파악할 수 있도록 설계된 개발 중인 시스템 프로그래밍 언어이자 컴파일러입니다.
  • 순수와 비순수를 분리하고 권한 관리와 계약 검사, GC 없는 메모리 안전성을 제공하는 것이 특징입니다.

Lowent(로우엔트)는 제가 만들고 있는 시스템 프로그래밍 언어와 그 컴파일러입니다. 목표는 하나입니다. 함수의 머리(서명)만 읽어도 그 함수가 무엇을 받고, 무엇을 돌려주고, 바깥 세상에 무엇을 할 수 있는지 알 수 있게 하는 것입니다. 짐작할 자리가 적은 코드는 사람도 AI 도 덜 틀리게 읽고 고칠 수 있다고 생각했습니다.

  • GitHub: https://github.com/rubidus-api/lowent_lang
  • 매뉴얼(한국어·영어, 웹·PDF): https://rubidus-api.github.io/lowent_lang/

어떤 문제를 풀려고 했나

  • C 의 int parse(const char *s) 는 파일을 열 수도, 네트워크에 닿을 수도, 전역 힙을 쓸 수도 있습니다. 서명은 아무 말도 하지 않습니다.
  • 정수는 몰래 넓어지고 좁아지며, 넘치면 미정의 동작이 됩니다.
  • 메모리는 GC 의 멈춤과 런타임을 감수하거나, 손 관리의 해제 누락·두 번 해제·해제 뒤 사용을 감수해야 합니다.
  • 주석에 적은 «0 보다 커야 한다» 는 아무도 검사하지 않습니다.

Lowent 는 이렇게 풉니다

  • 순수와 비순수를 가릅니다. fn 은 순수하고, proc 은 하는 일(입출력·할당·상태 변경)을 effects 로 적어야 합니다. 순수하다고 적은 fn 이 몰래 출력하면 컴파일되지 않습니다.
  • 권한을 인자로 받습니다. 전역 출력도 전역 힙도 없습니다. 파일·출력·할당에 닿으려면 그 권한(capability)을 값으로 건네받아야 해서, 서명만 보고도 «이 함수는 네트워크에 닿지 않는다» 를 압니다.
  • 계약을 검사합니다. requires·ensures·errors 를 서명에 적으면 컴파일 때 또는 경계에서 검사하고, 증명된 계약은 본문의 검사를 지웁니다.
  • GC 없이 메모리를 지킵니다. 영역(region)·소유·빌리기로 수명을 정하고, 닫다가 실패할 수 있는 자원(파일 등)을 열고 닫지 않으면 컴파일되지 않습니다.
  • 정수는 적은 대로만 움직입니다. 값을 잃을 수 있는 변환은 적어야 하고, 넘침은 멈출지·돌지·끝에서 멈출지 고릅니다.
  • 한 뜻에 한 표기. 전위 표기와 점으로 끝나는 문장, 닫힌 키워드 43 개. 특수문자가 거의 없어 스마트폰 자판으로도 편하게 치고, 문법 전체를 정규식만으로 칠할 수 있습니다.
fn mean input xs slice u8 . output u64 . requires gt (len xs) 0 . do var total u64 be 0 . for x xs do set total (add total (widen u64 x)) . end return div total (len xs) . end

지금 어디까지 왔나

  • 컴파일러 lowentc 는 C23 으로 썼고, 외부 의존은 제가 만든 proven_c_lib 하나입니다. 프로그램을 VM 으로 돌리는 동시에 C 로 내보내고, 두 결과가 다르면 컴파일러 결함으로 봅니다.
  • 대상: x86_64 · arm64 · riscv64 · cortex_m(힙 없는 보드) · mips_be.
  • 순차 단편의 메모리 안전과 데이터 경합 없음을 Coq 로 기계 증명해 두었습니다(언어 모델에 대해서이고, 무엇을 증명하지 않았는지도 매뉴얼에 따로 정리했습니다).
  • 회귀 시험 2,065 개, 표준 라이브러리 64 개 모듈, 매뉴얼 10부 50장(예제는 모두 두 백엔드로 돌려 확인).

감수하셔야 할 것

전위 표기가 처음엔 낯설고, 효과·권한·변환을 다 적느라 코드가 깁니다. 상속·람다·예외가 없고(대신 값을 지닌 enum+match, 트레이트, 이름 붙인 함수를 넘기는 pipe, result/option 을 씁니다), 동적 디스패치(dyn)는 아직 없습니다. 무엇보다 아직 개발 중이고 언어 설계도 바뀌고 있어서 호환성을 약속하지 않습니다. 설계에 대한 의견이나 «이건 이상하다» 는 지적을 특히 환영합니다.

질문은 GitHub Discussions Q&A 에 남겨 주세요: https://github.com/rubidus-api/lowent_lang/discussions/categories/q-a

함께 만들고 있는 것들

  • Proven C Book — 컴퓨터가 어떻게 만들어졌는지에서 출발하는 최신 C23 기반 C언어 입문서입니다. 소개글: https://news.hada.io/topic?id=32528
  • HGFloater — Windows 11 용 가벼운 빠른 실행기·작업 전환기입니다. https://github.com/rubidus-api/hgfloater
  • ReteClock — 오래된 안드로이드 기기를 먼저 생각한 전체 화면 디지털 시계·독 화면 보호기입니다. https://github.com/rubidus-api/reteclock_apk
  • ReteKey — 하드웨어 키보드까지 지원하는, 개발자에게 맞춘 안드로이드 한글 키보드입니다. https://github.com/rubidus-api/retekey_apk
  • ReteGet — 오래된 안드로이드 기기를 위한 단순한 HTTPS 파일 내려받기 앱입니다. https://github.com/rubidus-api/reteget_apk
  • Rubraview — C23 과 Win32 API 로 만든 Windows 11 용 가벼운 멀티미디어 뷰어·동영상 재생기·이미지 일괄 처리기입니다. https://github.com/rubidus-api/rubraview
  • Rubrapack — MSI·MSIX 설치 패키지를 만드는 C23 명령줄 도구입니다(공개 준비 중). https://github.com/rubidus-api/rubrapack

전체 목록은 https://rubidus-api.github.io/ 에 모아 두었습니다. 감사합니다.

그냥 목록으로
원문 보기 ↗