Một JavaScript nhanh hơn, gọn hơn cho máy tính khoa học: tôi nên giữ những tính năng nào?


8

Ở đây tôi thực sự quan tâm đến việc hạ thấp các rào cản đối với giáo dục toán học.

Mục tiêu:

Tôi muốn thấy được tạo cho cộng đồng JavaScript, tương đương với các thư viện tính toán hiệu năng cao và khoa học dựa trên Python (các danh sách tuyệt vời có sẵn thông qua Sage và mặt khác ). Và tôi muốn điều đó, vì tôi muốn giúp những người học JavaScript dễ dàng tiếp cận với máy tính số và khoa học mà không cần phải học Python (& company). (Tôi biết việc học Python rất dễ, vì về cơ bản tôi đã làm được điều đó vào một lúc nào đó, nhưng điều này cho thấy rằng có lẽ sẽ dễ dàng biên dịch một số tập hợp con hạn chế của JavaScript sang Python.)

Phương pháp giả thuyết:

Tôi chủ yếu quan tâm đến một ngôn ngữ mới với sự khác biệt tối thiểu so với JavaScript, bởi vì thị trường ("trình biên dịch con người") tôi đang nhắm mục tiêu là các lập trình viên đã biết JavaScript. Điều tôi muốn nhắm mục tiêu vào những người đó là cung cấp cho họ một ngôn ngữ khác biệt tối thiểu để viết mã biên dịch sang C nhanh hơn, theo cách mà RPython và Cython làm cho Python. Tôi sẵn sàng cung cấp nhiều tính năng JavaScript, tôi chỉ muốn cẩn thận thêm một số tính năng tối thiểu trở lại. Tôi chắc chắn sẽ xem xét Lua, Dart, ECMA Harmony (không có ngày phát hành chính thức hoặc tôi nhầm?), v.v. vì đây đều là những điểm tương đồng gần với các triển khai JavaScript hiện đại (2012).

Động lực đáng ngờ:

Cá nhân tôi sẵn sàng học bất kỳ ngôn ngữ / bộ công cụ nào giúp mọi việc được hoàn thành nhanh hơn (bản thân tôi đang học Erlang), nhưng ở đây, tôi đặc biệt quan tâm đến việc hạ thấp thanh (xin lỗi) cho những người khác có thể không có sẵn sàng Đây chỉ là một trong những điều "muốn có bánh của tôi và cũng ăn nó, vì vậy tôi sẽ dành thời gian nghiên cứu vấn đề". Tôi có rất ít kinh nghiệm trước đây về thiết kế ngôn ngữ máy tính, nhưng từ quan điểm của hệ sinh thái hack, vấn đề có vẻ đủ thú vị để nghiên cứu, vì vậy, tôi hy vọng sẽ sớm làm được điều đó.


5. Sử dụng các ký hiệu thay vì chuỗi cho tên phương thức.
Dave Clarke

4
Câu hỏi này không hợp lý có thể trả lời trong trạng thái hiện tại của nó. Tôi khuyên bạn nên đọc faq của chúng tôi ; câu hỏi của bạn rất rộng và kết thúc mở, và đọc giống như một lời ca ngợi chống lại sự chậm chạp nhận thức của JavaScript hơn là một nỗ lực thực sự nhằm làm cho một cái gì đó tốt hơn. Tuy nhiên, có những câu hỏi hợp lệ ẩn giấu ở đây và tôi khuyến khích bạn cải thiện câu hỏi của mình để có thể mở lại. Đừng để bóng lăn, câu trả lời thuộc về câu trả lời. Tránh đặt quá nhiều giả định cá nhân vào câu hỏi của bạn, câu hỏi khách quan sẽ nhận được câu trả lời khách quan hơn.
Gilles 'SO- ngừng trở nên xấu xa'

2
Điều chính còn thiếu trong câu hỏi của bạn là mục tiêu của bạn. Bạn muốn tốc độ và bạn muốn có sự tương đồng với Javascript; Bạn chuẩn bị gì để hy sinh? Ngôn ngữ của bạn nên làm gì? Khả năng tương thích mã nguồn với Javascript có quan trọng không? Bạn có muốn liên kết với mã hiện có không? Trường hợp sử dụng ngôn ngữ của bạn là gì? Rất nhiều mã Javascript được tải động, rất gần với việc có eval; ngôn ngữ của bạn nên có điều này? Bạn chủ yếu nhắm đến việc biên dịch mã máy, VM hay giải thích? Những loại hệ thống tĩnh nào bạn hình dung?
Gilles 'SO- ngừng trở nên xấu xa'

2
Cảm ơn đã chỉnh sửa, câu hỏi có thể trả lời được (rộng và chủ quan, nhưng tôi nghĩ không quá nhiều) bây giờ chúng tôi biết mục tiêu của bạn là gì. Thật không may, dường như không ai nhận thấy chỉnh sửa của bạn cho đến bây giờ; Tôi hy vọng câu trả lời vẫn có thể hữu ích. Xin lưu ý rằng để ai đó được thông báo rằng bạn đã trả lời nhận xét của họ, bạn cần sử dụng @ký hiệu trước tên của họ (ví dụ @Gilles- và viết đúng chính tả) - nhấp vào helpnút gần hộp nhập bình luận để biết thêm thông tin.
Gilles 'SO- ngừng trở nên xấu xa'

1
"Tôi có rất ít kinh nghiệm trước khi thiết kế ngôn ngữ máy tính". Bạn nên sửa nó trước. Không có hành vi phạm tội cá nhân, nhưng chúng tôi đã có một loạt các nhà thiết kế ngôn ngữ nghiệp dư tràn ngập thị trường với những sáng tạo phụ. Hãy là một phần của giải pháp, không phải là vấn đề
vườn

Câu trả lời:


7

Nếu bạn muốn sử dụng JavaScript cho máy tính khoa học, tại sao không thử Node.js ? Node dựa trên công cụ V8 của Google với một số chức năng bổ sung để tương tác với hệ thống tệp, viết máy chủ và liên kết với thư viện C và C ++ (đây chắc chắn không phải là danh sách đầy đủ). Nó có thời gian thực hiện nhanh và cung cấp bảng điều khiển tương tác cũng như cách thực hiện các chương trình của bạn từ dòng lệnh. Tôi thấy nhận xét của @ DaveClarke về Python hoạt động như "mã keo" thú vị vì từ ngữ. Đây là một đoạn trích từ tài liệu Node về addons :

Addon là các đối tượng chia sẻ được liên kết động. Họ có thể cung cấp keo cho các thư viện C và C ++.

Node cũng có một trình quản lý gói tuyệt vời được gọi là NPM, giúp bạn dễ dàng chia sẻ các mô-đun khoa học mà bạn đã viết. Kho NPM đã chứa một số mô-đun khoa học, chẳng hạn như "tự nhiên" (để xử lý ngôn ngữ tự nhiên) hoặc "clusterfck" (một thư viện phân cụm). Chắc chắn có nhiều thư viện khác ngoài kia cho nhiều ứng dụng.

Điều tuyệt vời về giải pháp này là bạn sẽ không phải sửa đổi JavaScript hoặc tạo một ngôn ngữ mới. Cú pháp về cơ bản là giống nhau, nhưng mã của bạn không cần trình duyệt để thực thi. Nếu bạn có kế hoạch theo dõi với nút, bước đầu tiên tốt có thể là bắt đầu tạo các addon cho các thư viện khoa học nguồn mở hiện có được viết bằng C và C ++ hoặc bạn có thể chuyển chúng sang JavaScript. Tôi đã thực sự suy nghĩ về việc sử dụng nút cho lập trình khoa học ngày hôm nay, đó là điều dẫn tôi đến câu hỏi này. Sẽ thật tuyệt khi thấy các công cụ mạnh mẽ hơn như bạn tìm thấy trong Python.

Ban đầu tôi có các liên kết đến tự nhiên và clusterfck, nhưng tôi không có đủ đại diện để đăng chúng. May mắn thay, chúng là kết quả đầu tiên nếu bạn google "nút clusterfck" và "nút tự nhiên".


Cảm ơn @ JasonLynch426, điều này có ý nghĩa. Tôi đồng ý với sự thuận tiện của NPM.
giật

6

Quan điểm của các thư viện khoa học Python là Python chỉ hoạt động như một mã keo để xáo trộn xung quanh dữ liệu giữa các thư viện khoa học. Python tự làm rất ít công việc xay hiệu suất cao. Python là một ngôn ngữ tốt cho việc này, vì nó hỗ trợ cả hai mô hình hướng thủ tục và hướng đối tượng (và chức năng ở mức độ lớn) và người ta có thể dễ dàng liên kết với các thư viện bên ngoài.

Javascript gắn chặt với các công nghệ trình duyệt. Nó chủ yếu là một ngôn ngữ khủng khiếp hoàn toàn không được thiết kế để có hiệu quả hoặc để viết phần mềm quy mô lớn, mặc dù trong thực tế cả hai điều đó xảy ra do đầu tư lớn vào công nghệ trình biên dịch và sử dụng ngôn ngữ một cách cẩn thận, tương ứng. Javascript được tạo ra đẹp hơn 1000 lần bởi các thư viện được thiết kế tốt như JQuery. Tôi không chắc liệu Javascipt có cung cấp bất kỳ hỗ trợ nào để liên kết dễ dàng với các thư viện C hay không (mặc dù tôi đoán nó phải, gián tiếp thông qua trình duyệt và qua Java).

Tôi không có ý làm nản lòng, nhưng toàn bộ ý tưởng dường như không có căn cứ. Javascript và điện toán hiệu năng cao chỉ được tìm thấy cùng nhau trong các câu bắt đầu bằng "Một người đàn ông bước vào quán bar ...."

Điều đó nói rằng, tôi sẵn sàng để được chứng minh là sai. Java thời gian thực tồn tại, là một sự kết hợp kỳ lạ và thành công hợp lý, vì vậy ai biết được.


2
Javascript trong trình duyệt không có FFI, nhưng việc triển khai ngôn ngữ không hoàn toàn JS mà người ta nghĩ rằng thiết kế có thể có một. JS cũng hỗ trợ các mô hình thủ tục, OO và các chức năng ở mức độ lớn. Vì vậy, tôi không chia sẻ sự miễn cưỡng của bạn đối với JS ở đây. (Tuy nhiên, tôi cũng không nghĩ đây là con đường đúng, vì một lý do khác: để thiết kế một ngôn ngữ mới, bạn nên có một lý do rất chính đáng và tôi không thấy một ngôn ngữ nào ở đây. Tôi nghĩ Vor ở bên phải đánh dấu khi anh ấy đề xuất Java.)
Gilles 'SO- ngừng trở nên xấu xa'

2
Javascript Javascript bị ràng buộc rất nhiều với các công nghệ trình duyệt. Trong lịch sử, nó vẫn còn như vậy? Theo tiêu chuẩn ECMAScript, ngôn ngữ này đối với tôi giống như một ngôn ngữ lập trình đa mục đích tốt, không đặc biệt gắn liền với các trình duyệt.
Tsuyoshi Ito

1
IMO Javascript là một ngôn ngữ rất tốt để viết kịch bản, nhưng hỗ trợ OO của nó hơi lạ một chút (kế thừa phải được mô phỏng với các nguyên mẫu, một "lớp" là một chức năng trong Javascript, ...) ... nhưng ở các mặt khác rất mạnh trong môi trường lập trình động, ví dụ các phương thức có thể được thêm nhanh chóng (tương tác) cả vào "các lớp" và các thể hiện của chúng.
Vor

3
"Đây hầu như là một ngôn ngữ khủng khiếp hoàn toàn không được thiết kế để hoạt động hiệu quả hoặc viết phần mềm quy mô lớn, mặc dù trong thực tế cả hai điều đó xảy ra do đầu tư lớn vào công nghệ trình biên dịch và sử dụng ngôn ngữ một cách cẩn thận" - tôi có thể nói như vậy cho Python. Cá nhân tôi thấy nó là khủng khiếp để sử dụng. Về hiệu quả - điều đó xuất phát từ việc đưa C / C ++ thực hiện công việc nặng nhọc, đó cũng là cách mà JS đạt được hiệu suất cao. Cả hai đều kinh khủng đến đa luồng. Tôi đã tăng tốc> 100 lần bằng cách viết lại các hàm Python đơn giản trong C.
Mark K Cowan

1
@Ski Câu trả lời năm tuổi là năm tuổi. Gây sốc!
David Richerby

5

Chỉ là một ý tưởng: bạn có thể sử dụng các thư viện khoa học được viết bằng Java (Tôi nghĩ rằng bạn sẽ tìm thấy rất nhiều công việc đã có sẵn) với Javascript - có cú pháp tương tự như Java - chỉ được sử dụng làm ngôn ngữ gói cho:

  • kịch bản
  • tương tác người dùng
  • (tái) mô hình hóa và tiêu chuẩn hóa các lớp / gói / hàm mức cao nằm bên dưới ... mặc dù tôi nghĩ sẽ tốt hơn nếu làm điều này trong "lớp" Java

Xem dự án Rhino để biết trình thông dịch Javascript ổn định được viết bằng Java.

Nếu bạn muốn, bạn có thể sử dụng Java JNI để sử dụng các thư viện khoa học được viết bằng C / C ++.

Toàn bộ hình ảnh:

                              ____ disparate Java libraries
Javascript   ----- Java      /
(scripting,      ("package   \____ JNI ____ C/C++ libraries
 interaction,     remodeling")   
high-level stuff)

EDIT : chỉ Googling xung quanh một thứ tìm thấy như thế này: thư viện Java GNU khoa học , Danh sách (Java) thư viện số , Java Graph thư viện , môi trường jHepWork đa nền tảng cho tính toán khoa học và phân tích dữ liệu


2

Tạo một ngôn ngữ mới là không cần thiết. Người ta có thể viết máy tính số hiệu suất trong JavaScript ngày nay, mà không cần biên dịch / dịch mã. Là ngôn ngữ kịch bản, JavaScript so sánh khá thuận lợi với Python và R. Đối với điểm chuẩn, hãy chạy điểm chuẩn ngôn ngữ trong stdlib , để so sánh hiệu suất trên một phạm vi rộng của API.

Đối với các ứng dụng phía máy chủ, người ta có thể viết các tiện ích bổ sung gốc Node.js vào giao diện với cùng các thư viện C / C ++ / Fortran được sử dụng trong các môi trường điện toán số khác, chẳng hạn như R, Python và Julia. Như được hiển thị trong công việc của tôi, các tiện ích bổ sung gốc Node.js cho phép liên kết với các thư viện tính toán số được tối ưu hóa phần cứng, do đó cho phép tính toán số hiệu suất cao từ JavaScript.

Đối với các ứng dụng phía máy khách, người ta có thể biên dịch sang WebAssugging để đạt được 1,5-2x hiệu năng gốc. Đối với các môi trường cũ hơn, người ta có thể biên dịch thành asm.js, đây là một tập hợp con được giảm bớt của JavaScript dễ dàng hơn để tối ưu hóa trình biên dịch. Trong công việc của tôi, asm.js có thể khớp với các triển khai ngây thơ (nghĩa là không tối ưu hóa phần cứng) được viết bằng C / C ++ / Fortran.

Nói tóm lại, không có lý do kỹ thuật nào khiến bạn không thể viết thư viện máy tính số và khoa học bằng JavaScript. Những gì cần thiết là những người có thời gian và tùy ý để viết các triển khai nghiêm ngặt và mạnh mẽ.

tiết lộ : Tôi và những người khác đang làm việc trong dự án stdlib , nhằm mục đích mang lại khả năng tính toán số hiệu suất cao, mạnh mẽ cho JavaScript và Node.js.

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.