디시인사이드 갤러리

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

갤러리 본문 영역

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

나르시갤로그로 이동합니다. 2025.07.19 10:27:07
조회 72 추천 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/28 - -
AD 휴대폰 액세서리 세일 중임! 운영자 25/07/28 - -
2876020 냥덩이에게 잘해줘야하는 진짜 이유⭐+ ♥불사신냥덩♥갤로그로 이동합니다. 07.29 44 0
2876019 파출소 자원하는 경찰대 출신들...알고보니 ‘로스쿨 열공 중’ 발명도둑잡기(118.216) 07.29 62 0
2876018 극좌구라당 근황 ㄹㅇ..;; ♥불사신냥덩♥갤로그로 이동합니다. 07.29 54 0
2876014 어제 제미나이씨로부터 제너레이터 js에 대해 배웟습니다 [3] 헬마스터갤로그로 이동합니다. 07.29 104 0
2876013 라이엇채용공고 [1] 프갤러(106.101) 07.29 76 0
2876012 챗봇 api한방에 100원? 헬마스터갤로그로 이동합니다. 07.29 106 0
2876010 짱깨새끼들보다 좇센이 더 덥누 짱깨폭염 ㅅㅂ 뒷통수한방(1.213) 07.29 26 0
2876009 산책길 참나리 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 07.29 27 0
2876008 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 07.29 28 0
2876007 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 07.29 29 0
2876005 나님 노팬티 상태임.. ♥불사신냥덩♥갤로그로 이동합니다. 07.29 39 0
2876001 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥불사신냥덩♥갤로그로 이동합니다. 07.29 43 0
2875999 Api키 공개 이거네 프갤러(149.88) 07.29 100 1
2875991 이파리 소동 보는데 하나하나가 전율 일어날 정도의 스킬들이고. ㅆㅇㅆ(124.216) 07.29 87 0
2875985 와 근데 이파리 사건인가 굴단 사건 보는데 저거 개발하는애 대단한걸 ㅆㅇㅆ(124.216) 07.29 93 0
2875982 최근에 1달 LLM으로 뽑아 놓은 코드 줄수보니 약 45만줄이네 ㅆㅇㅆ(124.216) 07.29 61 0
2875976 클로드 코드 거의 24시간 돌려서 코드찍어내서 그런가 ㅆㅇㅆ(124.216) 07.29 89 0
2875972 좀 번아웃 온다. 뭔가 오케스트레이터 구현에서 막히는듯 ㅆㅇㅆ(124.216) 07.29 45 0
2875959 모솔 계급 발명도둑잡기(118.216) 07.29 38 0
2875944 국민의힘이 절대 안 망하는 이유 발명도둑잡기(118.216) 07.29 52 0
2875940 소유자와 비소유자의 경계가 애매한 화폐가 있나 발명도둑잡기(118.216) 07.29 51 0
2875933 카일리(Kyly)-불꽃놀이(Fireworks) 발명도둑잡기(118.216) 07.29 28 0
2875929 불교에 의지해 성욕을 줄인다고? 발명도둑잡기(118.216) 07.29 55 0
2875927 관세전쟁에서 미국 응원하는 매국노 새끼들이 많다 발명도둑잡기(118.216) 07.29 28 0
2875923 이번에 굴단인가 걔네들 역류기에 쓰던 프록시 제공 사이트 걸렸다더만 ㅆㅇㅆ(124.216) 07.29 63 0
2875922 군중을 개인들의 집합이라고 보는 시각의 사회심리학적 한계 발명도둑잡기(118.216) 07.29 34 0
2875921 나는 수년 전에 인지능력 떨어지는 사람을 잘 설득하는 능력 발명도둑잡기(118.216) 07.29 62 0
2875920 불교수행 몸에대한 집착, 성욕을 내려놔라 프갤러(183.101) 07.29 42 0
2875919 넥슨 청소년 코드배틀 참가할깡 ㅇㅅㅇ [2] 어린이노무현갤로그로 이동합니다. 07.28 105 0
2875910 프갤 애들보면 책을 얼마나 안 읽고 사는지 신기하지 않냐. [2] ㅆㅇㅆ(124.216) 07.28 97 0
2875907 유독 프걀에만 야한글이 많다 수행에 방해된다 프갤러(183.101) 07.28 29 0
2875903 중국 형님들 유니티 보는데 [2] 루도그담당(58.239) 07.28 78 0
2875900 힘들다. 그냥 불교식대로 백골관을 수행해보려고 [1] 프갤러(183.101) 07.28 45 0
2875899 연애라는게 꼭 서로 좋아죽을 그런게 필요한가 싶다 [5] ㅆㅇㅆ(124.216) 07.28 83 0
2875896 모솔이지만 연애하고싶어 보는데 프갤러(183.101) 07.28 52 0
2875894 섹스<<해본 적 없음 [3] ㅆㅇㅆ(124.216) 07.28 92 0
2875893 1인 SAAS 개발 돈버는 꿀팁 [1] 프갤러(71.167) 07.28 89 0
2875891 자신도 모르게 내가 원고? 라는 개발자들 발명도둑잡기(118.216) 07.28 41 0
2875889 Gpt 5 8월출시 알트만:내가 무능하게 느껴졌다 프갤러(183.101) 07.28 52 1
2875883 일본 프랑스 이탈리아 독일 중국 테마파크 발명도둑잡기(118.216) 07.28 58 0
2875882 고졸취업가능하냐? 프갤러(121.185) 07.28 52 0
2875878 원종이 보고싶다 [4] 어린이노무현갤로그로 이동합니다. 07.28 101 0
2875877 휴머노이드형은 크기에 따라서 루도그담당(58.239) 07.28 37 0
2875876 김기찬-골목은 살아있다 발명도둑잡기(118.216) 07.28 30 0
2875872 90만년 전 인류 생존자는 단 1300여명…원인 뭐였나? 발명도둑잡기(118.216) 07.28 30 0
2875870 중국여자 위안부 후손 발명도둑잡기(118.216) 07.28 54 0
2875867 커서 vs 클로드코드(클로드 프로) [1] 프갤러(221.167) 07.28 63 0
2875863 설탕으로 획기적 탈모제 개발 발명도둑잡기(118.216) 07.28 26 0
2875855 RAG 씨발 완성해야한다 해야한다 하는데 감이 안잡힌다 그냥 ㅆㅇㅆ(124.216) 07.28 54 0
2875850 혹시 인도의 예언자가 말하는 사람이 저는 아니죠? 넥도리나(220.74) 07.28 28 0
뉴스 ‘슈퍼맨이 돌아왔다’ 심형탁, 아들 하루 목욕 스킬 대방출! 육아 선배 박수홍, “안정적으로 잘 한다” 폭풍 칭찬 디시트렌드 14:00
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2