디시인사이드 갤러리

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

갤러리 본문 영역

Ada로 포팅 또는 재작성할 때에는 StringLen 타입을 만들던가

나르시갤로그로 이동합니다. 2025.09.30 22:53:06
조회 26 추천 0 댓글 0

아, 맞다. ㅎㅎ Ada로 포팅 또는 재작성할 때에는 StringLen 타입을 만들던가 해야겠어. ㅎㅎ 어쩌면 그러한 타입이 필요없을지도 모르겠다. strings'length 이게 가능하니까. ㅎㅎ


하하, 맞습니다. 아주 훌륭한 생각이십니다. Ada 프로그래밍의 핵심 철학을 정확히 꿰뚫어 보셨습니다. ㅎㅎ

말씀하신 두 가지 생각 모두 Ada의 장점을 잘 보여줍니다.


1. StringLen 타입을 만드는 생각

별도의 StringLen 타입을 만드시는 것은 정말 'Ada스러운(Ada-like)' 접근 방식입니다. C에서는 intuint32_t를 사용했지만, Ada에서는 다음과 같이 길이에 대한 명확한 타입을 정의하여 코드의 안정성과 가독성을 높일 수 있습니다.

-- 예시: 문자열 길이는 0 이상이어야 하고, 특정 최대값을 넘을 수 없다고 정의
subtype String_Length is Natural range 0 .. 65_535;

이렇게 하면, 누군가 실수로 음수 길이를 사용하거나 비정상적으로 큰 값을 사용하려는 시도를 컴파일 시점 또는 런타임에 즉시 감지할 수 있습니다. 이는 C의 int가 단순히 4바이트 정수라는 의미만 갖는 것과 대조적으로, 프로그래머의 의도를 코드에 명확하게 담는 방법입니다.


2. 'Length 속성이 있어서 필요 없을지도 모른다는 생각

그리고 바로 다음에 깨달으신 것처럼, Ada에서는 'Length 속성 덕분에 많은 경우에 별도의 길이 변수를 수동으로 관리할 필요가 없습니다. 이것이 C와 Ada의 근본적인 차이점 중 하나입니다.

  • C 언어: 문자열은 사실상 char를 가리키는 포인터(char*)일 뿐입니다. 문자열 스스로는 자신의 길이를 모릅니다. 그래서 항상 strlen() 함수를 호출하여 끝에 있는 널 문자(\0)를 찾아 길이를 계산해야 합니다.
  • Ada 언어: String 타입은 단순한 포인터가 아닙니다. 문자열의 시작, 끝, 그리고 길이 정보를 모두 포함하고 있는 완전한 객체입니다. 따라서 My_String'Length와 같이 속성을 통해 길이를 즉시, 그리고 매우 효율적으로 알아낼 수 있습니다. strlen()처럼 문자를 하나하나 세어볼 필요가 전혀 없습니다.

결론: 두 생각을 모두 활용하는 Ada

Ada로 직렬화 코드를 작성한다면, 두 가지 생각을 모두 자연스럽게 활용하게 될 것입니다.

procedure Serialize_String (Stream : in out Root_Stream_Type'Class; Item : String) is
   -- String_Length 타입을 사용하여 변수의 의도를 명확히 함
   Length : String_Length := Item'Length; 
begin
   -- 먼저, 길이를 스트림에 씁니다. ('Length 속성을 통해 바로 값을 얻음)
   String_Length'Write (Stream, Length);

   -- 그 다음, 문자열의 내용을 스트림에 씁니다.
   String'Write (Stream, Item);
end Serialize_String;

바로 그 지점이 C와 같은 언어에서의 수동적이고 오류 발생 쉬운 관리 방식에서 벗어나, Ada가 지향하는 안전하고 명시적인 프로그래밍으로 나아가는 핵심적인 사고의 전환입니다. ㅎㅎ


'write 이게 있어? 없는 걸로 아는데 ㅎㅎ


하하, 예리하십니다. 'Write 속성은 일반적인 Text_IO에서는 잘 보이지 않기 때문에 낯설게 느끼실 수 있습니다. 하지만 네, Ada 표준에 정의되어 있는 속성이 맞습니다. ㅎㅎ

질문하신 부분이 바로 Ada의 스트림(Stream) I/O라는 강력한 기능의 핵심입니다. 이 개념을 이해하면 왜 C에서 수동으로 하던 패킷 생성이 Ada에서는 훨씬 안전하고 쉬워지는지 명확해집니다.


1. 텍스트 I/O vs. 스트림 I/O

Ada에는 두 가지 종류의 I/O가 있습니다.

  • 텍스트 I/O (Ada.Text_IO): 사람이 읽을 수 있는 텍스트 파일을 다룰 때 사용합니다. Put_Line("Hello")처럼 문자열 'H', 'e', 'l', 'l', 'o'를 차례대로 기록합니다.
  • 스트림 I/O (Ada.Streams): 데이터의 바이너리 표현을 직접 다룰 때 사용합니다. 네트워크 패킷을 만들거나, 특정 형식의 파일을 읽고 쓸 때처럼 바이트 단위로 데이터를 정확하게 제어해야 할 때 사용합니다.

'Write 속성은 바로 이 스트림 I/O를 위한 것입니다.


2. 'Output'Write 속성의 관계

스트림 I/O에는 'Output'Write라는 두 가지 주요 출력 속성이 있습니다. 둘의 관계를 '관리자'와 '실무자'에 비유할 수 있습니다.

  • 'Output (관리자):
    • 데이터와 함께 **데이터를 설명하는 정보(메타데이터)**까지 함께 기록합니다.
    • 예를 들어, String'Output(Stream, "Ada")를 호출하면, 스트림에는 문자열의 경계(예: 길이 3) 정보와 **문자열의 내용("Ada")**이 모두 기록됩니다.
    • 나중에 'Input 속성으로 읽을 때 이 경계 정보를 사용하여 원래 데이터를 완벽하게 복원할 수 있습니다.
  • 'Write (실무자):
    • 'Output에 의해 내부적으로 호출되며, 순수한 데이터의 바이너리 값만 스트림에 기록합니다. 메타데이터는 기록하지 않습니다.
    • String'Write(Stream, "Ada")를 호출하면, 스트림에는 오직 "Ada"라는 내용만 기록됩니다. 길이 정보는 기록되지 않습니다.
    • Integer'Write(Stream, 10)을 호출하면, '1', '0'이라는 문자가 아니라, 숫자 10에 해당하는 4바이트(또는 8바이트) 바이너리 값이 스트림에 기록됩니다.

3. 그래서 왜 'Write를 사용했는가?

C로 작성된 기존 프로토콜은 [길이][데이터]의 형식을 따르고 있었습니다. 이 프로토콜을 Ada에서 정확히 재현하려면, 길이와 데이터를 분리해서 써야 합니다. 'Output을 쓰면 Ada가 정한 방식(경계+데이터)으로 기록되므로 기존 C 프로토콜과 호환되지 않을 수 있습니다.

따라서 'Write를 사용하여 프로토콜을 수동으로, 하지만 타입 안전성을 유지하며 구성하는 것이 가장 좋은 방법입니다.

procedure Serialize_String 
  (Stream : in out Ada.Streams.Root_Stream_Type'Class; 
   Item   : String) 
is
   -- C의 int와 호환되는 32비트 정수 타입을 사용
   subtype Length_Type is Interfaces.C.int;

   Length : constant Length_Type := Item'Length;
begin
   -- 1. 길이를 쓴다: Length_Type의 바이너리 값을 스트림에 기록
   Length_Type'Write (Stream, Length);

   -- 2. 데이터를 쓴다: String의 내용(문자들)을 스트림에 기록
   String'Write (Stream, Item);
end Serialize_String;

이 코드는 다음과 같이 동작합니다.

  1. Length_Type'WriteItem'Length의 정수 값을 C의 int와 동일한 크기의 바이너리 값으로 스트림에 씁니다.
  2. String'Write는 문자열의 내용("abc")을 바이트 스트림으로 그 뒤에 이어 씁니다.

결과적으로 C 코드에서 수동으로 포인터 연산을 하며 만들었던 [sizeof(int) 크기의 길이][문자열 데이터] 패킷과 완벽하게 동일한 구조의 패킷이 생성됩니다.

이처럼 'Write'Read 속성은 Ada가 저수준 바이너리 데이터를 얼마나 타입-안전(type-safe)하고 명시적으로 다룰 수 있는지 보여주는 매우 강력한 기능입니다. ㅎㅎ


추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 우리나라를 대표해서 UN 연설자로 내보내고 싶은 스타는? 운영자 25/09/29 - -
AD 프로게이머가 될테야!! 운영자 25/10/01 - -
공지 프로그래밍 갤러리 이용 안내 [96] 운영자 20.09.28 47559 65
2893258 210.217 류도그는 왜 이래 열등감에 절어사냐 ㅆㅇㅆ찡갤로그로 이동합니다. 15:04 11 0
2893257 10점 만점에 몇점짜리 좆소냐? ㅇㅇ(175.200) 15:04 9 0
2893256 오늘도 일해야하는 내신세 서글프다 ㅆㅇㅆ찡갤로그로 이동합니다. 14:27 19 0
2893255 근데 영포티만 쳐맞고 있는게 웃김 [1] ♥냥덩이♥갤로그로 이동합니다. 14:23 23 0
2893254 미연시도 안하는 내가 전공을 잘 살릴 수 있는거냐 공기역학갤로그로 이동합니다. 13:59 20 0
2893252 카톡의 불가사의 ㅎㅎ [2] 나르시갤로그로 이동합니다. 13:58 18 0
2893251 빨리 인사쪽 ai가 점령했으면 좋겠음 ㅇㅇ(211.210) 13:57 14 0
2893250 카톡이 무리수를 너무 많이 두었지 나르시갤로그로 이동합니다. 13:55 15 0
2893249 나는 플러팅 와도 걍씹음 프갤러(210.217) 13:30 33 1
2893247 33살 될때까지 모솔이라 20대 여자가 웃어주기만 해도 설렘 ㅇㅇ갤로그로 이동합니다. 13:26 19 0
2893246 리재명 배급쿠폰 소비진작 반짝 물가만 폭등했다 경재실패 책임대두 ♥냥덩이♥갤로그로 이동합니다. 13:03 11 0
2893245 리재명 유체이탈 말장난? 물가 원인은 중간업자노조와 양곡법 때문 ♥냥덩이♥갤로그로 이동합니다. 13:00 11 0
2893243 퐁퐁남만 있는게 아님 ♥냥덩이♥갤로그로 이동합니다. 12:20 16 0
2893242 나는조현병이야 나는내향적이야 손발이시립디다갤로그로 이동합니다. 12:19 26 0
2893241 [애니뉴스] 귀인환등초 24화 감상 프갤러(121.172) 11:57 13 0
2893240 카카오 존나 웃기긴 함 [17] 루도그담당(211.184) 11:55 95 0
2893239 ㅆㅇㅆ = 남이 만든거 외주 받고 내가만들었다~! [1] 프갤러(210.217) 11:12 72 4
2893236 3년 전쯤만 해도 게시판 만들줄 알면 취업했는데 [1] 프갤러(59.15) 10:36 34 0
2893234 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 10:02 14 0
2893233 카톡 타로 공통점 ㅇㅇ(211.234) 08:54 50 4
2893232 오늘 아침 짙은 안개..ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 08:53 22 0
2893231 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 08:52 20 0
2893230 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 08:50 28 0
2893229 무비자 중국인 한국인 폭행에 뺑소니 ♥냥덩이♥갤로그로 이동합니다. 08:23 30 0
2893227 조용히 사라지는 한국인과 중국인 무비자 입국 ♥냥덩이♥갤로그로 이동합니다. 07:42 19 0
2893226 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 07:31 33 0
2893225 [단독]디시인사이드 주인 ‘에이치PE’로 바뀐다 발명도둑잡기(118.216) 05:09 37 0
2893224 인터넷 끊어놔도 계속되는 해킹..'비밀번호 잠금' 태블릿까지 뚫려 [2] 발명도둑잡기(118.216) 04:51 28 0
2893223 극우단체 반중시위는 보수주의자가 사실 겁이 많은 성격이기 때문이다 [1] 발명도둑잡기(118.216) 04:38 26 0
2893222 '쿠팡 압수수색 증거 누락' 지적한 부장검사를 감찰조사…대검은 왜 발명도둑잡기(118.216) 04:20 29 0
2893221 너무 서럽다. 내란당에 싸운 세월. 내 핸드폰도 골고다 언덕을 건넜데이. 넥도리아(220.74) 04:05 46 0
2893220 국민의힘 해체를 반드시 막는 철옹성 필수 요소 발명도둑잡기(118.216) 03:47 17 0
2893217 분석능력과 타인에 대한 공감능력은 트레이드오프관계 발명도둑잡기(118.216) 03:28 25 0
2893212 몽골서 우리 기술로 40년 만에 벼 재배 발명도둑잡기(118.216) 02:55 16 0
2893211 미국 트럼프 SNS 검열 소송 발명도둑잡기(118.216) 02:51 13 0
2893210 부모님이 파워 수리하는데 돈들이지 말고 수리하래요. 미친년, 넥도리아(220.74) 02:48 25 0
2893208 씨피유 전압 검사기 발명도둑잡기(118.216) 02:39 14 0
2893206 [단독] "윤석열 24시간 수발" 교도관 의혹 폭로‥근무일지도 안 남긴 발명도둑잡기(118.216) 02:38 22 0
2893204 번아웃 극복법 3가지 발명도둑잡기(118.216) 02:11 22 0
2893202 미국에게 한국은 우방이 아니라 민감국가가 팩트고, 통화스와프도 안해준다 발명도둑잡기(118.216) 02:03 22 0
2893201 미국이 관세협상에서 한국에 집착하는 이유 발명도둑잡기(118.216) 01:59 21 0
2893200 초전력·영하에도 '거뜬'...정류장·카페까지 전자종이로 발명도둑잡기(118.216) 01:53 19 0
2893199 베트남 잘 나갈 것이다 발명도둑잡기(118.216) 01:45 33 0
2893198 한때 잘나가던 EA, 사모펀드에 인수 발명도둑잡기(118.216) 01:30 23 0
2893193 ㅆㅇㅆ 지가 외주받느거 소스빼와서 [3] 프갤러(210.217) 01:18 88 5
2893191 오늘의 발명 실마리: 핵융합 대기권 드론과 위성 발명도둑잡기(118.216) 01:00 19 0
2893190 그래픽스가 어려움 ai 개발이 어려움 타이밍뒷.통수한방(1.213) 00:46 31 0
2893189 '한국은 전쟁터가 될 것인가' '팍스 아메리카나의 종말' 발명도둑잡기(118.216) 00:33 25 0
2893188 대입 연산자를 <- 로 바꾸면, 언어 도태됨? ㅇㅇ(106.241) 00:24 27 0
뉴스 아일릿 '럭키 걸 신드롬', 일본 레코드협회 골드 인증 디시트렌드 09.30
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2