디시인사이드 갤러리

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

갤러리 본문 영역

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

나르시갤로그로 이동합니다. 2025.07.19 10:27:07
조회 81 추천 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/08/04 - -
AD 가전디지털, 휴대폰 액세서리 SALE 운영자 25/08/08 - -
2879345 단점을 줄이고 장점을 늘린다. 별로 좋아하지 않는 말임. 프갤러(218.154) 08.08 34 0
2879344 민생지원금12만원남았는디 2차지급까지 버텨야지 현무E공인(211.234) 08.08 38 0
2879343 재테크강좌 Show me the money-> the liberty 발명도둑잡기갤로그로 이동합니다. 08.08 23 0
2879342 [대한민국][충격] 미 국무부 고위 직원, 미 주한 대사관 근무자 프갤러(121.172) 08.08 23 0
2879340 구글 수수료 정책 진짜 개좆같네 ㄹㅇ [1] 뉴진파갤로그로 이동합니다. 08.08 40 0
2879339 전세계 냥덩이들이여 일제히 봉기하라❤+ ♥냥덩이♥갤로그로 이동합니다. 08.08 28 0
2879338 장난쳤다가 일 존나 커짐 ㅋㅋㅋㅋㅋㅋ ㅇㅇ(211.234) 08.08 50 3
2879335 4 + 1 컴퓨존 주문했습니다. 입금도 했습니다. 점심시간에 죄송합니다 도리스아(220.74) 08.08 48 0
2879334 스톨만의 프로그래밍 언어 호불호 언급 발명도둑잡기갤로그로 이동합니다. 08.08 37 0
2879333 안철수도 러스트 프로그래밍한다고함 ㅋ 뒷통수한방(1.213) 08.08 62 0
2879332 한미일영 코메디의 가장 큰 문제는 아무리 적나라하게 웃기고 풍자를 해도 발명도둑잡기갤로그로 이동합니다. 08.08 28 0
2879331 앱개발 하려는데 뭐 만들지 추천좀 [1] (118.235) 08.08 36 0
2879330 점점 러스트 못하면 도태되는 세상이 되어가는 중 ㄷㄷㄷㄷ [1] 프갤러(218.154) 08.08 78 0
2879328 아 회사컴 씨발 [2] 루도그담당(118.235) 08.08 68 1
2879327 자바쓰는이유는 딱 1가지 밖에없지 [4] 프갤러(121.174) 08.08 121 1
2879326 삭제했는데, 프리랜서라서 좆같다... [4] ㅆㅇㅆ(124.216) 08.08 78 0
2879325 Ada 프로그래밍 연재를 하니까 러스토커가 ㅁㅌ 나르시갤로그로 이동합니다. 08.08 26 0
2879323 봤을테니 삭제해둠. 대부분 내 코드지만 내 코드가 아니라서 [2] ㅆㅇㅆ(124.216) 08.08 73 0
2879322 ❤+❤+❤+ [2] 어린이노무현갤로그로 이동합니다. 08.08 49 0
2879320 흠.. 확실히 꿀잠잔날은 뭔가 땡기는게 없군 ♥냥덩이♥갤로그로 이동합니다. 08.08 28 0
2879318 김성태 "전한길·전광훈·신천지·통일교 모인 당 돼 버려…위헌정당 빌미" 발명도둑잡기갤로그로 이동합니다. 08.08 38 0
2879317 갑질좌파 강선우와 좌청래의 관계 ♥냥덩이♥갤로그로 이동합니다. 08.08 25 0
2879316 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 08.08 26 0
2879315 꿀잠잔 나님의 두뇌는 지구생명체 1황이당 By 나님 [1] ♥냥덩이♥갤로그로 이동합니다. 08.08 36 0
2879314 근데 좀 궁금한게 분명히 GPT도 깃 최상급 프로그래머들 코드 다넣었을 [7] ㅆㅇㅆ(124.216) 08.08 102 0
2879312 모바일기기는 무조건 가벼워야 ♥냥덩이♥갤로그로 이동합니다. 08.08 27 0
2879311 근데 진짜 깃 최상급 코드들 보면 경이롭지 않냐? 지피티한테 뽑아달라해도 [4] ㅆㅇㅆ(124.216) 08.08 96 0
2879309 예전에도 말했지만 자바 개발자 연봉은 기술보단 범죄행위에서 비롯됩니다. 프갤러(218.154) 08.08 80 0
2879308 요새 내 코드 스타일 변화는 명세 짜두고 제네릭으로 패턴 연결해둠 ㅆㅇㅆ(124.216) 08.08 53 0
2879307 코드는 일단 짜놓고 [2] 루도그담당(211.184) 08.08 58 0
2879306 12시쯤 나가볼까요... 도리스아(220.74) 08.08 37 0
2879304 지피티 5는 제미나이보다는 우위, OPUS 4.1보다는 낮은 그런 느낌듯 ㅆㅇㅆ(124.216) 08.08 53 0
2879303 연쇄살인 조직폭력 관련자 220.84가 오늘 꼭 해야 할 일 발명도둑잡기갤로그로 이동합니다. 08.08 64 0
2879302 컴퓨터네트워크 선수과목 있음? 프갤러(118.217) 08.08 40 0
2879301 기초생활수급자 인생. 근데 솔직히 절반만 주셔도 되는데, 데이터복구에 도리스아(220.74) 08.08 45 0
2879300 좌폐아는 4050 아니더라도 모자른 잉여들밖에 없넹 [1] ♥냥덩이♥갤로그로 이동합니다. 08.08 39 0
2879299 뭔 자뻑이여 인간 코드보다 못하다는건데 ㅆㅇㅆ(124.216) 08.08 32 0
2879298 빈부격차 심한 사회에서 적은 사회보다 인기 많은 노래 특징 발명도둑잡기갤로그로 이동합니다. 08.08 42 0
2879295 118.235 발명도둑잡기갤로그로 이동합니다. 08.08 31 0
2879294 지피티 류 코드의 문제점이 메모리를 한번에 올려 자꾸 ㅆㅇㅆ(124.216) 08.08 38 0
2879293 휴대용 레트로 콘솔 게임기 KNULLI 운영체제 부팅 스크린 발명도둑잡기갤로그로 이동합니다. 08.08 23 0
2879292 지피티 5 코드 전반적으로 맥락에 따른 코드 변화를 미묘하게 못잡아낸다. ㅆㅇㅆ(124.216) 08.08 40 0
2879291 왜 펌웨어랑 윈도우는 커서같은 툴이안나오는것임? 네오커헠(211.234) 08.08 49 0
2879290 지피티 5 써보는데 여전히 소스제네레이터보다 리플랙션쓰네 [1] ㅆㅇㅆ(124.216) 08.08 48 0
2879289 지피티 5로 코드 뱉어봤는데 여전히 좀 아쉽 ㅆㅇㅆ(124.216) 08.08 43 0
2879288 용산을 일주일에 1번은 기본으로 가네요. 도리스아(220.74) 08.08 47 0
2879287 왜 윾과장은 메시지를 쳐안읽는 걸까요? [1] 아스카영원히사랑해갤로그로 이동합니다. 08.08 43 0
2879285 자바는 뭔가 일하고있다는 표시를 내는 언어임 [2] ㅇㅇ갤로그로 이동합니다. 08.08 65 0
2879284 프로그래밍 언어의 가치 평가에 대한 특정 관점에 대한 반박 나르시갤로그로 이동합니다. 08.08 78 0
2879283 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 08.08 24 0
뉴스 코미디언 문세윤, 방송 최초 유산 아픔 공개...“집안이 휘청일 정도로 힘들었다” 디시트렌드 08.09
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2