오늘도 MySql에 속썩여서 바뻣다. 이 족같은 디비는 JDBC 드라이버도 아주 족같아서 UTC 시간을 저장하고 가져오려 해도 병신같이 UTC를 로컬타임으로 저장하거나 가져옴. 하여간 병신들이 지랄하고 만든 거는 안쓰는게 상책인데 돈벌이 때문에 어쩔 수 없이 씀. 아뭏든 결국 최소의 노력으로 생각한대로 돌아가게 만들어 놓긴 함.
각설하고
함수형이라는 것은 흔히 말하는 대입을 안하고 프로그래밍 하는 거다. 이걸 언어에서 전폭적으로 지원해 주면 그걸 함수형 언어라고 불러
이건 걍 아무나 씨부리는 수준의 정의야
객체지향이란 뭐냐하면 니가 시스템에 다양한 객체들을 만들고 그 각각의 상태를 바꿔가면서 객체들의 총합으로 구성된 세계를 변경해 나가는 프로그래밍이야.
근데 니가 멀티 쓰레드를 추가하고 객체지향을 하게 되면 때때로 매트릭스에 나오는 거처럼 세계를 잠깐씩 멈춰서 동기화 시켜야 함
이게 말처럼 쉬운게 아니야. 해서 니가 왠만한 복잡한 현대적인 시스템을 객체지향으로 만들다 보면 어느 순간부터 세계를 점점 길게 멈추고 정확히 동기화 하려고 머가리 뽀개지는 일들을 해야 됨.
이런 일이 왜 생기냐? 왜냐하면 상태를 대입으로 바꿔가면서 하기 때문에 어떤 함수를 콜 했을 때 그 리턴 값이 수시로 달러질 수 있기 때문이야. 함수형 언어는 그 리턴 값이 항상 동일함. 왜냐하면 상태를 대입으로 바꾸지 않기 때문에
함수형 언어로 시스템을 만들면 세계를 멈추는 일이 없어지거나 최소화 됨. 그래서 대입이 없으면 버그가 줄어든다는 얘기임
그런데 대입이 없으면 사실 효율이 떨어질 수가 있으므로 특수한 방법으로 특별한 경우에 대해서 대입이 되게 하는게 보통이야. 하지만 함수형 언어를 제대로 사용하다 보면 99% 대입을 안쓰고 1% 정도에서 대입을 쓴다.
Lazy eval 얘기가 나오던데, 이건 메모리 효율을 높이기 위해 실행 속도를 희생하는 테크닉이야. 어떤 스칼라 코드를 봤더니 그 씨방 새끼가 개념없이 Lazy를 무조건 non-lazy로 바꿔 버리고 대입을 밥먹듯이 하더라고... 완전 C++나 Java 보다도 더 스파케티 ㅋㅋㅋ... 니가 딱 봐서 언제 Lazy를 쓸지 안쓸지 알아야 되는 거야.
그러면 함수형 언어는 뭐가 있냐? 요즘 밥법이 되는 거로만 얘기 하자면 Haskell, Scala, Clojure, OCalm, Erlang 대략 이정도가 운좋으면 밥벌이가 가능함.
이중 Scala와 Clojure 가 JVM 위에 올라가고, Haskell, Scala, OCalm 이 부류는 스태틱 타이핑, Clojure와 Erlang은 다이나믹 타이핑 이런거야.
이제부터 내가 경험해 본 봐를 알려줄꼐. 니들이 함수형 언어를 택할 때 중요한 고려점들이야.
* 하스켈과 스칼라 계열은 멀리해라 - 모나드 부심 있는 생키들 치고 프로그래밍 제대로 해논 생키 한번도 못봄. 하스켈 게이들이 현실에서 밥벌이 안되니까 JVM 언어이고 제일 유사한 스칼라를 택하거든. 스칼라 언어 프로젝트, 시발 메인 개발자 중 한 새끼가 개 줙같이 만들어 졌다고 GG 치고 튀는 그런 언어임. 에러 메시지 아주 줙같음. 니가 에러 메시지를 보고 문제를 해결할 가능성 0에 수렴한다고 보면 된다. 경험상 에러 처리 제대로 못하는 새끼들이 만들어 논건 절대 쓰지 말아야 됨. 대부분 학교 식당 밥만 먹던 생키들이라 현실에서 제대로 맞는 프로그래밍에 대해 조또 모름
* 스태틱 타이핑 vs 다이나믹 타이핑 - 니가 뭘하는 지 잘 모르고 타입 에러 잘 내고 시간이 널널하면 스태틱 타이핑 함수형 언어를 골라라. 조낸 컴파일되고 끝나는 거임.
니가 뭐하는지 니 능력을 스스로 잘 알고 언제 타입을 써야 될지 알면 다이나믹 타이핑 함수형 언어를 택해라. 자유를 얻게 됨. 예를들어 프로덕션에 버그가 있다 치자. 거기 접속해서 핫픽스 - 새로 함수 정의 해주면 버그 픽스 되는 그런게 다이나믹 타이핑 함수형 언어 시스템이야. 알고리듬은 내비두고 데이터 타입만 바꾸겠다, 이런거 쉽게 됨. 왜냐하면 타입 체킹을 런타임에 하거덩. 타입에러가 있으면 런타임 에러 되는거임.
쉽게 말해서 컴파일러에게 타입 힌트를 많이 주면 줄수록 런타임 타입 에러는 줄어들겠지만, 프로그래머 생산성은 떨어지는 거임. 둘 사이 젖절한 점을 찾는 게 좋다 (다이나믹 타이핑 함수형 언어 중 원하면 타입 힌트를 많이 줄 수 있는 거도 있음. 물론 난 꼭 필요할 때만 타입 힌트를 붙임)
* 밥벌이가 중요하면 JVM 계열에서 골라라 - JVM이거 예전엔 별거 아니었는데 이제는 아주 물건임. 니가 자바 프로그래머이고 실력 좀 있으면 JVM 계열 함수형 언어로 살며시 프로젝트를 전환할 수 있는 경우가 있다 - JVM 언어 아닌거로 하자 하면 워낙 반발이 새니까
* 개중에 OOP 가 되는 함수형 언어가 있다. 이 부류 잘못 건드리면 함수도 OOP도 아닌 희안한 프로그래밍이 됨. 조팝들은 촉수금지
한줄요약: 니들은 배우고 싶으면 Clojure, Erlang, OCalm, Haskell, Scala 이 순서대로 공부해라. 보통 Clojure 까지만 하면 딴거 안해도 무궁무진 흥미진진 함.
아참, 그리고 변수 당근 있지. 다만 변수에 연산을 가하면 그 결과값은 달라짐. 그래서 보통은 1회용 변수(?) 뭐 이런거고.. 전역변수는 나는 이제껏 한 다섯번 썼나? 근데 이게 아주 특수한 경우에만 쓰는 거라 대개 안씀
lazy eval 얘기가 나오는 이유는 lazy eval 이 디폴트일 경우 call by need 때문에 절차대로 처리해야 하는 사이드 이펙트나 I/O 처리가 힘듬. 그래서 대부분 함수형 언어에서 lazy 디폴트 -> purity 공식이 성립함. strict 언어는 대부분 허용하고. purity 는 그냥 함수형 언어에 있는 하나의 속성일뿐. 모나드는 뭐 부심부릴거 있나? preordered set 에 몇가지 규칙 만족하는 closure operation 일뿐이라, 그냥 어떤 언어에서도 정의해서 사용가능한 개념인거고. 그흔한 list comprehension 도 따져보면 모나드고.
ㄴ 이런게 모나드 부심이지 ㅋㅋㅋ 보나마나 하스켈 빠겠지
하스켈빠는 모나드가 아니라 type class 빨겠지. 뭣도모르는 애들이 하스켈=모나드 타령.
ㄴ 어이쿠 그렇게 잘 아시면 새로 한번 썰좀 풀어주세요
보나마나 조빱 쌩키 GG 치겠지
ㅇㅇ gg 침. 나도 배울게 있어야 시간을 들여서 키배를 뜨지.
ㄴ 풉 별 시답지 않은 조팝이 끝까지 아는 채 하고 멍석 깔아줘도 주댕이만 놀리네. 부랄 뗴서 개나줘
나도 배울게 많다면 열렬히 키배를 뜨게씾만 본문보니까 사이즈가 나와서 너랑은 키배떠도 별 득이 없다고 판단되서리. 미안해.
ㄴ 얌마 형이 왜 너같은 조팝이랑 키배를 떠? ㅋㅋㅋ 형은 평화주의자임. 니 얘기를 쓰라니까? 난 니가 좆또 몰라도 거기에 댓글 안달거임. 왜? 모르고 잘못된 길로 계속 가다가 함 크게 좆되보라고 ㅋㅋㅋㅋ
여기 달지말고 니가 아는 함수형 언어 니 경험에 대해 싸질러 봐라. 1시간 내로 못하면 개 좆밥 인증 ㅋㅋㅋ
음..뭐 너정도가 개좆밥으로 인정한다고 해서 뭐가 달라질지 모르겠지만, 솔까 본문에 나오는 함수형 언어에 대한 인식은 요기조기 웹서핑하면서 줏어들은거 모음집이랑 별차이가 없잖아. 교재가 있다면 보통 introduction 에 나올만한 모나드도 잘 모르는거같은데 그럼 topos 나 heyting semilattice 같은거 얘기하면 뭔지 알아먹음? 뭘 배우긴 커녕 시간만 낭비지. 너한테나 나한테나.
ㄴ 별 뵹신 새끼 다보겠네 ㅋㅋㅋ 야이 씨방새가 여기는 디시거든요? 학교에서 배우시고 여기선 디시질 하는 겁니다. 개 족같은 시방새가 주댕이만 살아서 .ㅋㅋㅋㅋ 야이 씹새야 디시에서 배우느라 고생해라 난 고만 퇴갤한다.
뭐 디시건 어디건 시간/정력낭비하는 키배는 하지말자는 주의라서리. ㅎㅎ 미안하고 나도 퇴갤.
d 이새키 아갈털다 튀네 븅신샠키 ㅋㅋㅋㅋ
그래도 scala나 클로져 정도가 제일 밥먹을만한듯. scala은근히 많이 씀 ㅋㅋㅋ
ㄴ 니가 아직 스칼라 타입 헬을 못격어봣구나. 한번 격어보면 제정신이면 두번다시 안쳐다 보는게 스칼라
아하