കോഫീസ്ക്രിപ്റ്റ്

ജാവാസ്ക്രിപ്റ്റിന്റെ ട്രാൻസ്കംപൈലിംഗ് പ്രോഗ്രാമിംഗ് ഭാഷയാണ് **കോഫീസ്ക്രിപ്റ്റ്**. ജാവാസ്ക്രിപ്റ്റിന്റെ പദപ്രയോഗമിതത്വവും, വായനക്ഷമതയും മെച്ചപ്പെടുത്തുന്നതിനുള്ള ശ്രമത്തിൽ റൂബി, പൈത്തൺ, ഹാസ്കൽ എന്നിവയാൽ പ്രചോദിപ്പിക്കപ്പെട്ട വാക്യഘടകങ്ങൾ ചേർക്കുന്നു.പ്രത്യേക അധിക സവിശേഷതകളിൽ ലിസ്റ്റ് ഉൾപ്പെടുത്തൽ, പാറ്റേൺ പൊരുത്തപ്പെടൽ എന്നിവ ഉൾപ്പെടുന്നു.

റൂബി ഓൺ റെയിൽസ് പതിപ്പ് 3.1 , പ്ലേ ഫ്രെയിം വർക്കുകളിൽ കോഫീസ്ക്രിപ്റ്റ് പിന്തുണ ഉൾപ്പെടുത്തിയിട്ടുണ്ട്. 2011-ൽ ബ്രണ്ടൻ ഐക്ക്, ജാവാസ്ക്രിപ്റ്റിന്റെ ഭാവിയെക്കുറിച്ചുള്ള അദ്ദേഹത്തിന്റെ ചിന്തകളുടെ സ്വാധീനമായി കോഫീസ്ക്രിപ്റ്റ് പരാമർശിച്ചു.  
## ചരിത്രം
2009 ഡിസംബർ 13 ന് ജെറമി ആഷെനാസ്  തയ്യാറാക്കിയ കോഫീസ്ക്രിപ്റ്റിന്റെ ആദ്യത്തെ ജിറ്റ് നിയോഗം: " ഭാഷയുടെ മർമ്മാരംഭം" എന്നായിരുന്നു. കമ്പൈലർ റൂബിയിൽ എഴുതിയിരുന്നു. ഡിസംബർ 24 ന് അദ്ദേഹം ആദ്യത്തെ ടാഗ് ചെയ്തതും രേഖപ്പെടുത്തിയതും ആയ 0.1.0 പുറത്തിറക്കി. 2010 ഫെബ്രുവരി 21 ന് ആയിരുന്നു അത്, കോഫീസ്ക്രിപ്റ്റിൽ ശുദ്ധമായ ഒരു പതിപ്പിനൊപ്പം സെൽഫ് ഹോസ്റ്റിംഗ് റൂബി കംപൈലർ പകരം വച്ചിരുന്നു. അപ്പോഴേയ്ക്കും ജിറ്റ് ഹബിൽ നിരവധി മറ്റ് കോൺട്രിബൂട്ടേഴ്സിനേയും ആ പ്രോജക്ട് ആകർഷിച്ചു. പ്രതിദിനം 300 പേജിലധികം ഹിറ്റ് ലഭിച്ചു.

2010 ഡിസംബർ 24 ന്, ആഷെനാസ് പ്രൊജക്റ്റ് ആദ്യമായി ഹാക്ക് ന്യൂസിൽ സൈറ്റിൽ 1.0.0 എന്ന സ്ഥിര പതിപ്പ് പ്രഖ്യാപിച്ചു.

2017 സെപ്റ്റംബർ 18 ന് പതിപ്പ് 2.0.0 അവതരിപ്പിച്ചു. "ആധുനിക ജാവാസ്ക്രിപ്റ്റ് കാലഘട്ടത്തെ ലക്ഷ്യം വച്ചുള്ളതാണ്  കോഫീസ്ക്രിപ്റ്റ്  ഹാൾമാർക്ക് എന്ന വൃത്തിയുള്ള വാക്യഘടന സംരക്ഷിക്കുന്നതിനിടയിൽ ജാവാസ്ക്രിപ്റ്റിനു യോജിച്ച തരത്തിൽ ന്യൂനതകൾ അവസാനിപ്പിക്കുക എന്നതായിരുന്നു. "
## വാക്യഘടന
മിക്കവാറും എല്ലാം കോഫീസ്ക്രിപ്റ്റിൽ ഒരു എക്സപ്രഷനാണ്, ഉദാഹരണത്തിന്, `if`,`switch``for`എക്സ്പ്രഷനുകൾക്കായി (ജാവാസ്ക്രിപ്റ്റിൽ തിരിച്ചെത്തുന്ന മൂല്യമില്ല) ഒരു മൂല്യം മടക്കി നൽകുക. പേൾ പോലെ, ഈ കൺട്രോൾ സ്റ്റേറ്റ്മെന്റുകളിൽ പോസ്റ്റിക്സ് പതിപ്പുകളും ഉണ്ട്; ഉദാഹരണത്തിന്, `if`കണ്ടീഷണൽ പ്രസ്താവനയ്ക്കു ശേഷം എഴുതപ്പെടുകയും ചെയ്യാവുന്നതാണ്. 

അനാവശ്യമായ ബ്രാക്കറ്റുകളും ബ്രേസ്സും ഒഴിവാക്കാവുന്നതാണ്; ഉദാഹരണത്തിന്, കോഡുകളുടെ ബ്ലോക്കുകൾ ബ്രെയ്സിന് പകരം ഇൻഡെന്റേഷൻ ഉപയോഗിച്ച് സൂചിപ്പിക്കാം, ഫംഗ്ഷൻ കോളുകൾ അന്തർലീനമാണ്, ഒബ്ജക്റ്റ് ലിറ്ററലുകൾ പലപ്പോഴും യാന്ത്രികമായി കണ്ടെത്തപ്പെടുന്നു.
## ഉദാഹരണങ്ങൾ
### ഇടവേള പരീക്ഷണം
ബോഡി മാസ് ഇൻഡക്സ് കണക്കുകൂട്ടാൻ, ഒന്ന് ചെയ്യത് നോക്കാം (ഇവിടെ ജാവാസ്ക്രിപ്റ്റിൽ):

```javascript
var mass = 72;
var height = 1.78;
var BMI = mass / Math.pow(height, 2);
if (18.5 < BMI && BMI < 25) alert('You are healthy!');
```

കോഫീസ്ക്രിപ്റ്റ് ഉപയോഗിച്ച് ഇന്റർവെൽ നേരിട്ട് ഇപ്രകാരം വിവരിച്ചിരിക്കുന്നു:

```coffeescript
mass = 72
height = 1.78
BMI = mass / height**2
alert 'You are healthy!' if 18.5 < BMI < 25
```

### ലൂപ്പുകളും കോംപ്രിഹെഷനുകളും
യൂക്ലിഡിയൻ അൽഗോരിതം ഉള്ള രണ്ട് പൂർണ്ണസംഖ്യകളുടെ ഏറ്റവും വലിയ പൊതുഹാരകം കണക്കുകൂട്ടാൻ, ജാവാസ്ക്രിപ്റ്റ് ഉപയോഗിക്കുമ്പോൾ സാധാരണയായി ഒരു ലൂപ്പ് ആവശ്യമാണ്:

```javascript
gcd = (x, y) => {
  do {
    z = x % y
    x = y
    y = z
  } while (y !== 0)
  return x
}
```

കോഫീസ്ക്രിപ്റ്റിൽ അതിന് പകരം ഉപയോഗിക്കാനും പാറ്റേൺ-പൊരുത്തപ്പെടാനും കഴിയും:

```coffeescript
gcd = (x, y) ->
  [x, y] = [y, x%y] until y is 0
  x
```

ഒരു ലൂപ്പിനുള്ള ലിസ്റ്റ്  മനസ്സിലാക്കാൻ കഴിയും; അതിനാൽ പത്തി നെക്കാൾ കുറവായ പോസിറ്റീവ് ഒറ്റ അക്കങ്ങളുടെ സ്ക്വയറുകൾ കണക്കാക്കാൻ കഴിയും (ശേഷിക്കുന്ന സംഖ്യ മോഡുലോ 2 ആണ്), ഒന്ന് ചെയ്യ്ത് നോക്കുവാൻ സാധിക്കുന്നതാണ്:

```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
personCheck = ->
  if not person? then alert("No person") else alert("Have person")
person = null
personCheck()
person = "Ivan"
personCheck()
```

വ്യക്തിയല്ലെങ്കിൽ എങ്കിൽ "ആരുമില്ല" എന്ന അലർട്ട് നൽകുന്നു, വേരിയബിൾ ശൂന്യം അല്ലെങ്കിൽ അനിർവ്വചനീയമായതാണോ  അവിടെ എന്തെങ്കിലും ഉണ്ടെങ്കിൽ "വ്യക്തി ഉണ്ട്" എന്ന് നൽകുയും ചെയ്യുന്നു.
## ഫങ്ഷനുകളും ജെക്വറിയും
ജെക്വറി(JQuery) ലൈബ്രറിയുപയോഗിക്കുന്ന പൊതുവായ ഒരു ജാവസ്ക്രിപ്റ്റിന്റെ ശകലശേഖരം(snippets) ആണ്:

```coffeescript
$(document).ready(function() {
  // Initialization code goes here
})
```

അല്ലെങ്കിൽ പോലും:

```coffeescript
$(function() {
  // Initialization code goes here
})
```

കോഫീസ്ക്രിപ്റ്റിൽ, `function` കീവേഡ് `->` ചിഹ്നം ഉപയോഗിച്ച് പുനഃസ്ഥാപിക്കുന്നു, പൈത്തൺ, ഹാസ്കൽ തുടങ്ങിയ മറ്റ് ഓഫ്-സൈഡ് റൂൾ ഭാഷകളെ പോലെ ഇൻഡന്റേഷൻ ഉപയോഗിക്കുന്നത് വളഞ്ഞ ബ്രെയ്സുകളുടെ സ്ഥാനത്താണ്. കൂടാതെ, ഒരു ഫങ്ഷൻ അല്ലെങ്കിൽ ബ്ലോക്ക് സൂചിപ്പിക്കുന്നതിന് പകരം ഇൻഡന്റേഷൻ ലെവൽ ഉപയോഗിച്ച് ബ്രാക്കറ്റിൽ നിന്ന് ഒഴിവാക്കാവുന്നതാണ്. ഇപ്രകാരം, കോഫീസ്ക്രിപ്റ്റ് മുകളിൽ കൊടുത്തിരിക്കുന്ന സ്നിപ്പെറ്റിന്  തുല്യമാണ്:

```coffeescript
$(document).ready ->
  # Initialization code goes here
```

അല്ലെങ്കിൽ:

```coffeescript
$ ->
  # Initialization code goes here
```

## സ്ട്രിംഗ് ഇന്റർപോളേഷൻ
റൂബി രീതിയിലുള്ള ഇന്റർപോളേഷൻ കോഫീസ്ക്രിപ്റ്റിൽ ഉൾപ്പെടുത്തിയിട്ടുണ്ട്. ഇരട്ട ഉദ്ധരണികൾ സ്ട്രിംഗ്സ് ഇന്റർപോളേറ്റഡ് മൂല്യങ്ങൾക്കായി ഉപയോഗിക്കുന്നത്, # {...} ഉപയോഗിച്ച്, സിംഗിൾ-കോട്ട് ചെയ്ത സ്ട്രിംഗുകൾ അക്ഷരീയമാണ്(literal). 

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

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


## കംപൈലിംഗ്
കോഫീസ്ക്രിപ്റ്റ് കമ്പൈലർ കോഫീസ്ക്രിപ്റ്റിൽ എഴുതിയത് 0.5 മുതൽ നോഡ്.ജെഎസ് യൂട്ടിലിറ്റി ലഭ്യമാണ്. എന്നിരുന്നാലും, കോർ കമ്പൈലർ നോഡ്.ജെഎസി (Node.js)നെ ആശ്രയിക്കില്ല, കൂടാതെ ഏതൊരു ജാവസ്ക്രിപ്റ്റ് സാഹചര്യത്തിലും(environment) പ്രവർത്തിക്കാൻ കഴിയും.നോഡ്.ജെഎസ് യൂട്ടിലിറ്റിക്കുള്ള ബദൽ കോഫി മാവെൻ പ്ലഗിൻ(Coffee Maven Plugin) ആണ്, അപ്പാച്ചെ മാവെൻ നിർമ്മിക്കുന്നതിനുള്ള ഒരു പ്ലഗിൻ. ജാവയിൽ എഴുതപ്പെട്ട റിനോ ജാവസ്ക്രിപ്റ്റ് എഞ്ചിൻ(Rhino JavaScript engine) ഈ പ്ലഗിൻ ഉപയോഗിക്കുന്നു.

കോഫീസ്ക്രിപ്റ്റ്.ഓർഗി(CoffeeScript.org) ലെ ഔദ്യോഗിക സൈറ്റിലെ മെനു ബാറിൽ "കോഫീസ്ക്രിപ്റ്റ് പരീക്ഷിക്കുക" ബട്ടൺ ഉണ്ട്; ഇത് ക്ലിക്ക് ചെയ്യുന്ന ഉപയോക്താക്കൾക്ക് മോഡ് വിൻഡോ തുറക്കാൻ കഴിയും, ഇത് കോഫീസ്ക്രിപ്റ്റ് നൽകുക, ജാവസ്ക്രിപ്റ്റ് ഔട്ട്പുട്ട് കാണുക, ഇത് ബ്രൗസറിൽ നേരിട്ട് പ്രവർത്തിപ്പിക്കാൻ സാധിക്കുന്നു. Js2coffee  സൈറ്റ് ബൈ-ദിശയിലുള്ള വിവർത്തനം നൽകുന്നു.
## ഏറ്റവും പുതിയ കൂട്ടിച്ചേർക്കലുകൾ
* സോഴ്സ് മാപ്പുകൾ ഉപയോക്താവിന് അവരുടെ കോഫിസ്ക്രിപ്റ്റ് കോഡ് നേരിട്ട് ഡി-ബഗ്ഗ് ചെയ്യാനുള്ള അവസരം നൽകുന്നു, പ്രവർത്തന സമയത്തുള്ള പിശകുകളെ കോഫിസ്ക്രിപ്റ്റ് ട്രെയ്സ്ബാക്കുകൾ പിന്തുണയ്ക്കുന്നു.
* .Coffee.md അല്ലെങ്കിൽ .litcoffee ഫയൽ വിപുലീകരണം ഉപയോഗിച്ച്, ലിറ്ററൽ പ്രോഗ്രാമിംഗിന്റെ ഒരു രൂപത്തെ കോഫീസ്ക്രിപ്റ്റ് പിന്തുണയ്ക്കുന്നു. ഇത് മാർക്സ്ഡൗണിൽ എഴുതി നൽകും. കംപൈലർ ഇൻഡെന്റ് ചെയ്ത ബ്ലോക്കുകളുമായി (സോഴ്സ് കോഡ് സൂചിപ്പിക്കുന്ന മാർക്സ്ഡൗൺ വഴി) കോഡായി കണക്കാക്കുകയും, ബാക്കിയുള്ള അഭിപ്രായങ്ങൾ അവഗണിക്കുകയും ചെയ്യും.
## അഡോപ്ഷൻ
2012 സപ്തംബർ 13 ന് ഡ്രോപ്പ്ബോക്സ് തങ്ങളുടെ ബ്രൌസർ സൈഡ് കോഡ് ബേസ് ജാവാസ്ക്രിപ്റ്റിൽ നിന്നും കോഫീസ്ക്രിപ്റ്റിലേക്ക് പകർത്തിയെഴുതിയതായി പ്രഖ്യാപിച്ചു.

ഗിറ്റ്ഹബ്ബി(GitHub)ന്റെ ആന്തരിക ശൈലിയിലുള്ള ഗൈഡ് ഒരിക്കൽ ഇങ്ങനെ പറഞ്ഞു, "കോഫീസ്ക്രിപ്റ്റിൽ പുതിയ ജെഎസ് എഴുതുക" ഒപ്പം, ഇനിമേൽ അത് ചെയ്യുന്നില്ല, സ്റ്റയിൽ ഗൈഡ് റഫറൻസുകളിലെ എല്ലാ ഉപദേശങ്ങളും എങ്ങനെ നല്ല കോഫീസ്ക്രിപ്റ്റ് കോഡ് എഴുതാം, കൂടാതെ അവരുടെ ആറ്റം(Atom) ടെക്സ്റ്റ് എഡിറ്ററും ഈ ഭാഷയിലാണ് എഴുതുന്നത്. 
## വിമർശനം
അസാധാരണമായ സ്കോപ്പിംഗ് നിയമങ്ങൾ കാരണം കോഫീസ്ക്രിപ്റ്റിനെതിരെ വിമർശനം ഉയർന്നിട്ടുണ്ട് .പ്രത്യേകിച്ചും, ഇത് വേരിയബിൾ ഷേഡോയിംഗ് അനുവദിക്കുന്നില്ല, അത് കോഡുകളെക്കുറിച്ച് ന്യായവാദം ചെയ്യുന്നത് ചില അടിസ്ഥാന പ്രോഗ്രാമിങ് പാറ്റേണുകളിൽ കൂടുതൽ ബുദ്ധിമുട്ടുള്ളതും പിശക്-സാധ്യതയുമാണ്, ഇത് സ്ഥാപിക്കപ്പെടുകയും എടുക്കുകയും ചെയ്യേണ്ടതാണ്. പ്രൊസീജറൽ പ്രോഗ്രാമിങ് തത്ത്വങ്ങൾ നിർവചിക്കപ്പെട്ടിരുന്നു.

ഉദാഹരണത്തിന്, ബാഹ്യ സാധ്യമായ `foo` വേരിയബിൾ ആകസ്മികമായി മറികടക്കാനാവില്ലെന്ന് ഉറപ്പുവരുത്താൻ ജാവാസ്ക്രിപ്റ്റ് ഉപയോഗിച്ചുള്ള കോഡ് സ്നിപ്പറ്റ് നോക്കുക `{}`ബ്ലോക്കിനു പുറത്തേക്ക് നോക്കേണ്ടി വരില്ല:

```javascript
// ...
  {
    var foo = "bar";
    console.log(`foo = ${foo}`)
  }
  // ...
}
```

ഒരു വേരിയബിളിന്റെ പരിധി ഒരു ബ്ലോക്കിലേക്ക് പരിമിതപ്പെടുത്തിയിട്ടുണ്ടോ എന്ന് അറിയിക്കാൻ ഒരു മാർഗ്ഗവുമില്ല അല്ലെങ്കിൽ ബ്ലോക്കിന് പുറത്ത് നോക്കാതെ തന്നെ.
## ഇതും കാണുക
* സോഴ്സ്-ടു-സോഴ്സ് കമ്പൈലർ
### ജാവാസ്ക്രിപ്റ്റിലേക്ക് സമാഹരിക്കുന്ന മറ്റ് ഭാഷകൾ

(കാലക്രമത്തിൽ, TIOBE സൂചികയിൽ ലിസ്റ്റുചെയ്തിട്ടുള്ളവ ബോൾഡായി എടുത്തു കാണിച്ചിരിക്കുന്നു.)
* ഹക്സെ (2006): സി++, ജാവ, സി#, പൈത്തൺ, ലൂആ, പി.എച്ച്.പി., ആക്ഷൻപ്ക്രിപ്റ്റ് എന്നിവയിലേക്ക് ട്രാൻസ്ഫർ ചെയ്യാവുന്ന ഒരു ഭാഷ; അതുപോലെ തന്നെ ജാവാസ്ക്രിപ്റ്റും.
*നിം (2008): പൈത്തണിലെ വാക്യഘടനാരീതികളുമായി സാങ്കല്പിക ടൈപ്പ് ചെയ്ത ഒരു പ്രോഗ്രാമിങ് ഭാഷ. ഇതേ നിം കോഡ് സി / സി ++ (ഒപ്റ്റിമൈസുചെയ്ത സിസ്റ്റംസ് പ്രോഗ്രാമിങ്, സെർവർ സൈഡ് മുതലായവ) അല്ലെങ്കിൽ ജാവാസ്ക്രിപ്റ്റിനെ (സ്ക്രിപ്റ്റിങ്, ക്ലയന്റ് സൈഡ്) വ്യാഖ്യാനിക്കുന്നു.
*ലൈവ്സ്ക്രിപ്റ്റ് (2011): പ്രവർത്തന പ്രോഗ്രാമിങ്ങിൽ കോഫീസ്ക്രിപ്റ്റ് പ്രോഗ്രാമിലെ ഒരു പരോക്ഷഘട്ടം.
* ആംബർ സ്മാൾടാക്ക് (2011): ജാവാസ്ക്രിപ്റ്റ് റൺടൈമിൽ പ്രവർത്തിക്കുന്ന സ്മാൾടോക്ക്-80 ഭാഷയുടെ ഒരു നിർവ്വചനം.
***ഡാർട്ട്** (2011): ഓപ്ഷണൽ ടൈപ്പിംഗുള്ള  ഗൂഗിളിന്റെ നേതൃത്വത്തിലുള്ള പൊതുവായ ഉദ്ദേശ്യത്തിലുള്ള OOP ഭാഷ.
***ഓപ**(Opa) (2011): സ്കേലബിൾ ക്ലയന്റ് സെർവർ വെബ് ആപ്ലിക്കേഷനുകൾ വികസിപ്പിക്കുന്നതിനുള്ള സംയോജിത സ്റ്റാക്ക്
***ടൈപ്പ്സ്ക്രിപ്റ്റ്**(TypeScript) (2012): ജാവാസ്ക്രിപ്റ്റിന്റെ മൈക്രോസോഫ്റ്റ് കർക്കശ്ശമായ സൂപ്പർസെറ്റ് ഓപ്ഷണൽ ടൈപ്പിങ്.
***എൽമ്** (2012): ജാവാസ്ക്രിപ്റ്റിലേക്ക് ശേഖരിക്കുന്ന ഒരു സ്റ്റാറ്റിസ്റ്റിക്കൽ ടൈപ്പ് ചെയ്ത ശുദ്ധമായ പ്രവർത്തന ഭാഷ.

## അവലംബം