Ngôn ngữ lập trình vs Ngôn ngữ đánh dấu vs Ngôn ngữ kịch bản


38

Cho đến bây giờ tôi không biết KEY khác nhau giữa ba. Khi ai đó hỏi tôi về điều này, tôi chỉ nói với họ rằng C # là ngôn ngữ lập trình, HTML và XML là Ngôn ngữ Đánh dấu và JavaScript và VBScript là ngôn ngữ kịch bản. Nhưng những khác biệt chính để phân biệt chúng với nhau là gì?


Đừng quên truy vấn ngôn ngữ!
Kyle Delaney

Câu trả lời:


38

Hãy để tôi cố gắng tìm một đường phân chia giữa ba loại ngôn ngữ này. Tất nhiên, sẽ có rất nhiều trường hợp ngoại lệ và phản tác dụng, vì đây chỉ là ý kiến ​​của tôi.

  • Một ngôn ngữ đánh dấu được sử dụng để kiểm soát việc trình bày dữ liệu, như "biểu thị những tên người dùng này dưới dạng danh sách dấu đầu dòng hoặc dưới dạng bảng".

  • Một ngôn ngữ kịch bản được sử dụng để làm trung gian giữa các chương trình để tạo dữ liệu. Điều này đặc biệt đúng với các ngôn ngữ kịch bản lệnh shell như bash, nhưng nếu bạn phản ánh về nó, thì Python hoặc Perl cũng xuất phát từ nhu cầu hoàn thành các nhiệm vụ trong UNIX mà không cần viết chương trình trong C. Chương trình mà bạn kiểm soát hầu hết thời gian bằng các ngôn ngữ đó là thông dịch viên của ngôn ngữ , nó hoàn thành các nhiệm vụ chung cho bạn. Các chương trình điển hình khác mà bạn tương tác là máy chủ cơ sở dữ liệu hoặc máy chủ web.

    Quay trở lại ẩn dụ danh sách người dùng, bằng ngôn ngữ kịch bản, bạn yêu cầu cơ sở dữ liệu "cung cấp cho tôi tất cả tên người dùng", sau đó yêu cầu máy chủ web "gửi danh sách người dùng này cho người yêu cầu này".

  • Một ngôn ngữ lập trình được sử dụng để chuyển đổi dữ liệu . Nó làm như vậy bằng cách tạo các lệnh CPU ghi lại dữ liệu đầu vào thành đầu ra; Hy vọng, đầu ra mong muốn . Ví dụ về chuyển đổi dữ liệu là tính tổng của một số bổ sung hoặc giải hệ phương trình vi phân từ một tập hợp các điều kiện, hoặc viết và đọc từ một cấu trúc giống như cây theo cách nhất quán đưa ra một chuỗi các truy vấn có thể đồng thời .

    Quay trở lại ẩn dụ danh sách người dùng, bằng ngôn ngữ lập trình, bạn viết cách duyệt qua bảng bản ghi, trích xuất từ ​​mỗi bản ghi trường "tên" và trả lại tất cả chúng cho người yêu cầu.

Lưu ý rằng các ngôn ngữ script là một tập hợp con của các ngôn ngữ lập trình, tức là một ngôn ngữ có thể là cả "scripting" và "lập trình": Python thường được sử dụng để "làm trung gian giữa các chương trình" và cũng để "chuyển đổi dữ liệu". Có những ngôn ngữ khác như Java hiếm khi được sử dụng để "làm trung gian giữa các chương trình", không phải vì điều này là không thể mà vì chúng không được thiết kế để làm cho việc này trở nên dễ dàng. Đặc điểm chính của ngôn ngữ kịch bản là nó có thể phối hợp các chương trình khác, giống như một kịch bản đưa ra gợi ý cho một diễn viên để bắt đầu phần của mình.


7
Các ngôn ngữ scripting chính thức là một lớp con của các ngôn ngữ lập trình. (Tôi cũng đã nhìn thấy các ngôn ngữ như C và Java được giải thích đầy đủ, với một REPL; rào cản là bị rò rỉ cả hai cách ...)
Donal Fellows

1
@DonalFellows: bạn nói đúng. Tôi đã trả lời với ý nghĩ đó, nhưng tôi chưa sử dụng rõ ràng biểu thức "cái này là tập con của cái kia". Ngoài ra, tôi đã không ngụ ý rằng một loại được giải thích và loại kia thì không, bởi vì tôi biết đó là một sự phân biệt yếu.
đăng nhập

1
@DonalFellows: Tôi đã chỉnh sửa câu trả lời của mình để đề cập rõ ràng rằng cái này là tập con của cái kia.
đăng nhập

1
Tôi ủng hộ câu trả lời này vì là người duy nhất (cho đến nay) cho rằng các ngôn ngữ đánh dấu là ngôn ngữ mô tả cấu trúc dữ liệu.
Idan Arye

3
@ JörgWMittag: Tôi biết sẽ có ngoại lệ, đó là lý do tại sao tôi bắt đầu với "sẽ có nhiều ngoại lệ" :) Nếu không, trong câu trả lời của tôi, tôi có ngụ ý rằng một ngôn ngữ kịch bản không được biên dịch? Tôi đã cố gắng tập trung vào mục đích của các ngôn ngữ một cách chính xác để tránh cạm bẫy đó ...
logc

11

Ngôn ngữ đánh dấu là ngôn ngữ được sử dụng để thể hiện dữ liệu có cấu trúc. Ví dụ: HTML cho phép chỉ định rằng một số phần của tài liệu là tiêu đề hoặc một phần khác là danh sách, bằng cách so sánh với tài liệu văn bản phẳng.

Ngôn ngữ đánh dấu không được coi là ngôn ngữ lập trình¹.

Sự khác biệt với ngôn ngữ lập trình không phải lúc nào cũng rõ ràng. Ví dụ: XSLT là ngôn ngữ hoàn chỉnh Turing², nhưng dựa trên XML là ngôn ngữ đánh dấu.

Bản thân Wikipedia thực hiện những nỗ lực quan trọng để tránh XSLT đủ điều kiện là ngôn ngữ lập trình hoặc ngôn ngữ đánh dấu. Nó chỉ nói đó là ngôn ngữ khai báo và nó sử dụng các kỹ thuật tối ưu hóa được tìm thấy trong các ngôn ngữ lập trình chức năng và ngôn ngữ truy vấn cơ sở dữ liệu.

Ngôn ngữ kịch bảnngôn ngữ lập trình được diễn giải, thay vì biên dịch, có nghĩa là ngôn ngữ kịch bản biểu thị một tập hợp con của tất cả các ngôn ngữ lập trình.

Không phải lúc nào ngôn ngữ lập trình cũng là ngôn ngữ kịch bản, không phải lúc nào ngôn ngữ cũng được biên dịch hay giải thích. Ví dụ, PHP có thể được biên dịch sang mã byte trung gian và sau đó được biên dịch lại thành mã máy bằng trình biên dịch JIT, trong khi vẫn được coi là ngôn ngữ kịch bản⁴.

Xem thêm: Tách tóc meta của Steven Lott.


XML XML XML không phải là ngôn ngữ lập trình. Xem XML trong 10 điểm .

² Từ XSLT là ngôn ngữ hoàn chỉnh Turing xem See XSLT trên Wikipedia

³ HHVM biên dịch Hack và PHP thành một mã byte trung gian. Mã byte này sau đó được dịch sang mã máy x64 một cách linh hoạt khi chạy bởi trình biên dịch chỉ trong thời gian (JIT). Trực tiếp Xem HHVM .

Scripting ngôn ngữ trong danh sách ngôn ngữ theo loại lập trình trên Wikipedia.


16
Ngôn ngữ không bao giờ được biên dịch hoặc giải thích. Ngôn ngữ chỉ . Biên dịch và giải thích là những đặc điểm của trình biên dịch hoặc trình thông dịch (duh!) Được sử dụng để thực hiện ngôn ngữ. Các thuật ngữ "ngôn ngữ được biên dịch" hoặc "ngôn ngữ được dịch" thậm chí không có nghĩa, chúng thuộc về các mức độ trừu tượng khác nhau. Nếu Englisch là một ngôn ngữ đánh máy, "ngôn ngữ được biên dịch" sẽ là một TypeError! Mỗi ngôn ngữ có thể được thực hiện bởi một thông dịch viên, mọi ngôn ngữ có thể được thực hiện bởi một trình biên dịch.
Jörg W Mittag

@ JörgWMittag "Mọi ngôn ngữ đều có thể được trình thông dịch triển khai, mọi ngôn ngữ đều có thể được thực hiện bởi trình biên dịch" - Có đúng 100% không?
spartacus

@spartacus Tôi đang gọi đó là "không" do dự. Tôi nghĩ rằng bất kỳ ngôn ngữ nào có thể được biên dịch cũng có thể được giải thích (chỉ cần thực hiện hướng dẫn thay vì lưu nó), nhưng tôi đã nghe rằng tính đồng âm hạn chế nghiêm trọng khả năng biên dịch
Izkata

@Izkata Tôi sẽ không nói rằng đồng âm tự thay đổi khả năng biên dịch, nhưng thay vào đó, siêu lập trình nó cho phép có nghĩa là nhiều quá trình biên dịch phải được hoãn lại trong thời gian chạy, nếu có.
Đánh dấu

1
Phần "Ngôn ngữ kịch bản" hoàn toàn sai vì "Jörg W Mittag" đã chỉ ra. Và trên đầu trang không có lời giải thích về "Ngôn ngữ lập trình".
David Raab

2

Để tạo ra bất kỳ loại phân loại nào, trước tiên bạn cần tự hỏi mình một số câu hỏi:

  • Các đối tượng tôi sẽ đặt vào bất kỳ mối quan hệ nào được xác định đúng?
  • Nếu vậy, họ thực sự tồn tại?
  • Tôi có tự giới hạn mình chỉ một loại mối quan hệ cụ thể giữa các đối tượng không, hay có một yêu cầu đặt ra cho hệ thống chỉ sử dụng các quan hệ hợp pháp?

Thông thường, khi một người nghe một câu hỏi giống như câu hỏi bạn đã hỏi, câu trả lời dự kiến ​​sẽ đưa ra một số giả định. Ví dụ, điều tự nhiên là giả định rằng vì tất cả các ngôn ngữ này là ngôn ngữ nên chúng phải tạo thành một hệ thống phân cấp theo khái niệm ngôn ngữ chung hơn hoặc chúng phân vùng không gian của tất cả các ngôn ngữ hoặc chúng là tập hợp con của nhau.

Ngôn ngữ lập trình

Thật không may, không có điều nào ở trên có vẻ đúng. Có lẽ chỉ các ngôn ngữ lập trình có một định nghĩa đồng ý nhất. Ngôn ngữ lập trình là ngôn ngữ mã hóa chương trình. Mã hóa có nghĩa là một từ trong ngôn ngữ có thể được hiểu là một chương trình (một chuỗi các hành động). Ngôn ngữ lập trình máy tính là một tập hợp con trong số này. Ví dụ về ngôn ngữ lập trình không phải máy tính: danh sách tạp hóa, được hiểu là chỉ dẫn cho người mua trong siêu thị, DNA được giải thích bằng cách phiên mã peptide, bản ghi âm nhạc tương tự phục vụ như một chương trình cho máy ghi âm.

Do đó, ngôn ngữ lập trình máy tính là ngôn ngữ lập trình máy tính.

Ngôn ngữ kịch bản

Không được xác định rõ. Nó là mở để giải thích những gì thuật ngữ này có nghĩa. Trong lịch sử, dường như các ngôn ngữ lập trình không có trình biên dịch để tạo mã máy đã được gọi theo cách này. Theo tiêu chuẩn ngày nay, điều này sẽ đưa mọi ngôn ngữ lập trình phổ biến sans Nhà lắp ráp vào danh mục này. Ngay cả những ngôn ngữ được gọi là ngôn ngữ cấp thấp như C yêu cầu thời gian chạy với các thủ tục có sẵn, do đó, các nhị phân thu được bằng cách biên dịch chương trình C không hoàn toàn là mã máy, mà còn gọi đến thời gian chạy mọi lúc.

Ngôn ngữ đánh dấu

Không được xác định rõ. Bất cứ khi nào thuật ngữ này được sử dụng, ý định dường như là để mô tả một ngôn ngữ lập trình với từ vựng rất hạn chế, chủ yếu được sử dụng để tạo hình ảnh trực quan hoặc âm thanh. Có thể khó thấy XML là một chương trình gì đó, nhưng nếu bạn nhìn vào đánh dấu Man hoặc TexInfo, bạn sẽ thấy các ký tự "đặc biệt" thực sự là hướng dẫn của trình thông dịch.

Cũng có thể đưa ra một diễn giải "lập trình" cho ngôn ngữ XML, một thứ có thể diễn ra như sau:

< := put interpreter in the reading node mode
! := if reading node, start CData/Comment mode
     else if not in read text mode, signal error
-- := if in start CData/Comment mode, start comment
      else if in comment, put in end comment mode
      else if in end comment mode, signal error
...

Điểm mấu chốt: sự phân chia này cho đến ngày hôm nay, dường như không có ý nghĩa lắm, nó chỉ có thể mang đến cho bạn một số trực giác về loại ngôn ngữ mà bạn phải đối mặt, nhưng nó sẽ không cung cấp cho bạn định nghĩa nghiêm ngặt.


1

Tất cả ba khái niệm chồng chéo lên nhau, do đó bạn có thể nhận được các đối số vô tận cho dù XSLT là ngôn ngữ lập trình hay liệu Python có phải là ngôn ngữ kịch bản hay không.

Một ngôn ngữ đánh dấu là một ngôn ngữ mà đại diện cho cấu trúc dữ liệu trong một định dạng văn bản , HTML là nổi tiếng nhất, nhưng có rất nhiều định dạng cho các mục đích khác nhau, như SVG cho đồ họa, WSDL để mô tả các giao diện dịch vụ web, resx cho các tập tin resouce trong. mạng và như vậy. Một nguyên tắc nhỏ là ngôn ngữ đánh dấu không mô tả một quy trình hoặc thuật toán (giống như ngôn ngữ lập trình), nhưng là dữ liệu thuần túy. Nhưng nó cũng là một cái nhìn sâu sắc CS cơ bản mà ở đó không có sự khác biệt cơ bản giữa mã và dữ liệu. Một số ngôn ngữ đánh dấu như XSLT có các vòng lặp và các điều kiện như ngôn ngữ lập trình "thực" và một số ngôn ngữ lập trình như Prolog gần như là dữ liệu thuần túy không có quy trình được chỉ định trong mã. Và Lisp làm mờ dòng rất nhiều, nó xử lý mã riêng của mình dưới dạng định dạng dữ liệu có cấu trúc.

Đối với sự phân biệt giữa ngôn ngữ lập trìnhngôn ngữ kịch bản , đây là một sự phân biệt lịch sử gần như đã lỗi thời ngày nay. Vào thời xa xưa, chúng tôi đã biên soạn các chương trình độc lập được viết bằng chữ C và sau đó chúng tôi có các ngôn ngữ kịch bản lệnh như shell script hoặc Word Basic, được diễn giải và thiết kế để thao tác các chương trình và công cụ khác. Ngày nay, dòng này khá mờ với nhiều nền tảng, vì chúng ta có nhiều cấp độ biên dịch và giải thích khác nhau (biên dịch mã byte, biên dịch JIT, v.v.) và các API độc lập với ngôn ngữ khác nhau. Vì vậy, sự phân biệt là không hữu ích.


0

Một ngôn ngữ đánh dấu được sử dụng để mô tả dữ liệu hơn là logic. Một cách sử dụng điển hình của chúng là để mô tả việc tạo tài liệu, ví dụ HTML được thiết kế cho việc này. Nhưng đôi khi chúng cũng được sử dụng làm định dạng dữ liệu chung, XML là ngôn ngữ đánh dấu thường được sử dụng để chỉ mô tả dữ liệu.

Sự khác biệt giữa các ngôn ngữ lập trình và kịch bản là rất mờ nhạt, cả hai đều có xu hướng hoàn thiện ở chỗ bạn có thể giải quyết bất kỳ vấn đề tính toán nào với chúng. Có một số 'gợi ý' chung mà bạn có thể tìm kiếm để xem liệu ngôn ngữ có phải là ngôn ngữ lập trình hay không.

  • Ngôn ngữ kịch bản thường được diễn giải thay vì biên dịch, hoặc ít nhất cung cấp tùy chọn được diễn giải.
  • Ngôn ngữ kịch bản thường được xây dựng để nhanh chóng hoạt động chứ không phải chạy nhanh.
  • Ngôn ngữ kịch bản có xu hướng đi kèm với các thư viện tiêu chuẩn rất rộng lớn. Nhiều ngôn ngữ lập trình cũng làm như vậy, nhưng nó là tùy chọn nhiều hơn cho chúng.

Nhưng cuối cùng, nếu một ngôn ngữ là ngôn ngữ kịch bản hoặc ngôn ngữ lập trình thì đó là vấn đề quy ước hơn là bất kỳ tiêu chí nghiêm ngặt nào. Ngay cả những gợi ý ở trên chỉ là xu hướng, bạn sẽ tìm thấy các ngôn ngữ lập trình đáp ứng tất cả các tiêu chí cho một ngôn ngữ kịch bản nhưng vẫn được coi là ngôn ngữ lập trình.


4
Ngôn ngữ không bao giờ được biên dịch hoặc giải thích. Ngôn ngữ chỉ . Biên dịch và giải thích là những đặc điểm của trình biên dịch hoặc trình thông dịch (duh!) Được sử dụng để thực hiện ngôn ngữ. Các thuật ngữ "ngôn ngữ được biên dịch" hoặc "ngôn ngữ được dịch" thậm chí không có nghĩa, chúng thuộc về các mức độ trừu tượng khác nhau. Nếu Englisch là một ngôn ngữ đánh máy, "ngôn ngữ được biên dịch" sẽ là một TypeError! Mỗi ngôn ngữ có thể được thực hiện bởi một thông dịch viên, mọi ngôn ngữ có thể được thực hiện bởi một trình biên dịch. Thậm chí có thể tự động tạo một trình biên dịch từ một trình thông dịch và ngược lại.
Jörg W Mittag

@ JörgWMittag đúng là không có ngôn ngữ nào được biên dịch hoặc giải thích. Nhưng thường có những quy ước về cách nó thường được thực thi, chủ yếu là những gì tôi đang đề cập ở đây.
Pierre Andersson
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.