brunch

You can make anything
by writing

C.S.Lewis

by SKKRYPTO May 17. 2019

[Tezos X Skkrypto] 테조스 공부노트 #4

오카멜(OCaml)

이번주에는 테조스가 사용하고 있는 프로그래밍 언어에 대해 이야기해보도록 하겠습니다. 건물을 세울 때 그 근본이 되는 것이 철근이나 시멘트라면 한 소프트웨어의 기초가 되는 것이 바로 프로그래밍 언어입니다. 소프트웨어가 만들어진 프로그래밍 언어를 살펴보면 그 소프트웨어의 방향성을 알 수 있습니다.

테조스는 ‘오카멜’’이라는 다소 생소한 언어를 사용하고 있습니다. 테조스는 어떤 이유로 이러한 언어를 통해 구현되었을까요?

여러분이 알고 있는 프로그래밍 언어는 어떤 것들이 있나요? 세상에는 무수히 많은 프로그래밍 언어가 존재하고 이를 분류하는 방법도 무수히 많습니다. 사람들이 가장 흔하게 분류하는 방법은 정적 언어와 동적 언어로 나누는 것입니다. 
정적 언어는 자료형을 컴파일 시에 결정하는 언어를 말합니다. 컴파일 시에 자료형이 맞지 않은 값이 들어갈 경우 컴파일 에러를 발생시킵니다. 컴파일 시에 타입에 대한 정보를 결정하기 때문에 속도가 빠르고 타입 에러로 인한 문제점을 초기에 발견할 수 있어 안정성이 높습니다. 정적 언어의 예로는 프로그래밍 언어의 근본이라 할 수 있는 C형제들(C, C++, C#)이나 java등을 들 수 있습니다. 반면 동적언어는 컴파일 시 자료형을 정하는 것이 아니고 실행 시에 정합니다. 따라서 타입 없이 변수만 선언하여 값을 지정할 수 있습니다. 따로 자료형을 선언할 필요가 없기 때문에 비교적 자유로운 프로그래밍이 가능하지만 예상치 못한 에러가 발생할 수도 있습니다. 동적 언어의 예로는 요즘 많은 인기를 얻고 있는 JavaScript나 Python을 들 수 있습니다.

           이와 비슷한 구분법으로 함수형 프로그래밍과 명령형 프로그래밍이 있습니다. 명령형 프로그래밍에서는 상태를 바꾸는 것을 강조하는 것과 달리 함수형 프로그래밍은 함수의 응용을 강조합니다. 이러한 구분의 명칭은 꽤나 헷갈리는데 명령형 프로그래밍 언어로 분류되는 C, JAVA등도 함수를 사용하기 때문입니다. 하지만 함수형 프로그래밍과 명령형 프로그래밍의 함수는 큰 차이가 있습니다. 
명령형의 함수는 프로그램의 상태의 값을 바꿀 때 ‘부작용’이 생길 수 있습니다. 즉 같은 코드라도 실행되는 프로그램의 상태에 따라 다른 결과값을 낼 수 있습니다. 조금이라도 프로그래밍 경험이 있으신 분이라면 일관적으로 작동하는 코드를 짜는 일이 얼마나 어려운지 알고 계실 것입니다. 대개의 경우 코드를 작성하는 시간보다 원하는 결과를 위해 오류를 잡는 시간이 몇배나 더 많이 듭니다. 반면 함수형 프로그래밍에서는 함수의 출력값이 그 함수에 입력된 인수에만 의존하기 때문에 항상 동일한 결과값을 얻을 수 있습니다. 함수형 프로그래밍 언어는 이렇게 함수의 실행이 외부에 영향을 끼치지 않는 함수를 이용해 순수한 프로그래밍(pure programming)이 가능합니다. 쉽게 말해 함수형 언어는 기존 명령형 언어의 부작용을 제거함으로써 프로그램의 동작을 이해하고 예측하기 쉽게 만든다고 볼 수 있습니다. 


위의 분류를 표로 정리하면 다음과 같습니다.


늘 언급되는, 블록체인의 한계 중 하나는 ‘사람’이 운영한다는 것입니다. 사람은 언젠가 실수를 합니다. 수정이 불가능한 블록체인에 막대한 금액이 오가는 스마트 컨트랙트를, 결과값이 안정적이지 않은 명령형 프로그래밍 언어로 작성하는 것은 너무나 위험한 행동입니다. 모두가 알고 있는 블록체인 업계의 아킬레스건 ‘THE DAO’ 해킹사태 또한 이더리움 플랫폼에서 명령형 언어 솔리디티로 쓰인 스마트 컨트랙트에 결함이 있었기 때문에 일어났습니다. 그렇다면 우리는 결함에 대한 막대한 위험과 불안을 안고 블록체인을 계속 사용해야만 하는 것일까요?

테조스는 표 우측 하단에 있는 오카멜을 이용해 이러한 문제를 해결하고자 접근합니다. 테조스 백서를 보면 유독 수학이라는 말이 자주 등장합니다. 수학적 표현, 수학적 증명을 통해 검증을 한다며 도저히 알 수 없는 수식들을 써 놓았습니다. 이는 쉽게 요약하면 스마트 컨트랙트를 ‘수학적 표현’이 가능한 언어로 코딩하여 논리적인 오류도 잡아낸다는 것입니다.


           뿐만 아니라 오카멜은 기존에 대중에게 사랑받는 여러 고수준 언어들의 장점들을 가지고 있는데, 예를 들어JAVASCRIPT에서 지원하는 일급 객체로써 함수를 받는 것, JAVA에서 제공하는 정적 자료형 확인, C#에서 지원하는 자료형을 직접적으로 명시하지 않아도 값이 사용되는 방식에 따라 형을 정해주는 형 추정 기능 등이 있습니다. 이러한 기능들로 인해 오카멜은 정확성뿐만 아니라 빠른 처리속도, 높은 실용성 또한 보장하게 됩니다. 또한 상대적으로 사용자가 적은 언어임에도 불구하고 수많은 훌륭한 툴과 라이브러리를 보유하고 있기 때문에 프로그래머가 상대적으로 쉽게 프로그래밍을 할 수 있습니다.

 블록체인 플랫폼은 수많은 Dapp이 작동되고 많은 금액(암호화폐)이 오가는 곳입니다. 그렇기 때문에 스마트 컨트랙트의 안정성은 아무리 강조해도 지나치지 않습니다. 오카멜이라는 참신한 언어의 도입은 테조스가 해당 문제에 대해 얼마나 깊이 고민하고 또 해결하기 위해 노력했는지 보여주는 단적인 예라고 할 수 있습니다.


 지난 몇 주간 컴퓨터(프로그래밍)와 관련된 이야기를 많이 했습니다. 컴퓨터에 대한 지식이 없으신 분들께서는 다소 어려웠을 수도 있을 것 같습니다. 다음주제인 베이킹과 합의알고리즘에서는 기술적인 담론과 함께 보다 대중적으로 익숙한 암호화폐(crypto currency)에 관한 이야기도 등장합니다. 다음 주를 기대해주세요





작성자 이교영

연구팀 구제성 김선우 이교영

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari