프로그래밍 원리 (Principles of Programming) Part IV Prof. Kwangkeun Yi 차례 1 안전하게프로그래밍하기 : 손수 vs 자동 2 맞는지확인하기쉽게프로그램하기 3 대형프로그래밍을위한기술 : 모듈프로그래밍
다음 1 안전하게프로그래밍하기 : 손수 vs 자동 2 맞는지확인하기쉽게프로그램하기 3 대형프로그래밍을위한기술 : 모듈프로그래밍 안전한프로그래밍 예상하는데이터 / 값이흘러다니는지를검사하는코드를항상넣는다. 넣는장소는함수정의내에 : 제대로된인자가전달되는지확인. 타입체크 (type check): 함수정의할때, 함수타입에맞는데이터를받는지확인하는코드를넣는다. 조건체크 (requirement check): 함수정의할때, 함수타입에맞는데이터중에서원하는경우의데이터인지를확인하는코드를넣는다.
안전한프로그래밍예 타입체크 (type check) 조건체크 (requirement check) (define (nth-child tree n) (cond ((not (is-tree? tree)) (error)) ((not (is-int? n)) (error)) ((is-leaf? tree) (error)) (( n 0) (error)) (else...) ; programming in a safe area ) ) (define (is-tree? tree) (and (pair? tree) (or (equal (car x) leaf-tag) (and (equal (car x) node-tag) (fold and (map is-tree? (cdr tree)) true) )))) (define is-int? integer?) 안전한프로그래밍의단점 타입체크코드 조건체크코드를꼭장착시켜야하는가? 분명히필요없는경우가있긴한데. 그럴땐필요없겠죠... 그런데붕안하긴해요. 모르겠네요. 더좋은방법없을까요? 내프로그램의실행속도가문제될것같아요. 함수호출하면매번타입체크를하는데시간이소모되잖아요. 문제될때곧바로중단시켜야문제를그때그때파악하기쉽긴할텐데... 모르겠네요. 더좋은방법없을까요? 내프로그램은 KRX-II로켓의진동보정시스템에장착될겁니다. 실행중에멈추면안되는데, 실행중에문제되면결국멈출텐데... 모르겠네요. 더좋은 방법없을까요?
미리타입검사해주는프로그래밍환경 static type-checking system 함수의인자타입에맞는데이타 / 값들이항상흘러드는지미리자동으로확인 미리 : 실행전에프로그램텍스트만을보면서. 자동으로 : 프로그래머가하지않는다. 프로그래밍을수월하게 /sw개발생산성증대 이미널리퍼지고있는기술 ( 미래? 현재!) 미리타입검사해주는프로그래밍환경 이슈 : 안전하게확인 vs 불안전하게확인 안전하게자동확인해주는환경 대표예 : ML(OCaml) 프로그래밍실습을통해서경험 그밖의예 : Java, C#, F#, Scala, Haskell 불안전한환경 타입체크 ok, 그러나실행중에타입에러 예 : C, C++, Scheme, JavaScript, Phython 대책? 프로그래머의책임 안전한프로그래밍 (defensive programming) 준수
미리타입검사해주는프로그래밍환경 안전한 static type-checking system 덕택에 분명히필요없는경우가있긴한데. 그럴땐필요없겠죠... 그런데불안하긴해요. 모르겠네요. 더좋은방법없을까요? Static Type-Checking 내프로그램의실행속도가문제될것같아요. 프로시져실행중에매번타입체크를하는데시간이소모되잖아요. 문제될때곧바로중단시켜야문제를그때그때파악하기쉽긴할텐데... 모르겠네요. 더좋은방법없을까요? Static Type-Checking 내프로그램은 KRX-II로켓의진동보정시스템에장착될겁니다. 실행중에멈추면안되는데, 실행중에문제되면결국멈출텐데... 모르겠네요. 더좋은방법없을까요? Static Type-Checking (define (nth-child tree n) (cond ) ) ((is-leaf? tree) (error)) (( n 0) (error)) (else...) ; programming in a safe area
다음 1 안전하게프로그래밍하기 : 손수 vs 자동 2 맞는지확인하기쉽게프로그램하기 3 대형프로그래밍을위한기술 : 모듈프로그래밍 귀납적으로차근차근프로그래밍하 기 (inductive refinement) 예 ) 어울리지않아 프로그래밍 smatch : 스트링 코드 bool 코드 보조자료참고 c 0 1 9 c c c c c? c*
다음 1 안전하게프로그래밍하기 : 손수 vs 자동 2 맞는지확인하기쉽게프로그램하기 3 대형프로그래밍을위한기술 : 모듈프로그래밍 대형프로그래밍의상황 바깥에드러나는정의된이름들이점점많아진다 해결책? 보따리포장 : 수많은정의된이름들을그룹별로나누고 보따리이름 : 보따리마다이름을붙이자 어느보따리의무엇 으로호칭 이름의재사용 : 보따리소속만다르면같은이름도 괜찮다
모듈프로그래밍 대형프로그래밍을위한 모듈 = 정의들 + 보따리포장 + 보따리이름 module,.c file, structure, package 모듈타입 = 박스안에있는정의들의타입들 module type,.h file, signature, interface 일반화된모듈 = 모듈을인자로받는모듈 functor, parameterized module, class template, generic package 타입시스템의똑똑한도움 ( 대세 ) 모듈정의대로외부에서사용하는지미리검사해준다겉으로드러내기로한내용만사용하는지미리 검사해준다 모듈의정의
모듈타입의정의 모듈정의에서자동유추될수있기도하고 모듈타입을정의할수도있고 모듈타입의용도 signature matching ( 모듈타입과어울리기 ) 을통해서 어울린모듈은모듈타입에드러난내용만바깥에알려짐모듈이어느모듈타입과어울리려면그타입에드러난정의는최소한있어야 module Box:S = struct... end module Box = struct... end:s
모듈함수의정의 함수 : 값을받아서값을만드는함수 fun f(x,y) = x+y 모듈함수 : 모듈을받아서모듈을만드는함수 module F(X:S1, Y:S2) = struct... end 참고 : 인자로받는모듈의타입을자동유추할수 있을까? 아직불가능. 예 ) module F(X) = struct let f x = X.g x X.g 의타입? 알려면, 만들어지는모듈이어디에서어떻게 f를사용하는지알아야. 모듈프로그래밍
모듈프로그래밍 모듈프로그래밍
모듈프로그래밍 모듈프로그래밍