왜 고전적인 응용 프로그램 개발 (컴파일 된 소프트웨어)에 JavaScript가 사용되지 않습니까? [닫은]


14

자바 스크립트로 웹을 개발하면서 몇 년 동안이 언어는 믿을 수 없을만큼 강력한 언어라는 결론에 도달했습니다.

다음과 같은 다양한 기능을 제공합니다.

  • 동적 타이핑
  • 일류 함수
  • 중첩 함수
  • 폐쇄
  • 메소드로서의 기능
  • 객체 생성자로서의 기능
  • 프로토 타입 기반
  • 객체 기반 (거의 모든 것이 객체 임)
  • 정규식
  • 배열과 객체 리터럴

거의 모든 것이 이러한 종류의 언어로 달성 될 수있는 것처럼 보입니다 .OO 자유 프로그래밍은 많은 자유와 다양한 코딩 스타일을 제공하기 때문에 OO 프로그래밍을 에뮬레이션 할 수도 있습니다.

소프트웨어 지향적 인 사용자 정의 기능 (I / O, 파일 시스템, 입력 장치 등)이 많을수록 응용 프로그램을 개발하는 것이 좋을 것 같습니다.

내가 아는 한, 그것은 웹 개발이나 기존 소프트웨어에서만 스크립팅 언어로만 사용됩니다.

V8 엔진 덕분에 최근에야 다른 종류의 작업에 더 많이 사용되었습니다 (예 : node.js 참조).

왜 지금까지만 웹 개발에만 강등됩니까? 소프트웨어 개발과 다른 점은 무엇입니까?


8
웹 개발이 (특별한 경우) 소프트웨어 개발이 아니라면 정확히 무엇입니까? ...
Péter Török

@ Peter Török : 당신이 요점을 얻는 것 같아요. 내 말은 지금까지 기능을 향상시키기 위해 소프트웨어에서 스크립팅 언어로만 사용했다는 것입니다. 실제로 OS 용 소프트웨어 응용 프로그램을 프로그래밍하는 데 사용 된 적이 없습니다.
Jose Faeti

4
동적 타이핑은 큰 단점으로 간주되며 null 값을 제거하고 싶습니다.
조나스

2
"소프트웨어 개발"이 아닌 "클래식 응용 프로그램 개발"을 의미합니까? 이에 따라 제목을 변경하는 것이 좋습니다.
Doc Brown

2
레코드 창 8을위한 @JoseFaeti는 HTML5 & JS에서 일부 개발을 할 수있게합니다
Raynos

답변:


14

최근 node.js 는 서버 측 개발을 발전 시켰습니다. 이제 개발을 위해 JavaScript를 작성할 수 있습니다.

사실입니다. 역사적으로 개발 언어로 사용되지 않았습니다. 그러나 클라이언트 환경 (사용자 에이전트)에서의 스크립팅도 일종의 개발입니다. 그렇지 않습니까?

내가 많은 웹 블로그에서 듣고 읽은 주된 이유는 사람들이 최근까지 그 힘과 독창성을 알지 못했기 때문 입니다. 이런 일이 일어 났을 때, 아마도 다른 언어들이 그 일을 충분히 잘하고 있었으며, 어떤 것도 병렬화에 대해 생각한 적이 없었을 것입니다.



15

에서 여기 :

나는 모든 실제 주장을 실제 사용 사례에 근거하고 있습니다. 실제적이고 완전하며 흥미롭고 유용한 응용 프로그램에서 사용하는 예제로 백업 할 수없는 반론은 유효하지 않습니다. 다른 사람들이 가진 "언어 데모"를 보았습니다. 프로토 타입과 동적 타이핑이 C #에서보다 몇 줄 더 짧은 예제를 만드는 방법을 자세히 설명하는 블로그 게시물을 보았습니다. 당신이 실제 쓰기 문제에 마이크로 데모와 장난감보다는 코드 . 그래서 여기 JS에 대한 그립이 있습니다.

a) 마술 'this'. 이것이 아닌 경우를 제외하고 이것은 이것입니다. JavaScript는 항상 'this'변수에 대한 적절한 컨텍스트를 잃어 버리는 것을 제외하고는 모든 곳에서 익명 함수를 사용하도록 강요하므로 "var _this = this"와 같은 구피 코드가있는 곳에서 사용합니다. 콜백 또는 다른 함수 내부. 언젠가 나는 이름을 바꾼 'this'를 사용하지 않는 내가 작성하려고하는 함수의 수가 실제로하는 것보다 작다는 것을 맹세합니다.

b) 1 + "1"-1 = 10. 또한 "1"+ 0 = "10". 그렇습니다. 실제로 다른 응용 프로그램의 버그로 인해 숫자로 예상되는 데이터가 문자열로 JSON 파일에서로드 된 결과가 좋지 않은 응용 프로그램에 버그가 발생했습니다. 모든 로딩 코드를 업데이트하여 모든 유형의 변환을 추가해야했습니다. 숫자가되어야 할 때 문자열이나 객체가 아닌 숫자 또는 null이 아닌 숫자가되기를 정말로 기이합니다. 대부분의 측면에서 JavaScript와 매우 유사한 Lua는 추가 및 문자열 연결에 동일한 연산자를 사용할만큼 지연되지 않으므로이 문제를 해결했습니다.

c) 기본적으로 전역 변수. 따라서 변수 선언에 대해 생각할 필요가 없기 때문에 동적 타이핑이 "더 쉬워진다"는 주장을하더라도 JavaScript는 새 식별자 앞에 'var'을 넣어서 해당 인수를 창 밖으로 내 보냅니다. . 그리고 잊어 버리면 조용히 조여줍니다.

d) 수업 대신 시제품. 대규모 응용 프로그램 아키텍처에서 프로토 타입의 고유 한 쓸모없는 문제를 해결하기 위해 자체 클래스 시스템을 연결하지 않는 대규모 실제 JavaScript 응용 프로그램은 거의 없습니다. 동일한 앱은 기본 JavaScript 유형을 확장하기 위해 프로토 타입을 최소한으로 사용합니다. JS는 디자인이 잘못되어 있기 때문에 두 가지 흥미로운 내장 유형조차도 기대했던 기능의 절반이 부족합니다.

e) 가치 별 유형을 만들 수 없음. 이것은 실제로 C ++ / D를 제외한 거의 모든 언어에서 빈번한 문제입니다. JavaScript를 사용하여 WebGL 앱을 작성하는 사람들은 JavaScript에 대한 모든 선형 대수 라이브러리를 살펴보십시오. 3D 앱에서는 스칼라보다 벡터를 거의 더 자주 사용합니다. 앱의 모든 정수가 참조로 전달되어 "a = 1; b = a; b ++"가 a와 b를 모두 2로 만들었다 고 상상해보십시오. 세 개의 작은 구성 요소 벡터는 모두 완전한 객체입니다. 그것들은 참조로 전달됩니다 (사실 WebGL 게임에서 버그의 거의 절반의 원인). 그것들은 대량으로 존재하고 힙 할당되며 가비지 수집되어 GC에 많은 압력을 가하여 간단한 WebGL 게임에서도 GC 일시 중지를 유발할 수 있습니다. 개발자가 어리석게 복잡한 후프를 뛰어 넘어 새 벡터를 만드는 것이 논리적 인 모든 곳에서 새 벡터를 만드는 것을 피하지 않는 한. 연산자 오버로드를 가질 수 없으므로 기본 작업을 수행하기 위해 매우 크고 못생긴식이 있습니다. 개별 구성 요소에 대한 액세스 속도가 느립니다. Float32Array 인스턴스로 구현하지 않는 한 객체는 기본적으로 압축되어 있지 않기 때문에 정점 버퍼로 푸시하는 속도가 매우 느립니다. 그들이 참조로 전달되었다고 언급 했습니까? 개별 구성 요소에 대한 액세스 속도가 느립니다. Float32Array 인스턴스로 구현하지 않는 한 객체는 기본적으로 압축되어 있지 않기 때문에 정점 버퍼로 푸시하는 속도가 매우 느립니다. 그들이 참조로 전달되었다고 언급 했습니까? 개별 구성 요소에 대한 액세스 속도가 느립니다. Float32Array 인스턴스로 구현하지 않는 한 객체는 기본적으로 압축되어 있지 않기 때문에 정점 버퍼로 푸시하는 속도가 매우 느립니다. 그들이 참조로 전달되었다고 언급 했습니까?

f) 내장 기능이 필요하지 않습니다. 진심으로, 여전히. 타사 라이브러리가 존재하지만 거의 모든 라이브러리에는 일종의 버그가 있습니다. 최소한 Chrome에서 실제 개발을 수행하는 데 어려움을 겪는 캐싱 문제는 적어도 엉덩이에 어려움을 겪습니다.

g) 동적 타이핑. 네, 그 주장을 기꺼이 시작하겠습니다. 작은 웹 응용 프로그램이나 웹 페이지 작성을 멈추고 마우스를 한 번만 클릭하거나 요청 / 응답주기보다 오래 지속되는 데이터가있는 큰 응용 프로그램을 작성하기 시작하면 가장 큰 사실을 알기 시작합니다. 나중에 실수로 처리하고 누락 된 메소드 또는 멤버가 실제 실수와 완전히 다른 코드 비트로 인해 충돌이 발생합니다. 즐거운 시간. 예, Java는 정적 입력을 악의적으로 보이게 만듭니다. 아니요, Java / C # / C ++는 정적 타이핑을 수행하는 유일한 방법이 아닙니다. 타입 추론, 암시 적 인터페이스 바인딩 등은 모든 버그없이 다이나믹 한 타이핑의 "처리하기 쉽고 많은 키 입력이 필요없는"이점을 제공합니다. 두 번째로 많이 사용되는 웹 언어 인 ActionScript 3은 실제로 JS / ECMAScript와 동일하지만 정적으로 입력됩니다. 따로, C / C ++ 앱보다 Fedora 데스크톱의 Python 앱에서 더 많은 충돌이 발생합니다 (실제로 데스크톱 크래시의 C / C ++ 앱은 전혀 생각하지 않습니다). 누락 된 멤버 예외 == 앱 개발 및 유지 관리가 훨씬 쉬워졌습니다.

h) 속도. 예, 한 명의 대학생 주니어가 몇 가지로 작성할 수있는 저급 C 컴파일러보다 JS를 거의 절반으로 빠르게 만들기 위해 언어 런타임에 투입된 수많은 수 많은 나쁜 엉덩이 개발자들이 엄청나게 엄청난 노력을 기울였습니다. 개월. LuaJIT은 기본 언어 제한 측면에서 JS와 동일한 보트에 있지만 어쨌든 모든 JavaScript 구현보다 더 잘 수행합니다. V8의 모든 JS 최적화가 실제로 무엇인지 이해하지 못하는 사람들JS가 놀라운 속도로 놀라운 일을 할 수 있다고 주장하고 싶지만 현실은 모든 최적화가 기본적으로 변수의 유형을 파악하기 위해 코드를 분석하는 데 매우 열심히 노력하고 약간 지연된 정적 인 유형으로 컴파일하는 것입니다 언어의 컴파일러가 그렇게 할 것입니다. " 아, 그리고 추적이 있지만 정적 형식의 언어에서도 추적이 작동합니다 (생성 된 기계 코드에서 유형 가드가 필요 없기 때문에 더 잘 작동합니다). 실제로 이러한 whizbang 최적화 중 하나가 JS에 의해 또는 JS를 위해 개발 된 것은 아닙니다. 대부분은 연구용 JVM (Java는 악의입니다!) 또는 고전적인 OOP 언어 (시제품은 대단합니다!)에서 가져 왔습니다.

i) IntelliSense도 가능하지 않습니다. 텍스트 편집기에서 foo.js의 187 행에있는 해당 변수에 어떤 메소드가 있는지 알고 싶습니까? 너무 나쁘다. 코드가 초기화 된 위치를 파악할 때까지 코드를 추적 한 다음 코드를 추적하여 프로토 타입의 내용을 찾으십시오. 그런 다음 프로토 타입을 동적으로 변경하는 코드가 없기를 바랍니다. 사실, 다른 방법으로 값에 대한 유용한 정보를 찾는 것이 JavaScript apologists가 JavaScript의 편리함과 단순성을 영화 롭게하기 위해 사용하는 toy_web_app.html 사이트보다 큰 코드베이스에서는 기본적으로 불가능하기 때문에 브라우저에서 실행하고 중단 점을 설정하십시오. 일부 코드 편집기는 실제로 더 잘하기 위해 열심히 노력하며, 때로는 간단한 경우에 한 번 성공하는 경우도 있습니다.

j) 장점이 없다. JavaScript는 다른 동적 형식 언어와 비교할 때 특별하지 않습니다. Lua, Python, Ruby 등으로는 불가능한 일을 전혀 할 수 없다 언어. JS는 일반적으로 사용 가능한 다른 언어와 비교하여 장점이 없습니다. 플러그인없이 웹 브라우저에서 기본적으로 실행되는 것을 제외하고는. 이것이 세상에서 유일하게 인기가있는 이유입니다. 사실, 그것이 이벤트 인 유일한 이유입니다 가 존재. "10 년 전에 누군가가"잘 설계되고 잘 정립 된 기존 언어를 브라우저에 드롭하고 다른 사람들이 NetScape이 제안한이 구미스러운 작은 hackjob을 사용하도록하는 대신 동일한 작업을하도록하겠습니다. ""오늘날 웹의 모습이 훨씬 달라졌습니다. Chrome에서 지원되는 언어로 Python을 Chrome에 넣은 경우 미래를 상상해보십시오. 또는 실제로 다음과 같이 상상해보십시오. Google은 C / C ++를 지원되는 언어 (http://code.google.com/p/nativeclient/)로 Chrome에 드롭합니다.


이것은 정말 흥미로운 게시물입니다. 그의 논증의 토대를 형성하는 그의 유스 케이스를보고 기뻤습니다. 나는 그의 요점에 동의하지 않지만, 거의 10 년 동안 회사 규모의 JS 응용 프로그램을 개발해 왔으며 그가 언급 한 것 중 일부 (특히, "magic this"에 대한 첫 번째 요점)를 경험하지 못했습니다. 내 경험에 따르면이 게시물의 것과 같은 자바 스크립트에 대한 주장은 전통적인 oop 배경을 가진 사람들이 만드는 경향이 있습니다 ... 그러면 그의 혼란을 이해할 것입니다.
Mr. JavaScript

2016 년에 언어의 진화로 인해 답이 완전히 폐지되었다는 것을 보는 것은 매우 흥미 롭습니다.
Stephan Bijzitter 2016 년

@씨. 자바 스크립트 JavaScript와 그 기능 및 메커니즘을 탐색하는 것이 아니라 실제 문제의 예를 해결하는 데 중점을 둔 일련의 자습서를 알고 있습니까? 키워드 검색에 운이 없습니다. 예를 들어, 상세한 튜토리얼 링크 와 수백만 개의 예제 및 기능을 거치는 대신 GUI 시스템을 작성하여 일부 보험 시스템, 의사 또는 학교 또는 운영 부서를 관리하는 방법에 대한 작은 튜토리얼 저장소를 찾을 수 있습니다. 슈퍼마켓? 감사합니다
Joshua

12

왜?

가장 오해 된 JavaScript

우리는 어려서부터 일반 개발 커뮤니티가 JavaScript가 강력하고 다양한 언어임을 인정해야합니다. 단순히 주류가 아닙니다.

최근의 유일한 발전은 node.js가 화제가되었고 사람들은 javascript가 다른 용도로 사용되기 시작한다는 것입니다.

Windows 8의 JS 및 HTML5 개발에 관심을 기울이고 있으며 .NET 커뮤니티의 반응은 "사랑하는 이유?"였습니다.

웹이 아닌 대부분의 사실은 개발자는 여전히 브라우저에서 메뉴를 스크롤하는 데 사용하는 장난감 언어로 JavaScript를 여전히 사용 .

분명히 JavaScript는 "현대 개발 방식"과 맞지 않습니다. 나를 위해 JavaScript는 여전히 해킹 언어이며 vim으로 크랙하고 인터넷은 내 문서입니다. IDE, 개발 도구, 자동 완성 또는 "지능형", 클릭 앤 드래그 GUI가 없습니다.

Java 및 .NET 개발자는 GUI 및 IDE에 연결되어 있으며 vim에서 프로그래밍 할 수 없습니다.


1
"IDE가없고, 개발 도구가 없으며, 자동 완성 또는"지능형 "이없고, 클릭 앤 드래그 GUI가 없습니다."를 제외하고 동의합니다. 실제로 다양한 IDE를 사용하여 모든 것을 얻을 수 있습니다. 예를 들어 Visual Studio를 사용하며 훌륭합니다.
Jose Faeti

1
@JoseFaeti 죄송합니다. Visual Studio는 자바 스크립트 IDE가 아닙니다. 나는 vim에서 VS2010보다 빠릅니다. 이것은 VS2010이 누설되는 JS IDE임을 의미합니다.
Raynos

2
@Raynos, "VS2010에서 VS2010보다 빠릅니다. 이것은 VS2010이 새는 JS IDE임을 의미합니다." -또는 이것은 단순히 당신이 VS뿐만 아니라 vim을 모른다는 것을 의미합니다.
Péter Török

2
물론 그렇지 않습니다 .Resharper와 LINQ 또는 얇은 jQuery 레이어가있는 ASP.Net MVC 앱을 좋아하기 때문에 Silverlight에서 RIA 프론트 엔드를 만들지 않을 것입니다. 작업에 더 적합합니다.
sa93

1
JavaScript IDE가 있다고 말하는 사람들의 합창에 내 목소리를 추가하십시오. 다른 주장은 솔직히 바보입니다. IDE가 마음에 들지 않고 완벽하지는 않지만 여전히 IDE입니다. 아니면 JS로 작업 할 때 VS의 지능과 코드 완성을 상상하고 있습니까?
Ian Newson 2018 년

10

귀하의 목록에는 파일을 시스템에 쓰는 것과 관련이 없으며 소프트웨어 개발의 큰 부분입니다.

사람들은 JS를 사용하여 웹을위한 사실상의 스크립팅 언어이기 때문에 애플리케이션을 빌드하는 것을 생각하지 않을 것이며, 항상 작업에 적합한 도구를 사용할 것입니다.

Java / .NET / C / C ++에서 사소한 작업 일 때 파일을 작성하기 위해 JS 에이커를 작성해야하는 이유는 무엇입니까?

다른 사람들이 언급했듯이 node.js와 그 라이브러리는 서버 측 작업을 사소하게 만들고 node.js를 대중적으로 만들면서 유지 관리 / 확장 / 빌드가 가능하기 때문에 CV에 대한 기술이 될 것입니다. 그것으로 응용 프로그램.


1
+1은 stdio 라이브러리가 얼마나 중요한지를 완전히 잊었습니다.
Raynos

1
파일 시스템의 경우 로컬 스토리지 API가 있지만 심각한 내구성을 기대할 수는 없습니다. 그러나 파일 시스템에 쓰는 것이 직접적 일 필요는 없으며, 자바 스크립트는 어떤 형태의 스토리지에 쓰는 서버 (LOLCode 또는 C 또는 JS 자체로 작성 됨)를 편안하게 호출 할 수 있습니다.
sa93

1
서버 측에서. C에서 IO를 올바르게 수행하는 경우 NodeJS 파일 API는 C 등으로 간단합니다. 또한 올바른 래퍼가있는 Ajax 호출은 2-3 줄이 될 수 있습니다. MyLib.Ajax.post ( '/ persistence / Something', {data : blahObj})
sa93

@ sa93 브라우저 호스트 환경과 JavaScript를 혼동하지 마십시오. localStorage는 브라우저의 호스트 API입니다. ES5 사양에 정의되어 있지 않습니다.
Raynos

1
@reinierpost Writing files to the file system has been replaced with HTTP POST.게시물을 처리하는 API를 작성하는 경우는 아닙니다.
StuperUser

5

일반적으로 사용되는 대부분의 언어는 더 강력하고 더 잘 설계되었습니다. JavaScript . 언급 한 모든 기능은 전반적으로 더 잘 설계된 Python 또는 Ruby와 같은 다른 동적 언어에서 지원됩니다. 그리고 당신이 언급 한 기능 중 일부는 어쨌든 바람직하지는 않습니다. 선택의 여지가있는 경우 동적 타이핑보다 유형 유추를 선호하는 정적 타이핑을 고려하는 것이 많습니다.

나는 JavaScript를 diss하기 위해 이것을 말하고 있지 않다. 나는 웹을 개발할 때 JS와 함께 일하는 것을 즐긴다. 그러나 객관적으로 보면 JS는 다른 언어와 비교하여 많은 단점이 있습니다.

  • 수많은 수정 불가능한 결함. JS를 처음 개발할 때 많은 실수가있었습니다. 여기에 열거 할 필요가 없으며 잘 문서화되어 있습니다. 모든 언어는 초기 디자인에 실수가있어 나중에 수정됩니다. JS와의 차이점은 언어가 신속하게 개발 및 출시되었으며 브라우저에서 이전 버전과의 호환성 요구로 인해 이러한 실수를 해결할 수 없다는 것입니다.
  • 개선 사항 및 새로운 기능을 도입하기위한 프로세스 속도가 매우 느립니다. 모든 브라우저 공급 업체는 동의해야하며 다양한 정치적 이유로 언어 개발 속도를 늦추고 싶어 할 수도 있습니다. 실제로 JS보다 새로운 언어 인 C #을보십시오. C #이 도입되었을 때는 예를 들어 없었습니다. JS와 같은 클로저 또는 고차 함수이지만, 여러 번 반복 한 후에는 이제 JavaScript 개발자가 부러워 할 수있는 Linq 및 비동기 구문과 같은 기능이 추가되었습니다.
  • 빈곤 표준 라이브러리. Python, Ruby 또는 Java 또는 .net 기반의 모든 최신 언어에는 거의 모든 것이 필요한 광범위한 표준 라이브러리가 있습니다. JS에서는 타사 라이브러리가 없으면 파일을 읽을 수 없습니다. Regex를 언급했지만 모든 현대 언어에는 그와 수천 가지가 더 있습니다.
  • 다른 언어는 몇 가지 JavaScript 장점을 따라 잡았습니다. 10 년 전 자바와 같은 어수선한 정적 언어와 비교할 때 클로저 및 일류 함수와 같은 기능은 강력했지만 동적 및 기능적 언어에는 오랫동안 이러한 기능이 있었으며 꽤 보수적 인 언어 인 Java조차도 Java 8에서이를 추가했습니다.

JavaScript를 다른 현대 언어와 차별화시키는 유일한 기능은 프로토 타입 기반 상속 (클래스 기반이 아닌)이며,이 모델의 장점은 모든 사람이 클래스 기반 상속을 에뮬레이션하는 데 사용하기 때문에 모호합니다.

다른 현대 언어를 선택할 수있는 옵션이 있다면 JavaScript를 선택할 이유가 없습니다. 그것이 당신이 아는 유일한 언어라면 유일한 이유 일 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.