Điều gì làm cho một ngôn ngữ được tối ưu hóa cho một nhiệm vụ cụ thể?


15

Thường có những ngôn ngữ lập trình chuyên biệt cho các nhiệm vụ cụ thể. Một số ngôn ngữ lập trình rất xuất sắc về số học mảng (như ma trận và sử dụng mảng đa chiều), nhưng một số ngôn ngữ tốt hơn nhiều ở toán học cấp cao khó có thể tái tạo bằng các ngôn ngữ khác (vẫn hoàn toàn có thể giống nhau).

Điều gì về một ngôn ngữ làm cho nó tốt hơn cho một nhiệm vụ cụ thể hoặc mục tiêu cuối cùng so với các ngôn ngữ khác, với điều kiện đơn giản nhất là biên dịch để lắp ráp mọi cách?

Tôi đang nói về Turing hoàn chỉnh các ngôn ngữ, những ngôn ngữ tương đương với Turing.


1
Đây là một câu hỏi bách khoa. Tôi đề nghị bạn nên chia nhỏ nó theo một cách nào đó, làm cho nó cụ thể hơn.
André Souza Lemos

5
Sẽ là sai khi nói "tiếp thị"?
corsiKa

2
@corsiKa Vâng, tôi nghĩ nó không chỉ là vấn đề tiếp thị.
Jeremy West

Câu trả lời:


18

Có một vài điều cần xem xét:

  • Trừu tượng: ngôn ngữ nào được coi là "đặc biệt"? Là các ma trận giá trị hạng nhất, như trong Matlab, hoặc bạn mã hóa chúng bằng các kiểu đơn giản hơn như mảng, như trong C? C làm cho bạn nghĩ về cách ma trận được thực hiện, Matlab thì không.

    Tương tự, nếu bạn có một hệ thống truyền thông không đồng bộ phức tạp, bạn có thể muốn các chức năng hạng nhất để bạn có thể thực hiện các cuộc gọi lại.

    Càng nhiều tính năng được thêm vào, ngôn ngữ càng phức tạp. Vì vậy, trong khi có một số ngôn ngữ "đa mô hình" như C ++ và D, hầu hết các ngôn ngữ đều chọn một phân khúc thích hợp, chọn những thứ quan trọng đối với phân khúc đó và ưu tiên những ngôn ngữ đó là trừu tượng chính của chúng.

  • Hiệu suất: tất cả sự trừu tượng đều đi kèm với một chi phí, cho dù đó là thời gian biên dịch hay thời gian chạy. Một số ngôn ngữ giới hạn bản thân theo cách làm cho chúng ít trừu tượng hơn nhưng hiệu quả hơn.

    Fortran thời kỳ đầu không cho phép con trỏ hoặc đệ quy, vì vậy thật tuyệt vời khi bấm số, nhanh hơn một ngôn ngữ như C, nơi bạn đang chạy rất nhiều vòng. Nhưng thật tồi tệ khi mã hóa các cấu trúc dữ liệu lớn, như cây cối, nơi bạn cần con trỏ để xác định. (Lưu ý rằng tôi không biết nhiều về Fortran hiện đại.)

Về cơ bản, luôn có sự đánh đổi. Trừu tượng hơn có nghĩa là thời gian chạy chậm hơn hoặc phức tạp hơn tại thời gian biên dịch. Nhiều tính năng hơn có nghĩa là một ngôn ngữ phức tạp hơn. Một số tính năng làm cho một số thứ nhanh nhất định và những thứ khác chậm, như con trỏ và đệ quy. Không có ngôn ngữ hoàn hảo, vì vậy mỗi ngôn ngữ sẽ đạt đến một loại tối đa cục bộ trong không gian của chất lượng ngôn ngữ.


8

Các ràng buộc của một số ngôn ngữ giúp dễ dàng thực hiện mã nhanh hơn (ví dụ Fortran vs C và bí danh con trỏ), đó là sự đánh đổi giữa hiệu suất và khả năng vượt trội).

Ngôn ngữ không được "tối ưu hóa" cho các tác vụ cụ thể, nhưng việc triển khai, trình biên dịch và các ràng buộc giúp dễ hiểu mã hơn bởi trình biên dịch làm như vậy. Thỏa thuận thực sự là về các thư viện cụ thể, các thuật toán được triển khai để tăng tốc quá trình với các công tắc tùy thuộc vào độ dài vấn đề làm cho nó tối ưu.

Ví dụ, phép nhân sử dụng các trường hợp khác nhau (xem phép nhân GMP .

Khi ngôn ngữ chỉ định các hoạt động toán học cấp cao hơn, việc triển khai là tối ưu (hiệu quả trong trường hợp này), nhưng đó không phải là một phần của đặc tả ngôn ngữ.

Xin hãy xem tính toán xếp hạng ma trận trong Matlab, Mathicala và Maple (Tôi không thể tự mình thực hiện tất cả các bài kiểm tra, nhưng chúng phù hợp với các bài kiểm tra của tôi). Tất cả các ngôn ngữ (môi trường) này thực hiện cùng một hoạt động cấp cao hơn nhưng các chi tiết triển khai khác nhau sẽ mang lại nhiều thời điểm khác nhau.

Khi một số tác vụ cụ thể của miền (ở đây cũng là ngôn ngữ cụ thể của miền) được định hướng theo các tính toán cụ thể, chúng sẽ được cải thiện và tối ưu hóa (qua nhiều năm) cho đối tượng mục tiêu. Nhưng không phải lúc nào cũng tối ưu. Ví dụ, Perl có lịch sử xử lý các chuỗi dài, nhưng PCRE (ở đây đơn giản là các biểu thức chính quy của Perl) không phải là các chuỗi hiện có nhanh nhất (và sử dụng nhiều bộ nhớ), nhưng cực kỳ biểu cảm và mạnh mẽ.

Các ràng buộc của ngôn ngữ tạo ra sự khác biệt trong quá trình biên dịch, việc đặt bí danh con trỏ được đề cập sẽ ngăn khả năng mã sắp xếp lại và thực thi tải lại các biến.


9
Hầu hết các ngôn ngữ đều được Turing hoàn thành theo thông số kỹ thuật, vì không phải tất cả các ngôn ngữ đều chỉ định kích thước địa chỉ cố định trong thông số kỹ thuật của chúng. Và thật hạn chế khi mất đi sự khác biệt giữa những thứ như C, đó là kích thước địa chỉ modulo Turing Complete và những thứ như Coq, Agda hoặc System F, hoàn toàn không phải là Turing Complete.
jmite

1
@jmite cảm ơn bạn. Tôi hy vọng điều này không còn che mờ sự khác biệt
Ác

@Evil: Chà, tôi nghĩ rằng tuyên bố của bạn về các ngôn ngữ không được tối ưu hóa cho các nhiệm vụ là sai. bạn đang thấy từ tối ưu hóa từ quan điểm của máy tính. Nhưng một số ngôn ngữ được thiết kế để giúp người lập trình dễ dàng hơn và để người thực hiện tìm ra cách làm cho nó hoạt động.
Giáo sư

Đây là từ góc độ hiệu quả, vì vậy nó không sai, tôi chỉ lấy góc này, bạn có thể xem xét góc kia (tối ưu hóa có nghĩa là dễ dàng hơn để viết một số nhiệm vụ cụ thể trong đó). "Điều gì về một ngôn ngữ làm cho nó tốt hơn cho một nhiệm vụ cụ thể hoặc mục tiêu cuối cùng so với các ngôn ngữ khác [...]", tôi rất tự tin rằng: dễ viết hơn, nhanh hơn, rẻ hơn, v.v. có thể được bao gồm trong "tốt hơn". Tác giả không chấp nhận một số câu trả lời cũng như không bao gồm làm rõ hoặc nhận xét rằng bất kỳ câu trả lời nào được đưa ra không phải là về những gì được hỏi. Bên cạnh đó, đó là một trong những yếu tố, đối với một số người quan trọng hơn những người khác
Evil

5

Theo tôi, điều này thực sự có thể được xây dựng khá chính xác: Một công cụ (ví dụ, ngôn ngữ lập trình cùng với các thư viện chuẩn của nó) là công cụ tối ưu cho một loại vấn đề cụ thể khi nó giảm thiểu, trên tất cả các công cụ có thể có thể sử dụng, chi phí dự kiến ​​để có được một giải pháp đủ chính xác và hiệu quả, trong đó kỳ vọng được thực hiện đối với một số phân phối xác suất nhất định đối với tất cả các vấn đề trong lớp vấn đề. Chủ yếu là chi phí này ở dạng thời gian lập trình viên , và bao gồm thời gian thiết kế dự kiến, thời gian gỡ lỗi dự kiến, thời gian dự kiến ​​cần thiết để giáo dục một người chưa quen với công cụ, v.v.

Trong thực tế, hầu như không có số lượng nào trong số này thực sự có thể được đo. Tuy nhiên, tôi nghĩ rằng đó là cách đúng đắn để suy nghĩ về vấn đề.


4

Đó là một câu hỏi xuất sắc và không dễ trả lời. Có bất cứ điều gì về ngôn ngữ Erlang làm cho nó phù hợp cho các ứng dụng viễn thông thời gian thực không? Hay là một cái gì đó về trình biên dịch Erlang? Hay đó là một cái gì đó về cộng đồng và hệ sinh thái Erlang? Có lẽ đó là những người biết cách viết các ứng dụng viễn thông là chuyên gia về Erlang và những người biết Erlang là chuyên gia về các ứng dụng viễn thông? Tôi nghi ngờ rằng tất cả các yếu tố này đóng một vai trò.

Có thể có hai tính năng trong Erlang phù hợp với các ứng dụng đó (hãy cẩn thận: tôi chưa bao giờ sử dụng ngôn ngữ này) - nó hỗ trợ tốt cho việc đồng thời và hỗ trợ nâng cấp phần mềm động. Những tính năng này cũng hữu ích trong nhiều lĩnh vực khác, nhưng các kỹ sư viễn thông rất cuồng tín về thời gian hoạt động. Có lẽ nếu mọi người xây dựng các trang web quan tâm đến tính sẵn sàng cao như mọi người xây dựng các tổng đài điện thoại, Erlang cũng sẽ phổ biến ở đó.


3

Các câu trả lời khác bỏ lỡ điểm tối ưu hóa ngôn ngữ cho một tác vụ cụ thể - đó không chỉ là về điều gì làm cho mã chạy nhanh hơn trên phần cứng nhất định; đó là về cách rõ ràng và ngắn gọn một ngôn ngữ cụ thể cho phép bạn thể hiện giải pháp cho một vấn đề. Điều đó phụ thuộc rất nhiều vào miền vấn đề và (cùng với sự cường điệu về tiếp thị, không biết gì về các giải pháp hiện có và chuyến đi viết một ngôn ngữ mới) là lý do tại sao chúng ta có nhiều ngôn ngữ - mục tiêu là để lập trình viên viết ít mã hơn là ít dễ bị lỗi hơn và dễ dàng hơn cho các lập trình viên tiếp theo để đọc / hiểu / sửa chữa / nâng cao.

Ví dụ, cả C và C ++ đều có thể được sử dụng để lập trình hướng đối tượng - và thực tế, thư viện GObject là một ví dụ điển hình về OO C. Cấu trúc AC chứa các con trỏ hàm có thể phục vụ cùng mục đích như các phương thức ảo trên lớp C ++ và có thể thực hiện tốt hơn; hình phạt phát triển là mã keo để phân bổ bộ nhớ, khởi tạo các con trỏ hàm và chọn một chiến lược để gọi các phương thức 'cha mẹ'. Hầu hết thời gian nó rõ ràng / an toàn hơn để gõ Class klass * = new class()hơn struct class *klass = malloc(sizeof(struct class));klass->fn1 = ...;klass->fnN = ....


Chà, câu trả lời của jmite cung cấp một gạch đầu dòng những điều bạn viết bị thiếu. Tôi đã viết về các nhiệm vụ cụ thể của miền được tối ưu hóa cho vấn đề này. Tôi thích C, tôi biết những thứ như OCC, nhưng nó không làm cho C Object Oriiated (trình biên dịch không giúp ích gì cho việc này và nhiều tối ưu hóa bị ngăn chặn, không có trình thu gom rác, v.v.). Bạn không thể quá tải các hàm C như trong C ++, nhưng tất nhiên bạn có thể mô phỏng mọi hành vi (jmite cũng viết về điều này). Tôi không thấy cách này trả lời câu hỏi đã nêu.
Ác

2
@Evil: Lập trình hướng đối tượng và ngôn ngữ lập trình hướng đối tượng là hai khái niệm khác nhau. Lập trình hướng đối tượng không yêu cầu ngôn ngữ hướng đối tượng. Có thể cho rằng nó chỉ yêu cầu sự tồn tại của giấy hoặc bảng trắng để bạn có thể thực hiện thiết kế UML của mình.
slebetman

@slebetman Tôi không thấy điều đó sẽ đến. Có thể cho rằng bạn không cần giấy và bảng trắng, bạn chỉ có thể tưởng tượng các vật thể, và theo một số người, đây là cách chúng ta nghĩ, nhưng điều này không thể tiến gần hơn đến sự hỗ trợ ngôn ngữ của các khái niệm OOP. Tôi xin lỗi, nhưng đây là tranh chấp tôi không muốn chọn.
Ác

@Evil: Tôi không chắc chắn về việc có thể theo dõi tất cả về mặt tinh thần mà không cần một chút trừu tượng để giúp bạn. Công việc đầu tiên của tôi là được cung cấp một đoạn mã C lớn trông giống như tất cả các mảng có con trỏ hàm (mất một lúc để tìm ra cú pháp kỳ lạ có nghĩa là gì - không có google trở lại) và tôi đã vật lộn với nó cho đến khi tôi bắt đầu thấy một mẫu và nhận ra rằng các mảng đó là các đối tượng và các con trỏ hàm đó là các phương thức. Mua cho mình một tấm bảng nhỏ và sử dụng hết giấy A4 nhưng cuối cùng tôi cũng hiểu được mã
slebetman

1
@slebetman Cho rằng lập trình hướng đối tượng có trước UML ít nhất 20 năm, yêu cầu của bạn rằng các thiết kế UML là cần thiết cho hướng đối tượng dường như là hoàn toàn sai.
David Richerby
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.