본문 바로가기

Dev.FrontEnd/JavaScript

JavaScript는 세상에서 제일 잘못 이해되고 있는 언어이다. / 자바스크립트란 어떤 언어인가?

Javascript: 세상에서 제일 잘못 이해되고 있는 언어

http://javascript.crockford.com/javascript.html :번역
Douglas Crokford : www.crokford.com

LiveScript, JScript, ECMAScript로 알려져 있는 Javascript는 세상에서 가장 유명한 언어중의 하나이다. 자바스크립트 인터프리터는 세상의 모든 퍼스널 컴퓨터에 설치되어 사용되고 있다. Javascript의 유명세는 WWW 스크립팅 언어의 막중한 책임을 맡고 있기 때문이다.

이런 유명세에도 불구하고, 오로지 몇몇만이 자바스크립트를 매우 좋은 동적 object-oriented 범용 목적의 프로그래밍 언어로 알고 있다. 이게 어떻게 비밀일 수 가 있는가? 왜 이 언어는 이렇게 오해를 받고 있을까?


이름 (The Name)
이름에 사용된 Java라는 접두사는 Javascript가 Java의 subset 또는 덜 호환적인 자바버전과 어떤 관계가 있어 보인다. 이 이름은 혼란을 유발 시키고, 이 혼란으로부터 오해가 발행하고 있다. Javascript는 Java의 인터프리트 언어가 아니다. JavaScript는 인터프리트 언어다. 자바스크립트는 완전히 다른 언어다. 자바가 C와 유사한 만큼 Javascript는 자바와 문법적 유사성을 가지지만 Javascript는 Java의 subset이 아니라 오히려 C의 Subset이다.  Javascript는 Java가 원래 의도 했던것 보다 더 잘 동작한다.

Javascript는 자바의 고향인 Sun Microsystems가 개발 하지 않았다. javascripts는 Netscape에 의해서 개발 되었다. 원래는 LiveScript라 불리었는데 오히려 그 이름이 혼란을 불러 일으키지 않는다.


C의 옷을 입은 Lisp (Lisp in C's Clothing)
Javascript와 같은 C-like 문법은 중괄호와 for 문장을 가지고 있어서 일반적인 절차적 언어처럼 보이게한다. Javascript는 Lisp나 Scheme처럼 C나 Java보다 더 일반적인 Functional (함수적 언어) 언어이다. 리스트보다 배열을 가지고 있고, 속성 리스트 대신 오브젝트를 가지고 있다. 함수 하나만으로 클래스이며, 모든 균형이 맞추지 않고도 끼워 넣을 수 있다.


타입변환(Typecasting)
Javascript는 Netscape 네비게이터에서 동작되도록 고안되었다. 이것은 모든 웹브라우저에 성공적인 표준 장비가 되었다. 이건 형변환의 결과이다. Javascript는 프로그래밍 언어의 George Reves이다. Javascript는 웹과 관계가 없는 큰 클래스에도 잘 들어 맞는다.


움직이는 표적 (Moving Target)
첫번째 버전의 Javascript는 매우 빈약했다. 상속과 내부함수와 예외 처리에서 난파되어 버렸으나 현재에 와서 완벽하게 object-oriented 프로그래밍 언어가 되었다. 하지만 많은 경우에는 불완전한 형태에 기반하고 있다. ECMA committee 는 Javascript의 확장을 개발하는 선의의 책무를 맡았지만 , 자바스크립트의 가장 큰 문제는 너무 많은 버전이 존재하고 있다는 것이었고, 이것이 혼란을 만들어 내고 있다.


디자인상의 에러들(Design Errors)
완벽한 언어란 없다. Javascript도 디자인상의 에러들을 가지고 있다. + 연산자를 오버로딩 하는 것이 더하기와 연결 둘 다를 의미하는 것, with 문구로 부터 발생되는 에러는 무시 될 것이다. 예약어 정책은 너무 엄격하며, 세미콜론 삽입은 문자 정규 표현식과 마찬가지로 크나큰 실수였다. 이 실수들은 프로그래밍 에러들을 유발하며, 언어 디자인의 전반적인 문제라고 일컬어 졌다. 다행스럽게도, 이런 많은 문제들은 좋은 교정 프로그램으로 인해서 해소 되었다.

언어디자인 문제는 조용해 졌다. 놀랍게도 ECMAScript committee는 이런 문제를 바로 잡는데 흥미를 보이지 않았으며, 아마도 새로운 것을 만드는 데 빠져 있을 것이다.


형편없는 구현들(Lousy Implementations)
몇몇의 초기에 Javascript로 구현된 것들은 버그 투성이다.
이것이 언어를 나쁘게 보이게 했다.
이것들로 조합된 구현들이 최악의 버그투성이 인채로 웹브라우저들에 삽입되었다.


나쁜책들(Bad Books)
많은 Javascript 책들은 지독하게 개판이다. 에러를 담고 있으며, 저질 예제, 저질 연습을 가르친다.
매우  빈번하게 중요한 요소들을 잘못 설명 하였으며, 방치하였다.
나는 수십권의 Javasript책들을 리뷰했으며,
내가 유일하게 추천하는 책은 JavaScript: The Definitive Guide (5th Edition) by David Flanagan 이다.
(저자들에게 : 당신이 좋은 책을 쓴 것이 있다면, 리뷰할 수 있게 나에게 보내 달라)



스탠다드의 부분 스탠다드(Substandard Standard)
공식적인 언어 정의는 ECMA에서 공표되어 진다.
정의는 극강 최악의 품질을 보인다. 읽는 것도 이해하는 조차도 어렵다.
이 것은 나쁜 책 문제에 일조 했다.
저자들이 언어를 이해하도록 도움을 주지도 못했으며, 표준 문서로 사용할 수도 없었다.
ECMA와 TC39 위원회는 깊이 반성해야 한다.


아마추어들(Amateurs)
프로그래머가 아닌 모든 사람들이 Javascript를 작성한다.
그들은 좋은 프로그램을 작성하는 훈련과 연습이 안된 사람들이다.
Javascript는 그들이 사용할 수 있는 매우 많은 표현력을 가지고 있다.
어쨋든, 이 말은 아마추어들에게 해당 되는 것이지 프로페셔널 프로그래밍에 맞지 않는다.


Object-Oriented
JavaScrpt가 Object-Oriented 인가? 오브젝트는 행위와 관련된 특정 데이터와 메소드를 담을수 있다.
오브젝트는 다른 오브젝트를 담을수 있다.
Javascript는 클래스들을 가지고 있지 않지만 클래스처럼 생성자를 가지고 있다.
class-oriented 상속을 가지고 있지 않지만 원형 상속을 지원한다.
이 두가지 방법으로 오브젝트 시스템을 구축한다.
상속(is-a) , 집합(has-a) , Javascript는 둘다를 지원하지만, 태생적으로 집합을 더 잘 지원한다.

Javascript가 진정한 객체지향이 아니라는 몇 가지 논쟁은 정보은폐 Infroamtion hiding 를 못 한다는데서 비롯된다.
그 말은 private 값과 , private 메소드가 없다는 말이다.
Javascript의 모든 멤버는 public 이다.

하지만 Javascript는 private values와 private 메소드를 가질 수 있는 것으로 밝혀졌다.(http://www.crockford.com/javascript/private.html)
물론  Javascript가 세상에서 가장 잘못 이해되고 있는 언어이기 때문에 소수만이 이 사실을 이해하고 있다.

Javascript가 진정한 객체지향이 아니라는 몇 가지 논쟁은 상속을 지원하지 않는다는 것도 포함된다.
Javascripts는 고전적인 상속을 지원하지는 못하지만 코드 재사용 패턴은 잘 지원하고 있다(http://javascript.crockford.com/inheritance.html)




#문제가 될 시 삭제하겠습니다.

번역이 적지 않은 오류가 있을 수 있습니다.