함수형 언어, 절차적 언어, 객체지향 언어 말고 또 뭐가 있나요? 람다는 무언가요?

oosap의 이미지

제가 좀 무식한 질문을 하고 싶어졌습니다. 바보같은 질문은 없다는 헤드퍼스트 시리즈의 격려를 믿으며...

아래 구인공고를 보고 품은 의문이예요.

http://kldp.org/node/128237
우대사항 : erlang 경험자, erlang이 아닌 다른 함수형 언어 경험자 (common lisp, haskell, scheme, ocaml, 기타 등등)

우대사항에 '함수형 언어 경험자' 라길래 그게 뭔가 찾아봤습니다.

http://kldp.org/node/53069
http://kldp.org/node/89641
http://kldp.org/node/113719
http://kldp.org/node/122514
http://kldp.org/node/18804

저는 함수형 언어라는 말을 거의 처음 들었거든요.
- 그게 어디 나오는 말인가요? '프로그래밍 언어론' 에서 가르치는 내용인가요?

제목에서 처럼,
- 함수형 언어, 절차적 언어, 객체지향 언어 말고 프로그래밍 언어중에 또 뭐가 있나요?
- 람다는 무언가요?

제가 정신을 못차리겠습니다. 도무지 제가 모르는 내용이 너무 많네요...

winner의 이미지

oosap님은 C++를 주로 했으니까 함수객체 혹은 함수포인터, 그리고 const를 적극적으로 쓴다고 말씀드리면 좋을 것 같네요.
약간 다르게 말해서 함수객체, 함수포인터와 같은 기법을 적극적으로 쓰는만큼 이것에 대한 언어 표기법이 매우 쉽게 되어 있습니다.
그리고 별도의 방식을 취하지 않는 이상 모든 객체는 const가 됩니다.

이에 따라 변수를 활용하는 반복문을 기본적으로 사용하지 않고 재귀를 통해 반복을 처리합니다.
모든 반복은 재귀로 표현할 수 있거든요. 그 반대는 아닙니다만...
이것이 함수형 언어에 대한 첫 진입장벽이 됩니다. 함수형 언어에 익숙하신 분들에게는 별 것 아니겠습니다만...
하지만 이 특징 때문에 입출력, 이벤트 중심의 서버, GUI에도 함수형 언어가 적절한 것인가에 대한 논쟁은 끊이질 않습니다.
반면 이런 특징이 program을 강건하게 한다고 보여 서버에 적절하다고도 보기도 합니다.
Erlang은 micro process 와 message passing 에 기반한 강력한 library(Open Telecom Platform)와 함께 매우 뛰어난 서버 프로그래밍용 언어로 부각되었었습니다.

마지막으로 meta programming 에 친화적(특히 Lisp)입니다.
C++ template metaprogramming에 대한 책을 읽어보면 함수형 언어와 유사하다라는 언급이 곧잘 등장합니다.

JavaScript는 함수객체를 적극적으로 활용하니까 JavaScript 공부하는게 좋은 시작이 될 것 같습니다.

함수형 언어가 수학적이라는 이야기는 함수형 언어의 함수는 전역 혹은 정적변수에 의해 다른 결과를 내지 않기 때문입니다.
기본적으로 객체들이 모두 상수(즉 const)이기 때문에 동일한 매개변수가 들어가면 동일한 결과가 나오게 됩니다.
수학의 함수가 원래 그렇잖아요.

익명 사용자의 이미지

"그 반대는 아닙니다만..."

누가 그러던가요?

oosap의 이미지

반론이 있으시면 반론의 근거를 밝히는게 좋아보입니다.
아무 근거 없이 '나는 반대요 당신 주장의 근거를 밝히시요' 보다는요.

자유 오픈소스 커뮤니티라면 말꺼낸 사람이 하는게 도리에 맞는 것 같습니다.
아무도 관심없던 사안에 관심을 모으려면 스스로 논의를 전개시키는 것이 맞지 않나 싶거든요.

여기는 게시판이지만 일종의 문서화 작업이라고 보거든요.
분산된 개인들의 지식을 모아놓고 문서화하는 생산적인 공간을 만들자 이게 이곳의 취지 아닌가요?
그런 의미에서 반론이 있으면 반론의 근거를 제공하신다면 일종의 공헌이 되지 않을까요?

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

익명 사용자의 이미지

너무 당연한 이야기라서 오히려 근거를 제시하는 것이 무색합니다.
recursion, iteration 으로 조금만 검색해봐도 수두룩하게 나오는 내용입니다.

winner의 이미지

삽질을 원하시나요?
재귀가 반복을 대등한 수준에서 표현할 수 있다는 것은 동의하시는 것 같고,
그렇다면 반대는 성립할 수 있느냐의 문제인데...

책 찾아보고, 실험해본 결과 제가 내린 결론은 삽질이다라는 것입니다.

어떤 재귀도 동일 결과를 만들 수 있는 반복을 생성해내는 program을 만들어주신다면 제 결론을 취소하겠습니다.
하지만 어떤 반복문도 동일 결과를 만드는 재귀를 생성하는 program은 만들 수 있죠.
함수 이름만 도입한다면 말입니다.

semmal의 이미지

스택을 만들면 가능합니다.
이러면 결과적으로 함수 호출방식과 같아집니다.
물론 삽질입니다.

------------------------------
How many legs does a dog have?

익명 사용자의 이미지

"모든 반복은 재귀로 표현할 수 있거든요. 그 반대는 아닙니다만..."

"모든 반복은 재귀로 표현하기 쉬워도 그 반대가 항상 쉽지는 않습니다"

로 읽지 못한 제 잘못입니까, 아니면 애초에 오해의 소지가 있게 글을 쓰신 님 잘못입니까?

그리고 재귀 호출을 위해 스택을 관리하고 일정 조건이 만족될 때까지
특정 위치로 점프하는 코드를 생성하는 컴파일러는 무엇을 한다고 생각하시는지요?

winner의 이미지

^_^. 네, 그렇군요.
뭐랄까 사실 반복의 꼬리재귀 표현은 결국 최적화 결과는 같지만 표현은 다르잖아요.
재귀의 반복문 전환이라고 한다면 단지 재귀를 기계수준으로 푸는 것(즉 삽질) 말고, 다른 것이 있는지 의문이었습니다.

임창진의 이미지

링크의 글의 답변들과 소스코드의 주석을 보시면 재귀에 관한 내용인데 한번 살펴 보시죠 http://kldp.org/node/48237

익명 사용자의 이미지

네 함수형 언어는 프로그래밍 언어론에 나오는 얘기입니다.

위 댓글을 보니 C++ 개발자인듯한데...
C++에서 비슷한걸 찾아보자면 template meta programming이 함수형 방법입니다.

leafriend의 이미지

winner님 말씀처럼 함수형 언어의 함수는 수학 함수와 마찬가지로 결과 값이 입력 값에 의해서만 결정됩니다. (원론적인 수준에서 말입니다.)

또한 함수를 다른 함수의 인수로 사용할 수 있습니다. 즉 f(x, g)와 같이 호출하여 f() 함수 안에서 g() 함수를 이용해 x를 조작(f(x, g) = g(x)처럼)할 수 있습니다.

람다는 저도 개념을 잡아가는 중인데, 익명 함수로 생각하시면 됩니다. 위 예제(f(x, g))에서 g() 함수가 단 한 번만 쓰인다면 굳이 이름공간(namespace)을 낭비할 필요 없이 f(x, (y => y + 1))처럼 사용합니다. 여기서 g 대신 넘겨진 (y => y + 1)은 인수 y를 받아서 1을 더한 값을 되돌리는 함수지만 이름은 없습니다. 이 이름 없는 함수를 람다로 이해하시면 될 것 같습니다.

혹시 제가 잘못 설명한 부분이 있으면 다른 고수분께서 지적해 주시기 바랍니다. :)

terzeron의 이미지

본래 람다의 개념은 컴퓨터에서 함수를 처리하여 파라미터를 지지고 볶아서 결과를 만들거나 계산하는 방법을 의미했습니다.

오늘날의 람다는 곧 람다 함수를 의미하고, 이것은 바로 이름이 없는 함수, 그러므로 다른 함수의 파라미터로 사용될 수 있는 함수 정도로 생각하시면 됩니다.

leafriend의 이미지

그리고 프로그래밍 패러다임을 이야기할 때 보통 네 개의 주요 패러다임이 언급됩니다.

  • 명령형 (imperative)
  • 객체지향 (object-oriented)
  • 함수형 (functional)
  • 논리형 (logical)

이 네 패러다임은 서로 배타적인 게 아닙니다. JavaScript만 하더라도 명령형, 객체지향, 함수형 패러다임의 특성을 모두 갖추고 있죠. 이에 대한 내용은 위키백과를 참조하시면 도움이 될 겁니다. 한국어 항목도 있긴하지만 내용이 빈약하므로 영어 문서를 보시는 게 낫겠네요.

oosap의 이미지

그려봤습니다.

|-- 0_hard_wired
`-- 1_stored_programming
    |-- 0_binary_code
    |-- 1_asmbly
    |-- 2_imperative_programming
    |   |-- 0_procedural_programming
    |   |   |-- BASIC
    |   |   |-- C
    |   |   `-- FORTRAN
    |   `-- 1_object_oriented_programming
    |       |-- Java
    |       `-- SmallTalk
    `-- 3_declarative_programming
        |-- 0_functional_programming
        |   |-- erlang
        |   `-- haskel
        `-- 1_logic_programming

http://en.wikipedia.org/wiki/Programming_paradigm
http://en.wikipedia.org/wiki/Imperative_programming

알려주신 위키피디아를 참조했구요,
요컨대, 폰노이만 컴퓨터 이후로 기계어 --> 어셈블리 까지 발전을 했고 그 이후 랭귀지는 두가지 흐름으로 나뉜다고 보면 되는 것 같아요. Imperative programming, Declarative programming 이 그것이죠.
저는 Declarative Programming 을 전혀 모르고 살아왔었네요... 그쪽 동네에는 또 펑셔널 마을과 로직 마을이 있고...
이제 더는 없겠죠? ㅎㅎ

답글 감사합니다.

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

태훈의 이미지

최근 멀티 코어 CPU가 많아지면서 병렬 프로그래밍이 이슈화 되고 있기 때문입니다.

함수형 언어는 언어 패러다임 자체가 병렬 프로그래밍에 적합합니다. 왜냐하면 함수의 실행
이 외부에 영향을 끼치지 않는 특징 때문입니다. (side-effect가 없음.)

Just do it!

oosap의 이미지

side effect 가 없다고 하시니 컴파일러가 최적화할 때 사용한다는 중간표현인 SSA 가 떠오릅니다.

SSA 는 Static Single Assignment 라고 하고 변수에 값을 한번만 할당한다는 특징을 가지는 중간표현의 한 형태라고 하는데요....

둘(함수형 언어와 SSA) 간에 비슷한 점 혹은 관련성이 있는지 궁금합니다.

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

M.W.Park의 이미지

functional language의 이론적 배경은 lambda calculus입니다.
튜링(혹은 그의 영향을 많이 받은 폰노이만) 쪽의 패러다임이 절차적인 것이고,
매카시의 lisp을 위시한 lambda calculus를 배경으로 가지는 언어들이 함수형 언어인 것입니다.

관련 검색하면 아주 많이 나올겁니다.

또한 실제 programming language에서 말하는 lambda라는 용어 자체는 anonymous function을 가리키는 경우가 많습니다

아참 그리고,
Church 교수의 lambda calculus와 Turing의 Turing machine이 실질적으로는 동일하다는 연구도 많았던 것으로 기억합니다.

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

oosap의 이미지

아바타로 쓰신 그림이 람다 아닌가요? 그것이 말씀하신 그 람다인지...

http://ko.wikipedia.org/wiki/%CE%9B

위키피디아에서 설명한 람다는

Λ는 다음과 같이 사용된다.
- 입자물리학에서 람다 중입자
- 우주 상수
λ는 다음과 같이 사용된다.
- 물리학에서 파장*
- 방사선 반감기
- 선형대수학에서 고유값**
- 신경생물학에서 길이상수
- 람다 대수에서 함수 표현식***
- 리스프, 파이썬 등의 프로그래밍 언어에서, 함수를 정의할 때에 사용된다.***
- 게임 하프 라이프 시리즈의 로고이자 작중에 등장하는 반시민의 상징.

- 물리학에서 파장*
>> 제가 알고 있는 유일한 람다

- 선형대수학에서 고유값**
>> 대학때 배우면서 졸립게 만들던 그 람다 배우면서도 도무지 이해를 못한...

- 람다 대수에서 함수 표현식***
- 리스프, 파이썬 등의 프로그래밍 언어에서, 함수를 정의할 때에 사용된다.***
>> 바로 이것이 이 쓰레드에서으 람다군요!!

뭔가 중요한 키워드같습니다.

프로그래밍에서 수학이 중요하다고 하는데 아마도 펑셔널 프로그래밍을 하려면 수학(대수학)을 잘 해야 하겠어요.. (짐작)

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

winner의 이미지

수학을 잘해야 함수형 프로그래밍을 할 수 있는 것이 아니라 수학하시는 분들이 프로그래밍 잘할려면 함수형 언어를 쓰는게 좋습니다.
예전에 수학과 사람들과 작업을 한 적이 있었는데 그 분들이 알고리즘을 작성해준대로 C언어로 프로그래밍하는 것이었습니다.
반복문과 배열표기법을 중심으로 한 pseudo code 를 작성해 주었는데 off by one error 등 오류가 번번히 보이더군요.
차라리 그 사람들이 작성했던 Matlab source를 달라고 했었던 기억이 나네요.
실행결과예제를 같이 주셨는데 Matlab을 써서 만들어더라고요.

물론 수학하시는 분이 아니더라도 함수형 언어로 프로그래밍을 시작하는 것은 좋을 것 같습니다.
현실은 안 그렇지만요.
잘못된(?) 길을 들어서면 올바른 곳으로 넘어가기 힘들듯 명령형(Imperative)나 OOP 위주로 시작하신 분들은 함수형 언어 쓰기에 거부감을 느낄 가능성이 높습니다.
Imperative에서 OOP로 넘어가는 것보다 약간(?) 더 어렵습니다.

M.W.Park 님의 아바타는 Racket 로고입니다.
http://racket-lang.org/
유명한 Scheme 개발환경입니다.

M.W.Park의 이미지

아니요. 제 아바타는 PLT Scheme입니다....
라고 댓글을 달려다 혹시나 해서 PLT scheme 사이트에 가봤더니 대문에
"PLT Scheme is now Racket"이라고 걸려있네요. 그동안 너무 erlang에만 집중했던것같습니다. ㅋ

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

oosap의 이미지

튜링과 매카시에 대해 검색해보니 참 여러 이슈들과 관련되어있군요.
우선 매카시는 얼마전에 돌아가셔서 이곳에서도 추모의 글들이 올라온 것을 본 기억이 있습니다.
튜링상 수상자이시고 튜링상 수상자 중 한 분은 Go 언어를 새로이 창안한 켄톰슨 이죠. 구글코리아에서 권순선님의 주최로 컨퍼런스를 했었죠. 튜링에 대해서는 찾아보니 놀라운 이야기가 많네요. 그중 하나는 에니악이 최초의 컴퓨터가 아니라 영국의 콜로서스라는 이야기(튜링과 관련된 것인지는 모르겠지만요..), 그리고 튜링이 동성애자라서 말년에 화학적 거세형을 당하고 결국 독사과를 만들어 먹고 자살을 했다는 이야기네요....

그리고 튜링과 매카시의 공통점은 둘 다 인공지능을 연구했다는 것이고 인공지능에 관해서는 최근에 kldp 블로그의 연재가 있고 이곳 회원님들간의 격한 논쟁의 주제이기도 했죠. 매카시가 했던 말이라는데,

그는 1979년 한 글에서 "기계가 실제로 뭔가를 '알거나 생각'할 수 있는지 아닌지 엄밀히 단정하기는 어려운데,
 그 이유는 우리가 이를 정의하기가 힘들기 때문이다"라며 "우리가 인간의 사고구조를 이해하는 방식은 물고기가
 스스로 헤엄치는 방법을 이해하는 것보다 아주 조금 더 나을 뿐이다"고 썼다.

라는 군요. 그 논쟁에 끼여들어서 얘기하시는 것 같네요.

http://ko.wikipedia.org/wiki/%ED%8A%9C%EB%A7%81%EC%83%81

http://ko.wikipedia.org/wiki/%EC%A1%B4_%EB%A7%A4%EC%B9%B4%EC%8B%9C_(%EC%A0%84%EC%82%B0%ED%95%99%EC%9E%90)

http://windshoes.new21.org/person-turing.htm

http://www.zdnet.co.kr/news/news_view.asp?artice_id=20111025101903

http://k.daum.net/qna/view.html?qid=0FqpY

재밌습니다.

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

M.W.Park의 이미지

앨런 튜링에 관해서는 "너무 많이 알았던 사람"이라는 책을 추천합니다.

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

oosap의 이미지


http://blog.daum.net/melon310/15688454

애플의 사과와의 연관성이 있는지 궁금하게 만드는 블로그네요.

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

M.W.Park의 이미지

잡스는 전기에서 연관성을 부인했습니다.

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

oosap의 이미지

프로그래밍 언어론 3시간짜리 교양 특강을 듣는 기분이예요 ^^;
감사합니다.

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

oosap의 이미지

http://news.mk.co.kr/v3/view.php?sc=30000037&cm=IT%C2%B7%EA%B3%BC%ED%95%99%20%EC%A3%BC%EC%9A%94%EA%B8%B0%EC%82%AC&year=2012&no=379168&relatedcode=&category=

애니악보다 더 먼저 사용된 실질적 최초의 컴퓨터라고 불리는 콜로서스는 영국군의 암호해독 머신이었네요.
그리고 튜링이 만든게 맞군요. 2차 대전이 연합군의 승리로 끝났기 때문에 대한민국도 있는 것일테죠..

구글 첫 페이지 로고에 링크가 있었습니다. 아마 구글 로고에서 보여주는게 콜로서스인 것 같습니다.

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

cleansugar의 이미지

콜로서스 돌리는 부대 여직원들이 무척 많았는데 이 사람들을 컴퓨터라고 부르다가 컴퓨터란 말이 생겼다고 책에서 본 것 같습니다.

여기 책임자가 튜링이고요.

튜링이 죽은 것도 이렇게 정부와 얽혔다가 어긋나서겠죠.

똑똑한 사람들이 총든 공무원의 질투를 사서 요절하는 경우가 많아요.

공무원과 얽히는 순간부터 잘 되든 잘못 되든 예상 수명은 줄어듭니다.

재벌 2세가 재벌이 될 확률과
금메달리스트 2세가 금메달을 딸 확률이 비슷해지도록
자유오픈소스 대안화폐를 씁시다.

아이디의 아이디어 무한도전
http://blog.aaidee.com

귀태닷컴
http://www.gwitae.com