디시인사이드 갤러리

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

갤러리 본문 영역

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

나르시갤로그로 이동합니다. 2025.07.19 10:27:07
조회 45 추천 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 - -
AD 곧 휴가!! 홈캉스, 바캉스 SALE 운영자 25/07/21 - -
공지 프로그래밍 갤러리 이용 안내 [88] 운영자 20.09.28 45650 65
2873345 ㅇㅅㅇ ♥삣삐냥덩♥갤로그로 이동합니다. 19:12 3 0
2873344 보안팀 하고싶다 nac 모니터링꿀잼일듯 ㅇㅇ(211.234) 19:10 3 0
2873342 배급견 정상화의 신 2찢명 통수 ㅋㅅㅋ ♥삣삐냥덩♥갤로그로 이동합니다. 19:00 5 0
2873341 먹으면 식중독걸리는 수박 특징 ㅇㅇㅇㅇ(115.144) 18:58 5 0
2873340 안에 싸주고 싶은.. ♥삣삐냥덩♥갤로그로 이동합니다. 18:57 10 0
2873339 너무 사람을 믿었을까... 넥도리아(223.39) 18:44 10 0
2873338 지원금 이건 함? ㅇㅇ(106.101) 18:38 9 0
2873337 LLM 쓰면서 장점: 하루 생산량이 3배가됨 [8] ㅆㅇㅆ(124.216) 18:33 33 0
2873336 요즘은 버전 api 브레이킹체인지 내버리면 잘안쓰려고하더라 ㅇㅇ(183.101) 18:31 7 0
2873335 중고 폰 거래 후기 넥도리아(223.39) 18:28 12 0
2873334 망해버린 갤러리에서 노는 것도 나름 재미있을지도 [2] 아스카영원히사랑해갤로그로 이동합니다. 18:22 26 0
2873333 갑질좌파 강선우 폭로 또 터졌다 논란 ♥삣삐냥덩♥갤로그로 이동합니다. 18:21 22 0
2873332 나 요새 모든 코드 짜는 기준이 LLM 이 이해하기 쉽게임 [4] ㅆㅇㅆ(124.216) 18:19 24 0
2873331 ❤✨☀⭐⚡☘♥+나님 시작합니당♥+☘⚡⭐☀✨❤ ♥삣삐냥덩♥갤로그로 이동합니다. 18:16 9 0
2873330 리액트 쓰다가 뷰 써보니 뷰가 더 낫긴함 [4] 거북이속이거북갤로그로 이동합니다. 18:15 28 0
2873329 자본주의 붕괴 시나리오 - 임금생활자가 사라지면 ㅇㅇ(183.101) 17:55 14 0
2873328 Ai 판사 도입하면 [3] 루도그담당(211.184) 17:51 43 0
2873327 ㅆㅇㅆ는 야옹이 하위호환임 [2] ㅇㅇ(211.235) 17:48 51 2
2873326 판사 업무 과중... - AI 보조판사 도입 ㅇㅇ(183.101) 17:48 16 0
2873325 아 개피곤하네 [2] 루도그담당(211.184) 17:47 29 0
2873323 그림체 넘 귀여웅 ㅜ ㅅ ㅜ ❤+ ♥삣삐냥덩♥갤로그로 이동합니다. 17:43 21 0
2873322 지가 다중이짓 하던거 걸리니까 [4] ㅇㅇ(211.235) 17:36 57 1
2873321 뷰 전망 어떠냐? [6] 프갤러(106.246) 17:35 30 0
2873320 니 주장의 근거가 니 주장 뿐이니까 조현병 망상이란 소릴 듣는거지 [1] ㅇㅇ(211.235) 17:33 32 1
2873319 AI 가못하는게 없을거라고 모든 교수,학자가 말하는중 ㅇㅇ(183.101) 17:32 14 0
2873318 냥덩아 비추주작 그만하고 자꾸 슼통피 쳐걸려놓고 따라다니면서 도배좀 [7] ㅆㅇㅆ찡갤로그로 이동합니다. 17:32 91 7
2873317 [추가모집][이스트소프트] 인공지능사관학교 AI교육생 모집 K교갤(118.235) 17:32 19 0
2873316 반박 못 하니까 작성자 삭제 ㅋㅋㅋㅋㅋ ㅇㅇ(211.235) 17:31 19 0
2873315 IP주소 관련 질문.. [4] ㅇㅇ(220.72) 17:30 22 0
2873314 재건축 앞둔 아파트가 하룻밤 만에 밴드 공연장으로 변신? 발명도둑잡기갤로그로 이동합니다. 17:11 13 0
2873313 나님 배구푼데 저녁 머먹찌? ♥삣삐냥덩♥갤로그로 이동합니다. 17:04 15 0
2873312 냥덩이에게 까분 극좌배급 찢칠라의 최후⭐(참교육,사이다) ♥삣삐냥덩♥갤로그로 이동합니다. 17:00 18 0
2873311 Reds Go Togethor 넥도리아(27.163) 16:48 11 0
2873310 근데 냥덩이는 진짜 인간이 음침하지 않냐? 지 닉넴단 글은 [3] ㅆㅇㅆ(124.216) 16:48 42 0
2873309 실시간베스트 성장호르몬 주사 글 보니 드는 생각 [2] 발명도둑잡기갤로그로 이동합니다. 16:45 33 0
2873308 민주당이 주는 건 상징 자본이고 국힘이 주는건 실제 자본이니까 [2] ㅆㅇㅆ(124.216) 16:37 28 0
2873307 근데 생각해보면 민주당이 왜 지역에서 못이기는지도 알거같긴해 ㅆㅇㅆ(124.216) 16:33 27 0
2873306 실베 언더친윤 이야기하니까 보는데, 경호쪽 노가다할때 떠오르네 [2] ㅆㅇㅆ(124.216) 16:30 41 0
2873305 요즘 만화 즐겨보는데 [2] 루도그담당(211.184) 16:23 28 0
2873304 좀 쉬었으니 개발 계속혀야겠다 [2] ㅆㅇㅆ(124.216) 16:17 32 0
2873303 檢, 이재명 '소년원 입소' 주장…강용석·김세의 실형 구형 발명도둑잡기갤로그로 이동합니다. 16:17 23 0
2873302 이거 쓴 새끼 누군지 찾았음 ㅇㅅㅇ ♥삣삐냥덩♥갤로그로 이동합니다. 16:13 28 0
2873301 산사태 ‘뒷북 경보’… 산청서만 10명이 숨졌다 발명도둑잡기갤로그로 이동합니다. 16:12 12 0
2873300 ㅇㅅㅇ ♥삣삐냥덩♥갤로그로 이동합니다. 16:02 19 0
2873298 나 나리타공항에서 어글리 중국인 봄 [4] 아스카영원히사랑해갤로그로 이동합니다. 15:42 68 0
2873297 프갤 망했냐? [1] 프갤러(175.210) 15:42 32 0
2873296 프갤신이 보우하사 중고거래 하러 뛰고 넥도리아(223.39) 15:42 18 0
2873295 나는 프로그래밍에 재능이 없는가봐 [4] ㅆㅇㅆ(124.216) 15:38 52 0
2873294 이상과 현실 사이…고교 내신 절대평가 왜 안 될까 발명도둑잡기갤로그로 이동합니다. 15:28 11 0
뉴스 ‘하트시그널3’ 서은우, 임신 근황 공개…“아기 크고 있어요, 친부는 연락두절” 디시트렌드 10:00
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2