펄, 파이선, 루비 등의 스크립트 언어 중에 하나 정도는 알아 두는게 편할 것 같다는 생각에 이번 달에는 루비를 공부하고 있다. 책의 절반을 쭉 읽어 나가면서 코드는 한번도 작성한 적이 없었지만 언어가 간결해서 그런지 몰라도 쉽게 원하는 코드를 작성할 수 있었다.
지금 진행하고 있는 프로젝트는 코볼 컴파일러의 개발인데, 컴파일러가 생성한 코드가 정확한가를 확인하는 가장 쉬운 방법은 기존의 컴파일러가 생성한 코드와 수행 결과(stdout)을 비교하는 것.
지금까지는 급한 마음에 두 실행파일을 번갈아 실행하며 눈으로 수행결과를 비교했는데, "실용주의 프로그래머"를 보면 테스트를 포함한 프로젝트 빌드의 전과정을 자동으로 수행할 수 있도록 할 것을 강조하고 있다.
그리하여 고즈넉한 저녁에 잠깐의 짬과 약간의 용기를 내어 처음으로 루비를 사용해 간단한 test harness를 작성해 보았다.
컴파일러가 생성한 코드의 수행시간 역시 컴파일러를 평가하는데 중요한 이슈이므로, 두가지 컴파일러가 생성한 코드의 수행시간을 자동으로 비교해 주는 프로그램을 루비로 간단히 작성하는 것도 큰 의미가 있을 것 같다. 사용하기 쉬운 루비 언어를 조금 더 연습해서 프로젝트의 여기저기에 잘 활용한다면 생산성을 향상 시킬 수 있을 것이다.
지금 진행하고 있는 프로젝트는 코볼 컴파일러의 개발인데, 컴파일러가 생성한 코드가 정확한가를 확인하는 가장 쉬운 방법은 기존의 컴파일러가 생성한 코드와 수행 결과(stdout)을 비교하는 것.
지금까지는 급한 마음에 두 실행파일을 번갈아 실행하며 눈으로 수행결과를 비교했는데, "실용주의 프로그래머"를 보면 테스트를 포함한 프로젝트 빌드의 전과정을 자동으로 수행할 수 있도록 할 것을 강조하고 있다.
그리하여 고즈넉한 저녁에 잠깐의 짬과 약간의 용기를 내어 처음으로 루비를 사용해 간단한 test harness를 작성해 보았다.
name_list = [
'intrinsic_math_func',
'intrinsic_char_func',
'intrinsic_case_func',
'intrinsic_value_func',
'intrinsic_divide_func',
'intrinsic_numval',
'intrinsic_annuity'
]
test_cnt = 0
succ_cnt = 0
fail_cnt = 0
# TODO
# compare execution time
name_list.each do |name|
test_cnt += 1
mf_exec = "./" + name + ".cob32"
tmax_exec = "./" + name + ".gcobol"
mf_stdout = `#{mf_exec}`
tmax_stdout = `#{tmax_exec}`
print "[#{test_cnt}] #{mf_exec} vs #{tmax_exec}"
if (mf_stdout == tmax_stdout)
puts " ...success"
succ_cnt += 1
else
puts " ...fail"
fail_cnt += 1
puts "[#{mf_exec}]"
puts mf_stdout
puts "[#{tmax_exec}]"
puts tmax_stdout
end
puts
end
puts
puts "Total : #{test_cnt}"
puts "Success : #{succ_cnt}"
puts "Fail : #{fail_cnt}"
puts
'intrinsic_math_func',
'intrinsic_char_func',
'intrinsic_case_func',
'intrinsic_value_func',
'intrinsic_divide_func',
'intrinsic_numval',
'intrinsic_annuity'
]
test_cnt = 0
succ_cnt = 0
fail_cnt = 0
# TODO
# compare execution time
name_list.each do |name|
test_cnt += 1
mf_exec = "./" + name + ".cob32"
tmax_exec = "./" + name + ".gcobol"
mf_stdout = `#{mf_exec}`
tmax_stdout = `#{tmax_exec}`
print "[#{test_cnt}] #{mf_exec} vs #{tmax_exec}"
if (mf_stdout == tmax_stdout)
puts " ...success"
succ_cnt += 1
else
puts " ...fail"
fail_cnt += 1
puts "[#{mf_exec}]"
puts mf_stdout
puts "[#{tmax_exec}]"
puts tmax_stdout
end
puts
end
puts
puts "Total : #{test_cnt}"
puts "Success : #{succ_cnt}"
puts "Fail : #{fail_cnt}"
puts
컴파일러가 생성한 코드의 수행시간 역시 컴파일러를 평가하는데 중요한 이슈이므로, 두가지 컴파일러가 생성한 코드의 수행시간을 자동으로 비교해 주는 프로그램을 루비로 간단히 작성하는 것도 큰 의미가 있을 것 같다. 사용하기 쉬운 루비 언어를 조금 더 연습해서 프로젝트의 여기저기에 잘 활용한다면 생산성을 향상 시킬 수 있을 것이다.