본문 바로가기

FrontEnd

[번역] "메타 언어 길들이기" 이해하기(Understanding "Taming the Meta Language")

반응형

https://frantic.im/meta-language/

 

Understanding "Taming the Meta Language"

Hello! This text lives here to convince you to subscribe. If you are reading this, consider clicking that subscribe button for more details. I write about programming, software design and side projects Subscribe

frantic.im

원문에 korean 번역 링크가 달려있는데 안들어가져서 직접 원문을 읽어보았습니다.

20분의 여유가 있다면 먼저 다음을 시청하세요. 
Cheng Lou - Taming the Meta Language - React Conf 2017

 

TL;DR

프로그래밍 언어에 문서, 주석 정보를 옮길수록, 문서와 주석이 다루는 내용이 더 고차원적이게 됩니다.

F#과 같은 고급 ML언어는 지원 중단, 단위와 같은 고차원의 정보를 프로그래밍 언어 차원에서 지원합니다.

이럴 경우, API 설명에서 단위에 대한 내용을 생략하고, 함수형 프로그래밍과 같은 고급 컨셉을 논의 할 수 있겠죠?

 

아래부터 원문입니다.


TL;DR: 언어가 있고 메타 언어가 있습니다.

 
언어는 실제 소스 코드입니다.
메타 언어는 테스트, 주석, IDE 기능, 문서, 예제, 자습서, 블로그 게시물, 책, 비디오, 기술 컨퍼런스 및 회의와 같이
언어 위의 모든 것입니다.
우리는 언어를 배우기 위해 메타 언어를 사용합니다.
그렇지만 개념을 메타 언어에서 언어 자체로 옮길 때 상황이 더 유동적이며,
동일한 에너지를 소비해도 새로운 메타 언어를 훨씬 더 높은 수준으로, 더 풍부하게 만들 수 있습니다.
이것을 더 잘 이해하는 데 도움이 되도록 여러 가지 예를 생각해 냈습니다.

Assembly instructions → Variable Names (어셈블리 명령어 > 변수명)

행성의 탈출 속도를 계산하는 우주 산업의 다음 코드를 살펴보겠습니다.
(어셈블리어 입니다)
.SUB_0_21:
    ; Computes escape velocity
    ; register xmm0 - planet mass
    ; retister xmm1 - planet radius
    mulsd   xmm0, qword ptr [rip + .LCPI0_0]
    divsd   xmm0, xmm1
    xorps   xmm1, xmm1
    sqrtsd  xmm1, xmm0
    ucomisd xmm1, xmm1
    jp      .LBB0_2
    movapd  xmm0, xmm1
    ret
.LBB0_2:
    jmp     sqrt                    ; TAILCALL
.LCPI0_0:
    .quad   4459223850755291651     ; double 1.334816E-10
이 코드에 대한 많은 부분이 메타 언어에 있습니다. 이 코드에 대한 주석과 관련 문서(여기엔 포함하지 않음)입니다.
이전 예제를 C로 작성된 이 예제와 비교해 봅시다.
#define GRAVITY_CONSTANT 6.67408e-11
double escape_velocity(double mass, double radius) {
    return sqrt(2 * GRAVITY_CONSTANT * mass / radius);
}
변수 이름을 지정하는 것만으로도 우리는 메타 언어에 있던 정보를 언어 자체로 끌어낼 수 있었습니다.

Variable names → advanced types (변수명 > 고급 타입 시스템)

코드의 C 버전에는 어셈블리보다 훨씬 더 많은 정보가 포함되어 있으며
덕택에 메타 언어는 더 높은 수준일 수 있습니다.
이제 함수가 2개의 인수를 취한다는 사실과 같이 코드에 이미 있는 것을 복제하고 문서화할 필요가 없습니다.
첫 번째는 질량이고 두 번째는 반경입니다.
 
그러나 코드에는 여전히 일부 컨텍스트가 누락되어 있습니다.
즉, 함수가 작동하는 단위입니다.
이것들은 라이브러리(메타 언어)에 대한 문서에 있어야 합니다.
우리는 간단한 트릭으로 인수를 mass_kilograms 및 radius_meters로 바꿀 수 있지만
킬로그램과 미터만 이 함수에 전달되도록 보장할 수 있는 언어 내의 시스템이 없습니다.
더 복잡한 타입을 지원하는 언어의 예를 살펴보겠습니다.
OCaml을 사용했지만 Haskell, Swift 등과 같은 거의 모든 ML 계열 언어가 이러한 종류의 항목을 지원합니다
(F#에는 단위에 대한 최고 수준의 지원도 있음).
let gravity_constant = 6.67408e-11

type mass = Kilograms of float
type length = Meters of float
type velocity = MetersPerSecond of float

let escape_velocity (Kilograms mass) (Meters radius) =
    MetersPerSecond (2.0 *. gravity_constant *. mass /. radius |> sqrt)
 
그건 그렇고, 농담이 아니라 지구의 탈출 속도를 계산할 때 OCaml 타입 덕택에 구현에서 버그를 발견했습니다.
질량을 잘못된 단위로 전달하고 있었습니다.
type mass =
  | Kilograms of float
  | Pounds of float
타입 검사기는 새 단위를 지원하기 위해 변경해야 하는 소스 코드의 모든 위치를 가리킵니다.

Deprecations and other meta information (지원 중단과 다른 메타정보)

우리의 평범한 탈출 속도 계산을 쓸모없게 만드는 물리학의 새로운 근본적인 발견이 있다고 상상해 봅시다.
이전 함수를 어떻게 폐기합니까?

 

문서에 주석을 추가하거나 자극적인 Medium 게시물을 작성하여 이 사실을 메타 언어에 넣을 수 있습니다.
그러나 이 정보를 코드 자체로 가져오는 것이 훨씬 더 건설적입니다.
우리는 C 함수를 사용할 때, 이전과 동일한 트릭을 사용하여
escape_velocity를 escape_velocity_DEPRECATED 또는 이와 유사한 이상한 것으로 이름을 바꿀 수 있습니다.
그러나 그것은 우리의 API 변경이 클라이언트 코드를 깨뜨릴 것이라는 것을 의미하며,
비표준(누구나 자신만의 접미사를 가질 수 있음)이며
사용하기에 더 나은 방법을 제안하지 않습니다.
이 정보를 메타에서 언어 자체로 푸시하기 위한 언어 차원의 지원이 있다면 어떨까요?
let escape_velocity = ...
[@ocaml.deprecated "Please use `quantum_escape` instead"]
 

More examples (더 많은 예제)

이것은 메타 공간에서 언어 자체로 점점 더 많은 정보를 포함하는 한 가지 가능한 경로를 보여줍니다.
다음은 더 많은 예입니다.

방문자(visitor) 패턴 및 for 루프 → map/filter/reduce.

대학에서 방문자 패턴에 대해 배웠지만
지금은 매우 간단하고 많은 언어 표준 라이브러리의 일부입니다.

Loading state

종종 사람들이 다음과 같은 상태를 가진 React 컴포넌트를 만드는 것을 봅니다.
state = {
  data: null,
  error: null,
  loading: true,
};

메타 언어에만 존재하는 정보가 있습니다.

load가 false일 때 data나 error 중 하나가 null이 되어서는 안된다고 선언하는 것입니다.
대신 Flow 또는 Typescript를 사용하여 이 제약 조건을 언어 자체에 가져올 수 있습니다.
type State =
  | { progress: "loading" }
  | { progress: "done", data: Object }
  | { progress: "error", error: Error };

 

Redux와 불변성.
현재 Redux가 직접적인 돌연변이가 없다고 가정한다는 사실은 문서, 블로그 게시물, 비디오 및 컨퍼런스 강연에 있습니다.
JavaScript가 기본적으로 변경할 수 없는 데이터 타입과 타입 주석을 지원하여
이러한 제약 조건을 코드 자체에서 표현할 수 있다면 좋지 않을까요?
Promise와 Observable.
JavaScript에서 프로미스 개념은 코어 언어 기능으로 포함되었습니다.
Observable에 대해서도 동일한 프로세스가 진행 중입니다.

결론

아무리 많은 것을 언어로 줄여도 인간의 의사 소통 부분은 해결되지 않는다는 것을 명심하는 것이 좋습니다.
그러나 언어를 발전시키면 훨씬 더 효율적인 의사소통의 기회가 열립니다.
복잡성은 어딘가에 상주해야 합니다.
언어가 매우 단순하면 복잡성이 메타 언어에서 결정됩니다.

 

see also : 

Sebastian Markbåge’s talk on minimal API surface area

 Jared Forsyth’s talk on type systems. Oh, and the Arrival movie, it’s really, really good!

반응형