JavaScript로 함수형 프로그래밍을 배우는 이유

스모크 아트 큐브 스모크 — MattysFlicks — (CC BY 2.0)
참고 :이 기능은 JavaScriptES6 +에서 기능 프로그래밍 및 컴포지션 소프트웨어 기술을 처음부터 배우는“소프트웨어 구성”시리즈 (현재 책!)의 일부입니다. 계속 지켜봐 주시기 바랍니다. 앞으로 더 많은 것들이 있습니다!
도서 구매 | 색인 | <이전 | 다음>

JavaScript에 대해 알고 있다고 생각하는 것을 잊고 초보자의 생각으로이 자료에 접근하십시오. 이를 위해 이전에 JavaScript를 본 적이없는 것처럼 JavaScript 기본 사항을 처음부터 검토 할 것입니다. 초보자라면 운이 좋을 것입니다. 마지막으로 ES6와 기능 프로그래밍을 처음부터 탐구하십시오! 모든 새로운 개념이 길을 따라 설명되기를 바랍니다.

JavaScript 또는 순수 기능 언어에 이미 익숙한 숙련 된 개발자라면 JavaScript가 기능 프로그래밍을 탐색하기위한 재미있는 선택이라고 생각할 수 있습니다. 그러한 생각을 제쳐두고 열린 마음으로 자료에 접근하십시오. JavaScript 프로그래밍에는 다른 수준이있을 수 있습니다. 당신이 전혀 몰랐던 존재.

이 텍스트를 "소프트웨어 작성"이라고하며 기능 프로그래밍은 소프트웨어를 구성하는 명확한 방법 (함수 구성, 고차 함수 등을 사용하는 등)이므로 Haskell, ClojureScript 또는 Elm에 대해 이야기하지 않는 이유가 궁금 할 수 있습니다. 자바 스크립트 대신

JavaScript에는 기능적 프로그래밍에 필요한 가장 중요한 기능이 있습니다.

  1. 일급 함수 : 함수를 데이터 값으로 사용하는 기능 : 함수를 인수로 전달하고 함수를 반환하며 함수를 변수 및 객체 속성에 할당합니다. 이 특성은 고차 함수를 허용하므로 부분 적용, 카레 및 구성이 가능합니다.
  2. 익명 함수 및 간결한 람다 구문 : x => x * 2는 JavaScript에서 유효한 함수 표현식입니다. 간결한 람다는 고차 함수로 작업하기가 더 쉽습니다.
  3. 클로저 : 클로저는 함수가 어휘 환경과 함께 제공됩니다. 함수 생성시 클로저가 생성됩니다. 함수가 다른 함수 내에 정의되면 외부 함수가 종료 된 후에도 외부 함수의 변수 바인딩에 액세스 할 수 있습니다. 클로저는 부분 애플리케이션이 고정 인수를 얻는 방법입니다. 고정 인수는 반환 된 함수의 클로저 범위에 바인딩 된 인수입니다. add2 (1) (2)에서 1은 add2 (1)에 의해 리턴 된 함수의 고정 인수입니다.

JavaScript가없는 것

JavaScript는 다중 패러다임 언어이므로 다양한 스타일의 프로그래밍을 지원합니다. JavaScript가 지원하는 다른 스타일에는 C와 같은 절차 적 (구제 적) 프로그래밍이 있습니다. 여기서 함수는 재사용 및 구성을 위해 반복적으로 호출 할 수있는 명령의 서브 루틴을 나타냅니다. 물론 기능 프로그래밍. 다중 패러다임 언어의 단점은 명령형 및 객체 지향 프로그래밍이 거의 모든 것이 변경 가능해야 함을 암시하는 경향이 있다는 것입니다.

돌연변이는 제자리에서 발생하는 데이터 구조의 변화입니다. 예를 들면 다음과 같습니다.

const foo = {
  바 : 'baz'
};
foo.bar = 'qux'; // 돌연변이

메소드는 속성을 업데이트 할 수 있도록 객체를 변경할 수 있어야합니다. 명령형 프로그래밍에서 대부분의 데이터 구조는 객체와 배열을 효율적으로 내부에서 조작 할 수 있도록 변경 가능합니다.

다음은 일부 기능 언어에 있고 JavaScript에는없는 일부 기능입니다.

  1. 순도 : 일부 FP 언어에서는 순도가 언어에 의해 시행됩니다. 부작용이있는 표현은 허용되지 않습니다.
  2. 불변성 : 일부 FP 언어는 돌연변이를 비활성화합니다. 식은 배열이나 객체와 같은 기존 데이터 구조를 변경하는 대신 새로운 데이터 구조로 평가됩니다. 이것은 비효율적으로 들릴 수 있지만 대부분의 기능적 언어는 구조적 공유를 특징으로하는 trie 데이터 구조를 사용합니다. 즉, 이전 오브젝트와 새 오브젝트가 동일한 데이터에 대한 참조를 공유한다는 의미입니다.
  3. 재귀 : 재귀는 함수가 반복 목적으로 자신을 참조하는 능력입니다. 많은 FP 언어에서 재귀는 반복하는 유일한 방법입니다. for, while 또는 do 루프와 같은 루프 문은 없습니다.

순도 : JavaScript에서는 순도를 규칙에 따라 달성해야합니다. 순수한 기능을 구성하여 대부분의 응용 프로그램을 작성하지 않으면 기능적 스타일을 사용하여 프로그래밍하지 않아도됩니다. 불행히도 JavaScript에서 실수로 불순한 함수를 만들어 사용하여 추적하는 것은 쉽습니다.

불변성 : 순수한 기능적 언어에서 불변성은 종종 시행됩니다. JavaScript에는 대부분의 기능적 언어에서 사용하는 효율적이고 불변의 trie 기반 데이터 구조가 부족하지만 Immutable.js 및 Mori를 포함하여 도움이되는 라이브러리가 있습니다. ECMAScript 사양의 향후 버전에 불변 데이터 구조가 포함될 것으로 기대합니다.

ES6에 const 키워드를 추가하는 것과 같이 희망을주는 표시가 있습니다. const로 정의 된 이름 바인딩은 다른 값을 참조하도록 재 할당 할 수 없습니다. const가 불변 값을 나타내지 않는다는 것을 이해하는 것이 중요합니다.

const 객체는 완전히 다른 객체를 참조하도록 재 할당 할 수 없지만 참조하는 객체는 속성이 변경 될 수 있습니다. JavaScript에는 객체를 고정 () 할 수있는 기능이 있지만 해당 객체는 루트 수준에서만 고정되므로 중첩 된 객체의 속성 속성이 여전히 변경 될 수 있습니다. 다시 말해, JavaScript 사양에서 진정한 복합 불변을보기 전에는 아직 멀었습니다.

재귀 : JavaScript는 기술적으로 재귀를 지원하지만 대부분의 기능적 언어에는 꼬리 호출 최적화라는 기능이 있습니다. 테일 콜 최적화는 재귀 함수가 재귀 호출에 스택 프레임을 재사용 할 수 있도록하는 기능입니다.

테일 콜 최적화가 없으면 콜 스택이 경계없이 커져서 스택 오버플로가 발생할 수 있습니다. JavaScript는 기술적으로 ES6 사양에서 제한된 형태의 테일 콜 최적화를 얻었습니다. 불행히도, 주요 브라우저 엔진 중 하나만 구현하여 최적화를 부분적으로 구현 한 다음 Babel (이전 브라우저에서 사용하기 위해 ES6을 ES5로 컴파일하는 데 사용되는 가장 널리 사용되는 표준 JavaScript 컴파일러)에서 제거했습니다.

결론 : 꼬리 위치에서 함수를 신중하게 호출하더라도 큰 반복에 재귀를 사용하는 것은 여전히 ​​안전하지 않습니다.

순수한 기능 언어가 부족한 JavaScript

순수 주의자는 JavaScript의 가변성이 가장 큰 단점이라고 말하고 있습니다. 그러나 부작용과 돌연변이가 때때로 유익합니다. 실제로 부작용없이 가장 유용한 최신 응용 프로그램을 만드는 것은 불가능합니다. Haskell과 같은 순수 기능 언어는 부작용을 사용하지만 모나드라고하는 상자를 사용하여 순수 기능으로 위장하여 모나드가 나타내는 부작용이 불분명하더라도 프로그램을 순수하게 유지할 수 있습니다.

모나드의 문제점은 사용이 매우 간단하지만 모나드가 많은 예제에 익숙하지 않은 사람에게 무엇인지 설명하는 것은 맹인에게 "파란색"이 어떻게 보이는지 설명하는 것과 조금 비슷하다는 것입니다.

“모나드는 endofunctors 범주의 단일체입니다. 문제는 무엇입니까?”~ James Iry는 가상으로 Philip Wadler를 인용하여 Saunders Mac Lane의 실제 인용문을 인용합니다. “프로그램 언어의 간단하고 불완전하며 잘못된 역사”

일반적으로 패러디는 재미있는 포인트를 더 재미있게 만들기 위해 물건을 과장합니다. 위의 인용문에서 모나드에 대한 설명은 실제로 다음과 같이 원래 인용문에서 단순화되었습니다.

"X의 모나드는 X의 endofunctors 범주의 단일체이며, 제품 ×는 endofunctor의 구성 요소로 대체되고 단위 endofunctor가 설정 한 단위로 대체됩니다."~ Saunders Mac Lane. "작업 수학자 카테고리"

그럼에도 불구하고 모나드에 대한 두려움은 약한 추론입니다. 모나드를 배우는 가장 좋은 방법은 주제에 관한 많은 책과 블로그 게시물을 읽는 것이 아니라 뛰어 들어 사용하는 것입니다. 함수형 프로그래밍에서 대부분의 것들과 마찬가지로, 흠 잡을 데없는 학문적 어휘는 개념보다 이해하기가 훨씬 어렵습니다. 기능 프로그래밍을 이해하기 위해 Saunders Mac Lane을 이해할 필요는 없습니다.

모든 프로그래밍 스타일에 이상적인 것은 아니지만 JavaScript는 다양한 프로그래밍 스타일과 배경을 가진 다양한 사람들이 사용할 수 있도록 설계된 범용 언어입니다.

Brendan Eich에 따르면, 이것은 처음부터 의도적이었습니다. Netscape는 두 종류의 프로그래머를 지원해야했습니다.

“… C ++로 작성했거나 Java를 희망했던 구성 요소 작성자; HTML에 직접 포함 된 코드를 작성하는 아마추어 또는 프로 '스크립트 작성자'

원래 Netscape는 두 가지 다른 언어를 지원하고 스크립트 언어는 아마도 Scheme (Lisp의 방언)과 유사 할 것입니다. 다시, Brendan Eich :

"브라우저에서‘체계를 수행하겠다’는 약속으로 Netscape에 채용되었습니다.”

JavaScript는 새로운 언어 여야했습니다.

“엔지니어링 엔지니어링 경영진은 언어가 '자바처럼 보이'어야한다고 생각했습니다. 이는 Scheme과 함께 Perl, Python 및 Tcl을 배제했습니다.”

따라서 Brendan Eich의 아이디어는 처음부터 다음과 같습니다.

  1. 브라우저의 구성표.
  2. 자바처럼 보입니다.

결국 더 많은 엉망진창이되었습니다.

“저는 자랑스럽지 않지만 Scheme-ish 일류 기능과 Self-ish (단수이지만) 프로토 타입을 주요 재료로 선택하게되어 기쁩니다. Java 영향, 특히 y2k Date 버그뿐만 아니라 원시적 대 객체 구별 (예 : 문자열 대 문자열)도 불행했습니다.”

필자는 자바 스크립트로 전환 된 "불행한"Java 유사 기능 목록에 추가하려고합니다.

  • 팩토리 함수와 다른 호출 및 사용법 시맨틱이있는 생성자 함수 및 새 키워드.
  • 단일 상위 항목이있는 클래스 키워드는 기본 상속 메커니즘으로 확장됩니다.
  • 사용자는 클래스를 정적 ​​유형 인 것처럼 생각하는 경향이 있습니다 (그렇지 않음).

내 충고 : 가능할 때마다 피하십시오.

스크립팅 접근 방식이“구성 요소”접근 방식보다 훨씬 우수하다는 사실이 밝혀 졌기 때문에 JavaScript가 유능한 언어가 된 것은 운이 좋았습니다 (오늘날 Java, Flash 및 ActiveX 확장 프로그램은 수많은 설치된 브라우저에서 지원되지 않음).

결국 우리가 브라우저에서 직접 지원하는 언어는 JavaScript였습니다.

즉, 브라우저는 단일 언어 바인딩 세트 (자바 스크립트) 만 지원하면되기 때문에 부풀어지고 버그가 줄어 듭니다. WebAssembly는 예외라고 생각할 수도 있지만 WebAssembly의 디자인 목표 중 하나는 호환 가능한 AST (Abstract Syntax Tree)를 사용하여 JavaScript의 언어 바인딩을 공유하는 것입니다. 실제로 첫 번째 데모는 WebAssembly를 ASM.js라는 JavaScript의 하위 집합으로 컴파일했습니다.

웹 플랫폼을위한 유일한 표준 범용 프로그래밍 언어로서의 위치 덕분에 JavaScript는 소프트웨어 역사상 가장 큰 언어 인기 물결을 탈 수있었습니다.

앱은 세계를, 웹은 앱을, JavaScript는 웹을 먹었습니다.

여러 가지 방법으로 JavaScript는 현재 세계에서 가장 인기있는 프로그래밍 언어입니다.

JavaScript는 함수형 프로그래밍을위한 이상적인 도구는 아니지만, 규모가 큰 분산 된 팀에서 대규모 응용 프로그램을 구축하는 데 유용한 도구로, 팀마다 응용 프로그램을 작성하는 방법에 대해 다른 아이디어를 가질 수 있습니다.

명령형 프로그래밍이 특히 유용한 일부 팀은 스크립팅 접착제에 집중할 수 있습니다. 다른 사람들은 건축 적 추상화를 만드는 데 집중할 수도 있는데, 약간의 (제한적이고 신중한) OO 사고는 나쁜 생각이 아닐 수도 있습니다. 또 다른 일부는 기능적 프로그래밍을 채택하여 결정적이며 테스트 가능한 애플리케이션 상태 관리를 위해 순수한 기능을 사용하여 사용자 조치를 줄입니다. 이 팀의 구성원은 모두 같은 언어를 사용하므로 아이디어를보다 쉽게 ​​교환하고 서로에게서 배우며 서로의 업무를 수행 할 수 있습니다.

JavaScript에서는 이러한 모든 아이디어가 공존 할 수있어 더 많은 사람들이 JavaScript를 받아 들일 수있게되어 세계에서 가장 큰 오픈 소스 패키지 레지스트리 (2017 년 2 월 현재) npm이되었습니다.

JavaScript의 진정한 강점은 생태계의 다양한 사고와 사용자입니다. 함수형 프로그래밍 순수 론자에게는 이상적인 언어는 아니지만 Java, Lisp와 같은 인기있는 다른 언어를 사용하는 사람들에게 익숙한 거의 모든 플랫폼에서 작동하는 하나의 언어를 사용하여 함께 작업하기에 이상적인 언어 일 수 있습니다. 또는 C. JavaScript는 이러한 배경을 가진 사용자에게는 이상적으로 편안한 느낌이 들지 않지만 언어를 배우고 빠르게 생산성을 발휘할 수있을 정도로 편안하다고 느낄 수 있습니다.

JavaScript는 기능 프로그래머에게 가장 적합한 언어가 아니라는 데 동의합니다. 그러나 ES6에 의해 입증 된 바와 같이, 모든 기능적 언어가 모든 사람이 사용하고 수용 할 수있는 언어라고 주장 할 수있는 다른 기능적 언어는 없습니다. 전 세계 거의 모든 회사에서 사용하는 JavaScript와 놀라운 생태계를 포기하는 대신,이를 수용하고 소프트웨어 구성을위한 언어를 점진적으로 향상시키는 이유는 무엇입니까?

JavaScript는 이미 충분히 기능적인 프로그래밍 언어입니다. 즉, 사람들은 기능적 프로그래밍 기술을 사용하여 JavaScript에서 유용하고 흥미로운 모든 종류의 것을 구축하고 있습니다. Netflix (및 Angular 2+로 구축 된 모든 앱)는 RxJS 기반 기능 유틸리티를 사용합니다. Facebook은 React에서 순수 기능, 고차 함수 및 고차 컴포넌트의 개념을 사용하여 Facebook 및 Instagram을 구축합니다. PayPal, KhanAcademy 및 Flipkart는 Redux를 상태 관리에 사용합니다.

Angular, React, Redux 및 Lodash는 JavaScript 애플리케이션 에코 시스템의 주요 프레임 워크 및 라이브러리이며 기능 프로그래밍 (또는 프로그래밍을 위해 빌드 된 Lodash 및 Redux의 경우)에 크게 영향을받습니다. 실제 JavaScript 응용 프로그램에서 기능적 프로그래밍 패턴을 활성화하는 목적.

“왜 JavaScript?”JavaScript는 대부분의 실제 회사에서 실제 소프트웨어를 작성하는 데 사용하는 언어이기 때문에. 그것을 좋아하거나 미워하기 위해, JavaScript는 Lisp의“가장 인기있는 기능적 프로그래밍 언어”라는 제목을 훔쳤습니다. 사실, Haskell은 오늘날 함수형 프로그래밍 개념에 훨씬 적합한 표준 베어러이지만 사람들은 Haskell에 실제 응용 프로그램을 많이 구축하지는 않습니다.

어느 시점 에나, 미국에는 거의 수십만 개의 JavaScript 일자리가 있으며 전 세계적으로 수십만 개가 더 있습니다. Haskell을 배우면 함수형 프로그래밍에 대해 많은 것을 배울 수 있지만 JavaScript를 배우면 실제 작업을위한 프로덕션 앱을 만드는 방법에 대해 많이 배울 수 있습니다.

앱은 세계를, 웹은 앱을, JavaScript는 웹을 먹었습니다.

도서 구매 | 색인 | <이전 | 다음>

EricElliottJS.com에서 자세히 알아보기

EricElliottJS.com 회원은 대화식 코드 문제가있는 비디오 강의를 이용할 수 있습니다. 회원이 아닌 경우 오늘 가입하십시오.

Eric Elliott는 분산 시스템 전문가이며“Composing Software”및“JavaScript Applications 프로그래밍”책의 저자입니다. DevAnywhere.io의 공동 창립자로서 개발자에게 원격으로 작업하고 업무 / 생활 균형을 수용하는 데 필요한 기술을 가르칩니다. 그는 암호화 프로젝트를위한 개발 팀을 구성하고 조언하며, Adobe Systems, Zumba Fitness, Wall Street Journal, ESPN, BBC 및 Usher, Frank Ocean, Metallica 등 최고의 레코딩 아티스트를위한 소프트웨어 경험에 기여했습니다.

그는 세상에서 가장 아름다운 여성과 함께 외진 생활을 즐깁니다.