디시인사이드 갤러리

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

갤러리 본문 영역

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

나르시갤로그로 이동합니다. 2025.09.30 22:53:06
조회 39 추천 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 47579 65
2893484 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 08:11 0 0
2893483 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 08:08 2 0
2893482 외국도 rewrite it in rust 하고 있는데 언어는 그저 프갤러(218.153) 07:28 14 0
2893481 나는내향적이야 나는조현병이야 손발이시립디다갤로그로 이동합니다. 07:22 8 0
2893471 멘헤라 모모링..❤ ♥냥덩이♥갤로그로 이동합니다. 06:37 12 0
2893460 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 06:19 13 0
2893452 민주당 종교단체 동원했나 “김민석으로 가시죠” 논란 일파만파 ♥냥덩이♥갤로그로 이동합니다. 06:04 12 0
2893449 외국도 초급/저연차 프로그래머들 다 잘리고 있는데 AI는 그저 프갤러(220.70) 06:00 16 0
2893415 컴공 학식 2학년인데 어케해야할까요 ㅇㅇ(211.60) 04:44 28 0
2893387 트럼프에 등 돌리는 MAGA! 원인은 엡스타인이 아니라 '딥스테이트'? 발명도둑잡기(118.216) 02:08 15 0
2893385 노인들이 인생이 노력이랬다가 운이라고하는데 정신 못차려서 그럼 타이밍뒷.통수한방(1.213) 01:44 19 0
2893384 이스라엘 삐삐 원격 폭파처럼 노트북, 서버 배터리 원격 폭발 공작 발명도둑잡기(118.216) 01:38 32 0
2893381 찢은 보수진보 대통합을 이루고 국가붕괴시킴 ㅋㅋㅋㅋㅋㅋ 타이밍뒷.통수한방(1.213) 01:35 15 0
2893379 정부 클라우드 복구불가 혹시 내란세력 증거 소멸 목적? 발명도둑잡기(118.216) 01:27 17 0
2893377 미국 국기 이모티콘은 두개 발명도둑잡기(118.216) 01:22 12 0
2893376 카카오 코테.. c없네.. 프갤러(112.170) 01:20 50 0
2893371 리눅스 창시자 리누스 방한하면 유퀴즈에 나와야 합니다 [1] 발명도둑잡기(118.216) 01:10 34 0
2893367 요즘은 국비교육 인기가 없나보네 [3] 프갤러(219.251) 00:53 61 0
2893366 근데 오히려 못생긴거<<이거 나름 나쁘지 않은듯 [1] ㅆㅇㅆ(113.192) 00:50 34 0
2893365 [4] 노력갤로그로 이동합니다. 00:41 50 0
2893364 북돼지새끼는 왜 외제품 사용하는거임?? 타이밍뒷.통수한방(1.213) 00:16 15 0
2893363 커널 패치가드 조지는 중인데 루도그담당(58.239) 00:14 18 0
2893362 오늘의 영화 실마리: 온라인게임 역사 다큐 발명도둑잡기(118.216) 00:12 17 0
2893361 사람이 참 보고배우는 영향이 큰 것 같어... ㅇㅇ(223.39) 00:10 37 0
2893360 수면쉬야햇당 ♥냥덩이♥갤로그로 이동합니다. 00:00 32 0
2893359 울트라리스크 ♥냥덩이♥갤로그로 이동합니다. 10.01 33 0
2893358 남자도 여신 유튜버 되기 가능 발명도둑잡기(118.216) 10.01 14 0
2893357 뭔가 덥넹 ♥냥덩이♥갤로그로 이동합니다. 10.01 30 0
2893356 애인과 수갑 한쪽씩 차면 뭐 하고 놀아야 하나요? 발명도둑잡기(118.216) 10.01 13 0
2893355 너희 좃찐따라서 나님 없으면 개노잼이잖아 [1] ♥냥덩이♥갤로그로 이동합니다. 10.01 26 0
2893354 나는 supabase의 기능중에 db를 벡터화 하는게 존나 편해서 ㅆㅇㅆ찡갤로그로 이동합니다. 10.01 31 0
2893353 나도 만약 성공했으면 운이 좋았다라고 변명했을듯 타이밍뒷.통수한방(1.213) 10.01 23 0
2893352 인생이 운이라는새끼는 그냥 집안이 좋은새끼들이나 하는 핑계거리이지 타이밍뒷.통수한방(1.213) 10.01 22 0
2893351 CIA에 신고한 냥덩이 외환죄로 최고 사형 가능 [1] 발명도둑잡기(118.216) 10.01 20 0
2893350 실력이라 포장된 운에 현혹되지 말기를 바래 ㅇㅇ(121.168) 10.01 16 0
2893349 근데 supabase 존나 편하네 왜 백엔드 안하고 supabase [5] ㅆㅇㅆ(113.192) 10.01 48 0
2893347 인생은 운이 절대아님 타이밍뒷.통수한방(1.213) 10.01 20 0
2893345 실력은 운이야. 운은 실력이 아니야 ㅇㅇ(121.168) 10.01 18 0
2893344 .. [4] ♥냥덩이♥갤로그로 이동합니다. 10.01 63 0
2893343 와 한화 우승못했네 [8] 개멍청한유라갤로그로 이동합니다. 10.01 41 0
2893342 이재명 대통령과 박진영 대중문화교류위원회 공동위원장 [1] 발명도둑잡기(118.216) 10.01 17 0
2893341 사기조심 프갤러(211.45) 10.01 15 0
2893340 이재명,조국 [1] ♥냥덩이♥갤로그로 이동합니다. 10.01 26 0
2893339 찢재명이 알트먼 보고 행복하겠누 자기보다 작은사람 만나서 ㅋㅋㅋ 타이밍뒷.통수한방(1.213) 10.01 20 0
2893338 금융권 다니는 사람들 다닐만 해? ㅇㅇ(121.168) 10.01 18 0
2893334 아빠 여행간김에 아빠술을 털어보자 ㅇㅅㅇ [1] ㅇㅇ(223.39) 10.01 34 0
2893333 수갑차고 데이트, 네티즌 인기 폭발 발명도둑잡기(118.235) 10.01 14 0
2893332 알트먼 키 뭐임??찢재명보다 작누 타이밍뒷.통수한방(1.213) 10.01 17 0
2893331 날이 쌀쌀하니 길거리 오뎅국물이 땡기는구낭 ♥냥덩이♥갤로그로 이동합니다. 10.01 38 0
뉴스 김민재, 전역 후 첫 팬미팅 'All I Want Is You' 개최…오늘(1일) 티켓 오픈 디시트렌드 10.01
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2