Sự khác biệt giữa ngôn ngữ kịch bản và ngôn ngữ lập trình bình thường là gì?


20

Sự khác biệt giữa ngôn ngữ lập trình và ngôn ngữ kịch bản là gì? Ví dụ, xem xét C so với Perl.

Có phải sự khác biệt duy nhất mà các ngôn ngữ kịch bản chỉ yêu cầu trình thông dịch và không yêu cầu biên dịch và liên kết?


4
Tôi sợ điều này là không chính đáng ở đây; những gì bạn muốn biết hoàn toàn là vấn đề thực hiện ngôn ngữ. Nó cũng có vẻ thu hút các câu trả lời nông cạn / ý kiến ​​(không phải lỗi của bạn), luôn luôn là một lá cờ đỏ.
Raphael

Phần cứng là một "trình thông dịch" cho các ngôn ngữ được biên dịch. Sau đó, sự khác biệt duy nhất là có bao nhiêu phiên dịch bạn đang trải qua. Nếu máy tương đương với Turing và bạn đang sử dụng ngôn ngữ tương đương Turing, bạn có thể viết trình thông dịch được biên dịch Abằng ngôn ngữ, sau đó viết trình thông dịch Bbằng ngôn ngữ mà trình thông dịch Acó thể thực thi, sau đó trình thông dịch Cbằng ngôn ngữ mà trình thông dịch Bcó thể thực thi , v.v.
Patrick87

Mức lương (tiền DevOps)
Phil Lello

Câu trả lời:


21

Tôi nghĩ rằng sự khác biệt có nhiều hơn để làm với mục đích sử dụng của ngôn ngữ.

Ví dụ: Python được diễn giải và không yêu cầu biên dịch và liên kết, như Prolog. Tôi sẽ phân loại cả hai thứ này thành languges lập trình.

Langauges lập trình có nghĩa là để viết phần mềm. Chúng được thiết kế để quản lý các dự án lớn. Họ có thể có thể gọi các chương trình, đọc tệp, v.v., nhưng có thể không hoàn toàn tốt như ngôn ngữ kịch bản.

Các kịch bản langauges không có nghĩa là để phát triển phần mềm quy mô lớn. Cú pháp, tính năng, thư viện, v.v. của họ được tập trung nhiều hơn vào việc hoàn thành các nhiệm vụ nhỏ một cách nhanh chóng. Điều này có nghĩa là đôi khi chúng "hackish" hơn so với các langau lập trình và có thể không có tất cả các tính năng hay như nhau. Chúng được thiết kế để thực hiện các tác vụ thường được thực hiện, như lặp qua một loạt các tệp hoặc thực hiện các tác vụ sysadmin, để được tự động hóa.

Ví dụ, Bash không làm số học độc đáo, điều này có thể sẽ khiến việc viết phần mềm quy mô lớn trong đó trở thành một cơn ác mộng.

Như một loại điểm chuẩn: Tôi sẽ không bao giờ viết một trình phát nhạc bằng perl, mặc dù tôi có thể có thể. Tương tự như vậy, tôi sẽ không bao giờ thử sử dụng C ++ để đổi tên tất cả các tệp trong một thư mục nhất định.

Dòng này đang trở nên mờ hơn và mờ hơn. JavaScript, theo định nghĩa một ngôn ngữ "kịch bản", ngày càng được sử dụng để phát triển "ứng dụng web" có nhiều hơn trong lĩnh vực phần mềm. Tương tự như vậy, Python ban đầu phù hợp với nhiều đặc điểm của ngôn ngữ kịch bản nhưng ngày càng thấy nhiều phần mềm được phát triển bằng Python làm nền tảng chính.


1
+1 cho ví dụ thực tế: Tôi không thể tưởng tượng được việc sử dụng C ++ để thực hiện các nhiệm vụ đổi tên hàng loạt!
Casey Kuball

3
Bạn không nêu bất kỳ sự khác biệt về khái niệm, chỉ có ý kiến ​​phổ biến về các trường hợp sử dụng tương ứng.
Raphael

3
Bạn cũng sẽ "không viết" mạng xã hội lớn nhất thế giới bằng ngôn ngữ kịch bản (FB bằng PHP), một trong những dịch vụ viết blog đầu tiên thúc đẩy toàn bộ xu hướng (LJ in Perl), hệ thống kiểm soát phiên bản dễ dàng cho phép hàng ngàn nhà phát triển làm việc cùng nhau (Mercurial trong Python)? Xin lỗi, nhưng "kịch bản này là dành cho các nhiệm vụ nhỏ" chỉ là rác rưởi phổ biến.
Oleg V. Volkov

1
@Raphael Tôi nghĩ rằng sự khác biệt về khái niệm là mờ nhạt nhất. Sự khác biệt chính là trong cách sử dụng phổ biến, IMO. Hầu hết các ngôn ngữ này đều sẽ hoàn thành Turing và tuân theo một mô hình tính toán tương tự. Tôi chưa bao giờ chạy qua một phân biệt hoặc định nghĩa chính thức, nhưng hãy thoải mái chỉnh sửa câu trả lời của tôi nếu bạn có.
jmite

3
@Raphael Đó là một phần của vấn đề: không có sự khác biệt về khái niệm. Những gì bạn có thể làm trong thời gian biên dịch - so với thời gian chạy chủ yếu là vấn đề được diễn giải so với biên dịch và đó là một thuộc tính của việc triển khai, chứ không phải ngôn ngữ (mặc dù thiết kế ngôn ngữ có thể gây khó khăn cho một mô hình triển khai cụ thể).
Gilles 'SO- ngừng trở nên xấu xa'

6

Bài báo kinh điển về các ngôn ngữ kịch bản là John K. Ousterhout's Scripting: Lập trình cấp cao hơn cho Thế kỷ 21 , được xuất bản trên Máy tính 31 (3), 1998. Một mặt, ông đã phân biệt giữa các ngôn ngữ kịch bản, và các ngôn ngữ lập trình hệ thống cai khac.

Ousterhout mô tả các ngôn ngữ lập trình hệ thống là đã phát triển để thay thế các ngôn ngữ máy để lập trình. Chúng ẩn các chi tiết tẻ nhạt như phân công đăng ký và các chuỗi gọi chương trình con, cung cấp các cấu trúc đơn giản để viết các vòng lặp và các thành ngữ dòng điều khiển chung khác và thực thi một quy tắc gõ. Chúng thường được thực hiện bởi một trình biên dịch (đi trước thời đại). Những ngôn ngữ này có nghĩa là để viết phần mềm từ đầu. Ví dụ là C, C ++ và Java.

Ngược lại, các ngôn ngữ kịch bản, theo Ousterhout, bắt đầu từ tiền đề rằng đã có các chương trình hữu ích ngoài kia, thường được viết bằng ngôn ngữ lập trình hệ thống. Các ngôn ngữ script, như Perl, Python, Tcl, Visual Basic và shell Unix, cung cấp các công cụ để kết hợp các chương trình hiện có này vào các chương trình mới. Ousterhout đặc trưng các ngôn ngữ kịch bản là "không chữ" (bao gồm cả những gì nhiều người gọi là gõ động) và như nhấn mạnh sự phát triển nhanh chóng; chúng thường được thực hiện bởi các thông dịch viên.

Bây giờ, người ta phải cẩn thận không cho rằng mô hình khái niệm của một tác giả là có thẩm quyền. Mặc dù các nhà khoa học máy tính của chúng tôi muốn giả vờ rằng chúng tôi là những nhà toán học đưa ra định nghĩa chính xác cho tất cả các thuật ngữ, trong thực tế, hầu hết các thuật ngữ điện toán được xây dựng xã hội với ý nghĩa mờ nhạt và không đồng nhất; có một sự đồng thuận thô bạo ở một mức độ rất cao về hầu hết các điều khoản, nhưng chi tiết thường phụ thuộc vào người đang viết. Vì vậy, hãy lấy bài viết của anh ấy, câu trả lời của tôi và tất cả các câu trả lời khác ở đây với một đống muối lớn.

Cá nhân tôi sẽ tranh luận về sự tồn tại của một ngôn ngữ lập trình "bình thường", khi bạn diễn đạt nó trong câu hỏi của bạn. Tuy nhiên, tôi nghĩ rằng khái niệm bạn đang cố gắng truyền tải tương ứng với các ngôn ngữ lập trình hệ thống của Ousterhout.


2

Tất cả các ngôn ngữ kịch bản cũng là ngôn ngữ lập trình. Chuyện này là không đúng sự thật. Các ngôn ngữ "chỉ yêu cầu trình thông dịch" là các ngôn ngữ được dịch (trái ngược với ngôn ngữ được biên dịch - lưu ý rằng một số ngôn ngữ, như Java, thuộc cả hai loại).

Một ngôn ngữ được phân loại là ngôn ngữ kịch bản ngụ ý rằng nó hữu ích như một ngôn ngữ "keo". Các tập lệnh không có xu hướng là các chương trình đầy đủ tính năng, mà thay vào đó, điền vào các khoảng trống giữa các phần mềm khác.

Các tập lệnh thường được sử dụng để kết nối nhiều chương trình với nhau, để thực hiện các nhiệm vụ cấp độ rất nhanh / dễ dàng hoặc thậm chí trong một môi trường nhúng nơi các mối quan tâm về hiệu suất và an toàn đã được trừu tượng hóa thành ngôn ngữ cấp thấp hơn. Ngôn ngữ kịch bản nhấn mạnh có xu hướng giảm thời gian phát triển, do đó lý do hầu hết được diễn giải và mức độ rất cao.


Bạn không nêu bất kỳ sự khác biệt về khái niệm, chỉ có ý kiến ​​phổ biến về các trường hợp sử dụng tương ứng.
Raphael

1

Đặt 'ngôn ngữ tập lệnh' là tập hợp con của tập hợp 'ngôn ngữ lập trình'. Sự khác biệt giữa C và Perl là sự khác biệt giữa ngôn ngữ lập trình hệ thống và ngôn ngữ ứng dụng và giữa ngôn ngữ được giải thích và ngôn ngữ biên dịch.

Ngôn ngữ lập trình hệ thống ở mức độ thấp và hướng tới quản lý bộ nhớ, IO có thể dự đoán được, v.v. Các ngôn ngữ ứng dụng được định hướng để giải quyết nhanh chóng các vấn đề ở cấp độ cao hơn, như 'cài đặt đọc từ tệp, ổ cắm mở và xử lý các yêu cầu theo cài đặt'.

Do đó, các ngôn ngữ ứng dụng có xu hướng ở cấp độ cao hơn nhiều, sau đó là ngôn ngữ hệ thống, tức là cung cấp số lượng lớn các phương tiện trừu tượng và trợ giúp tích hợp và thường thêm quản lý bộ nhớ tự động.

Các chương trình trong các ngôn ngữ được biên dịch được xử lý hoàn toàn thành một số mã trước khi thực hiện chương trình. Các ngôn ngữ script được dịch động trong quá trình thực thi và thường bao gồm các phương tiện để tạo mã động và bao gồm các tệp có mã nguồn.

Do đó, tất cả các ngôn ngữ script là ngôn ngữ ứng dụng, nhưng ngược lại là không đúng. Ngôn ngữ hệ thống luôn là ngôn ngữ được biên dịch, vì ngôn ngữ kịch bản thường bao gồm các tính năng, không thực dụng để thực hiện theo ngôn ngữ. Tuy nhiên, lưu ý rằng kịch bản (diễn giải) / sự khác biệt được biên dịch liên quan nhiều hơn đến việc triển khai: đối với một số ngôn ngữ, cả hai loại triển khai đều có thể tồn tại, như đối với haskell.


Tôi nghĩ rằng đó là một sai lầm để vẽ sự phân đôi được giải thích / biên dịch này. Tôi cũng không nghĩ đó là một mối quan hệ tập hợp con, mặc dù chắc chắn các bộ có một số giao điểm không trống. Tương tự, mức cao và mức thấp không biết mô tả chính xác sự khác biệt. Prolog ở mức rất cao, nhưng không phải là ngôn ngữ kịch bản theo cách bash hay java script.
jmite

1

Những người khác có các thuộc tính được bảo hiểm có xu hướng được liên kết với các ngôn ngữ script và với các ngôn ngữ không script. Điều đó hữu ích để có cảm giác về ý nghĩa của mọi người khi họ sử dụng thuật ngữ "ngôn ngữ kịch bản", nhưng tôi cảm thấy điều quan trọng hơn là phải hiểu rằng đơn giản là không có ranh giới được xác định rõ ràng: Hai người hiểu biết có thể không đồng ý về việc liệu một ngôn ngữ cụ thể X có phải là ngôn ngữ kịch bản. Tuy nhiên, thuật ngữ "ngôn ngữ kịch bản" có tiện ích vì có sự thống nhất rộng rãi về các ngôn ngữ ở xa bên trong hoặc bên ngoài ranh giới.

So sánh "xe gia đình" với "xe thể thao" hoặc "tạp chí" với "báo". Tôi dám khẳng định rằng sẽ rất khó để đưa ra một quy tắc đáng tin cậy 100% để phân biệt mọi chiếc xe gia đình với mọi chiếc xe thể thao có thể nói chung (có nghĩa là về cơ bản nó không đủ để liệt kê tất cả các xe hiện có trong mỗi danh mục) và ít nhất là có khả năng khách quan ( có nghĩa là nó sẽ được mọi người chấp nhận). Nhưng những thuật ngữ này vẫn hữu ích trong thực tế, bởi vì mặc dù có một số trường hợp khó quyết định, nhiều chiếc xe rõ ràng thuộc một loại chứ không phải loại khác.


0

Một điểm khác biệt tôi chưa từng thấy được đề cập là khi được sử dụng như dự định, thời gian thực hiện của hầu hết các tập lệnh sẽ bị chi phối bởi các hoạt động "vĩ mô" và hiệu suất của các hoạt động vi mô sẽ không ảnh hưởng đáng kể đến thời gian thực hiện chung. Ví dụ: nếu chương trình hoạt hình dò ​​tia có thể bao gồm ngôn ngữ kịch bản lệnh với câu lệnh "kết xuất hình ảnh", thì một kịch bản để tạo 240 khung hình động có thể mất bốn giờ trong câu lệnh "kết xuất hình ảnh" và tổng cộng bốn giây thực hiện mọi thứ khác. Ngay cả khi một người tăng tốc mọi thứ bên ngoài công cụ kết xuất lên tới hàng triệu, thì điều đó sẽ ít ảnh hưởng đến hiệu suất tổng thể hơn là tăng tốc công cụ kết xuất lên 0,1%.

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.