폴리그랏 프로그래밍

_b_2086

지은이 : 임백준
출판사 : 한빛미디어
출간일 : 2014-03-03

프롤로그

  • 행사코드
    • 보일러플레이트(boilerplate), 세레모니(ceremony)
    • 문제 해결책과 상관없는 코드들
    • 아래에서 System.out.println(“Hello, World”); 를 제외한 코드들
    • DRY : Don’t Repeat Youself (복붙하지 마라)
    • 모든 언어는 추상수준을 상승시키는 방향으로 발전 : 함수형 언어, 동적 언어
    • 코드의 간결함은 미적으로 국한되지 않고, 기능과 성능과 연관된다.
    • java의 경우
      public class HelloWorld{    
          public static void main(String[] args) {
              System.out.println("Hello, World");
          }
      }
      
    • F#의 경우
      printfn "Hello World"
  • 언어의 권력교체
    • 코볼은 90년대에 사망함. 자바의 시대가 도래함
    • 언어의 전성기는 10년을 넘기기 어렵다는 정설
    • 자바는 2000년대에 사망
  • 폴리그랏
    • 폴리그랏 : 여러개의 언어를 사용하는 것
    • 월스트리트 금융회사들의 아키텍쳐 : C# 클라이언트, java 서버
    • 앞으로는 어떤 언어를 얼마나 빠르게 학습하느냐가 중요함
    • 미래의 애플리케이션은 언어세계의 다중언어적인 본질로부터 이득을 취할 것이다.
    • 하나의 언어로 애플리케이션을 작성하는 시대는 이미 지나갔다.

자바

람다와 클로저

  • 클로저
    • 클로저 : 자신을 둘러싸고 있는 외부의 코드에서 선언한 변수를 마음대로 접근할 수 있는 코드
    • 자유변수 : 클로저 바깥에서 선언하고, 클로저 안에서 사용하는 변수
    • 자바에서는 익명클래스로 비슷하게 사용가능하지만.. final을 사용하므로 mutable 변수를 쓸 수 없다.

closure

  • 람다
    • 람다 : 메서드를 별도의 장소에서 미리 선언하지 않고 필요한 곳에서 곧바로 구현할 수 있도록 해주는 문법
    • 코드 조각 또는 표현을 다른 객체나 메소드에 전달하기 위한 표현식

닐 게프터

  • 가비지 컬렉터 : 비본질적인 복잡성이 강력한 추상의 힘에 의해 시야에서 사라지게 함
  • 본질적인 복잡성 추구 : 더그리(Doug Lea)의 동시성 패키지 : 쓰레드를 직접 만들지 않고 업무(Task, Runnable 또는 Callable 인터페이스 사용)를 만들어 ExcuterService에 제출하도록 함

연산자 오버로딩

  • C# 등 다양한 언어에서 지원하지만 자바에서 지원하지 않음.
  • 연산자 오버로딩
    • 성장이 가능한 언어로 만들어줌
    • 상식적인 직관에서 어긋나지 않도록 통제된 연산자 오버로딩은 코드의 가독성을 높여줌 ## 제네릭
    • C# 은 제네릭 타입을 컴파일하면 IL코드에 타입과 관련된 정보가 기억됨 (List<Integer>와 List<Double>은 다른 IL코드를 생성)
    • 자바는 컴파일시 제네릭 or 타입파라메터 정보를 지워버린다. 이로 인해 성능향상이 없고 제네릭을 실행시간 타입에 접근할 수 없다. 컴파일러 트릭 정도.

C#

델파이

  • call by name
    • call by value, call by reference
    • 아래의 코드에서 obj.toString()이 거대한 연산인데, 로그레벨이 warn 이면 쓸데없는 연산을 한셈이다.
    • obj.toString()을 통체로 전달하고 평가를 뒤로 미룰 수 있다면 낭비를 막을 수 있다. –> 람다!!
      logger.debug("some message : " + obj.toString());
  • 니클라우스 워스
    • 파스칼의 창시자
    • 파스칼의 현재적인 객체지향 언어 모습 : 객체의 힙 할당, 단일상속, TObject가 최상위 클래스, 인터페이스 지원
    • 볼렌드에 다니는 워스를 MS가 스카웃하여 Visual J++ 를 개발함 –> 향후 C# 1.0의 기반이 됨

속성과 대리자

  • C# 1.0은 자바와 비슷하였지만, 속성(Property)과 대리자(Delegate)를 지원함
  • 속성과 대리자는 행사코드를 줄일 수 있음
  • 대리자 : 타입안정성(type safety)를 보장하는 함수 포인터 –> 게으른 평가(Lazy evaluation)을 가능하게 하는 call by name 지원

일급 함수

  • 일급함수 (first-class function) : 함수를 다른 함수에게 인수로 전달하고, 함수 자체를 반환값으로 사용하고, 변수에 함수를 할당하고, 데이터 구조에 함수를 저장할 수 있다.
  • 고계함수 (higher-order function) : 다른 함수를 인수로 받는 함수
  • (1,2,3) 리스트 입력시 (101, 102, 103) 리스트로 출력하는 메서드
    • java : for문으로 동작방식을 명령해야 함
      Collection<Integer> input = Arrays.asList(1,2,3);
      List<Integer> output = new ArrayList<Integer>();
      for(int n : input) {
          output.add(n+100);
      }
    • C# : 아래에서 Select 메소드는 “i=>i+100” 라는 람다를 인수로 받는 고계함수이다. 선언적.
      var input = Enumerable.Range(1,3); 
      var output = input.Select(i=>i+100);
  • 명령형으로 멀티코어에서 동작하는 동시성 코드를 작성하기 힘들다.동시성 접근과 선언적 접근은 동시성

또 다른 차이들

  • 예외
    • 자바는 검사된 예외(checed exception)을 포함하지만, c#은 없다. c#은 모든 예외가 실행시간 예외(runtime exception)이기 때문
    • 자바의 검사된 예외는 버전과 확장성에 문제가 있다.
  • 메소드 오버라이딩
    • c#에서는 vitual(하위클래스에서 오버라이딩될 것으로 기대할때 사용)과 override(하위클래서에서 오버라이딩 할때 사용)키워드를 도입하여 버전 문제를 해결함

링큐 LINQ

  • 데이터를 읽는 질의문(query)는 선언적이며, 서로 다른 도메인의 데이터를 애플리케이션 내부에서 일관성있게 접근하게 함.
  • 링큐를 구현에 사용된 요소 : 제네릭, 람다, 타입유추, 확장메서드, 암묵적인 타입변수(var), 객체 초기자, 익명타입
  • 동적 언어의 타입시스템 : 덕타이핑 (duck typing, 꽥꽥거리고 뒤뚱뒤뚱 걸으면 오리 타입)
  • 자바8의 stream api가 있지만….

스칼라

가디언

  • 가디언의 디지털로 전환 : 스칼라와 플레이 2.0 웹 프레임워크 사용
  • 스칼라 : 동시성/병렬성 –> 멀티코어 CPU와 클라우딩 환경에 알맞음
  • 기존 자바 코드 호환, 정적 타이핑
  • https://github.com/guardian/frontend

제임스 스트라칸

  • 제임스 스트라칸 : 그루비의 창시자. “스칼라를 보았다면 그루비를 개발하지 않았을 것이다”

트위터

  • 트위터는 스칼라로 개발
  • 트위터가 스칼라를 사용한 이유
    • 동시성을 활용하여 더 적은 기계에서 더 많은 일을 수행
    • 스칼라는 OOP(객체지향 프로그래밍)과 FP(함수형 프로그래밍)을 결합
    • 트레이트(traits) : cross-cutting으로 영향을 미치는 공통적인 기능을 넣을 수 있음
    • mutable, unmutable을 선택할 수 있음
    • 게으른 값 : 필요한 순간까지 실행되지 않음 (lazy val x = a)
    • 패턴매칭 : 데이터 구조 탐색
    • XML리터럴 : XML을 문자열처럼 다룸

언어의 추상

  • 함수형 언어의 패러다임 요소 : 변경 불가능성, 일급함수, 람다와 클로저, 고차함수, 재귀, 게으른 평가, 함수 합성, 모나드
  • 결국은 “추상” !!
  • 동시성 : 동시에 하는 듯하지만, 문맥교환(context switch)가 분주하게 발생
  • 병렬성 : 문맥교환 없이 동시에
  • 선언적 방식 프로그래밍 : ID 100이상인 직원의 연봉을 병렬로 처리하라 (C#, Linq)
    from emp in employee.AsParallel()
    where emp.id > 100
    select emp.salafy;

     

Notice

  • 이 저작물은 크리에이티브 커먼즈 저작자표시-비영리-변경금지 2.0 대한민국 라이선스에 따라 이용할 수 있습니다. 크리에이티브 커먼즈 라이선스
  • 저작권과 관련된 파일요청 및 작업요청을 받지 않습니다.
  • 댓글에 대한 답변은 늦을 수도 있습니다.
  • 댓글 남기기

    이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다