Tại sao các ngôn ngữ lập trình khoa học rất kỳ lạ? [đóng cửa]


9

Dường như với tôi rằng các ngôn ngữ lập trình có nghĩa là được sử dụng trong khoa học và kỹ thuật luôn kỳ lạ so với các ngôn ngữ có mục đích chung. Một số ví dụ ngoài đỉnh đầu của tôi:

  • Trong Matlab, mỗi chức năng phải được đặt trong một tệp riêng
  • Trong R, <- là toán tử xác nhận, trái ngược với = trong hầu hết các ngôn ngữ khác
  • Matlab, R, Julia và những người khác đều được lập chỉ mục 1
  • Matlab sử dụng% cho các nhận xét và không phải là tiêu chuẩn # hoặc //

Tất nhiên, tất cả các ngôn ngữ này đều có một số tính năng thiết kế thực sự giúp chúng dễ sử dụng hơn cho các ứng dụng khoa học, chẳng hạn như ký hiệu ma trận tự nhiên hơn. Tuy nhiên, tất cả họ đều không thể giải thích được tất cả những lựa chọn kỳ quái này mà không làm cho mọi thứ dễ dàng hơn và có thể dễ dàng tránh được nếu các nhà thiết kế ngôn ngữ chỉ chọn làm những gì 99% ngôn ngữ khác làm. Là lý do nhà cung cấp khóa trong? Thiếu liên hệ với cộng đồng phát triển phần mềm rộng lớn hơn? Thứ gì khác?

Tôi đọc chủ đề này và không tìm thấy lời giải thích thỏa đáng. Chỉ vì R được thiết kế như một ngôn ngữ khoa học không có nghĩa là nó phải hoàn toàn bỏ qua các quy ước và sử dụng <- thay vì =.


6
Câu trả lời ngắn gọn: bởi vì chúng được tạo ra cho các nhà khoa học, không phải cho các lập trình viên.
Bart van Ingen Schenau

19
Câu trả lời ngắn: Bởi vì mọi ngôn ngữ bạn nghĩ là bình thường đều bị ảnh hưởng bởi một tổ tiên chung, C.
Ross Patterson

3
Tôi nghĩ bạn sẽ đấu tranh để tìm bất kỳ quy ước nào qua các ngôn ngữ. Nó phụ thuộc vào di sản của họ.
Robbie Dee

6
Không có gì là lạ cả. Nó chỉ khác nhau . Bởi vì không có lý do cụ thể nào để chọn một cú pháp so với cú pháp khác ngoại trừ tác giả cụ thể của ngôn ngữ cụ thể được sử dụng để làm gì.
Jan Hudec

8
99% của bạn là sai. Nếu bạn chỉ biết C và các dẫn xuất của nó, bạn có thể nghĩ như vậy, nhưng hơn 50% ngôn ngữ không phải C sử dụng một cái gì đó khác nhau để gán, lập chỉ mục và / hoặc nhận xét.
david.pfx

Câu trả lời:


21
  • Có những quy ước khác nhau. Các quy ước trong toán học, logic, và các khoa học ứng dụng và quy ước trong CNTT. Những cái đầu tiên là cũ hơn nhiều.
  • Các ngôn ngữ khoa học được tạo ra để làm cho cuộc sống của người dùng THEIR thuận tiện hơn. Người dùng được xem như một nhà khoa học, người thỉnh thoảng có thể nhận ra một số thuật toán hoặc kiểm tra một số lý thuyết, mà không cần phải học một cái gì đó thực sự mới. Vì vậy, ngôn ngữ cho các nhà khoa học PHẢI được tạo thành theo tiêu chuẩn phi CNTT. Bởi vì chúng không dành cho người sử dụng CNTT. Họ đạt tiêu chuẩn KHÁC và điều đó là tốt vì thính giác mục tiêu. Bởi vì giao diện người dùng SW tốt và ngôn ngữ là giao diện người dùng SW, phải được thực hiện dựa trên nhu cầu của người dùng, không phải của người viết mã.
  • Tiêu chuẩn CNTT của chúng tôi là tiêu chuẩn công nghiệp. CNTT là công nghiệp. Khoa học không phải là ngành công nghiệp. Các nhà khoa học tự hào về nó. Và họ sẽ miễn cưỡng lấy bất cứ thứ gì từ thực tiễn của chúng tôi vào của họ. Và họ không thích tiêu chuẩn nào cả. Và không ai thích tiêu chuẩn nước ngoài. Vì vậy, nếu ai đó sẽ tạo ra một ngôn ngữ khoa học theo tiêu chuẩn CNTT, thì nó sẽ khó bán, vì không thích thính giác mục tiêu, ngay cả khi nó thuận tiện hơn về mặt khách quan.

Và ngay cả khi chúng tôi chỉ phán xét theo tiêu chuẩn CNTT ... Xin lỗi, ý bạn là tiêu chuẩn nào? Bạn đã thử viết một prog trong APL hoặc SNOBOL chưa? Hai ngôn ngữ này, IMHO, mạnh nhất trong các lĩnh vực thích hợp (đếm và chuỗi). Nhưng cú pháp là một cái gì đó RẤT lạ (và hiệu quả) Đọc một dòng mã APL có thể mất nhiều ngày. Mặt khác, dòng như vậy là một mảnh nghiêm trọng của SW. Bạn sẽ trở lại Mathlab với những giọt nước mắt nhẹ nhõm.

Đối với "=", nhiều người có vấn đề phải làm quen rằng đó không phải là sự bình đẳng, mà là sự phân công. BTW, trong Pascal, đẳng thức và phép gán của IS là ": =".

Và bạn thực sự nghĩ rằng == cho sự bình đẳng là tự nhiên hơn? Ngược lại, trộn = và == là lỗi phổ biến nhất trong lập trình C, nó xảy ra rất thường xuyên ngay cả trong các IDE hiện đại, với điều khiển tự động của chúng.

Về lập chỉ mục từ 1 - đó là điều tự nhiên duy nhất. Khi bạn còn là một đứa trẻ, bạn đã học những bài thơ và bài hát, trong đó bạn đếm: một, hai, ba ... và không phải 0,1,2 ... Trong toán học ở trường, chúng tôi đã nghiên cứu rằng việc đếm bắt đầu từ 1 và 0 không thuộc về số tự nhiên / đếm. Chỉ với định nghĩa của các chức năng chỉ số phi tự nhiên đến. Rốt cuộc, số 0 được phát minh ra từ hàng ngàn năm sau khi tổ tiên chúng ta giơ ngón tay lên.

0-start đơn giản hơn để nhận ra và ngay lập tức bắt đầu thực hành CNTT sau khi xuất hiện C. Nhưng ở Fortran, ngôn ngữ đầu tiên, chỉ mục 1 được sử dụng. Tương tự với các ngôn ngữ khác của thời đại tiền công nghiệp.

Và vâng, tôi đã đọc bài viết của Dyjkstra về tính tự nhiên của việc đếm dựa trên 0. Và hoàn toàn không đồng ý với lập luận của ông. Đó là tự nhiên cho các nhạc sĩ ony. Và thậm chí 0 người đam mê tạo ra trình biên dịch C và Java, hãy đếm các dòng mã BẮT ĐẦU TỪ 1!


1
": =" để gán và lập chỉ mục dựa trên 1 cũng được sử dụng trong Smalltalk.
Rory Hunter

1
Tôi không mua lập chỉ mục dựa trên 0 là vì dễ thực hiện (FORTRAN khá nhiều từ chối điều này). cs.utexas.edu/users/EWD/transcrip/EWD08xx/EWD831.html đưa ra một số lý do khiến người ta có thể thích lập chỉ mục dựa trên 0, nhưng lưu ý rằng lựa chọn này khá tùy ý.
jk.

2
FORTRAN đã lập chỉ mục dựa trên 1. PASCAL cho phép lập chỉ mục dựa trên tùy ý: bạn có thể khai báo một mảng có chỉ số nằm trong khoảng, ví dụ: -42 đến +57. (Xem en.wikipedia.org/wiki/ Kẻ để biết ví dụ về việc này hữu ích.)
John R. Strohm

1
@Gangnus Tôi nghĩ thật sai lầm khi so sánh các ngôn ngữ hiện đại với C và coi đó là cố ý khó đọc. Nó được thiết kế để thay thế cấp cao cho các ngôn ngữ cấp thấp hơn.
Robbie Dee

1
FORTH là một ngôn ngữ dựa trên ngăn xếp. Hãy suy nghĩ máy tính HP. Nó rất nhỏ gọn và nhanh, nhưng thật khó để viết mã không thể xuyên thủng. Trong FORTH, bạn hiếm khi sử dụng các biến mà thay vào đó đẩy mọi thứ lên ngăn xếp và sử dụng các toán tử hoạt động trên ngăn xếp.
Gort Robot

16

Lập chỉ mục từ 1 không có gì lạ, nó hoàn toàn bình thường và được mong đợi ngoại trừ các lập trình viên , bởi vì họ đã có điều kiện để mong đợi tính toán dựa trên 0 của C (được điều chỉnh từ các thuộc tính của kiến ​​trúc bộ xử lý).

Nhận xét được ký hiệu theo nhiều, nhiều cách khác nhau trong các ngôn ngữ khác nhau; có không cách tiêu chuẩn, mọi ngôn ngữ chọn một biểu tượng hoặc digraph mà chưa được thực hiện.

Chuyển nhượng cũng là một khái niệm kỳ lạ và khó hiểu, ngoại trừ các lập trình viên ; hầu hết mọi người không quan tâm đến việc nó có =hay :=không <-, họ đấu tranh để hiểu ý nghĩa (và đối với họ, thực tế không nên sử dụng =, bởi vì điều này nhấn mạnh rằng sự phân công không phải là sự bình đẳng - trở ngại phổ biến nhất đối với những người không lập trình hiểu mã).

Nói tóm lại, ngôn ngữ lập trình dành cho những người không phải là lập trình viên chuyên nghiệp trông khác biệt bởi vì những người sử dụng chúng hầu hết đều muốn nó theo cách đó.


4
Tôi không đồng ý rằng việc lập chỉ mục từ 1 không có gì lạ. Lập chỉ mục 0 ít nhất là phổ biến như lập chỉ mục 1 trong toán học, và rõ ràng nó đã trở thành chuẩn mực trong lập trình trong nhiều năm trước khi Matlab hoặc S / R ra đời.
haroba

9
@Aqwis Ồ, vâng, tôi đã thấy em bé đếm không, một, hai ... Cách tự nhiên nhất, thực sự.
Gangnus

4
Em bé không viết mã. Có nhiều lý do tốt để sử dụng lập chỉ mục 0 (xem: Dijkstra) và khi lập chỉ mục bằng 0 cũng phổ biến trong toán học, tôi không thể thấy nhiều lý do để sử dụng lập chỉ mục 1.
haroba

1
@Aqwis Trả lời cho lời nói của bạn. Có gì lạ và không. Một điều được thiết lập từ thời thơ ấu và bằng toán học (số tự nhiên không bao gồm số không), không thể là lạ từ bất kỳ bên nào. Và những gì mâu thuẫn với nó, thật kỳ lạ. Và rằng bạn đã quen với một cái gì đó khác, là không liên quan. Những ngôn ngữ này đơn giản là không được tạo ra cho bạn hoặc tôi.
Gangnus

1
@phresnel Để diễn giải từ câu trả lời: Lập chỉ mục từ 1 là bình thường. Ngoại trừ các lập trình viên, bởi vì họ đã có điều kiện để mong đợi nó [lập chỉ mục từ 0] từ C
Robbie Dee

5

Có ba vấn đề:

  1. Bạn không biết về những truyền thống nhất định, và những lý do tốt cho những lựa chọn nhất định.
  2. Bạn quá chú trọng vào cú pháp, quá ít về ngữ nghĩa.
  3. Các kỹ sư và nhà khoa học không có kinh nghiệm trong thiết kế ngôn ngữ, dẫn đến cú pháp đáng ngờ.

Bây giờ đến điểm cụ thể của bạn:

  • Tôi không biết Matlab, vì vậy tôi không thể nhận xét về các yêu cầu của tổ chức tệp. Lưu ý rằng Java muốn bạn sử dụng một tệp cho mỗi lớp công khai.

  • Trong R, =có thể được sử dụng như là một toán tử gán. Lưu ý rằng nó cần nhiều toán tử gán <-<<-để xử lý khái niệm phạm vi của nó ( <<-gán cho một biểu tượng trong phạm vi bên ngoài thay vì tạo một biểu tượng mới bên trong hàm). Các mũi tên cũng có thể được sử dụng theo hướng khác, có khả năng tạo mã sạch hơn : complex_calculation() -> x.

  • Lập chỉ mục dựa trên 1 là tiêu chuẩn trong toán học, đó là điều mà người dùng của Matlab và R cảm thấy thoải mái hơn so với C. Julia theo Matlab để có một lộ trình học tập tốt hơn.

  • %cho ý kiến ​​cũng được sử dụng trong TeX / LaTeX. Đây #chỉ là một quy ước từ các ngôn ngữ kịch bản Unix và con cháu của họ.

Bạn cũng bỏ qua rằng các ngôn ngữ lập trình thực tế của Wikipedia có nhiều phần kỳ lạ. Tại sao Scheme không sử dụng =? Thay thế:

(define foo 5)

Tại sao C sử dụng *cho hội nghị, trong khi rõ ràng một dấu mũ ^xlà phổ biến hơn trong các truyền thống khác?


"Tôi không biết Matlab, vì vậy tôi không thể nhận xét về các yêu cầu của tổ chức tệp. Lưu ý rằng Java muốn bạn sử dụng một tệp cho mỗi lớp công khai." Tôi nghĩ rằng ngôn ngữ hoàn toàn hợp lý để mong bạn chia dự án của bạn thành nhiều tệp. Tuy nhiên, một lớp thường là một lượng mã tương đối lớn. Chức năng không phải là. Bằng cách buộc một tệp riêng cho mọi chức năng, Matlab không khuyến khích bạn tạo các hàm nhỏ và thay vào đó thúc đẩy các hàm lớn, nguyên khối.
haroba

1
Tôi đồng ý gần như với tất cả mọi thứ, ngoại trừ p.3. Các nhà khoa học không tạo ra ngôn ngữ của họ, họ ĐẶT HÀNG chúng. Họ là khách hàng, người dùng, nhưng không phải là người tạo ra chúng. Nếu ai đó là, anh ấy / cô ấy đã là một người đam mê CNTT. Và cú pháp của bất kỳ ngôn ngữ là nghi vấn, không ai là lý tưởng cho tất cả các nhiệm vụ.
Gangnus

Matlab biên dịch các chức năng / tập tin trên cơ sở đúng lúc theo yêu cầu. Nó không có khái niệm thực sự về một chương trình, chỉ là một loạt các chức năng. Nếu tôi đang chạy một hàm thực hiện cuộc gọi đến foo (), thì nó sẽ tìm kiếm đường dẫn của nó cho một tệp có tên foo.m, biên dịch nó và chạy nó. Không cần phải nói trước với Matlab về tập hợp các tệp tôi định sử dụng.
Simon B

1

Tôi đoán nó phụ thuộc vào sự tiếp xúc của bạn với các ngôn ngữ khác. Off đỉnh đầu của tôi:

  • C / C ++ có các tệp nguồn riêng biệt (.c / .cpp & .h)
  • Các ký tự -> được sử dụng trong C # cho các biểu thức lambda
  • Các phiên bản cũ của VB đã sử dụng 1 làm chỉ mục mặc định (mặc dù điều này có thể được thay đổi với Tùy chọn cơ sở)

1
Trong C và C ++, bạn có thể xác định bao nhiêu chức năng bạn muốn trong một tệp.
haroba

Tôi chỉ đưa ra quan điểm rằng việc các mô-đun được chia thành nhiều tệp không phải là bất thường. Nếu bạn muốn, bạn có thể đặt tất cả các chức năng của mình vào các tệp riêng biệt bằng ngôn ngữ .NET với cấu trúc lớp một phần .
Robbie Dee

1
Tất nhiên, không có gì bất thường khi các mô-đun được phân chia trên một số tệp và trong nhiều trường hợp là mong muốn. Nhưng trong Matlab, bạn phải đặt mọi hàm riêng lẻ vào tệp riêng của mình, điều đó có nghĩa là nếu bạn có một nghìn hàm thì bạn cần một nghìn tệp .
haroba

3
Nhận xét trong HTML trông như thế nào <!-- ... -->. Dấu phần trăm được sử dụng để mã hóa URL: http://example.com/()trở thành http://example.com/%28%29.
amon

Xin lỗi, là lỗi của tôi.
Robbie Dee
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.