Tôi có bao giờ có thể mã mã trình duyệt phía máy khách bằng ngôn ngữ mà tôi chọn không? [đóng cửa]


15

Tôi sẽ thành thật một cách tàn nhẫn: Tôi ghét viết mã phía máy khách bằng JavaScript. Tôi không phải là một fan hâm mộ của ngôn ngữ này, để nói rằng ít nhất.

Đối với tôi, có vẻ ngớ ngẩn khi các trình duyệt hỗ trợ ngôn ngữ lập trình , thay vì máy ảo trung gian (như CIL hoặc JVM). Loại thứ hai sẽ cho phép các lập trình viên viết bằng ngôn ngữ mà họ lựa chọn (ở một mức độ nào đó), thay vì bằng một ngôn ngữ được cài đặt sẵn cố định. Ngôn ngữ này có thể phát triển nhanh hơn, bởi vì chỉ thay đổi đối với CIL / JVM / bất cứ điều gì sẽ yêu cầu mọi trình duyệt chính nâng cấp. Các tính năng ngôn ngữ có thể được thêm vào mà không ảnh hưởng đến trải nghiệm trình duyệt cũ.

Tiết kiệm lớn của nỗ lực mà langau trung gian mang lại đã được biết đến . Có bất kỳ sáng kiến ​​nào ngoài kia để thúc đẩy "kịch bản" trình duyệt trong một cái gì đó không phải là JavaScript và đặc biệt là trong một máy ảo đã được thiết kế, phát triển và tối ưu hóa không? Họ có động lực gì không?


Câu trả lời:


11

Để trả lời câu hỏi của bạn, vâng, có những nỗ lực được thực hiện để loại bỏ Javascript để ủng hộ một ngôn ngữ gắn kết hơn cho kịch bản web. Google đã đặt rất nhiều lực đẩy đằng sau họ Dart ngôn ngữ. Dart có VM riêng đã được nhúng vào Chrome, nhưng tôi không chắc các trình duyệt khác đã chấp nhận nó chưa. Ngoài ra còn có một ngôn ngữ khá hứa hẹn được gọi là CoffeeScript .

Ngoài ra còn có một dự án tìm kiếm rất tham vọng có tên HaXe nhằm mục đích hợp nhất một loạt các nền tảng phát triển với một ngôn ngữ duy nhất ..

Hãy tin tôi rằng bạn không đơn độc trong việc không thích Javascript, nhưng tôi sợ rằng nó sẽ không đi đến đâu cả - thực tế nó dường như đang đạt được nhiều động lực với các ứng dụng HTML5 / JS của Windows 8, v.v., nhưng các lựa chọn thay thế như tôi đề cập đến đang bắt đầu mọc lên :)


9
Hợp nhất mọi thứ thành một ngôn ngữ hoàn toàn trái ngược với những gì mong muốn. Nó chỉ khiến bạn gặp tình huống như bây giờ, chỉ với một ngôn ngữ khác thay vì JavaScript. Vấn đề là các nỗ lực hiện có nên được xây dựng dựa trên: IL / CLR đã được thiết lập tốt, đã có JITters hiệu suất cao cho hầu hết các nền tảng và một số trình biên dịch đã biên dịch một số ngôn ngữ vào đó. Để đưa web vào thế kỷ 21, các trình duyệt cần phải sử dụng điều đó, thay vì liên tục cố gắng nướng những thứ mới của riêng họ và bắt đầu từ đầu.
Timwi

3
@Timwi, CIL quá nặng và có quá nhiều sự quan liêu trong đó. Sẽ không có ý nghĩa gì khi đính kèm một tệp mã byte đầy đủ, cồng kềnh với một lớp chuyên dụng và tất cả siêu dữ liệu cồng kềnh cho mỗi onSomethingtrình xử lý sự kiện - phân tích và giải thích 10-20 ký tự của ngôn ngữ kịch bản đơn giản sẽ hiệu quả hơn nhiều.
SK-logic

1
@ SK-logic: Bạn dường như có một bức tranh hoàn toàn sai về CIL và nói chung về mã byte. Tôi không biết điều gì sẽ khiến bạn nghĩ rằng siêu dữ liệu nhị phân là kiểu cồng kềnh, có thể so sánh với một cú pháp cấp cao như JavaScript. Trên hết, tôi không có lý do tại sao những người xử lý sự kiện trên mỗi cái gì đó Các chương trình C # rõ ràng không biên dịch thành nhiều hội đồng cho mọi trình xử lý sự kiện.
Timwi

1
@Timwi, tôi đang ăn ECMA-335 cho bữa sáng, vì vậy tôi biết rất rõ CIL cồng kềnh như thế nào. Các nút DOM thường được tạo động. Không có cách nào để thêm một cái gì đó vào một mô-đun hiện có trong CIL - bạn phải xác định một mô-đun mới. Và bạn không thể thêm vào một lớp - bạn phải xác định một lớp mới (với siêu dữ liệu cồng kềnh được đính kèm). Và chỉ cần so sánh chi phí đọc, JIT và thực thi CIL để phân tích cú pháp, thực thi và loại bỏ ngay một chuỗi văn bản nhỏ. Có nhiều trường hợp trong đó một diễn giải ad hoc là một cách hiệu quả hơn nhiều so với bất kỳ loại biên dịch nào.
SK-logic

2
@Timwi, bạn đang đề xuất sử dụng mã byte làm mẫu số chung và định dạng giao tiếp, phải không? Quan điểm của tôi là đặc điểm kỹ thuật hiện tại của CIL là khá vô dụng. ExpandoObject là không liên quan. Và quan điểm của bạn về phân tích cú pháp phức tạp bị che khuất. Mô-đun CIL chứa bảng tham chiếu lắp ráp riêng, bảng mã thông báo siêu dữ liệu và chỉ sau đó các lớp và phương thức. So sánh nỗ lực cần thiết để đọc và JIT tất cả những thứ cồng kềnh này với việc diễn giải một chuỗi ngôn ngữ cấp cao tầm thường. Chi phí phân tích gần như bằng không ở đây. Chỉ cần thử cả hai cách tiếp cận và so sánh bản thân.
SK-logic

5

Bản thân Javascript có thể được xem như là một ngôn ngữ trung gian, xác định một máy ảo mà các ngôn ngữ khác có thể được biên dịch. Trong các dự án như GWT, khái niệm này đã được thực hiện. Nó có thể không phải là những gì bạn thiết kế từ đầu, nhưng nó đã trở thành hiện thực mà bạn có thể biên dịch "ngôn ngữ yêu thích của bạn" thành Javascript.


5

Về cơ bản, không. Bạn đang bị mắc kẹt với Javascript.

Phải nói rằng, trong quá khứ đã có những nỗ lực để đưa các ngôn ngữ khác lên máy bay (java applet, vbscript, v.v.) Mỗi ​​thứ này không bao giờ thực sự đạt được sức hút mà javascript có vì javascript được tích hợp .

Cách duy nhất để xây dựng những gì bạn đang đề cập là tạo một ngôn ngữ kịch bản chạy trên máy ảo, phía máy khách được biên dịch và sau đó được thực thi. Sau đó, mỗi trình duyệt sẽ phải triển khai máy ảo thành cơ sở mã riêng để tất cả mã chạy trên tất cả các trình duyệt. Sau đó, bạn phải đảm bảo có một số loại tiêu chuẩn để tất cả các trình duyệt thực hiện các lệnh theo cùng một cách. Tất nhiên, các trình duyệt được tạo độc lập, có lẽ sẽ có những điều kỳ quặc mà các nhà phát triển sẽ phải ghi nhớ.

Nhưng bây giờ chúng tôi chỉ mô tả Javascript.

Vì vậy, cuối cùng, lựa chọn của bạn là:

  1. làm quen với Javascript
  2. hãy thử sử dụng một số ngôn ngữ biên dịch thành Javascript. (Hãy nhớ rằng bạn vẫn sẽ muốn xác minh Javascript, đưa trở lại tùy chọn 1.)
  3. sử dụng ngôn ngữ tồn tại dưới dạng trình cắm cho trình duyệt, chẳng hạn như Actioncript (Flash), ActiveX, java applet, .Net (SilverLight). Điều này tránh được vấn đề với nhiều nhà cung cấp / triển khai ngôn ngữ, nhưng không tích hợp ngôn ngữ.

Về cơ bản, nếu bạn muốn một ngôn ngữ tích hợp, bạn bị mắc kẹt với Javascript.


2
Một lựa chọn khác là sử dụng ngôn ngữ biên dịch thành javascript và sử dụng ngôn ngữ đó.
Jetti

@Jetti Bạn đang nghĩ về CoffeeScript ? Đó là phương châm - đó là "Quy tắc vàng" khi họ gọi nó - là "Đó chỉ là Javascript" . Nhưng nếu bạn đang viết một cái gì đó chủ yếu là Javascript, bạn không thực sự viết Javascript sao? Nó giống như lập luận rằng jQuery không phải là javascript vì nó sạch hơn và dễ sử dụng hơn.
Richard


@Jetti Có lẽ họ sẽ làm việc ổn. Nhưng với sự khó hiểu của hỗ trợ nhiều trình duyệt, tôi sẽ lo lắng về việc đề xuất bất kỳ thứ nào trong số đó và không xác minh javascript được tạo thực tế.
Richard

1
Ngoại trừ javascript là một ngôn ngữ trung gian hoàn toàn khủng khiếp và rất khó để thực thi một cách nhất quán.
Milind R

4

Trong thực tế, bạn không ghét javascript, như được mô tả trong các tiêu chuẩn Ecma, nhưng bạn ghét việc triển khai khủng khiếp trên các trình duyệt khác nhau , với các quirks, lỗi và wtfs. Javascript phía máy chủ thực sự khá thú vị. Ngoài ra, Mô hình DOM là nguyên nhân gây ra 80% nỗi đau của javascript phía máy khách.

Nếu bạn vẫn muốn sử dụng ngôn ngữ khác, bạn có thể sử dụng GWT , về cơ bản cho phép bạn viết Java, sau đó biên dịch nó thành javascript (xấu xí), hoặc CoffeeScript , là một cú pháp cú pháp qua JS, biên dịch thành JS.


9
Tôi không thể nói cho romkyns, nhưng tôi ghét chính JavaScript ( ngoài các vấn đề bạn đã đề cập). Nó không hướng đối tượng, không có kiểu gõ tĩnh, không xử lý lỗi hữu ích và không có khung hữu ích của chức năng hiện đại. Nó cũng không nhất quán và khó sử dụng. Và nhân tiện, tính năng bị ghét nhất của JS, chèn dấu chấm phẩy, trong tiêu chuẩn ECMA.
Timwi

1
@Timwi, đó là chức năng dựa trên và bạn có thể viết mã OO nếu bạn muốn. Gõ tĩnh là tốt, nhưng nếu mã của bạn được viết tốt (các hàm nhỏ, phạm vi phù hợp), thì hiếm khi đó là một vấn đề. Đối với chèn dấu chấm phẩy, tôi thấy đó là một phiền toái nhẹ. Nó chỉ cắn tôi một lần, bởi vì tôi có sự trở lại và mở {một đối tượng trên các dòng khác nhau. "Khung chức năng hiện đại" nào bạn thấy thiếu?
CaffGeek

2
Bản thân JavaScript không phải là ngôn ngữ tốt nhất ngoài kia (nói một cách lịch sự). Tôi không quan tâm đến những thứ hướng đối tượng (càng ít - càng tốt), về hệ thống kiểu động của nó (thật sự cần thiết cho một ngôn ngữ kịch bản loại này, không may), nhưng sự hiện diện của các câu lệnh và thiếu đúng danh sách và bộ dữ liệu là gây phiền nhiễu. Cả để viết bằng JavaScript và để thực hiện các trình biên dịch nhắm mục tiêu JavaScript.
SK-logic

2
@Timwi: bạn đang thấy không định hướng objet là một điều xấu, trong khi không phải lúc nào cũng như vậy. Xin đừng xem OOP là viên đạn bạc của các mô hình phát triển. Cách tiếp cận chức năng, như JS hay Scala cũng rất tuyệt. Bạn có thể có OOP trong JS, nhưng sự khác biệt chính là đó là lập trình dựa trên Nguyên mẫu, thay vì lập trình dựa trên Lớp. OOP là một tên rộng và không giới hạn đối với Java / C #. Dựa trên nguyên mẫu khác với dựa trên Class và được sử dụng tốt, nó mạnh mẽ như dựa trên Class.
Clement Herreman

2
@ClementHerreman: JavaScript không giới hạn ở phía máy khách, nhưng cuộc thảo luận này là về phía máy khách. JavaScript được giới hạn dựa trên nguyên mẫu, đó là một nhược điểm so với IL mà sẽ cho phép bạn sử dụng khá nhiều bất kỳ ngôn ngữ nào.
Timwi

2

Câu hỏi này bật lên theo thời gian.

Tại sao chúng ta không có ngôn ngữ khác trong thẻ script thay vì chỉ Javascript

Ngày trước IE đã giới thiệu VB như một giải pháp thay thế cho Javascript. Tôi nghĩ rằng bạn đã có thể thấy điều này sẽ dẫn đến địa ngục tiêu chuẩn như thế nào nếu nó bắt kịp ...

Vậy tại sao không phải là một ngôn ngữ trung gian tiêu chuẩn phổ biến sau đó?

Có một podcast cũ từ Brendan Eich giải thích lý do tại sao anh ta không thấy một ngôn ngữ mã byte trung gian trong tương lai gần:

http://www.aminutewithenamendan.com/pages/20101122

http://news.ycombinator.com/item?id=1893686

Vấn đề cơ bản là trong khi ngôn ngữ trung gian (như CIL & JVM bytecodes) cố gắng chung chung, phần lớn thời gian chúng hóa ra quá thấp và quá ràng buộc với các ngôn ngữ cấp cao ban đầu được biên dịch cho chúng. Ví dụ, bạn thực sự không thể triển khai các hàm đệ quy đuôi trong JVM - những tính năng ngôn ngữ hoặc lựa chọn triển khai nào khác mà chúng ta sẽ không thể thực hiện nếu chúng ta kết hợp với một sự trừu tượng hóa mã mức thấp quá sớm?

Trong khi đó, Javascript là một ngôn ngữ cấp cao linh hoạt với ngữ nghĩa được thiết lập sẵn và nhiều triển khai hiệu quả, khác nhau. Những gì chúng ta có thể thấy trong tương lai là chính Javascript như một ngôn ngữ trung gian - Thật không may, điều này hơi non nớt và ít ngôn ngữ được biên dịch thành JS như ngày nay.


Nhưng đối số này áp dụng cho JavaScript cũng giống như đối số với JVM và CIL, phải không? :) Điều duy nhất dành cho JavaScript là nó đã được tất cả các trình duyệt hỗ trợ.
Roman Starkov

Vấn đề là tinh tế hơn - Javascript được mô tả ở cấp độ cao hơn sau đó hầu hết các ngôn ngữ trung gian để việc triển khai có nhiều chỗ để lựa chọn hơn để làm gì. (Tất nhiên, đây không phải là tất cả một biển hoa hồng - Tôi chỉ muốn chỉ ra rằng chúng tôi không là người đầu tiên nghĩ về một IL cho web và rằng nó không phải là đơn giản)
hugomg

1

Đúng. Bạn đã có thể biên dịch Dart, Coffeescript và Java thành Javascript. Bạn có Emscripten, đây là phần phụ trợ của trình biên dịch cho LLVM để tạo mã byte Javascript (và LLVM xử lý khá nhiều ngôn ngữ, tôi tin vậy).

Nhưng khác với việc biên dịch sang JS, không phải trong một khung thời gian ngắn. IE6 đã 10 tuổi và vẫn còn đá. Tôi hy vọng rằng các trình duyệt hiện tại (không hỗ trợ các ngôn ngữ khác) sẽ tồn tại quá lâu, nhưng chúng sẽ tồn tại trong một vài năm, gây ra chu kỳ cắn đuôi "chúng tôi vẫn phải hỗ trợ các trình duyệt chỉ hỗ trợ Javascript, vì vậy chúng tôi phải sử dụng Javascript ", theo cách khó hơn nhiều so với nói CSS3 - trang web của bạn có thể hoạt động mà không có CSS3, nhưng hãy thử làm cho nó hoạt động mà không có kịch bản phía máy khách.


0

Bạn có thể gặp may mắn. Đây là đoạn mở đầu của một bài nộp trên diễn đàn webkit-dev:

Nhiều ngôn ngữ biên dịch thành JavaScript ngày nay để chạy trên web. Thay vào đó, chúng tôi đã thử nghiệm cho phép các thời gian chạy ngôn ngữ khác nhau trong WebKit chạy trong các trang web cùng với JavaScript ...

Bạn có thể xem phần còn lại của tin nhắn ở đây .


0

JavaScript là linh hồn của các trình duyệt, đó là lý do tại sao phần lớn các nỗ lực mới đang tạo JavaScript (CoffeeScript là một ví dụ rõ ràng).
Trong GWT, bạn mã hóa logic phía máy khách của mình bằng ngôn ngữ lập trình Java và bộ công cụ tạo JavaScript.

ClojureScript là một dự án thú vị nếu bạn đang viết mã Lisp.

Vì vậy, có vẻ như không có vấn đề gì, JavaScript vẫn ở đây. (Có thể là COBOL của web không?).


0

"Bất kỳ khách hàng nào cũng có thể có một chiếc xe sơn bất kỳ màu nào mà anh ta muốn miễn là nó có màu đen." -- Henry Ford

Đã có một số trình biên dịch nhắm mục tiêu javascript và bạn có thể chọn bất kỳ ngôn ngữ nào biên dịch thành javascript.

Liên kết của bạn thảo luận về giá trị của các ngôn ngữ trung gian thảo luận về chúng trong bối cảnh triển khai bộ trình biên dịch, không phải trong việc cung cấp mã sẽ được chuyển qua mạng và chạy trên máy khách. Javascript có thể không phải là định dạng tốt nhất cho điều đó, nhưng dù là gì đi nữa, nó sẽ không giống với mã byte CIL hoặc java.

Nếu bạn ghét javascript, tôi khuyên bạn nên chuyển sang không gian phát triển nhúng, khoa học hoặc trò chơi, trong đó C, Fortran và C ++ cai trị con gà trống. Dòng ứng dụng kinh doanh chuyển sang web rất nhiều và điều đó có nghĩa là nhiều Javascript hơn chứ không phải ít hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.