Wikipedia는 Ruby가 기능적인 언어라고 말하지만 확신하지 못합니다. 그 이유는 무엇?
Wikipedia는 Ruby가 기능적인 언어라고 말하지만 확신하지 못합니다. 그 이유는 무엇?
답변:
루비에서 기능적인 스타일을 사용할 수 있다고 생각합니다.
기능적 스타일로 프로그래밍 할 수있는 가장 중요한 측면 중 하나는 언어가 더 높은 수준의 함수를 지원하는지 여부입니다.
즉, 비 기능적 스타일로 루비로 프로그래밍하는 것도 쉽습니다. 함수 스타일의 또 다른 주요 측면은 상태가없고 주어진 입력 세트에 대해 항상 동일한 값을 반환하는 실제 수학 함수를 갖는 것입니다. 이것은 Ruby에서 수행 될 수 있지만 Haskell과 같이 더 엄격하게 기능하는 것과 같은 언어에서는 시행되지 않습니다.
예, 기능적 스타일을 지원하지만 비 기능적 스타일로 프로그래밍 할 수도 있습니다.
Is ruby a functional language?
고 말하고 싶고 솔직한 대답은 단순한 아니오입니다. Ruby는 몇 가지 기능적 특징을 가진 객체 지향 언어입니다.
언어가 기능적 언어인지 아닌지 여부는 중요하지 않습니다. 함수형 프로그래밍은 Philip Wadler (함수 프로그래밍의 본질)와 John Hughes (함수 프로그래밍이 중요한 이유)가 가장 잘 설명한 논문입니다.
의미있는 질문은 '루비가 함수형 프로그래밍의 주제를 달성하는 데 얼마나 도움이 되는가?'입니다. 대답은 '매우 나쁨'입니다.
최근에 이것에 대해 이야기를했습니다. 다음은 슬라이드입니다.
Ruby는 더 높은 수준의 함수를 지원하지만 (Array # map, inject, & select 참조) 여전히 명령형 객체 지향 언어입니다.
기능적 언어의 주요 특징 중 하나는 변경 가능한 상태를 피한다는 것입니다. 함수형 언어에는 Ruby, C, Java 또는 기타 명령형 언어에서와 같이 변수 개념이 없습니다.
기능적 언어의 또 다른 주요 특징은 "어떻게"가 아닌 "무엇"의 관점에서 프로그램을 정의하는 데 초점을 맞추는 것입니다. OO 언어로 프로그래밍 할 때 "what"(클래스 / 메서드 이름)에서 구현 ( "어떻게")을 숨기는 클래스 및 메서드를 작성하지만 결국 이러한 메서드는 일련의 명령문을 사용하여 작성됩니다. 기능적 언어에서는 최하위 수준에서도 실행 순서를 지정하지 않습니다.
나는 지원하거나 기능적인 스타일 의 언어로 프로그래밍 할 수있는 능력 이 기능적 언어를 만드는 것이 아니라고 제출합니다.
난 내 동료들에게 상처를하려는 경우 기능적인 스타일로 자바 코드를 작성하고, 자신을 몇 수 개월 에 주.
기능적 언어를 갖는 것은 고차 함수, 일류 함수 및 커링과 같이 할 수 있는 일 뿐만이 아닙니다 . 또한 순수 함수의 부작용과 같이 할 수없는 일 에 관한 것 입니다.
이것은 기능 프로그램이있는 이유 또는 generel의 기능 코드가 추론하기 쉬운 이유의 큰 부분이기 때문에 중요합니다. 그리고 코드를 추론하기가 더 쉬우면 버그가 더 얕아지고 수정 될 수있는 개념적 표면으로 이동하여 버그가 적은 코드를 제공합니다.
루비의 핵심은 객체 지향적이므로 기능적 스타일을 상당히 잘 지원하지만 그 자체가 기능적 언어는 아닙니다.
어쨌든 그것은 나의 비과학적인 의견입니다.
편집하다: 회고하여 지금 까지이 답변에 대해받은 훌륭한 의견을 고려하여 객체 지향 대 기능 비교는 사과와 오렌지 중 하나라고 생각합니다.
진정한 차별화 요소는 실행에있어서 명령 적 이냐 아니냐입니다. 기능적 언어는 표현을 기본 언어 구조로 가지고 있으며 실행 순서는 종종 정의되지 않거나 게으른 것으로 정의됩니다. 엄격한 실행이 가능하지만 필요한 경우에만 사용됩니다. 명령형 언어에서는 엄격한 실행이 기본값이며 지연 실행이 가능하지만 종종 수행하기 어렵고 많은 경우에 예측할 수없는 결과가 발생할 수 있습니다.
자, 그것은 나의 비과학적인 의견입니다.
Ruby가 "진정하게"작동하려면 다음 요구 사항을 충족해야합니다.
불변 값 : "변수"가 설정되면 변경할 수 없습니다. Ruby에서는 변수를 상수처럼 효과적으로 처리해야합니다. 는 언어에서 완전히 지원되지 않으므로 각 변수를 수동으로 고정해야합니다.
부작용 없음 : 주어진 값이 전달되면 함수는 항상 동일한 결과를 반환해야합니다. 이것은 불변의 값을 갖는 것과 밀접한 관련이 있습니다. 함수는 값을 취하여 변경할 수 없습니다. 결과를 반환하는 데 접선적인 부작용이 발생하기 때문입니다.
고차 함수 : 함수를 인수로 허용하거나 함수를 반환 값으로 사용하는 함수입니다. 이것은 틀림없이 모든 기능 언어의 가장 중요한 기능 중 하나입니다.
Currying : 고차 함수에 의해 활성화되는 currying은 여러 인수를받는 함수를 하나의 인수를받는 함수로 변환합니다. 이것은 부분 함수 응용 프로그램과 함께 진행되며 다중 인수 함수를 원래보다 적은 인수를 사용하는 함수로 변환합니다.
재귀 : 자체 내에서 함수를 호출하여 반복합니다. 변경 가능한 데이터에 액세스 할 수없는 경우 재귀를 사용하여 데이터 구성을 구축하고 연결합니다. 이는 주어진 시간에 루프의 상태를 저장하기 위해 변수를 전달해야하므로 루핑은 기능적 개념이 아니기 때문입니다.
지연 평가 또는 지연 평가 : 실제로 필요한 순간까지 값 처리를 지연합니다. 예를 들어 지연 평가가 활성화 된 피보나치 수 목록을 생성하는 코드가있는 경우 결과의 값 중 하나가 puts와 같은 다른 함수에 필요할 때까지 실제로 처리 및 계산되지 않습니다.
제안 (그냥 생각)mode
기능적 패러다임으로 파일을 선언
하는 지시문을 갖는 일종의 정의가 있으면 좋을 것입니다.
모드 '기능'
"기능적 언어"의 정의에 따라 다릅니다. 개인적으로 절대적인 용어로 사용될 때 그 용어 자체가 상당히 문제가 있다고 생각합니다. 단순한 언어 기능보다 "기능적 언어"가되는 데 더 많은 측면이 있으며 대부분은 사용자가 찾고있는 위치에 따라 다릅니다. 예를 들어, 언어를 둘러싼 문화는 이와 관련하여 매우 중요합니다. 기능적인 스타일을 장려합니까? 사용 가능한 라이브러리는 어떻습니까? 기능적으로 사용하도록 권장합니까?
예를 들어 대부분의 사람들은 Scheme을 기능적 언어라고 부릅니다. 하지만 Common Lisp는 어떻습니까? 다중 / 단일 네임 스페이스 문제와 보장 된 꼬리 호출 제거 (컴파일러 설정에 따라 일부 CL 구현도 지원)를 제외하고는 Scheme을 Common보다 기능적 프로그래밍에 더 적합한 언어로 만드는 것은 많지 않습니다. Lisp, 그리고 여전히 대부분의 Lispers는 CL을 기능적 언어라고 부르지 않습니다. 왜? 이를 둘러싼 문화는 CL의 명령 적 기능에 크게 의존하기 때문입니다 (예를 들어 대부분의 Schemer가 눈살을 찌푸리는 LOOP 매크로 등).
반면에 C 프로그래머는 CL을 기능적 언어로 간주 할 수 있습니다. Lisp 방언으로 작성된 대부분의 코드는 결국 일반적인 C 코드 블록보다 스타일면에서 훨씬 더 기능적입니다. 마찬가지로 Scheme은 Haskell과 비교할 때 매우 필수적인 언어입니다. 그러므로 나는 확실한 예 / 아니오 대답이있을 수 없다고 생각합니다. 언어를 기능적으로 호출할지 여부는 관점에 따라 다릅니다.
루비는 실제로 다중 패러다임 언어가 아니라고 생각합니다. 다중 패러다임은 자신이 좋아하는 언어를 여러 분야에서 유용한 것으로 분류하려는 사람들이 사용하는 경향이 있습니다.
Ruby가 객체 지향 스크립팅 언어라고 설명하겠습니다. 예, 함수는 일류 객체 (일종)이지만 실제로 함수형 언어가되는 것은 아닙니다. IMO, 추가 할 수 있습니다.
재귀는 함수형 프로그래밍에서 일반적입니다. 거의 모든 언어가 재귀를 지원하지만 TCO ( 꼬리 호출 최적화) 가없는 경우 재귀 알고리즘은 종종 비효율적 입니다.
함수형 프로그래밍 언어는 꼬리 재귀를 최적화 할 수 있으며 일정한 공간에서 이러한 코드를 실행할 수 있습니다. 일부 Ruby 구현은 꼬리 재귀를 최적화하고 다른 구현은 최적화하지 않지만 일반적으로 Ruby 구현은 TCO를 수행 할 필요가 없습니다. Ruby가 Tail Call 최적화를 수행합니까?를 참조하십시오 .
따라서 일부 Ruby 기능 스타일을 작성하고 특정 구현의 TCO에 의존하면 다른 Ruby 인터프리터에서 코드가 매우 비효율적 일 수 있습니다. 이것이 Ruby가 기능적 언어가 아닌 이유라고 생각합니다 (Python도 아닙니다).
엄밀히 말해서, 언어를 "기능적"이라고 설명하는 것은 이치에 맞지 않습니다. 대부분의 언어는 함수형 프로그래밍이 가능합니다. C ++도 있습니다.
기능적 스타일은 구문 적 설탕과 불변성 및 꼬리 재귀 평면화와 같은 일부 컴파일러 최적화로 지원되는 명령형 언어 기능의 하위 집합입니다.
후자는 분명 사소한 구현 특정 기술이며 실제 언어와 관련이 없습니다. x64 C # 4.0 컴파일러는 꼬리 재귀 최적화를 수행하는 반면 x86 컴파일러는 어리석은 이유로하지 않습니다.
특히 언어에 프로그래밍 가능한 사전 컴파일러 (예 : C의 #define)가있는 경우 구문 설탕은 일반적으로 어느 정도 또는 다른 범위에서 작업 할 수 있습니다.
"언어 __는 명령형 프로그래밍을 지원합니까?"라고 묻는 것이 약간 더 의미가있을 수 있으며, 예를 들어 Lisp의 경우 대답은 "아니오"입니다.
책의 시작 부분을보십시오 : "A-Great-Ruby-eBook" . 그것은 당신이 묻는 매우 구체적인 주제에 대해 논의합니다. Ruby에서 다양한 유형의 프로그래밍을 할 수 있습니다. 기능적으로 프로그래밍하고 싶다면 할 수 있습니다. 명령 적으로 프로그래밍하려면 그렇게 할 수 있습니다. 결국 루비가 어떻게 기능하는지 정의 질문입니다. 사용자 camflan의 답변을 참조하십시오.