맨위로가기

커피스크립트

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

커피스크립트는 2009년 제레미 아쉬케나스에 의해 개발된 자바스크립트의 상위 집합 언어이다. 자바스크립트로 컴파일되며, 간결한 문법과 다양한 기능을 제공한다. 2017년 버전 2.0.0이 도입되어 자바스크립트와의 호환성을 개선했다. 표현식 기반 문법, 들여쓰기를 활용한 코드 블록, 루비 스타일 문자열 보간 등 특징을 가지며, jQuery와의 통합을 지원한다. 드롭박스, 깃허브, Atom 텍스트 편집기 등에서 사용되었으나, 2017년 드롭박스는 TypeScript로 마이그레이션했다.

더 읽어볼만한 페이지

  • 자바스크립트 프로그래밍 언어 계열 - 타입스크립트
    타입스크립트는 마이크로소프트에서 개발한 자바스크립트의 상위 집합으로, 정적 타입 지정, 타입 추론 등의 기능을 제공하여 코드의 안정성과 가독성을 높이는 언어이다.
  • 자바스크립트 프로그래밍 언어 계열 - ECMA스크립트
    ECMAScript는 넷스케이프에서 개발한 스크립팅 언어의 표준 명세로, 자바스크립트 등을 포함하며, 구조적, 동적, 함수형 프로그래밍 기능을 지원하고 C 스타일의 구조적 프로그래밍과 약타입 언어 등의 특징을 갖는 언어이다.
  • 프로토타입 기반 프로그래밍 언어 - 루아 (프로그래밍 언어)
    루아는 C 언어와의 통합이 용이하고 작고 가벼운 확장 가능한 스크립트 언어로, 테이블 기반의 자료 구조를 통해 다양한 프로그래밍 패러다임을 지원하며 여러 분야에서 활용된다.
  • 프로토타입 기반 프로그래밍 언어 - LPC (프로그래밍 언어)
    LPC는 1989년 Lars Pensjö가 개발한 객체 지향 프로그래밍 언어로, C와 유사한 문법을 가지며 MUD 게임 개발에 주로 사용된다.
  • 소스 대 소스 컴파일러 - 스칼라 (프로그래밍 언어)
    스칼라는 마틴 오더스키가 설계한 객체 지향 및 함수형 프로그래밍 언어이며, 자바 플랫폼에서 실행되고 자바 코드와 상호 운용이 가능하며, 아파치 스파크 등 다양한 곳에서 활용된다.
  • 소스 대 소스 컴파일러 - 타입스크립트
    타입스크립트는 마이크로소프트에서 개발한 자바스크립트의 상위 집합으로, 정적 타입 지정, 타입 추론 등의 기능을 제공하여 코드의 안정성과 가독성을 높이는 언어이다.
커피스크립트 - [IT 관련 정보]에 관한 문서
개요
유형프로그래밍 언어
패러다임멀티 패러다임 프로그래밍: 프로토타입 기반 프로그래밍, 함수형 프로그래밍, 명령형 프로그래밍, 스크립트 언어
발표일2009년 12월 13일
디자이너제레미 애시캐너스
개발자제레미 애시캐너스, 기타
최신 릴리스 버전2.7.0
최신 릴리스 날짜2022년 4월 23일
타이핑동적 타이핑, 암시적
영향 받은 언어하스켈, 자바스크립트, 펄, 파이썬, 루비, YAML
영향을 준 언어문스크립트, 라이브스크립트, 자바스크립트
운영체제크로스 플랫폼
라이선스MIT 허가서
파일 확장자.coffee, .litcoffee
웹사이트
공식 웹사이트공식 웹사이트

2. 역사

제레미 아쉬케나스는 2009년에 커피스크립트 개발을 시작했다.[8] 초기에는 루비로 컴파일러를 작성했지만, 2010년에 셀프 호스팅 방식으로 전환하여 커피스크립트 자체로 컴파일러를 작성했다. 같은 해 해커 뉴스(Hacker News)에서 안정 버전인 1.0.0을 발표했다.[9][10] 2017년에는 버전 2.0.0을 출시하며 자바스크립트와의 호환성을 개선하고 새로운 기능을 추가했다.[11]

2. 1. 초기 역사 (2009년 ~ 2010년)

제레미 아쉬케나스는 2009년 12월 13일 "미스터리 언어의 초기 커밋"이라는 주석과 함께 커피스크립트의 첫 번째 Git 커밋을 만들었다.[8] 당시 컴파일러는 루비로 작성되었다. 12월 24일, 그는 첫 번째 태그가 지정되고 문서화된 0.1.0 버전을 출시했다. 2010년 2월 21일, 그는 루비 컴파일러를 순수 커피스크립트로 작성된 셀프 호스팅 버전으로 대체한 버전 0.5를 커밋했다. 그 당시 이 프로젝트는 깃허브(GitHub)에서 여러 다른 기여자를 유치했으며, 하루에 300회 이상의 페이지 조회수를 기록했다.

2010년 12월 24일, 아쉬케나스는 프로젝트가 처음 발표된 사이트인 해커 뉴스(Hacker News)에 안정적인 1.0.0 버전을 출시한다고 발표했다.[9][10]

2. 2. 발전과 변화 (2017년 ~ 현재)

제레미 아쉬케나스는 2017년 9월 18일에 커피스크립트 버전 2.0.0을 발표했다.[11] 이 버전은 "커피스크립트를 현대적인 자바스크립트 시대에 도입하여, 커피스크립트의 특징인 깔끔한 구문을 유지하면서 자바스크립트와의 호환성 격차를 해소하는 것"을 목표로 했다. 컴파일 후 출력을 ES2015+ 구문으로 변경했고, ES2015+ 구현에 맞춰 1.x 버전과는 사양 일부가 변경 및 추가되었다. JSX나 타입 애노테이션 코멘트 등의 기능이 추가되었으며, Babel과 연동하여 ES5로 트랜스파일을 동시에 할 수 있게 되었다.

3. 문법

CoffeeScript에서는 거의 모든 것이 표현식이다. `if`, `switch`, `for`와 같은 제어문은 값을 반환하며, Perl이나 Ruby처럼 후위 표기법(`결과 if 조건`)도 지원한다. 불필요한 괄호와 중괄호는 생략할 수 있다. 코드 블록은 중괄호 대신 들여쓰기로, 함수 호출은 암시적으로 표현되며, 객체 리터럴은 자동 감지되는 경우가 많다.

`?` 키워드는 변수가 `null` 또는 `undefined`인지 빠르게 확인하는 데 사용된다.

```coffeescript

personCheck = ->

if not person? then alert("No person") else alert("Have person")

person = null

personCheck()

person = "Ivan"

personCheck()

```

위 코드는 변수가 `null` 또는 `undefined`이면 "No person", 값이 있으면 "Have person" 경고를 표시한다.

ES6 이전에는 jQuery를 다음과 같이 사용했다.

```javascript

$(document).ready(function() {

// 초기화 코드

});

```

또는

```javascript

$(function() {

// 초기화 코드

});

```

CoffeeScript에서는 `function` 키워드를 `->`로, 중괄호는 들여쓰기로 대체한다. 괄호는 생략 가능하다.

```coffeescript

$ ->

# 초기화 코드

```

체질량 지수(BMI) 계산, 최대공약수 계산, 문자열 보간, 리스트 컴프리헨션, `for ... in`, `for ... of` 등은 하위 섹션에서 자세히 설명한다.

CoffeeScript는 스코핑 규칙, 특히 변수 섀도잉을 허용하지 않는 점 때문에 비판받기도 한다.[14][15]

3. 1. 기본 문법

coffeescript

square = (x) ->

x * x

```

위 코드는 `x`를 입력받아 제곱을 반환하는 함수를 `square` 변수에 저장한다. 이는 아래와 같은 자바스크립트 코드로 변환된다.

```javascript

var square;

square = function(x) {

return x * x;

};

```

CoffeeScript에서는 거의 모든 것이 표현식이다. `if`, `switch`, `for` 표현식은 값을 반환하며, Perl과 Ruby처럼 후위 표기법(예: `결과 if 조건`)도 지원한다.

불필요한 괄호와 중괄호는 생략 가능하다. 코드 블록은 중괄호 대신 들여쓰기로, 함수 호출은 암시적으로, 객체 리터럴은 자동 감지되는 경우가 많다.

체질량 지수 계산 예시:

```coffeescript

mass = 72

height = 1.78

BMI = mass / height**2

alert 'You are healthy!' if 18.5 <= BMI < 25

```

유클리드 호제법을 사용한 최대공약수 계산 예시:

```coffeescript

gcd = (x, y) ->

[x, y] = [y, x%y] until y is 0

x

```

`?` 키워드는 변수가 `null` 또는 `undefined`인지 확인한다.

```coffeescript

personCheck = ->

if not person? then alert("No person") else alert("Have person")

person = null

personCheck()

person = "Ivan"

personCheck()

```

ES6 이전 jQuery 코드 예시:

```coffeescript

$ ->

# 초기화를 위한 코드

```

Ruby 스타일 문자열 보간:

```coffeescript

author = "Wittgenstein"

quote = "A picture is a fact. -- #{ author }"

sentence = "#{ 22 / 7 } is a decent approximation of π"

```

`for` 루프는 리스트 컴프리헨션으로 대체 가능하다.

```coffeescript

alert n*n for n in [1..10] when n%2 is 1

```

또는:

```coffeescript

alert n*n for n in [1..10] by 2

```

선형 검색 예시:

```coffeescript

names = ["Ivan", "Joanna", "Nikolay", "Mihaela"]

linearSearch = (searchName) -> alert(name) for name in names when name is searchName

```

`for ... in`은 배열 반복, `for ... of`는 객체 반복에 사용된다.

CoffeeScript는 스코핑 규칙으로 비판받기도 한다.[14][15] 변수 섀도잉을 허용하지 않아 코드 추론이 어렵고 오류 발생 가능성이 있다는 점이 지적된다.

jQuery를 사용한 JavaScript 코드 예시는 다음과 같이 CoffeeScript로 표현할 수 있다.

```coffeescript

$ ->

# 초기화를 위한 코드

```

CoffeeScript에서는 `function` 키워드는 `->`로, 중괄호는 들여쓰기로 대체된다. 괄호는 생략 가능하다.

클로저를 활용한 jQuery 예시:

```coffeescript

$.get("/info", ((txt) -> $("#info").text("info = #{txt}")), "text")

3. 2. 예제

커피스크립트에서는 함수를 다음과 같이 정의할 수 있다.

```coffeescript

square = (x) ->

x * x

```

이 코드는 `x`를 입력받아 그의 제곱을 반환하는 함수를 `square` 변수에 저장한다. 이 코드는 다음과 같은 자바스크립트로 변환된다.

```javascript

var square;

square = function(x) {

return x * x;

};

```

CoffeeScript에서는 거의 모든 것이 표현식이다. 예를 들어, `if`, `switch`, `for` 표현식은 (자바스크립트에서는 반환 값이 없지만) 값을 반환한다. Perl과 Ruby처럼, 이러한 제어문은 후위 표기법 버전도 가지고 있다. 예를 들어, `if`는 `결과 if 조건` 형식으로도 작성할 수 있다.

불필요한 괄호와 중괄호는 많이 생략될 수 있다. 예를 들어, 코드 블록은 중괄호 대신 들여쓰기로 표시할 수 있고, 함수 호출은 암시적이며, 객체 리터럴은 종종 자동으로 감지된다.

`?` 키워드는 변수가 `null` 또는 `undefined`인지 빠르게 확인한다.

```coffeescript

personCheck = ->

if not person? then alert("No person") else alert("Have person")

person = null

personCheck()

person = "Ivan"

personCheck()

```

변수가 `null` 또는 `undefined`이면 "No person" 경고가 표시되고, 무언가가 있으면 "Have person" 경고가 표시된다.

ES6 이전의 일반적인 자바스크립트 코드는 jQuery 라이브러리를 사용한다.

```javascript

$(document).ready(function() {

// Initialization code goes here

});

```

또는 간단하게:

```javascript

$(function() {

// Initialization code goes here

});

```

CoffeeScript에서 `function` 키워드는 `->` 기호로 대체되며, 다른 오프사이드 규칙 언어인 Python 및 Haskell과 마찬가지로 들여쓰기가 중괄호 대신 사용된다. 또한, 괄호는 일반적으로 생략할 수 있으며, 들여쓰기 수준을 사용하여 함수 또는 블록을 나타낸다. 따라서 위의 코드 조각에 해당하는 CoffeeScript는 다음과 같다.

```coffeescript

$ ->

# Initialization code goes here

```

jQuery 등에서는 클로저를 많이 사용하는데, CoffeeScript에서는 클로저가 간결하게 작성될 수 있다. 다음은 `/info`의 내용을 가져와서 `#info`에 넣는 jQuery를 사용한 JavaScript 예시이다.

```javascript

$.get("/info", function(txt) { $("#info").text("info = " + txt) }, "text")

```

CoffeeScript에서는 다음과 같이 한 줄로 작성할 수 있다.

```coffeescript

$.get("/info", ((txt) -> $("#info").text("info = #{txt}")), "text")

```

체질량 지수(BMI) 계산, 최대공약수 계산, 문자열 보간, 리스트 컴프리헨션 등의 예시는 하위 섹션에서 더 자세히 다룬다.

CoffeeScript는 특이한 스코핑 규칙으로 비판을 받아 왔는데,[14][15] 특히 변수 섀도잉을 완전히 허용하지 않으므로, 절차적 프로그래밍 원칙이 정의된 이후로 당연하게 여겨지고 있는 몇 가지 기본 프로그래밍 패턴에서 코드에 대한 추론을 더 어렵고 오류가 발생하기 쉽게 만든다.

3. 2. 1. 체질량 지수(BMI) 계산

coffeescript

mass = 72

height = 1.78

BMI = mass / height**2

alert 'You are healthy!' if 18.5 <= BMI < 25

```

커피스크립트에서는 위와 같이 간격을 직접 설명하여 체질량 지수(BMI)를 계산할 수 있다. 이는 자바스크립트 코드와 비교했을 때 더 간결하고 가독성이 좋다.

3. 2. 2. 최대공약수(GCD) 계산

coffeescript

gcd = (x, y) ->

[x, y] = [y, x%y] until y is 0

x

```

CoffeeScript에서는 `until`until영어을 사용하여 유클리드 호제법으로 두 수의 최대공약수를 계산할 수 있다.[12]

3. 2. 3. 문자열 보간

CoffeeScript는 Ruby 스타일 문자열 보간을 지원한다. 이중 인용 부호("")로 묶인 문자열은 `#{ ... }`를 사용하여 변수나 표현식의 값을 문자열 안에 삽입할 수 있으며, 작은따옴표('')로 묶인 문자열은 보간 없이 문자 그대로 처리된다.[13]

```coffeescript

author = "Wittgenstein"

quote = "A picture is a fact. -- #{ author }"

sentence = "#{ 22 / 7 } is a decent approximation of π"

3. 2. 4. 리스트 컴프리헨션

coffeescript

alert n*n for n in [1..10] when n%2 is 1

```

또는 다음과 같이 표현할 수 있다.

```coffeescript

alert n*n for n in [1..10] by 2

```

선형 검색은 `when` 키워드를 사용하여 한 줄로 구현할 수 있다.

```coffeescript

names = ["Ivan", "Joanna", "Nikolay", "Mihaela"]

linearSearch = (searchName) -> alert(name) for name in names when name is searchName

```

`for ... in` 구문은 배열을 반복할 수 있으며, `for ... of` 구문은 객체를 반복할 수 있다.

3. 3. jQuery와의 통합

ES6 이전의 일반적인 자바스크립트 코드는 jQuery 라이브러리를 사용한다.

```javascript

$(document).ready(function() {

// Initialization code goes here

});

```

또는 간단하게:

```javascript

$(function() {

// Initialization code goes here

});

```

CoffeeScript에서 `function` 키워드는 `->` 기호로 대체되며, 다른 오프사이드 규칙 언어인 Python 및 Haskell과 마찬가지로 들여쓰기가 중괄호 대신 사용된다. 또한, 괄호는 일반적으로 생략할 수 있으며, 들여쓰기 수준을 사용하여 함수 또는 블록을 나타낸다. 따라서 위의 코드 조각에 해당하는 CoffeeScript는 다음과 같다.

```coffeescript

$(document).ready ->

# Initialization code goes here

```

```coffeescript

$ ->

# 초기화를 위한 코드

```

jQuery 등에서는 클로저를 많이 사용하는데, CoffeeScript에서는 클로저가 간결하게 작성될 수 있다. 이는 /info의 내용을 가져와서 #info에 넣는 경우의 jQuery를 사용한 JavaScript 예시이다.

```javascript

$.get("/info", function(txt) { $("#info").text("info = " + txt) }, "text")

```

CoffeeScript에서도 다음과 같이 한 줄로 작성할 수 있으며, 75문자에서 67문자로 약 1/10 정도 문자 수가 줄어들었다.

```coffeescript

$.get("/info", ((txt) -> $("#info").text("info = #{txt}")), "text")

4. 컴파일

커피스크립트 컴파일러는 0.5 버전부터 셀프 호스팅을 지원하며, Node.js 유틸리티로 사용할 수 있다. 하지만 핵심 컴파일러는 Node.js에 의존하지 않으며, 어떤 자바스크립트 환경에서도 실행될 수 있다.[16]

CoffeeScript.org의 공식 사이트에는 메뉴 바에 "Try CoffeeScript" 버튼이 있는데, 이 버튼을 클릭하면 모달 창이 열려 사용자가 커피스크립트를 입력하고 자바스크립트 출력을 확인하며 브라우저에서 직접 실행할 수 있다. js2coffee[17] 사이트는 양방향 번역을 제공한다.

CoffeeScript에서 JavaScript로 컴파일하는 방법은 다음과 같다.


  • Node.js를 설치한 후, npm install --global coffeescript로 설치할 수 있다. CoffeeScript의 컴파일러는 버전 0.5부터 CoffeeScript 자신으로 기술되었지만, npm에서는 컴파일된 JavaScript가 배포되므로, Node.js의 유틸리티로 사용할 수 있다. 그러나 컴파일러의 핵심 부분은 Node.js에 의존하지 않으므로, 브라우저상의 JavaScript 실행 환경에서 동작시킬 수 있는 컴파일된 모듈도 준비되어 있다.[35]
  • Apache Maven의 플러그인인 [https://github.com/talios/coffee-maven-plugin Coffee Maven Plugin]이 있다. 이것은 Java로 작성된 JavaScript 엔진인 Rhino를 이용하고 있다.
  • CoffeeScript의 공식 사이트에서는 메뉴바에 있는 "Try CoffeeScript"를 클릭함으로써, 브라우저 상에서 CoffeeScript의 입력, JavaScript로의 컴파일, 실행을 할 수 있다.
  • Windows용 컴파일된 coffee.exe. 단, Node.js를 사용하는 것이 권장된다.
  • Debian/Ubuntu에서는 레포지토리에 coffeescript가 있다. 단, 반드시 최신 버전은 아니다.
  • `