jQuery is DSL (Part 1 - DSL)

4348 단어 jquery
JQuery가 막 나왔을 때, 나는 그것을 많이 주목하지 않았는데, 이것은 Yet Another JavaScript Library에 불과하다고 생각했다.초기의 jQuery는 DOM 노드의 선별과 조작에 전념하여 많은 기초 클래스의 확장을 제공하지 않았고 UI 구성 요소도 제공하지 않았기 때문에 부피가 매우 작을 수 있었다.그러나 나는 그것이 내가 익숙한 프로토타입보다 어떤 뚜렷한 장점이 있는지 알 수 없다. 바로 jQuery가 할 수 있는 여러 가지 독립된 조작을 프로토타입도 할 수 있다는 것이다.
이후에 jQuery를 사용하는 사람들이 갈수록 많아졌고, 모두들 그것의 체인 방법으로 호출하기를 좋아했으며, 심지어는 이런 문법을 다른 언어로 보급하기도 했다.예: ASP.NET MVPOmar AL Zabir는 그의 서버 쪽 C# 구성 요소를 체인식 방법으로 호출할 수 있도록 설계했다.이때부터 저는 jQuery에 관심을 가지기 시작했고 체인 방법으로 호출되는 쓰기를 좋아하게 되었습니다. 또한 제 자바스크립트 구성 요소에서 유사한 API(참고AsyncOverload를 실현했습니다.마지막으로, 나는 이것이 사실 인터넷 DSL이라는 것을 갑자기 깨달았다.
이 글에서, 나는 먼저 인터넷 DSL에 대해 토론하고, 다음 글에서 왜 jQuery가 인터넷 DSL인지 설명하려고 한다.이제 가장 근본적인 문제부터 시작하자--
인터넷 DSL이란?
DSL은 Domain Specific Language, 즉 특정 영역의 문제를 설명하고 해결하는 데 사용되는 언어다.예를 들어 우리는 문자열의 특징을 전문적으로 기술하는 정규 표현식이 있고 데이터베이스 조회를 전문적으로 기술하는 SQL이 있으며 XML 구조를 전문적으로 기술하는 DTD와 XSD가 있으며 심지어 XML 변환을 전문적으로 기술하는 XSLT도 있다. 이것들은 모두DSL이다.
물론 우리가 주목하는 분야에 모두 기존의 DSL이 있는 것은 아니다. 이때 우리는 세 가지 선택이 있다.
  • 공통 언어로 이 영역의 문제를 설명하기(non-DSL)
  • 이 분야의 문제를 새로운 언어로 설명하는 것을 발명했다External DSL
  • 기존 언어에서 영역 문제에 대한 묘사 실현Internal DSL
  • 예를 들어 우리는 지금 매우 간단한 금융 분야의 문제를 묘사하고자 한다.'나는 화기은행에서 200달러를 예금하고 있다'는 말에 대응하는 세 가지 방법은 다음과 같다. (I와CitiBank 두 개의 실체 실례가 이미 존재한다고 가정하면)
  • I.DepositTo(new USD(200), CitiBank); /* C# */
  • I deposit 200USD to CitiBank /* E-DSL */
  • I.deposit(200.USD()).to(CitiBank); /* I-DSL */

  • 첫 번째 방법의 원가가 가장 낮다. 당신은 OO의 사상만 있으면 된다. 당신은 항상 실체류를 설계할 수 있지만 인류가 이 분야의 문제를 묘사하는 사고방식과 어느 정도 차이가 있을 수 있다. (왜 USD는 new가 될 수 있습니까? 왜 그렇지 않습니까?deposit [something] to [somewhere] ?).
    두 번째 방법의 원가가 가장 높다. 당신은 새로운 해석기를 써야 한다. 적어도 하나의 새로운 규칙을 쓴 다음에 YACC와 같은 도구로 해석기를 만들어 주어야 한다. 그러나 이렇게 나온 문법은 인류의 사고방식에 가장 가깝고 심지어 자연 언어처럼 유창하다.
    세 번째 방법 용어인 상술한 두 가지 절충안은 문법이 그리 복잡하지 않으면 Builder 모델로 문법 분석을 실현할 수 있다. 쓴 문법은 자연 언어에 상당히 가깝지만 학습 문턱이 있다.스크립트 언어는 상당히 유연성이 있기 때문에 현재 많은 사람들이 스크립트 언어 내에서 인터넷 DSL을 실현하는 것을 선택하는 경향이 있다.
    인터넷 DSL은 어떻게 구성됩니까?
    흔히 볼 수 있는 두 가지 인터넷 DSL 구현 방법은 Method ChainingFunction Sequence입니다.만약 우리가 한 기계의 하드웨어 구성을 설명해야 한다면, 두 가지 실현 방식의 코드는 각각 다음과 같다./* Method Chaining */
    computer()
      .processor()
        .cores(2)
        .i386()
      .disk()
        .size(150)
      .disk()
        .size(75)
        .speed(7200)
        .sata()
      .end();
    /* Function Sequence */
    computer();
      processor();
        cores(2);
        processorType(i386);
      disk();
        diskSize(150);
      disk();
        diskSize(75);
        diskSpeed(7200);
        diskInterface(SATA);

    어떤 글씨를 쓰든지 간에 중간에 반드시 분석기층을 써야 한다.문법 분석기가 상태기를 사용해야 하는 것처럼 인터넷 DSL의 실현도 현재 어떤 상태로 실행되고 그 다음에 어떤 유효한 상태로 옮길 수 있는지 기록하기 위해 상태기를 내장해야 한다.
    이것은 문법 분석기와 상태기 실현을 전문적으로 다루는 문장이 아니기 때문에 우리는 관심사를 API 차원에서 유지하고 그 실현 세부 사항과 비용을 깊이 토론하지 않는다.우리는 체인 방법으로 인터넷 DSL을 실현할 수 있다면 충분하다는 것을 알고 있으며, jQuery가 이 점을 어떻게 잘 활용하는지에 대해서는 다음 글에서 다시 토론할 것이다.
    소결
    이 글에서 우리는 인터넷 DSL과 External DSL 간의 차이점을 이해했고 인터넷 DSL을 실현하는 구체적인 방식도 이해했다. 이것은 다음에 jQuery의 인터넷 DSL식 인터페이스를 토론하는 데 밑받침이 되었다.다음 글에서 우리는 왜 jQuery의 인터페이스를 이렇게 디자인해야 하는지, 사용자에게 어떤 편리함을 가져다 줄 수 있는지, 그리고 그 자체의 실현에 어떤 장점이 있는지 깊이 있게 살펴볼 것이다.
    다음 글을 놓치지 않으려면 내 블로그 구독을 고려해 보세요.
  • Cat in Chinese ( feed )
  • Cat in dotNET ( feed )
  • 좋은 웹페이지 즐겨찾기