디시인사이드 갤러리

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

갤러리 본문 영역

Ada 언어 Cara 플젝에 Ruby 코드 사용하는 이유

나르시갤로그로 이동합니다. 2025.07.19 10:27:07
조회 59 추천 0 댓글 0

cloc 로 보겠습니다.


hodong@:~/projects/cada/src $ cloc .

      19 text files.

      17 unique files.                              

       5 files ignored.


github.com/AlDanial/cloc v 2.04  T=0.01 s (1182.6 files/s, 87513.2 lines/s)

-------------------------------------------------------------------------------

Language                     files          blank        comment           code

-------------------------------------------------------------------------------

Ada                             14            133            186            720

Ruby                             2             29             35            133

C                                1              4              6             12

-------------------------------------------------------------------------------

SUM:                            17            166            227            865

-------------------------------------------------------------------------------


이렇습니다.

루비 코드도 많이쓰죠.
웰까요.
소스코드 자동 생성 때문에 그렇습니다.
ㅎㅎㅎ


이런 식으로 코드 자동생성 ㅋㅋ
#!/usr/bin/env ruby
# frozen_string_literal: true

require 'fiddle/import'

# =============================================================================
# 1. C 라이브러리(libc)의 strerror 함수를 호출하기 위한 설정
# =============================================================================
module LibC
  extend Fiddle::Importer

  LIBC_PATH = case RUBY_PLATFORM
              when /linux/
                'libc.so.6'
              when /darwin/ # macOS
                'libc.dylib'
              when /freebsd/
                'libc.so.7'
              else
                'libc.so'
              end
  begin
    dlload LIBC_PATH
    extern 'char* strerror(int)'
  rescue Fiddle::DLError => e
    warn "Warning: Could not load libc. Cannot generate error messages."
    warn "Details: #{e.message}"
    # strerror를 찾을 수 없을 때 빈 함수를 정의하여 스크립트가 완전히 죽는 것을 방지
    def self.strerror(errnum); "libc not found"; end
  end
end

# =============================================================================
# 2. strerror 메시지를 Ada 예외 이름으로 변환하는 로직
# =============================================================================
def message_to_ada_name(message)
  # 'Can't'/'can't' 같은 예외적인 단어들을 먼저 처리
  processed_message = message.gsub(/can't/i, "cannot")

  # 각종 구분자(공백, /, :, ., -)로 단어를 나누고, 빈 조각은 제거
  parts = processed_message.split(/[ \/:.-]/).reject(&:empty?)

  # 각 단어의 첫 글자를 대문자로 만들고 언더스코어(_)로 합침
  return parts.map(&:capitalize).join('_')
end

input_file = ARGV[0]
unless input_file && File.exist?(input_file)
  puts "Usage: #{$0} <path_to_errno_h.ads>"
  exit 1
end

# 1. 'errno_h.ads' 파일을 읽어 문자열로 저장합니다.
file_contents = File.read(input_file)
# 2. 정규표현식으로 파일 내용에서 C 상수 이름과 숫자 값을 모두 찾아냅니다.
#    결과는 [["EPERM", "1"], ["ENOENT", "2"], ...] 형태의 배열이 됩니다.
c_constants = file_contents.scan(/^\s*(\w+)\s*:\s*constant\s*:=\s*(\d+);/)
# 3. 최종 결과를 담을 빈 배열을 준비합니다.
errors = {}

# 4. 찾아낸 각 상수 쌍([name, val])에 대해 반복 작업을 수행합니다.
c_constants.each do |name, val|
  # 5. 숫자 값을 정수로 변환하고, strerror를 호출하여 메시지를 가져옵니다.
  error_number = val.to_i
  message = LibC.strerror(error_number).to_s
  # 6. 메시지가 유효하지 않으면 스크립트를 중단시킵니다.
  if message.nil? || message.empty? || message.start_with?('Unknown error')
    raise "Invalid message for errno #{error_number}"
  end

  # 7. 메시지를 Ada 예외 이름 형식으로 변환합니다.
  ada_name = message_to_ada_name(message)

  # 8. 변환에 성공했다면, 모든 정보를 묶어서 최종 결과 배열에 추가합니다.
  if ada_name
    errors[val] = {  c_name: name, ada_name: ada_name } if errors[val].nil?
  end
end

# --- cada-error.ads 파일 생성 (추가된 부분) ---
File.open('cada-error.ads', 'w') do |f|
  f.puts '-- -*- Mode: Ada; indent-tabs-mode: nil; c-basic-offset: 2; tab-width: 2 -*-'
  f.puts '-- This file is generated by gen-cada-error.rb. DO NOT EDIT.'
  f.puts '-- cada-error.ads'
  f.puts '-- Copyright (c) 2025 Hodong Kim <hodong@nimfsoft.art>'
  f.puts '--'
  f.puts '-- Permission to use, copy, modify, and/or distribute this software for any'
  f.puts '-- purpose with or without fee is hereby granted.'
  f.puts '--'
  f.puts '-- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES'
  f.puts '-- WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF'
  f.puts '-- MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR'
  f.puts '-- ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES'
  f.puts '-- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN'
  f.puts '-- ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF'
  f.puts '-- OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.'
  f.puts 'with Interfaces.C;'
  f.puts
  f.puts 'package Cada.Error is'
  f.puts
  errors.each_pair do |code, hash|
    f.puts "  #{hash[:ada_name].ljust(35)} : exception; -- #{hash[:c_name]}, #{code}"
  end
  f.puts
  f.puts '  Unknown_Error : exception; -- For unhandled errno values'
  f.puts
  f.puts '  function get_error_message (Err_Code : Interfaces.C.Int) return String;'
  f.puts
  f.puts 'end Cada.Error;'
end

puts "Generated src/cada-error.ads successfully."

# =============================================================================
# 5. cada-error-raise_from_errno.adb (서브유닛) 파일 생성
# =============================================================================
File.open('cada-error-raise_from_errno.adb', 'w') do |f|
  f.puts '-- This file is dynamically generated by gen-cada-error.rb. DO NOT EDIT.'
  f.puts 'separate (Cada.Error)'
  f.puts 'procedure raise_from_errno (err_code : Interfaces.C.Int; message : String := "") is'
  f.puts '  final_message : constant String :='
  f.puts '    (if message\'length > 0 then message else "OS Error");'
  f.puts 'begin'
  f.puts '   case err_code is'
  errors.each_pair do |val, data|
    f.puts "      when #{val} => raise #{data[:ada_name]} with final_message;"
  end
  f.puts '      when others => raise Unknown_Error with final_message & " (errno: " & err_code\'image & ")";'
  f.puts '   end case;'
  f.puts 'end raise_from_errno;'
end

puts "Generated src/cada-error-raise_from_errno.adb successfully."

한가지 언어만 사용하지는 않아요.
ada, c/c++로 뭔가를 개발한다고 하여 동적 언어는 안 쓰겠거니 생각하면 큰 오산입니다.

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 모태 솔로도 구제해 줄 것 같은 연애 고수 스타는? 운영자 25/07/21 - -
공지 프로그래밍 갤러리 이용 안내 [88] 운영자 20.09.28 45765 65
2874742 나님 출발합니당❤+ ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07:57 7 0
2874740 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07:21 10 0
2874736 물론 프로그래밍의 전공 특성상 우아함과 정확성은 변하지 ㅆㅇㅆ(124.216) 05:54 29 0
2874734 나는 이론물리 전공했는데 프로그래밍 전공한다는 놈들은 [8] ㅆㅇㅆ(124.216) 05:44 68 0
2874732 115.138야 넌가서 쿠팡일이나해라. (조언포함) [20] 프갤러(121.139) 05:34 121 1
2874729 내가 생각하는 오타쿠의 최소 요건 [8] 아스카영원히사랑해갤로그로 이동합니다. 05:30 67 0
2874726 프로그래밍 하시는분들 메모리스캔에 대해서 질문이 있는데 [2] 프갤러(112.148) 05:15 42 0
2874724 프로그래밍 판에 지적허영심 있는 분들이 보임 [14] 프갤러(115.138) 05:06 91 1
2874720 누가 특이점이 온다고 했냐 [5] 프갤러(115.138) 04:07 140 0
2874717 민생지원금 안뿌려도 어차피 물가는 오름 야옹아저씨갤로그로 이동합니다. 03:22 29 0
2874716 해외 계약직도 경력에 도움됨? ㅇㅇ(49.166) 03:20 21 0
2874714 웹사이트 클릭률 평가좀 [1] 프갤러(210.97) 02:32 51 0
2874713 요즘 유튜브에 무한도전 가끔 뜨는데 아스카영원히사랑해갤로그로 이동합니다. 02:28 24 0
2874709 음기 충전 발명도둑잡기(118.216) 01:44 39 0
2874708 민생지원금 사용기준 더 제한햇어야함 [9] 야옹아저씨갤로그로 이동합니다. 01:34 85 5
2874701 냥덩이 발명도둑잡기(118.216) 01:18 26 0
2874699 여사친 섹트찾았는데 어캄? [2] 헤치갤로그로 이동합니다. 01:14 61 0
2874698 프로그래머스 부트캠프 가는데 전여친있는데 ㅈ됀거냐 프갤러(118.36) 01:13 28 0
2874697 난 박보영하고 결혼 안 한다 발명도둑잡기(118.216) 01:08 32 0
2874696 민생지원금 배민되던데 루도그담당(58.239) 01:04 49 0
2874695 베트남 놀러왔는데 추천 비추천이 안되네 [1] 프갤러(117.3) 01:04 27 0
2874693 서온-파도 발명도둑잡기(118.216) 00:51 12 0
2874692 민생지원금으로 배달 시켜먹었습니다~ [9] 루도그담당(58.239) 00:40 73 0
2874691 새 정부에서 날 잡아간단다... 국힘 해체쇼가 문제란다 [1] 발명도둑잡기(118.216) 00:30 33 0
2874688 ㅆㅇㅆ 는 그누보드 코드보면 정신나가겠네 [2] 피치(183.101) 00:26 40 0
2874687 형들 리액트 독학해서 사이트 하나 만들어봤는데 UI 디자인 한번 봐줘 [5] 프갤러(221.161) 00:26 45 0
2874684 김영한씨 빡고수지 문제는 김영한씨 책을 아직도 참조하는게 문제인거지 [3] ㅆㅇㅆ(124.216) 00:22 77 0
2874682 낭만 그잡채자나❤+ [1] 어린이노무현갤로그로 이동합니다. 00:20 30 0
2874679 냥덩이랑 친해지는법❤+ ♥팬티스타킹냥덩♥갤로그로 이동합니다. 00:18 17 0
2874678 김x한님 별로야? [1] 피치(183.101) 00:15 32 0
2874677 검신 오공이랑 세키로 같은거 무브먼트 영상보면서 [2] 루도그담당(58.239) 00:14 36 0
2874676 밤 12시 이후로 깨았눈거 정말 오랜만인둣? ♥팬티스타킹냥덩♥갤로그로 이동합니다. 00:13 27 0
2874675 도태 에겐코더들이 싸놓은 코드보면 한숨만 나온다 [2] 프갤러(220.87) 00:10 40 0
2874674 얼마전 리조트 총싸움 글 쓴 이틀 뒤 인천 총기 사건 남 발명도둑잡기(118.216) 00:06 23 0
2874673 유니티 최대 난제 부딪힘 [15] 루도그담당(58.239) 00:05 87 0
2874672 ㄹㅇ 프리랜서 뛰면서 경력에 대한 환상이 깨짐 [3] ㅆㅇㅆ(124.216) 00:04 52 0
2874671 그냥 남의 코드 덜렁 던져주고 고쳐달란 새끼한테도 화가나고 [4] ㅆㅇㅆ(124.216) 00:02 39 0
2874670 뷰 응답 객체는 일반적으로 DTO임 [1] ㅆㅇㅆ(124.216) 00:00 31 0
2874669 개씹웃기넹 ㅋㅋㅋㅋㅋㅋ ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.25 20 0
2874668 가끔 신기하긴해. 요구 스펙들은 무슨 난다 긴다하는 새끼들인데 [3] ㅆㅇㅆ(124.216) 07.25 35 0
2874666 젤 이해가 안가는게 왜 틀딱들은 자기 지식을 최신화 안하냐 ㅆㅇㅆ(124.216) 07.25 41 0
2874663 내가 느끼는게 회사 요구스펙이랑 하는 일이 너무 동떨어진듯 [7] ㅆㅇㅆ(124.216) 07.25 49 0
2874660 Ai로 진짜 기술격차 안드로메다 됨? [1] 프갤러(118.235) 07.25 29 0
2874658 확실히 애바가 우울증 치료효과가 있네 - 레딧 글 ㅇㅇ(183.101) 07.25 25 0
2874657 지금도 송지훈형 모델그대로네요예 신비한티비서프라이즈(121.147) 07.25 27 0
2874656 유니티 씨발련아 [4] 루도그담당(58.239) 07.25 37 0
2874655 민생지원금으로 주식을 어떻게 산다는 거죠? [1] 발명도둑잡기(118.216) 07.25 24 0
2874654 수리할 권리를 투쟁으로 쟁취해야 한다 발명도둑잡기(118.216) 07.25 15 0
2874652 슬줌마 슬카스 [12] ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.25 57 0
뉴스 '전참시' 28년 차 레전드 혼성그룹 코요태 첫 출격! 육아 난이도 上 두 아들 종민&빽가와 엄마 신지(?) '찰떡 케미' 디시트렌드 07.25
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2