Khi nào một ngôn ngữ được coi là ngôn ngữ kịch bản? [đóng cửa]


107

Điều gì làm cho một ngôn ngữ trở thành một ngôn ngữ kịch bản? Tôi đã nghe một số người nói "khi nó được thông dịch thay vì biên dịch". Điều đó sẽ làm cho PHP (ví dụ) trở thành một ngôn ngữ kịch bản. Đó có phải là tiêu chí duy nhất? Hay có những tiêu chí khác?

Xem thêm:


Bạn có thể muốn mở rộng câu hỏi của mình một chút. Tôi cảm thấy đây gần như là một bản dupe nếu không. Người khác có thể không thấy sự khác biệt
Kent Fredric

Một bản dupe cho câu hỏi nào khác?
Sietse 19/09/08

2
stackoverflow.com/questions/98268/… Có rất nhiều điểm tương tự. Không hoàn toàn giống nhau, mà là rất nhiều ngữ cảnh / quan điểm được chia sẻ.
Kent Fredric 19-08

7
... Khi một ngôn ngữ phá vỡ API và thay đổi cú pháp của nó mỗi lần phát hành nhỏ, khi nó là một trình bao bọc xung quanh 100 thư viện C lỗi không rõ ràng, thì đó là một ngôn ngữ script. ;)
ivan_ivanovich_ivanoff 19/09/09

1
Trong thanh bên "Có liên quan", bạn sẽ tìm thấy stackoverflow.com/questions/1514206/… mà tôi đã liên kết một đống các bản sao hiện có sau đó quay trở lại stackoverflow.com/questions/101055/… .
dmckee --- ex-moderator kitten

Câu trả lời:


52

Một ngôn ngữ kịch bản là một ngôn ngữ "viết" những thứ khác để thực hiện công việc. Trọng tâm chính không chủ yếu là xây dựng các ứng dụng của riêng bạn mà là để một ứng dụng hiện có hoạt động theo cách bạn muốn, ví dụ: JavaScript cho trình duyệt, VBA cho MS Office.


Vậy những ngôn ngữ như Python thì sao? Không dễ để biết trọng tâm ở đâu, nhưng có thể nói nó đang tập trung nhiều hơn vào các ứng dụng của riêng mình, nó vẫn thường được gọi là "ngôn ngữ kịch bản". Có thể do việc biên dịch ẩn thành bytecode của CPython impl tham chiếu. không làm tăng lỗi biên dịch liên quan đến "an toàn kiểu"? Có lẽ câu trả lời Oded của có những ...
n611x007

Bytecode và hệ thống loại không thực sự liên quan đến nó. Theo định nghĩa trên, nếu một ứng dụng hiển thị một API cho Python, nó được cho là sử dụng Python làm ngôn ngữ kịch bản của nó. Nếu bạn tạo một ứng dụng hoàn toàn bằng Python, thì ứng dụng đó sẽ sử dụng nó làm ngôn ngữ lập trình.
bug

"Scripting" không phải là định nghĩa của một loại ngôn ngữ. Đó là một đặc điểm mà các ngôn ngữ có thể có . Vì vậy, Python là một "ngôn ngữ kịch bản tốt" bởi vì nó giúp bạn dễ dàng viết mã để viết ra mọi thứ. Assembly không phải là một ngôn ngữ viết kịch bản tốt vì nó gây khó khăn cho việc viết kịch bản. C nằm ở đâu đó ở giữa, bởi vì mặc dù nó có một từ khóa (hệ thống) để gọi ra, nó cũng khiến người dùng yên tâm với rất nhiều rắc rối trước khi bạn có thể đến được đó.
nomen

93

Đơn giản. Khi tôi sử dụng nó, nó là một ngôn ngữ động hiện đại, khi bạn sử dụng nó, nó chỉ đơn thuần là một ngôn ngữ kịch bản!


19
Vâng. "Đó không phải là 'ngôn ngữ đồ chơi', đó là một 'ngôn ngữ cấp cao'": P
Roberto Bonvallet

6
đó là kiêu căng và tắt chủ đề, -1
adf88

1
Ngay cả với - (1 + 1), nó nhận được khoảng 2x + 1 giây so với một dấu kiểm. : D
anatoly techtonik

Tốt. Câu trả lời. EVAR!
iconoclast,

41

Theo truyền thống, khi nói về sự khác biệt giữa tập lệnh và lập trình, các tập lệnh được diễn giải và các chương trình được biên dịch. Một ngôn ngữ có thể được thực thi theo nhiều cách khác nhau - được thông dịch hoặc biên dịch (sang mã bytecode hoặc mã máy). Điều này không làm cho một ngôn ngữ trở thành một ngôn ngữ khác.

Theo một số ý kiến, cách bạn sử dụng một ngôn ngữ khiến nó trở thành ngôn ngữ kịch bản (ví dụ: các nhà phát triển trò chơi chủ yếu phát triển bằng C ++ sẽ viết kịch bản cho các đối tượng trong Lua). Một lần nữa, các dòng bị mờ - một ngôn ngữ có thể được sử dụng cho lập trình bởi một người và ngôn ngữ tương tự có thể được sử dụng cho ngôn ngữ lập trình của người khác.

Đây là từ bài viết trên wikipedia về các ngôn ngữ lập trình:

Ngôn ngữ kịch bản, ngôn ngữ tập lệnh hoặc ngôn ngữ mở rộng là ngôn ngữ lập trình cho phép điều khiển một hoặc nhiều ứng dụng phần mềm. "Tập lệnh" khác với mã cốt lõi của ứng dụng, vì chúng thường được viết bằng một ngôn ngữ khác và thường được tạo ra hoặc ít nhất là sửa đổi bởi người dùng cuối. Các tập lệnh thường được diễn giải từ mã nguồn hoặc mã bytecode, trong khi các ứng dụng mà chúng điều khiển được biên dịch theo cách truyền thống sang mã máy gốc. Các ngôn ngữ kịch bản gần như luôn được nhúng trong các ứng dụng mà chúng kiểm soát.

Bạn sẽ nhận thấy việc sử dụng "thường", "thường xuyên", "truyền thống" và "gần như luôn luôn" - tất cả những điều này cho bạn biết rằng không có tập hợp các thuộc tính riêng biệt nào khiến một ngôn ngữ cụ thể trở thành "ngôn ngữ kịch bản".


1
@Amr: Nó được gọi là java script
sepp2k

1
@Ram Bhat - thật là khó hiểu, vì sự phân biệt là giả tạo.
Oded

11
@Andrey: Tất cả các triển khai JavaScript hiện đại đều được biên dịch. Và có thông dịch viên cho C.
Jörg W Mittag

27
Đây chỉ là một lỗi bình thường. Chà, thực ra nó thậm chí không sai , nó chỉ đơn giản là không có ý nghĩa. Không có cái gọi là ngôn ngữ biên dịch hoặc thông dịch. Một ngôn ngữ không được biên dịch, một ngôn ngữ chỉ . Đó là một loạt các quy tắc toán học trừu tượng. Phiên dịch và biên dịch là đặc điểm của một công cụ thực thi , không phải là một ngôn ngữ. Mọi ngôn ngữ đều có thể được triển khai bằng trình biên dịch hoặc trình thông dịch. Trên thực tế, tất cả các ngôn ngữ được trích dẫn là "thông dịch" trên trang này, hầu như chỉ có các triển khai biên dịch, ví dụ như JavaScript, PHP, Python, Ruby.
Jörg W Mittag

5
@Andrey: Chakra (IE9), TraceMonkey / JägerMonkey (Firefox), Nitro (Safari), Carakan (Opera) đều biên dịch JavaScript thành bytecode và sau đó một số bytecode được thông dịch và một số được biên dịch sang mã gốc. V8 (Chrome) bỏ qua mã bytecode và biên dịch JavaScript thẳng thành mã gốc. IronJS biên dịch JavaScript sang mã bytecode CIL. Rhino biên dịch JavaScript sang mã bytecode JVML. BESEN (công cụ ECMAScript 5 duy nhất cho đến nay) biên dịch JavaScript thành BESEN bytecode và một trình biên dịch gốc hiện đang được thêm vào. Một số cách ở trên cũng biên dịch các biểu thức chính quy thành mã máy gốc.
Jörg W Mittag

31

"Một kịch bản là những gì bạn cung cấp cho các diễn viên. Một chương trình là những gì bạn cung cấp cho khán giả." - Larry Wall

Tôi thực sự không nghĩ rằng có nhiều khác biệt nữa. Các ngôn ngữ được gọi là "kịch bản" thường được biên dịch - rất nhanh chóng và trong thời gian chạy. Và một số ngôn ngữ "lập trình" cũng được biên dịch thêm trong thời gian chạy (hãy nghĩ đến JIT) và giai đoạn đầu tiên của quá trình "biên dịch" là kiểm tra cú pháp và phân giải tài nguyên.

Đừng treo lên, nó thực sự không quan trọng.


hmmm .. Tôi không cúp máy, nhưng hầu hết những người phỏng vấn và giáo viên đều vậy. Và tôi chưa bao giờ có ai trong số những người này cho tôi một câu trả lời hài lòng!
Laz

1
Và nếu bạn đưa ra một trong những câu trả lời khác ở đây, với tư cách là một người phỏng vấn, tôi nghĩ bạn thực sự không có khả năng xử lý câu hỏi. Sự phân biệt thực sự rất mờ và không có câu trả lời rõ ràng. Nếu bạn nói "Ồ, theo truyền thống ..." thì tôi sẽ hiểu, nhưng sau đó tôi mong bạn sẽ thảo luận về những thứ như biên dịch thời gian chạy và JIT'ing.
Clinton Pierce

25

Định nghĩa của tôi sẽ là một ngôn ngữ thường được phân phối dưới dạng nguồn thay vì dưới dạng nhị phân.


5
Vì vậy, bạn nghĩ php, python, vv là ngôn ngữ kịch bản?
Sietse 19/09/08

"Scripting" là mô tả chung cho Python và PHP.
S.Lott 27/09/08

22
php và python - tất nhiên chúng là ngôn ngữ kịch bản!
Antony Carthy

đây là những gì định nghĩa của tôi đã được kể từ khi bắt đầu

@Antony Carthy điều này là sai. Python không phải là một ngôn ngữ kịch bản thường, nhưng nó có thể, giống như bất kỳ ngôn ngữ nào khác, được sử dụng trong vòng một programm (như Word (VB), Trình duyệt (JS))
Joschua

16

Có rất nhiều câu trả lời cho điều này.

Thứ nhất: nó không thực sự là một câu hỏi về sự khác biệt giữa ngôn ngữ kịch bản và ngôn ngữ lập trình, bởi vì ngôn ngữ kịch bản ngôn ngữ lập trình. Câu hỏi nhiều hơn về những đặc điểm nào khiến một số ngôn ngữ lập trình trở thành ngôn ngữ kịch bản trong khi một ngôn ngữ lập trình khác không phải là ngôn ngữ kịch bản.

Thứ hai: thực sự rất khó để nói ngôn ngữ XYZ là gì, cho dù XYZ đó là "kịch bản", "lập trình chức năng", "lập trình hướng đối tượng" hay là gì. Định nghĩa về "lập trình chức năng" là khá rõ ràng, nhưng không ai biết "ngôn ngữ lập trình chức năng" là gì.

Lập trình hàm hay lập trình hướng đối tượng là các kiểu lập trình ; bạn có thể viết theo kiểu chức năng hoặc kiểu hướng đối tượng bằng bất kỳ ngôn ngữ nào. Ví dụ, Linux Virtual File System Switch và trình điều khiển Linux Mẫu là nặng nề hướng đối tượng mặc dù viết bằng C, trong khi rất nhiều Java hoặc C # mã bạn thấy trên web là rất thủ tục và không hướng đối tượng ở tất cả . OTOH, tôi đã thấy một số mã Java có nhiều chức năng.

Vì vậy, nếu lập trình chức năng và lập trình hướng đối tượng chỉ đơn thuần là các kiểu có thể được thực hiện bằng bất kỳ ngôn ngữ nào , thì làm thế nào để bạn định nghĩa một "ngôn ngữ lập trình hướng đối tượng"? Bạn có thể nói rằng một ngôn ngữ lập trình hướng đối tượng là một ngôn ngữ cho phép lập trình hướng đối tượng. Nhưng đó không phải là định nghĩa nhiều: tất cả các ngôn ngữ đều cho phép lập trình hướng đối tượng, do đó tất cả các ngôn ngữ đều hướng đối tượng? Vì vậy, bạn nói, một ngôn ngữ là hướng đối tượng, nếu nó buộc bạn phải lập trình theo phong cách hướng đối tượng. Nhưng đó cũng không phải là định nghĩa: tất cả các ngôn ngữ đều cho phép lập trình hàm, do đó không có ngôn ngữ nào là hướng đối tượng?

Vì vậy, đối với tôi, tôi đã tìm thấy định nghĩa sau:

Một ngôn ngữ là một ngôn ngữ kịch bản (ngôn ngữ hướng đối tượng / ngôn ngữ chức năng) nếu cả hai

  • tạo điều kiện thuận lợi cho việc tạo kịch bản (lập trình hướng đối tượng / lập trình chức năng), tức là nó không chỉ cho phép mà còn làm cho nó dễ dàngtự nhiên và chứa các tính năng trợ giúp cho nó,
  • khuyến khíchhướng dẫn bạn theo hướng viết kịch bản (lập trình hướng đối tượng / lập trình chức năng).

Vì vậy, sau năm đoạn văn, tôi đã đến: "một ngôn ngữ kịch bản là một ngôn ngữ để viết kịch bản". Thật là một định nghĩa tuyệt vời. KHÔNG PHẢI.

Rõ ràng, bây giờ chúng ta cần nhìn vào định nghĩa của "scripting".

Đây là lúc vấn đề thứ ba xuất hiện: trong khi thuật ngữ "lập trình chức năng" được định nghĩa rõ ràng và chỉ có thuật ngữ "ngôn ngữ lập trình chức năng" là có vấn đề, thật không may với kịch bản, cả thuật ngữ "kịch bản" và thuật ngữ "ngôn ngữ lập trình "không được xác định rõ.

Vâng, trước hết kịch bản lập trình. Nó chỉ là một kiểu lập trình đặc biệt. IOW: mọi kịch bản đều là một chương trình, nhưng không phải mọi chương trình đều là kịch bản; tập hợp tất cả các tập lệnh là một tập hợp con thích hợp của tập hợp tất cả các chương trình.

Theo ý kiến ​​cá nhân của tôi, điều tạo nên kịch bản script và phân biệt nó với các kiểu lập trình khác, đó là…

Tập lệnh điều khiển phần lớn các đối tượng

  • không được tạo bởi tập lệnh,
  • có thời gian tồn tại độc lập với kịch bản và
  • sống bên ngoài miền của script.

Ngoài ra, các kiểu dữ liệu và thuật toán được sử dụng thường không được định nghĩa bởi script mà là bởi môi trường bên ngoài.

Hãy nghĩ về một tập lệnh shell: các tập lệnh shell thường thao tác các tệp, thư mục và các quy trình. Phần lớn các tệp, thư mục và quy trình trên hệ thống của bạn có thể không được tạo bởi tập lệnh hiện đang chạy. Và chúng không biến mất khi script thoát ra: thời gian tồn tại của chúng hoàn toàn độc lập với script. Và chúng cũng không thực sự là một phần của kịch bản, chúng là một phần của hệ thống. Bạn không bắt đầu tập lệnh của mình bằng cách viết FileDirectorycác lớp, những kiểu dữ liệu đó không phải là mối quan tâm của bạn: bạn cứ cho rằng chúng ở đó, và bạn thậm chí không biết (cũng như không cần biết) cách chúng hoạt động. Và bạn cũng không triển khai các thuật toán của riêng mình, ví dụ như đối với truyền tải thư mục mà bạn chỉ sử dụng findthay vì triển khai tìm kiếm theo chiều rộng của riêng bạn.

Nói tóm lại: một tập lệnh gắn chính nó vào một hệ thống lớn hơn tồn tại độc lập với tập lệnh, thao tác một số phần nhỏ của hệ thống và sau đó thoát ra.

Hệ thống lớn hơn đó có thể là hệ điều hành trong trường hợp tập lệnh shell, DOM của trình duyệt trong trường hợp tập lệnh trình duyệt, trò chơi (ví dụ: World of Warcraft với Lua hoặc Second Life với Linden Scripting Language), một ứng dụng (ví dụ: AutoLisp ngôn ngữ cho AutoCAD hoặc macro Excel / Word / Office), một máy chủ web, một gói rô bốt hoặc thứ gì đó hoàn toàn khác.

Lưu ý rằng khía cạnh kịch bản là hoàn toàn trực giao với tất cả các khía cạnh khác của ngôn ngữ lập trình: một ngôn ngữ lập trình có thể được gõ mạnh hoặc yếu, gõ chặt chẽ hoặc lỏng lẻo, nhập tĩnh hoặc nhập động, trên danh nghĩa, định cấu trúc hoặc gõ kiểu vịt, thậm chí có thể không định kiểu được. . Nó có thể là mệnh lệnh hoặc chức năng, hướng đối tượng, thủ tục hoặc chức năng, nghiêm ngặt hoặc lười biếng. Các triển khai của nó có thể được diễn giải, biên dịch hoặc trộn lẫn.

Ví dụ, Mondrian là một ngôn ngữ kịch bản chức năng lười biếng được đánh kiểu tĩnh mạnh mẽ với triển khai đã được biên dịch.

Tuy nhiên, tất cả điều này là tranh luận, bởi vì cách hạn ngôn ngữ kịch bản được thực sự được sử dụng trong thế giới thực, không có gì để làm với bất kỳ ở trên. Nó thường được sử dụng đơn giản như một sự xúc phạm và định nghĩa khá đơn giản, thậm chí đơn giản:

  • ngôn ngữ lập trình thực : ngôn ngữ lập trình của tôi
  • ngôn ngữ kịch bản: ngôn ngữ lập trình của bạn

Đây dường như là cách mà thuật ngữ này thường được sử dụng nhất.


Một số câu trả lời này là ngớ ngẩn. Một ngôn ngữ là "hướng đối tượng" khi nó được định hướng để lập trình với các đối tượng. Một ngôn ngữ là "chức năng" nếu nó có các chức năng hạng nhất. Điều đó không có nghĩa là một ngôn ngữ không thể là cả hai. Đây là những đặc điểm của ngôn ngữ, không phải là định nghĩa của các loại. Viết kịch bản cũng tương tự. Một ngôn ngữ là một "ngôn ngữ kịch bản tốt" nếu nó giúp bạn dễ dàng viết các tập lệnh - các đoạn tương tác giữa người dùng và ứng dụng đơn giản.
nomen

16

Nó giống như phim khiêu dâm, bạn biết nó khi bạn xem nó. Định nghĩa duy nhất có thể về ngôn ngữ kịch bản là:

A language which is described as a scripting language.

Một chút tròn, phải không? (Nhân tiện, tôi không nói đùa đâu).

Về cơ bản, không có gì khiến một ngôn ngữ trở thành một ngôn ngữ kịch bản ngoại trừ việc nó được gọi như vậy, đặc biệt là bởi những người tạo ra nó. Nhóm ngôn ngữ kịch bản hiện đại chính là PHP, Perl, JavaScript, Python, Ruby và Lua. Tcl là ngôn ngữ kịch bản hiện đại đầu tiên (mặc dù nó không phải là ngôn ngữ viết kịch bản đầu tiên, tôi quên nó là gì, nhưng tôi rất ngạc nhiên khi biết rằng nó có trước Tcl).

Tôi mô tả các tính năng của các ngôn ngữ kịch bản chính trong bài báo của mình :

 A Practical Solution for Scripting Language Compilers
 Paul Biggar, Edsko de Vries and David Gregg
 SAC '09: ACM Symposium on Applied Computing (2009), (March 2009)

Hầu hết được nhập và thông dịch động, và hầu hết không có ngữ nghĩa xác định bên ngoài triển khai tham chiếu của chúng. Tuy nhiên, ngay cả khi việc triển khai chính của chúng trở thành biên dịch hoặc JITed, điều đó không thay đổi "bản chất" của ngôn ngữ.

Họ chỉ còn lại câu hỏi là làm thế nào bạn có thể biết một ngôn ngữ mới có phải là ngôn ngữ kịch bản hay không. Chà, nếu nó được gọi là ngôn ngữ kịch bản, thì nó là một. Vì vậy, Factor là một ngôn ngữ kịch bản (hoặc ít nhất là khi nó được viết), nhưng, giả sử Java thì không.


1
Đó là một lời giải thích rất tốt, nhưng tôi chắc chắn một số người upvote nó bởi vì họ nhìn thấy "khiêu dâm"
HoKy22

Liên kết với tờ giấy bị hỏng.
Quazi Irfan

5

"Ngôn ngữ kịch bản" là một trong những khái niệm mờ nhạt có thể có nhiều nghĩa. Thông thường, nó đề cập đến thực tế là tồn tại một quy trình một bước đưa bạn từ mã nguồn đến thực thi.

Ví dụ trong Perl bạn làm: perl my_source.pl

Với các tiêu chí trên PHP là một ngôn ngữ kịch bản (ngay cả khi bạn có thể có một quy trình "biên dịch", ví dụ khi sử dụng Zend Encoder để "bảo vệ" mã nguồn).

Tái bút. Thường (nhưng không phải luôn luôn) các ngôn ngữ kịch bản được thông dịch. Cũng thường (nhưng không phải lúc nào cũng vậy) các ngôn ngữ kịch bản được gõ động.


Perl biên dịch thành mã byte trước khi chạy.
Brad Gilbert

2
Còn Java thì sao? Bạn cần một JVM để chạy một chương trình java nhưng tôi sẽ không gọi nó là một ngôn ngữ kịch bản
Eineki

5

Tất cả các ngôn ngữ kịch bản đều là ngôn ngữ lập trình. Vì vậy, nói đúng ra, không có sự khác biệt.

Thuật ngữ này không đề cập đến bất kỳ thuộc tính cơ bản nào của ngôn ngữ, nó đề cập đến cách sử dụng ngôn ngữ điển hình . Nếu mục đích sử dụng thông thường là viết các chương trình ngắn chủ yếu thực hiện các lệnh gọi đến mã có sẵn và một số xử lý đơn giản về kết quả, (nghĩa là, nếu mục đích sử dụng thông thường là viết kịch bản ) thì đó là ngôn ngữ kịch bản.


4

Tôi nghĩ ông Roberto Ierusalimschy có một câu trả lời rất hay hoặc cho câu hỏi trong 'Lập trình trong Lua':

Tuy nhiên, đặc điểm phân biệt của các ngôn ngữ được thông dịch không phải là chúng không được biên dịch, mà là bất kỳ trình biên dịch nào cũng là một phần của thời gian chạy ngôn ngữ và do đó, có thể (và dễ dàng) thực thi mã được tạo ngay lập tức


Điều này không trả lời câu hỏi ở tất cả!
Paul Biggar

Hãy để tôi nói lại rằng, một ngôn ngữ kịch bản là ngôn ngữ mà trình biên dịch được đưa vào và có thể thực thi mã được tạo một cách nhanh chóng. Làm thế nào mà điều đó không trả lời câu hỏi?
Rodrigo Lopez

Đó là một ngôn ngữ thông dịch. Nếu bạn đang cố gắng nói rằng bất kỳ ngôn ngữ được thông dịch nào cũng là ngôn ngữ kịch bản, hãy nói điều đó.
Paul Biggar,

Tất cả các ngôn ngữ đều có thể được sử dụng để viết kịch bản, điều quan trọng đối với tôi là mức độ phù hợp của chúng. Đối với tôi, đặc điểm phân biệt là, vâng, chúng được diễn giải.
Rodrigo Lopez

4
Common Lisp không phải là thứ mà tôi thường nghĩ đến như một ngôn ngữ kịch bản, nhưng nó có một evalchức năng toàn năng.
David Thornley

4

Một bộ phận là

  • scripting = được thông dịch động
  • normal = biên dịch

Một ngôn ngữ được thông dịch động được thông dịch trong thời gian chạy trong khi một ngôn ngữ biên dịch được biên dịch trước khi thực thi.

Tôi nên nói thêm rằng như Jörg đã chỉ ra, sự khác biệt được diễn giải / biên dịch không phải là một đặc điểm của ngôn ngữ, mà là của công cụ thực thi.

Bạn cũng có thể quan tâm đến phần giải thích này về hệ thống Type , có liên quan và tập trung nhiều hơn vào khía cạnh ngôn ngữ, thay vì công cụ thực thi. Hầu hết các ngôn ngữ kịch bản được gõ động, trong khi các ngôn ngữ "bình thường" chủ yếu được nhập tĩnh.

Nói chung, việc phân chia ngôn ngữ nhập tĩnh và nhập động được xác định tốt hơn và có nhiều ý nghĩa hơn về khả năng sử dụng của ngôn ngữ.


Còn Objective-C thì sao?
mouviciel

1
Nó hỗ trợ nhập động, nhưng tôi sẽ không gọi nó là ngôn ngữ kịch bản.
Timo Westkämper

2
Đây chỉ là một lỗi bình thường. Chà, thực ra nó thậm chí không sai , nó chỉ đơn giản là không có ý nghĩa. Không có cái gọi là ngôn ngữ biên dịch hoặc thông dịch. Một ngôn ngữ không được biên dịch, một ngôn ngữ chỉ . Đó là một loạt các quy tắc toán học trừu tượng. Phiên dịch và biên dịch là đặc điểm của một công cụ thực thi , không phải là một ngôn ngữ. Mọi ngôn ngữ đều có thể được triển khai bằng trình biên dịch hoặc trình thông dịch. Trên thực tế, tất cả các ngôn ngữ được trích dẫn là "thông dịch" trên trang này, hầu như chỉ có các triển khai biên dịch, ví dụ như JavaScript, PHP, Python, Ruby.
Jörg W Mittag

@ jorg-w-mittag, Vui lòng chỉnh sửa câu trả lời của tôi để chính xác hơn. Điểm của bạn là hợp lệ. Thông thường, nếu bạn nói về một ngôn ngữ, bạn cũng nói về công cụ thực thi mặc định.
Timo Westkämper

3

Ngôn ngữ kịch bản thường là :

  1. Được gõ động
  2. Được diễn giải, với rất ít sự nhấn mạnh vào hiệu suất, nhưng tính di động tốt
  3. Yêu cầu mã soạn sẵn ít hơn nhiều , dẫn đến tạo mẫu rất nhanh
  4. Được sử dụng cho các nhiệm vụ nhỏ, thích hợp để viết một tệp duy nhất để chạy một số "tập lệnh" hữu ích.

Mặc dù ngôn ngữ không phải là tập lệnh thường : 1. Được nhập tĩnh 2. Được biên dịch, chú trọng đến hiệu suất 3. Yêu cầu nhiều mã soạn sẵn hơn, dẫn đến việc tạo mẫu chậm hơn nhưng dễ đọc hơn và khả năng bảo trì lâu dài 4. Được sử dụng cho các dự án lớn, thích ứng với nhiều thiết kế mẫu

Nhưng tôi, đó là một sự khác biệt lịch sử ngày nay. Javascript và Perl được viết với các tập lệnh nhỏ, đơn giản trong khi C ++ được viết với các ứng dụng phức tạp; nhưng cả hai đều có thể được sử dụng theo một trong hai cách. Và nhiều ngôn ngữ lập trình, hiện đại cũng như cũ, dù sao cũng làm mờ dòng (và ngay từ đầu nó đã mờ!).

Điều đáng buồn là, tôi đã biết một số nhà phát triển ghét thứ mà họ coi là "ngôn ngữ kịch bản", nghĩ rằng chúng đơn giản hơn và không mạnh mẽ. Ý kiến ​​của tôi là khuôn sáo cũ - sử dụng công cụ phù hợp cho công việc.


2
Không có cái gọi là ngôn ngữ biên dịch hoặc thông dịch. Một ngôn ngữ không được biên dịch, một ngôn ngữ chỉ . Đó là một loạt các quy tắc toán học trừu tượng. Phiên dịch và biên dịch là đặc điểm của một công cụ thực thi , không phải là một ngôn ngữ. Mọi ngôn ngữ đều có thể được triển khai bằng trình biên dịch hoặc trình thông dịch. Trên thực tế, tất cả các ngôn ngữ được trích dẫn là "thông dịch" trên trang này, hầu như chỉ có các triển khai biên dịch, ví dụ như JavaScript, PHP, Python, Ruby.
Jörg W Mittag

@Jorg: Điểm tốt, tôi đồng ý. Nhưng tôi không nói rằng không thể biên dịch, chỉ nói rằng những loại ngôn ngữ này thường được thông dịch thay vì biên dịch, theo cách sử dụng phổ biến.
Oak

Có phải họ không? Tất cả các triển khai hiện tại của Python, PHP, Perl và Lua đều được biên dịch. Ngoại trừ MRI, tất cả các triển khai hiện tại của Ruby đều được biên dịch. (Và có thực sự không phải một, nhưng hai trình biên dịch JIT cho MRI). Ngoại trừ JScript, mọi cài đặt JavaScript hiện nay được biên soạn. Lưu ý rằng người kế nhiệm của JScript, Chakra, được biên dịch. Nhiều triển khai Đề án được biên soạn. ELisp được biên dịch.
Jörg W Mittag

3

Ngôn ngữ kịch bản ban đầu được coi là cơ chế điều khiển các ứng dụng được viết bằng ngôn ngữ lập trình cứng. Không thể sửa đổi các chương trình đã biên dịch trong thời gian chạy, do đó, việc viết script mang lại cho mọi người sự linh hoạt.

Đáng chú ý nhất, shell script đã tự động hóa các quy trình trong nhân hệ điều hành (theo truyền thống, AppleScript trên Mac); một vai trò ngày càng được chuyển vào tay Perl, và gần đây nó chuyển sang Python. Tôi đã thấy Scheme (đặc biệt là trong việc triển khai Guile của nó) được sử dụng để khai báo các cảnh raytracing; và gần đây, Lua rất phổ biến như là ngôn ngữ lập trình để viết kịch bản trò chơi - đến mức thứ duy nhất được mã hóa cứng trong nhiều trò chơi mới là công cụ đồ họa / vật lý, trong khi toàn bộ logic trò chơi được mã hóa bằng Lua. Theo cách tương tự, JavaScript được cho là kịch bản hoạt động của trình duyệt web.

Các ngôn ngữ được giải phóng; không ai nghĩ về hệ điều hành như một ứng dụng (hoặc nghĩ về nó nhiều), và nhiều ngôn ngữ kịch bản trước đây bắt đầu được sử dụng để viết các ứng dụng đầy đủ của riêng họ. Bản thân cái tên đã trở nên vô nghĩa và lan rộng ra nhiều ngôn ngữ thông dịch được sử dụng ngày nay, bất kể chúng có được thiết kế để thông dịch từ bên trong một hệ thống khác hay không.

Tuy nhiên, "ngôn ngữ kịch bản" chắc chắn không đồng nghĩa với "ngôn ngữ thông dịch" - ví dụ: BASIC đã được thông dịch trong phần lớn thời gian của nó (tức là trước khi nó mất tính đồng nhất và trở thành Visual Basic), nhưng không ai thực sự nghĩ về nó như viết kịch bản.

CẬP NHẬT: Đọc tài liệu như thường lệ có tại Wikipedia .


Trên thực tế, việc triển khai BASIC ban đầu là một trình biên dịch. Mãi sau này, các bản sao BASIC mới được viết dưới dạng trình thông dịch, vì trình thông dịch được cho là dễ viết hơn trình biên dịch.
Jörg W Mittag

1
@ Jörg: Không hoàn toàn như vậy. Trong khi các triển khai thử nghiệm đầu tiên của Dartmouth BASIC đã được biên dịch (được gọi là Card BASIC), các triển khai thực tế là thông dịch viên. Trên thực tế, có lẽ tính năng mới quan trọng nhất của BASIC là nó có tính tương tác. Không cần đục mã nguồn vào thẻ và đưa chúng vào trình biên dịch. Người dùng có thể chỉ cần ngồi vào teletype, viết chương trình và sau đó chạy nó.
PauliL

Điều thú vị là câu trả lời này giới thiệu ý tưởng về một ngôn ngữ 'khó'. Có cần định nghĩa trong ngữ cảnh này không?
DA Vincent,

@DavidVincent: Tôi có lẽ nên có nghĩa là "khó hơn". Không cần định nghĩa chính thức, sự hiểu biết trực quan là đủ: viết một chương trình bằng Assembly hoặc C khó hơn nhiều so với Ruby hoặc Python, vì những chương trình trước ở mức thấp và dài dòng hơn nhiều so với chương trình sau.
Amadan

3

Điểm đầu tiên, ngôn ngữ lập trình không phải là "ngôn ngữ kịch bản" hay một thứ gì đó khác. Nó có thể là một "ngôn ngữ kịch bản" và một thứ gì đó khác.

Điểm thứ hai, người triển khai ngôn ngữ sẽ cho bạn biết đó có phải là ngôn ngữ kịch bản hay không.

Câu hỏi của bạn nên đọc là "Ngôn ngữ lập trình nào sẽ được coi là ngôn ngữ kịch bản?", Chứ không phải "Sự khác biệt giữa ngôn ngữ kịch bản và ngôn ngữ lập trình là gì?". Không có giữa.

Tuy nhiên, tôi sẽ coi một ngôn ngữ là ngôn ngữ kịch bản nếu nó được sử dụng để cung cấp một số loại phần mềm trung gian. Ví dụ, tôi sẽ coi hầu hết các triển khai JavaScript là một ngôn ngữ kịch bản. Nếu JavaScript được chạy trong hệ điều hành, không phải trình duyệt thì nó sẽ không phải là ngôn ngữ kịch bản. Nếu PHP chạy bên trong Apache, thì đó là một ngôn ngữ kịch bản. Nếu nó chạy từ dòng lệnh thì không.


3

Tôi thấy một ngôn ngữ kịch bản là bất cứ thứ gì không yêu cầu bước 'biên dịch' quá nặng nề. Tính năng chính theo quan điểm của lập trình viên là: bạn chỉnh sửa mã và chạy nó ngay lập tức.

Vì vậy, tôi coi JavaScript và PHP là ngôn ngữ kịch bản, trong khi ActionScript 3 / Flex không thực sự như vậy.


Tôi không muốn bôi nhọ câu trả lời của Phi-e-rơ, nhưng chúng ta có thể bổ sung thêm ý kiến ​​không?
DA Vincent,

3

Tôi và bạn tôi vừa tranh luận như thế này: Sự khác biệt giữa ngôn ngữ lập trình và ngôn ngữ kịch bản là gì.

Một lập luận phổ biến là các ngôn ngữ lập trình được biên dịch và các ngôn ngữ kịch bản được thông dịch - Tuy nhiên tôi tin rằng lập luận này hoàn toàn sai ... tại sao?

  1. Chakra & V8 (công cụ JavaScript của Microsoft và Google) biên dịch mã trước khi thực thi
  2. QBasic được thông dịch - điều này có làm cho Qbasic trở thành một ngôn ngữ "kịch bản" không?

Trên cơ sở đó, đây là lập luận của tôi về sự khác biệt giữa ngôn ngữ lập trình và ngôn ngữ kịch bản:

Một ngôn ngữ lập trình chạy ở cấp độ máy và có quyền truy cập vào chính máy đó (bộ nhớ, đồ họa, âm thanh, v.v.).

Một ngôn ngữ kịch bản là hộp cát và chỉ có quyền truy cập vào các đối tượng tiếp xúc với hộp cát. Nó không có quyền truy cập trực tiếp vào máy bên dưới.


2

Trong Ý kiến ​​của tôi, tôi sẽ nói rằng các ngôn ngữ được thông dịch động như PHP, Ruby, v.v ... vẫn là ngôn ngữ "bình thường". Tôi muốn nói rằng các ví dụ về ngôn ngữ "script" là những thứ như bash (hoặc ksh hoặc tcsh hoặc bất cứ thứ gì) hoặc sqlplus. Những ngôn ngữ này thường được sử dụng để xâu chuỗi các chương trình hiện có với nhau trên hệ thống thành một chuỗi các lệnh nhất quán và liên quan, chẳng hạn như:

  1. sao chép A.txt vào / tmp / work /
  2. chạy quy trình dọn dẹp hàng đêm trên máy chủ cơ sở dữ liệu
  3. ghi lại kết quả và gửi chúng đến sysdamin

Vì vậy, tôi muốn nói rằng sự khác biệt (đối với tôi, dù sao) là ở cách bạn sử dụng ngôn ngữ. Các ngôn ngữ như PHP, Perl, Ruby có thể được sử dụng làm "ngôn ngữ kịch bản", nhưng tôi thường thấy chúng được sử dụng như "ngôn ngữ bình thường" (ngoại trừ Perl dường như có cả hai cách.


Cảm ơn .. Điều này làm cho mọi thứ rõ ràng hơn một chút. Vì vậy, tóm lại, các ngôn ngữ kịch bản được thiết kế để sử dụng các chương trình đã tồn tại cùng nhau theo một trình tự. NHƯNG các ngôn ngữ như C có thể được sử dụng để làm điều tương tự thông qua API. Vì vậy, về mặt kỹ thuật, tất cả phụ thuộc vào việc sử dụng
Laz

Không, bạn chỉ đang tạo ra một sự khác biệt giả tạo (đây là cái gì). Nếu bạn có thể sử dụng nó một cách nhanh chóng, một ngôn ngữ thường được gọi là ngôn ngữ kịch bản, nhưng đó không phải là một định nghĩa nghiêm ngặt hay bất cứ điều gì. Các ngôn ngữ thông thường được thông dịch thường được gọi là ngôn ngữ kịch bản.
wlangstroth

@Will: mọi sự khác biệt sẽ là giả tạo. Đây là sự khác biệt cố chấp của tôi. ;)
FrustratedWithFormsDesigner

vâng, nhưng "kịch bản" trong trường hợp này là một cách sử dụng rất thông tục và mơ hồ. Quyết định rằng "sử dụng các chương trình hiện có cùng nhau theo một trình tự" là rất cụ thể và không hoàn toàn đúng. Điều đó nghe giống như một kịch bản shell , có thể, nhưng không phải Perl. Sau đó, để đối chiếu điều đó với các API (?) ... Tôi chỉ không muốn anh chàng đi quá xa.
wlangstroth

2

Tôi sẽ tiếp tục và chuyển câu trả lời của mình khỏi câu hỏi trùng lặp


Tên "Ngôn ngữ kịch bản" áp dụng cho một vai trò rất cụ thể: ngôn ngữ mà bạn viết lệnh để gửi đến một ứng dụng phần mềm hiện có. (như "kịch bản" truyền hình hoặc phim truyền thống)

Ví dụ, ngày xưa, các trang web HTML rất nhàm chán. Họ luôn luôn tĩnh. Rồi một ngày, Netscape nghĩ, "Này, điều gì sẽ xảy ra nếu chúng ta để trình duyệt đọc và thực hiện các lệnh nhỏ trong trang?" Và như thế, Javascript được hình thành.

Lệnh javascript đơn giản là alert()lệnh, lệnh này hướng dẫn / ra lệnh cho trình duyệt (một ứng dụng phần mềm) đang đọc trang web để hiển thị cảnh báo.

Bây giờ, có alert()liên quan, theo bất kỳ cách nào, với C ++ hoặc bất kỳ ngôn ngữ mã nào mà trình duyệt thực sự sử dụng để hiển thị cảnh báo không? Dĩ nhiên là không. Ai đó viết "alert ()" trên trang .html không hiểu cách trình duyệt thực sự hiển thị cảnh báo. Anh ấy chỉ đang viết một lệnh mà trình duyệt sẽ diễn giải.

Hãy xem đoạn mã javascript đơn giản

<script>
var x = 4
alert(x)
</script>

Đây là các hướng dẫn được gửi đến trình duyệt để trình duyệt tự giải thích. Ngôn ngữ lập trình mà trình duyệt sử dụng để thực sự đặt một biến thành 4, và đưa nó vào trạng thái cảnh báo ... nó hoàn toàn không liên quan đến javascript.

Chúng tôi gọi chuỗi lệnh cuối cùng đó là "script" (đó là lý do tại sao nó được bao bọc trong <script>các thẻ). Chỉ theo định nghĩa của "script", theo nghĩa truyền thống: Một loạt các hướng dẫn và mệnh lệnh được gửi đến các diễn viên . Mọi người đều biết rằng một kịch bản phim (kịch bản phim) chẳng hạn, là một kịch bản.

Kịch bản (kịch bản) không phải là diễn viên, máy quay, hay các hiệu ứng đặc biệt. Kịch bản chỉ cho họ biết phải làm gì.

Bây giờ , chính xác thì ngôn ngữ script là gì?

Có rất nhiều ngôn ngữ lập trình giống như các công cụ khác nhau trong một hộp công cụ; một số ngôn ngữ được thiết kế đặc biệt để sử dụng làm script.

Javasript là một ví dụ rõ ràng; có rất ít ứng dụng của Javascript không nằm trong lĩnh vực kịch bản.

ActionScript (ngôn ngữ cho hoạt ảnh Flash) và các dẫn xuất của nó là ngôn ngữ kịch bản, trong đó chúng chỉ đơn giản đưa ra các lệnh cho trình phát / trình thông dịch Flash. Chắc chắn, có những điều trừu tượng như lập trình Hướng đối tượng, nhưng tất cả những điều đó chỉ đơn giản là một phương tiện cuối cùng: gửi lệnh đến trình phát flash.

Python và Ruby cũng thường được sử dụng làm ngôn ngữ kịch bản. Ví dụ, tôi đã từng làm việc cho một công ty đã sử dụng Ruby để viết các lệnh để gửi tới một trình duyệt có nội dung "truy cập trang web này, nhấp vào liên kết này ..." để thực hiện một số thử nghiệm tự động cơ bản. Tôi không phải là một "Nhà phát triển phần mềm" trong bất kỳ công việc nào. Tôi vừa viết các tập lệnh gửi lệnh đến máy tính để gửi lệnh đến trình duyệt.

Vì bản chất của chúng, các ngôn ngữ kịch bản hiếm khi được 'biên dịch' - tức là được dịch sang mã máy và được máy tính đọc trực tiếp.

Ngay cả các ứng dụng GUI được tạo từ Python và Ruby cũng là các tập lệnh được gửi đến một API được viết bằng C ++ hoặc C. Nó cho ứng dụng C biết phải làm gì.

Tất nhiên, có một dòng mơ hồ. Tại sao bạn không thể nói rằng Ngôn ngữ Máy / C là các ngôn ngữ kịch bản, bởi vì chúng là các tập lệnh mà máy tính sử dụng để giao tiếp với bo mạch chủ / card đồ họa / chip cơ bản?

Có một số dòng chúng ta có thể rút ra để làm rõ:

  1. Khi bạn có thể viết một ngôn ngữ kịch bản và chạy nó mà không cần "biên dịch", đó là một loại kịch bản trực tiếp hơn. Ví dụ, bạn không cần phải làm bất cứ điều gì với một kịch bản phim để yêu cầu các diễn viên phải làm gì với nó. Nó đã ở đó, được sử dụng, nguyên trạng. Vì lý do này, chúng tôi sẽ loại trừ các ngôn ngữ đã biên dịch được gọi là ngôn ngữ kịch bản, mặc dù chúng có thể được sử dụng cho mục đích viết kịch bản trong một số trường hợp.

  2. Ngôn ngữ kịch bản ngụ ý các lệnh được gửi đến một ứng dụng phần mềm phức tạp ; đó là toàn bộ lý do chúng tôi viết script ngay từ đầu - vì vậy bạn không cần biết sự phức tạp của cách phần mềm hoạt động để gửi lệnh đến nó. Vì vậy, ngôn ngữ kịch bản có xu hướng là ngôn ngữ gửi (tương đối) các lệnh đơn giản đến các ứng dụng phần mềm phức tạp ... trong trường hợp này, ngôn ngữ máy và mã hợp ngữ không cắt được.


2

Tôi có thể gợi ý rằng ngôn ngữ viết kịch bản đã là một thuật ngữ mà nhiều người đang tránh xa. Tôi muốn nói rằng nó chủ yếu tập trung vào các ngôn ngữ biên dịch và các ngôn ngữ động ngày nay.

Ý tôi là bạn không thể thực sự nói những thứ như Python hay Ruby là những ngôn ngữ "tạo kịch bản" trong thời đại ngày nay (thậm chí bạn còn có những thứ như IronPythonJIT-ngôn ngữ yêu thích của bạn , sự khác biệt thậm chí còn bị làm mờ hơn).

Thành thật mà nói, cá nhân tôi không cảm thấy PHP là một ngôn ngữ kịch bản nữa. Tôi sẽ không mong đợi mọi người thích phân loại PHP khác với nói Java trong lý lịch của họ.


Ngay cả khi tôi làm việc trong php rất nhiều, tôi sẽ nói rằng cho đến khi nó chuyển từ dựa trên tập lệnh sang có mô hình servlet / real / fcgi điều phối các nhiệm vụ được ủy quyền từ máy chủ, cá nhân tôi sẽ gọi nó là "một ngôn ngữ kịch bản khá tốt, có thể đưa ra ảo tưởng về một ứng dụng "
Kent Fredric

Tĩnh / Động, có những ngôn ngữ động được biên dịch.
Brad Gilbert

Tôi nhắc lại: Ý tôi là bạn không thể thực sự nói thứ gì đó như Python, hay Ruby là những ngôn ngữ "kịch bản" trong thời đại ngày nay (Bạn thậm chí có những thứ như IronPython snd JitYourFavoriteLanguage, sự khác biệt thậm chí còn bị làm mờ hơn).
Robert Gould

1

Các ngôn ngữ kịch bản có xu hướng chạy trong một công cụ kịch bản là một phần của ứng dụng lớn hơn. Ví dụ: JavaScript chạy bên trong công cụ tạo tập lệnh của trình duyệt của bạn.


Thật vui khi câu trả lời được chấp nhận có hai phiếu phản đối.
Robert S.

1
Nên có một số loại huy hiệu cho điều đó. Làm thế nào về "Không thể xử lý sự thật." Không, hơi quá lời. ;-)
Joseph Ferris

3
Perl, Python, Ruby, Tcl / Tk - tên nhưng bốn ngôn ngữ kịch bản - chủ yếu không được xây dựng trong một ứng dụng lớn hơn.
Jonathan Leffler

3
Ergo - chúng không phải là ngôn ngữ kịch bản.
Milen A. Radev

3
Uh yeah, thật tuyệt nếu điều này có thể được đánh dấu là chính xác bằng cách nào đó.
Noon Silk

1

Ngôn ngữ kịch bản là một ngôn ngữ được thông dịch mỗi khi tập lệnh được chạy, nó ngụ ý có một trình thông dịch và hầu hết con người đều có thể đọc được, để trở nên hữu ích, một ngôn ngữ kịch bản rất dễ học và sử dụng.

Mọi ngôn ngữ có thể biên dịch đều có thể được tạo thành một ngôn ngữ script và ngược lại, tất cả phụ thuộc vào việc triển khai trình thông dịch hoặc trình biên dịch, ví dụ như C ++ có trình thông dịch nên nó có thể được gọi là ngôn ngữ tập lệnh nếu được sử dụng (nói chung không thực tế lắm như C ++ là một ngôn ngữ rất phức tạp), một trong những ngôn ngữ script hữu ích nhất hiện nay là Python ...

Vì vậy, để trả lời câu hỏi của bạn, định nghĩa là sử dụng một trình thông dịch để chạy các chương trình được viết kịch bản nhanh chóng và dễ dàng, để giải quyết các tác vụ đơn giản hoặc các ứng dụng nguyên mẫu, cách sử dụng mạnh mẽ nhất mà người ta có thể làm cho các ngôn ngữ tập lệnh là bao gồm khả năng cho mỗi lần sử dụng để mở rộng ứng dụng đã biên dịch.


1

Tôi muốn mọi người không sử dụng thuật ngữ "ngôn ngữ viết kịch bản" vì tôi nghĩ rằng nó làm giảm công sức. Lấy một ngôn ngữ như Perl, thường được gọi là "ngôn ngữ kịch bản".

  • Perl là một ngôn ngữ lập trình!
  • Perl được biên dịch giống như Java và C ++. Nó chỉ được biên dịch nhanh hơn rất nhiều!
  • Perl có các đối tượng và không gian tên và các bao đóng.
  • Perl có IDE và trình gỡ lỗi và trình cấu hình.
  • Perl có đào tạo và hỗ trợ và cộng đồng.
  • Perl không chỉ là web. Perl không chỉ là sysadmin. Perl không chỉ là băng keo của Internet.

Tại sao chúng ta thậm chí cần phải phân biệt giữa một ngôn ngữ như Java được biên dịch và không phải là Ruby? Giá trị của việc ghi nhãn là gì?

Để biết thêm về điều này, hãy xem http://xoa.petdance.com/Stop_saying_script .


Không máy tính nào có thể chạy perl hoặc ruby ​​(hoặc bất kỳ dạng nào mà chúng có thể được biên dịch thành) nguyên bản. Do đó perl và ruby ​​là ngôn ngữ kịch bản, được thông dịch bởi trình phân tích cú pháp hoặc máy ảo.
anon6439

@psoul: vâng. java cũng vậy.
Stefano Borini

Có một số kỹ thuật để biên dịch ruby ​​sang mã máy mặc dù tôi không chắc liệu có bất kỳ kỹ thuật nào trong số đó không chỉ gói trình thông dịch với chuỗi đại diện cho mã ruby, nhưng ngay cả khi điều đó đúng thì vẫn có thể thực hiện được trình biên dịch từ ruby ​​sang mã máy. nó thành mã máy sẽ không làm cho nó ở bất kỳ đâu gần với tốc độ c do tất cả các điều phối động và gc trong số những thứ khác. Tôi không nghĩ rằng có bất kỳ bộ xử lý ruby ​​nào nhưng đã được thiết kế để phù hợp hơn với mô hình lisp và bộ xử lý chạy java bytecode.
Roman A.

1

Một sự khác biệt quan trọng là gõ mạnh (so với gõ yếu ). Các ngôn ngữ kịch bản thường được đánh máy yếu , do đó có thể viết các chương trình nhỏ nhanh hơn. Đối với các chương trình lớn, đây là một nhược điểm, vì nó ngăn trình biên dịch / thông dịch tự động tìm ra các lỗi nhất định, làm cho việc cấu trúc lại mã rất khó khăn.


1

Ngôn ngữ kịch bản là ngôn ngữ lập trình trong đó các chương trình thường được gửi đến người dùng cuối ở dạng văn bản có thể đọc được và ở đó có một chương trình rõ ràng có thể thực thi chương trình đó trực tiếp. (Chương trình có thể biên dịch tập lệnh nội bộ rất tốt; điều đó không liên quan ở đây vì nó không hiển thị cho người dùng.)

Các ngôn ngữ kịch bản tương đối phổ biến để có thể hỗ trợ một phiên tương tác, nơi người dùng có thể chỉ cần nhập chương trình của họ và nó thực thi ngay lập tức. Điều này là do đây là một phần mở rộng nhỏ của yêu cầu thiết yếu từ đoạn đầu tiên; yêu cầu bổ sung chính là việc bổ sung một cơ chế để tìm ra khi nào một câu lệnh đã nhập là hoàn tất để nó có thể được gửi đến bộ máy thực thi.


1

Đối với một câu hỏi hơi khác một chút. Một ngôn ngữ kịch bản là một ngôn ngữ lập trình nhưng một ngôn ngữ lập trình không nhất thiết phải là một ngôn ngữ kịch bản. Một ngôn ngữ kịch bản được sử dụng để điều khiển hoặc viết kịch bản cho một hệ thống. Hệ thống đó có thể là một hệ điều hành mà ngôn ngữ kịch bản sẽ là bash. Hệ thống có thể là một máy chủ web với ngôn ngữ kịch bản PHP. Ngôn ngữ kịch bản được thiết kế để lấp đầy một thị trường ngách cụ thể; chúng là các ngôn ngữ cụ thể của miền. Các hệ thống tương tác đã thông dịch các ngôn ngữ kịch bản làm phát sinh quan điểm rằng các ngôn ngữ kịch bản được thông dịch; tuy nhiên, đây là hệ quả của hệ thống chứ không phải bản thân ngôn ngữ kịch bản.


1

Ngôn ngữ kịch bản là một ngôn ngữ cấu hình hoặc mở rộng một chương trình hiện có.
Ngôn ngữ kịch bản là một ngôn ngữ lập trình.


1

Định nghĩa về "ngôn ngữ kịch bản" khá mờ nhạt. Tôi sẽ căn cứ vào những cân nhắc sau:

  1. Các ngôn ngữ kịch bản thường không có các bước biên dịch mà người dùng có thể nhìn thấy. Thông thường, người dùng chỉ có thể chạy các chương trình bằng một lệnh đơn giản.

  2. Các chương trình bằng ngôn ngữ kịch bản thường được truyền ở dạng nguồn.

  3. Các ngôn ngữ kịch bản thường có thời gian chạy có mặt trên một số lượng lớn hệ thống và thời gian chạy có thể được cài đặt dễ dàng trên hầu hết các hệ thống.

  4. Các ngôn ngữ kịch bản có xu hướng đa nền tảng và không dành riêng cho máy.

  5. Ngôn ngữ kịch bản giúp dễ dàng gọi các chương trình khác và giao diện với hệ điều hành.

  6. Các ngôn ngữ kịch bản thường có thể dễ dàng nhúng vào các hệ thống lớn hơn được viết bằng các ngôn ngữ lập trình thông thường hơn.

  7. Các ngôn ngữ kịch bản thường được thiết kế để dễ lập trình và ít quan tâm hơn đến tốc độ thực thi. (Nếu bạn muốn thực thi nhanh chóng, lời khuyên thông thường là viết mã các phần tốn thời gian trong một cái gì đó như C, và nhúng ngôn ngữ vào C hoặc gọi C bit từ ngôn ngữ đó.)

Một số đặc điểm mà tôi đã liệt kê ở trên là đúng với các triển khai, trong trường hợp đó tôi đang đề cập đến các triển khai phổ biến hơn. Đã có trình thông dịch C, với (AFAIK) không có bước biên dịch rõ ràng, nhưng điều đó không đúng với hầu hết các triển khai C. Bạn chắc chắn có thể biên dịch một chương trình Perl sang mã gốc, nhưng đó không phải là cách nó thường được sử dụng. Một số đặc điểm khác mang bản chất xã hội. Một số tiêu chí trên có phần trùng lặp. Như tôi đã nói, định nghĩa là mờ.


0

Tôi có thể nói rằng ngôn ngữ kịch bản là ngôn ngữ thao túng nhiều thực thể mà nó không tự định nghĩa. Ví dụ, JavaScript thao tác các đối tượng DOM do trình duyệt cung cấp, PHP vận hành thư viện khổng lồ các hàm dựa trên C, v.v. Tất nhiên không phải là một định nghĩa chính xác, nhiều hơn một cách để suy nghĩ nếu nó.


Mmm, PHP sử dụng thư viện C bên dưới, nhưng đây là trường hợp của hầu hết các ngôn ngữ, bao gồm cả Java (ở cấp thấp nhất). Và nó không thao tác các chức năng này ...
PhiLho 22/11/08

0

Nếu nó không / sẽ không chạy trên CPU, đó là một tập lệnh đối với tôi. Nếu một trình thông dịch cần chạy trên CPU bên dưới chương trình, thì đó là một tập lệnh và một ngôn ngữ kịch bản.

Không có lý do gì để làm cho nó phức tạp hơn thế này?

Tất nhiên, trong hầu hết (99%) trường hợp, rõ ràng một ngôn ngữ có phải là ngôn ngữ kịch bản hay không. Nhưng hãy xem xét rằng một máy ảo có thể mô phỏng tập lệnh x86 chẳng hạn. Điều này sẽ không làm cho x86 bytecode trở thành một ngôn ngữ kịch bản khi chạy trên một máy ảo? Điều gì sẽ xảy ra nếu ai đó viết một trình biên dịch có thể biến mã perl thành một tệp thực thi gốc? Trong trường hợp này, tôi sẽ không biết phải gọi chính ngôn ngữ đó là gì nữa. Nó sẽ là đầu ra quan trọng, không phải ngôn ngữ.

Sau đó, một lần nữa, tôi không biết bất cứ điều gì như thế này đã được thực hiện, vì vậy hiện tại tôi vẫn thấy thoải mái khi gọi các ngôn ngữ thông dịch là ngôn ngữ kịch bản.


1
Bạn đang gọi khá nhiều ngôn ngữ ngoại trừ những ngôn ngữ biên dịch thành nhị phân bản địa cho các ngôn ngữ kịch bản? Tôi chắc chắn rằng các nhà phát triển Java sẽ rất vui khi được gọi là người viết kịch bản;)
truppo

1
Họ đang. Các chương, đó là.
anon6439 14/12/08

0

Tập lệnh là một chương trình tương đối nhỏ . Một hệ thống là tương đối lớn chương trình, hoặc một bộ sưu tập của các chương trình tương đối lớn.

Một số ngôn ngữ lập trình được thiết kế với các tính năng mà nhà thiết kế ngôn ngữ và cộng đồng lập trình coi là hữu ích khi viết các chương trình tương đối nhỏ. Các ngôn ngữ lập trình này được gọi là ngôn ngữ kịch bản , ví dụ như PHP.

Tương tự như vậy, các ngôn ngữ lập trình khác được thiết kế với các tính năng mà nhà thiết kế ngôn ngữ và cộng đồng lập trình cho là hữu ích khi viết các chương trình tương đối lớn. Các ngôn ngữ lập trình này được gọi là ngôn ngữ hệ thống , ví dụ như Java.

Bây giờ, các chương trình nhỏ và lớn có thể được viết bằng bất kỳ ngôn ngữ nào. Một chương trình Java nhỏ là một tập lệnh. Ví dụ, một chương trình Java "Hello World" là một tập lệnh, không phải là một hệ thống. Một chương trình lớn, hoặc tập hợp các chương trình, được viết bằng PHP là một hệ thống. Ví dụ, Facebook, được viết bằng PHP, là một hệ thống, không phải là một tập lệnh.

Việc xem xét một tính năng ngôn ngữ đơn lẻ như là một "phép thử quỳ" để quyết định xem ngôn ngữ đó có phù hợp nhất với lập trình kịch bản hay hệ thống hay không. Ví dụ: các tập lệnh có thể được biên dịch thành mã byte hoặc mã máy hoặc chúng có thể được thực thi bằng cách diễn giải cây cú pháp trừu tượng trực tiếp (AST).

Vì vậy, một ngôn ngữ là một ngôn ngữ kịch bản nếu nó thường được sử dụng để viết các tập lệnh . Một ngôn ngữ kịch bản có thể được sử dụng để viết hệ thống, nhưng những ứng dụng như vậy có thể bị coi là không rõ ràng.

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.