디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

업뎃) 동일 안전성 목표 하의 코드 비교 - Rust vs. Ada/..

루비갤로그로 이동합니다. 2025.07.03 20:05:00
조회 64 추천 0 댓글 0

부록 B: 동일 안전성 목표 하의 코드 비교 - Rust vs. Ada/SPARK


이 부록은 본문 5장에서 철학적 차원으로 다룬 ‘의도 중심’과 ‘규칙 중심’의 설계 방식이, 실제 코드에서는 어떻게 구현되는지 구체적으로 비교 분석합니다.


이를 위해, 컴퓨터 과학의 가장 기본적인 자료구조 중 하나를 구현하는 것을 목표로 설정하고, 각 언어가 이 문제를 해결하는 접근 방식과 그 과정에서 개발자가 겪는 경험이 어떻게 다른지 독자 여러분께서 직접 판단하실 수 있도록 구성했습니다.


비교 과제: ‘부모-자식 관계’를 가진 노드(Node) 구조 표현하기


우리의 목표는 간단한 트리(Tree) 구조를 만드는 것입니다. 이 구조에서 각 노드는 여러 자식 노드를 가질 수 있으며, 동시에 각 자식 노드는 자신의 부모 노드를 가리키는 참조를 가질 수 있어야 합니다.


접근법 1: 러스트 (Rust) - ‘규칙’이 ‘의도’를 가로막는 경우


1. 직관적이지만 ‘실패’하는 코드


다른 언어에 익숙한 개발자라면 누구나 떠올릴 법한, 가장 직관적인 코드입니다. 하지만 이 코드는 러스트의 빌림 검사기(Borrow Checker) 규칙 때문에 절대로 컴파일되지 않습니다.


// 이 코드는 컴파일되지 않습니다!

struct Node<'a> {

    parent: Option<&'a Node<'a>>, // 부모를 가리키는 참조

    // ... 다른 필드들

}


fn main() {

    let mut root = Node { parent: None, /* ... */ };


    // 컴파일 에러: `root`의 소유권과 빌림 규칙이 충돌합니다.

    // 빌림 검사기는 이처럼 데이터가 순환 참조 구조를 갖는 것을 허용하지 않습니다.

    let child = Node { parent: Some(&root), /* ... */ };

}

‘자식이 부모를 가리킨다’는 개발자의 단순하고 명확한 의도가, ‘데이터는 단 한 명의 소유자만 가져야 하며, 빌림 규칙은 순환을 만들 수 없다’는 컴파일러의 엄격한 규칙과 정면으로 충돌하는 상황입니다.


2. ‘성공’하지만 복잡한 우회로


이 문제를 ‘안전한(safe)’ 러스트로 해결하려면, 개발자는 자신의 단순한 의도를 포기하고, 컴파일러의 규칙을 통과하기 위해 Rc, RefCell, Weak라는 복잡한 개념들을 동원한 ‘우회로’를 설계해야 합니다.


use std::rc::{Rc, Weak};

use std::cell::RefCell;


// 부모를 가리키는 참조는 '소유권 없는' 약한 참조(Weak)를 사용해야 합니다.

// 내부의 값을 변경하기 위해 RefCell을 사용합니다.

struct Node {

    parent: RefCell<Weak<Node>>,

    children: RefCell<Vec<Rc<Node>>>,

}


fn main() {

    let root = Rc::new(Node {

        parent: RefCell::new(Weak::new()),

        children: RefCell::new(vec![]),

    });


    let child = Rc::new(Node {

        parent: RefCell::new(Rc::downgrade(&root)), // 부모를 '약한 참조'로 저장

        children: RefCell::new(vec![]),

    });


    // 자식 노드를 추가하기 위해 .borrow_mut()를 호출해야 합니다.

    root.children.borrow_mut().push(Rc::clone(&child));


    println!("트리 구조 생성 완료!");

}


러스트 방식 분석


단순한 부모-자식 관계를 표현하기 위해, 개발자는 Rc(참조 카운팅 포인터), RefCell(내부 가변성), Weak(약한 참조), borrow_mut()(가변 빌림), downgrade()(약한 참조로 변환) 등 수많은 난해한 개념과 마주해야 합니다. 개발자의 초점은 ‘트리 구조’라는 원래 문제에서 벗어나, ‘어떻게 하면 빌림 검사기를 통과할까’라는 러스트의 규칙 자체를 해결하는 문제로 변질됩니다. 안전성은 컴파일러가 강제하지만, 그 대가로 개발자는 비직관적인 코드와 씨름해야 합니다.


접근법 2: Ada/SPARK - ‘의도’를 코드로 직접 표현하는 경우


Ada/SPARK 생태계는 개발자의 의도를 존중하고, 안전성을 다층적으로 확보하는 길을 제시합니다.


1. Ada: 직관적인 구조 표현과 런타임 안전성


먼저, Ada 언어 자체는 access라는 ‘포인터’ 타입을 사용하여 개발자의 의도를 직접적으로 표현하도록 돕습니다.


-- `Node` 타입을 미리 선언하여 자기 참조 구조가 가능하게 합니다.

type Node;

-- `Node` 타입을 가리킬 수 있는 '포인터' 타입을 정의합니다.

type Node_Access is access all Node;


-- 실제 `Node` 타입을 정의합니다.

type Node is record

   -- 부모를 가리키는 포인터를 필드로 가집니다. (자연스러운 표현)

   Parent   : Node_Access;

   -- 자식들을 담는 자료구조...

end record;


-- 사용 예시

procedure Create_Tree is

   Root  : Node_Access := new Node;

   Child : Node_Access := new Node;

begin

   Root.Parent := null; -- 루트 노드의 부모는 없음


   -- 자식 노드의 Parent 필드가 부모 노드(Root)를 직접 가리킵니다.

   Child.Parent := Root;


   -- ... 자식 노드를 Root의 Children 리스트에 추가하는 로직 ...

end Create_Tree;

이처럼 개발자의 의도(“노드는 다른 노드를 가리킬 수 있다”)가 매우 간결하게 표현됩니다. 이때 Ada는 러스트와 다른 방식으로 안전성을 확보합니다. 만약 개발자가 Parent가 null인 상태에서 Parent.all과 같이 역참조를 시도하면, 컴파일러는 이 코드를 막는 대신 런타임에 Constraint_Error라는 예외를 발생시키는 코드를 기본적으로 삽입합니다. 즉, 런타임에서 안전장치가 작동하는 것입니다.


이처럼 Ada의 런타임 안전망은 훌륭하지만, 일부 고신뢰성 시스템에서는 이마저도 부족할 수 있습니다. 바로 이 지점에서 SPARK가 등장하여 안전성을 한 차원 더 끌어올립니다.


2. SPARK: 명시적 계약을 통한 ‘증명된’ 컴파일 타임 안전성


SPARK는 개발자가 자신의 ‘의도’를 ‘계약(Contract)’으로 명시하면, 정적 분석 도구(Prover)가 “이 코드는 런타임 에러가 절대 발생하지 않는다”는 것을 수학적으로 증명합니다.


-- 부모의 정보를 사용하는 프로시저

procedure Process_Parent (Item : in Node_Access)

  with

    -- 사전 조건(Pre-condition)으로 "Item의 부모는 null이 아니다"라고 명시합니다.

    -- 이것이 개발자의 '의도'이자, Prover에게 증명을 요청하는 '계약'입니다.

    Pre => Item.Parent /= null

is

begin

   -- 이 계약 덕분에, SPARK Prover는 아래 코드가 런타임 에러 없이

   -- 안전함을 100% 증명할 수 있습니다.

   Put_Line ("My Parent is: " & Image (Item.Parent.all));

end Process_Parent;


이처럼 SPARK는 개발자에게 자신의 코드가 안전하다는 것을 ‘스스로 증명’하도록 요구합니다. 도구는 개발자의 이 선언이 타당한지를 수학적으로 검증해 줄 뿐입니다.


결론: 두 방식의 비교



구분러스트 (Rust)Ada/SPARK
핵심 철학‘규칙’이 ‘의도’를 제약‘도구’가 ‘의도’를 지원하고 검증
안전성 확보컴파일러가 암묵적 규칙을 자동으로 강제개발자가 명시적 계약을 작성하고 도구가 증명
개발자 경험컴파일러의 규칙을 통과하기 위한 싸움자신의 의도를 코드로 표현하고, 그 안전성을 계약으로 증명
주요 어려움언어의 고유한 패러다임(소유권)에 대한 적응문제에 대한 형식적이고 논리적인 사전 분석 및 ‘계약’ 작성
안전성의 기본값성능 우선 (안전은 Opt-in)안전 우선 (런타임 체크가 기본, 증명은 Opt-in)



이 ‘그래프/트리’ 예시는 ‘개발자의 단순한 의도’(자식이 부모를 가리킨다)와 ‘컴파일러의 엄격한 규칙’(데이터는 단 한 명의 소유자만 가져야 한다)이 정면으로 충돌하는 상황을 극명하게 보여줍니다. 러스트의 방식이 왜 어떤 이들에게는 ‘불필요한 장벽’이자 ‘비정석적인 설계’로 평가받는지, 이 예시만큼 명확하게 보여주는 것은 없습니다.


이 비교를 통해, 우리는 두 언어가 ‘안전성’에 도달하는 길이 근본적으로 다름을 알 수 있습니다. 러스트는 개발자의 실수를 원천적으로 막는 엄격한 ‘자동화된 규칙’을 선택했고, Ada/SPARK는 개발자의 ‘명시적인 의도와 증명’을 통해 안전성을 확보하는 길을 선택했습니다. 어느 쪽이 더 합리적인지는, 결국 개발자의 철학에 달려있을 것입니다.

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 현역으로 군대 안 간게 의아한 스타는? 운영자 25/06/30 - -
AD 휴대폰 바꿀까? 특가 구매 찬스! 운영자 25/07/02 - -
공지 프로그래밍 갤러리 이용 안내 [88] 운영자 20.09.28 45201 65
2869944 ❤✨☀⭐나님 시작합니당⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 19:13 7 0
2869943 3장에서는 러스트 설계 철학의 모순에 대해 루비갤로그로 이동합니다. 19:03 8 0
2869942 이재명씨는 왜 스윗식스티가 됐을까? [3] 헬마스터갤로그로 이동합니다. 19:01 23 0
2869941 러빠 왜 안 보임 gg침?? 루비갤로그로 이동합니다. 18:59 8 0
2869940 나경원 이 사진이 안웃기냐? 헬마스터갤로그로 이동합니다. 18:59 15 0
2869939 동아시아 문화에 최적화된 AI 기반 조직관리 서비스 어떨 것 같음? 프갤러(211.204) 18:54 7 0
2869938 다른 에.드랑 급이다름..이건 꼭해야돼 2분에 7만눤이????? ㅇㅅㅇ(211.36) 18:35 9 0
2869937 mz빙고...jpg [1] ㅇㅇ갤로그로 이동합니다. 18:30 15 0
2869935 프부이들 치킨 ㄱㄱ? [1] 프갤러(14.45) 18:07 25 0
2869933 서민 대변한다던 의원들, 알보고니 최고 고소득자…극우정당 내로남불에 난리 발명도둑잡기(118.216) 17:56 13 0
2869930 남한테 설명한단 사실 하나만으로 실력이 느는듯 [3] ㅆㅇㅆ찡갤로그로 이동합니다. 17:49 32 0
2869928 휴지통에서 영구삭제한 파일 레큐바에도 안뜨는데 이거 걍 못찾는거임? [2] 프갤러(115.143) 17:38 16 0
2869927 오늘의 작사 실마리: 100만원으로 한 달 살기 발명도둑잡기(118.216) 17:38 10 0
2869924 세계 동물 수 비교 [1] 발명도둑잡기(118.216) 17:18 14 0
2869923 교정기 때문에 입안이 다 헐어서 다이어트가 저절로 된다 발명도둑잡기(118.216) 17:13 13 0
2869921 지금 갤에 뭐가 있길래 [1] 프갤러(113.59) 17:04 38 1
2869920 굳이 공부안해도 살아남는사람들은 뭐냐 [1] ㅇㅇ(39.118) 17:04 23 0
2869919 젤렌스키는 왜 중립을 포기했나? 우크라이나 전쟁, 다른 시선 심용환 [1] 발명도둑잡기(118.216) 17:03 16 0
2869918 ‘핵무기 야망’ 이유로 이란 비난한 서방, 자신들 안보는 핵무기로? 발명도둑잡기(118.216) 16:46 16 0
2869917 에어장 목사 사건 발명도둑잡기(118.216) 16:39 13 0
2869916 파이썬은 자바에 비하면 병신 언어 같음 ㅇㅇ갤로그로 이동합니다. 16:38 31 0
2869915 "딸이 모텔에…" 부모 신고→경찰 출동→39세 남성 3층 추락 발명도둑잡기(118.216) 16:35 18 0
2869913 냥덩 또 가짜뉴스 “시진핑 실각설은 국내 반중정서 키우는 독약” 발명도둑잡기(118.216) 16:24 22 0
2869912 '자유총연맹 지원 조례' 반대, 노원구의회 찾아간 청년들 발명도둑잡기(118.216) 16:22 8 0
2869911 20~30대 한남이 병신세대이긴 하네 ㅇㅅㅇ [1] 류류(118.235) 16:21 31 0
2869910 결국 문 닫은 미 USAID…'64년 대외 원조' 역사의 뒤안길로 [2] 발명도둑잡기(118.216) 16:20 18 0
2869909 한국 미사일 "세계최고 수준" 하지만 다른나라의 수출할수없는 이유? 발명도둑잡기(118.216) 16:19 12 0
2869908 트럼프 게임의 룰에 말려든 아시아, 이재명 대통령이 나설 때다 발명도둑잡기(118.216) 16:18 15 0
2869907 [팩트체크] "100만원 서울살이 가능할까"…현실은 '극기훈련' 발명도둑잡기(118.216) 16:16 11 0
2869906 ‘혐중’이란 병을 어떻게 치료할 것인가 [박노자의 한국, 안과 밖] [1] 발명도둑잡기(118.216) 16:14 17 0
2869905 이재명씨는 여성에게만 기회를 많이 주더라 [6] 헬마스터갤로그로 이동합니다. 16:13 46 0
2869904 잭 도시·일론 머스크 "모든 지적재산권 법 없애자"…AI 시대 [2] 발명도둑잡기(118.216) 16:10 21 0
2869903 트럼프 "내년 250주년 독립기념일 축제로 백악관서 UFC 경기" 발명도둑잡기(118.216) 16:08 12 0
2869902 [정동칼럼]전쟁은 두 사람만 미치면 시작된다 발명도둑잡기(118.216) 16:07 14 0
2869901 AI 잘 쓰는 사람은 따로 있다 [김상균의 메타버스] 발명도둑잡기(118.216) 16:06 14 0
2869900 "대소변 먹이고 39차례 강간"…75세 유명 축구 에이전트 발명도둑잡기(118.216) 16:05 18 0
2869899 "하루라도 쉬고 싶어요"…'주 7일 배송' 택배기사의 하소연 발명도둑잡기(118.216) 16:04 10 0
2869898 TV조선 ‘강적들’ 새 MC에 진중권 교수·임윤선 변호사 발명도둑잡기(118.216) 16:03 11 0
2869897 웹백엔드 독학러 인데... 질문 받아주실분? ㅇㅇ(211.176) 16:03 16 0
2869896 [단독] SPC “기계 안 꺼서 사고, 교육 강화”…사고 책임 노동자에게 [1] 발명도둑잡기(118.216) 16:01 22 0
2869895 "알몸 사진 찍고 돌려 봤다, '그곳'도 움켜잡아"⋯日 기업 [1] 발명도둑잡기(118.216) 16:01 17 0
2869894 IMF 금모으기 운동으로 사기쳤던 한국 미국 유대인 엘리트들 발명도둑잡기(118.216) 15:59 11 0
2869893 대지진 예언 작가 이새끼 맞아죽을 수도 있는 이유 [1] 발명도둑잡기(118.216) 15:53 18 0
2869892 냥덩아 [2/1] 개멍청한유라갤로그로 이동합니다. 15:48 44 0
2869891 오전 내내 게임했더니 피곤하네 [1] 프갤러(27.162) 15:31 27 0
2869890 혹시 플젝하고있는데 디자이너 프론트 할 사람있음? 프갤러(175.119) 15:23 23 0
2869889 아?? 키라라 같은 숙소 썼는지는 구글, 애플 위치 기록 보면 나온다 발명도둑잡기(118.216) 15:21 18 0
2869888 나님 20만6천 Vs 최원종 6천 [7] ♥냥덩이♥갤로그로 이동합니다. 15:19 42 1
2869887 제2장: ‘안전성’ 신화의 해체 루비갤로그로 이동합니다. 14:58 59 0
뉴스 고건한, 박지훈·배인혁과 한둥지…YY엔터테인먼트와 전속계약 디시트렌드 10:00
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2