Tôi đã nói HTML là ngôn ngữ đánh dấu, C ++ là ngôn ngữ lập trình, điều gì có thể tạo ra sự khác biệt đó?


22

Những người bạn lập trình của tôi luôn nói với tôi rằng HTML là ngôn ngữ đánh dấu và C ++ là ngôn ngữ lập trình. Khi tôi hỏi họ sự khác biệt là gì, họ không bao giờ cho tôi một câu trả lời hợp lý.

Điều gì có thể khiến một người gọi C ++ là ngôn ngữ lập trình, còn HTML thì không?


5
Bạn có nghĩa là khác hơn là Turing hoàn thành?
Manoj R

1
@ManojR Không phải tất cả các ngôn ngữ hoàn chỉnh Turing đều được coi là ngôn ngữ lập trình, ví dụ XSLT.
yannis

Đang đóng lại, hãy xem Q / A trong meta tại meta.programmers.stackexchange.com/q/5397/70298
miraculixx

1
Chỉnh sửa tuyệt vời @gnat, cảm ơn. Câu hỏi mở lại, xóa bình luận lỗi thời.
yannis

1
@YannisRizos Tôi vừa sao chép làm rõ được đưa ra bởi OP trong các bình luận . Tự hỏi tại sao rất nhiều người dùng đưa những thứ quan trọng về bài đăng của họ vào bình luận, thay vì chỉnh sửa; bản thân tôi hầu như luôn chỉnh sửa bài viết của mình trong những trường hợp như thế
gnat

Câu trả lời:


45

Ngôn ngữ lập trình là ký hiệu được thiết kế để truyền hướng dẫn đến máy. Theo định nghĩa đó, cả C ++ và HTML đều là ngôn ngữ lập trình, như ký hiệu Joseph Marie Jacquard được sử dụng vào năm 1801 để lập trình máy dệt của mình .

Tuy nhiên, với sự phổ biến của các ngôn ngữ được sử dụng để cấu trúc và / hoặc mô tả dữ liệu, định nghĩa của ngôn ngữ lập trình đã thay đổi để chỉ bao gồm các ngôn ngữ có khả năng diễn đạt thuật toán. Đây là định nghĩa phổ biến hơn hiện nay và nó loại trừ các ngôn ngữ như HTML hoặc XML.

Trọng tâm của định nghĩa hiện tại là khái niệm về sự hoàn thiện của Turing . Hầu hết các ngôn ngữ lập trình đều hoàn chỉnh Turing và tính hoàn chỉnh của Turing thường được trích dẫn là một đặc điểm quan trọng tách biệt ngôn ngữ lập trình với bất kỳ ngôn ngữ máy tính nào khác. Điều này là đủ tốt như một quy tắc chung, nhưng không hoàn toàn chính xác:

  1. Một số ngôn ngữ hoàn chỉnh không Turing được coi là ngôn ngữ lập trình, ví dụ: Từ thiện .
  2. Một số ngôn ngữ thường không được coi là ngôn ngữ lập trình là Turing hoàn chỉnh, ví dụ XSLT .
  3. Turing hoàn thiện một mình không nói nhiều về tính hữu ích của ngôn ngữ .

Tùy thuộc vào ngữ cảnh, bạn có thể chọn bất kỳ định nghĩa nào bạn muốn.

Chỉnh sửa:

Nói cho rõ hơn, việc triển khai một ngôn ngữ không tạo ra các đặc điểm cho chính ngôn ngữ đó, ví dụ: Thông số kỹ thuật của ngôn ngữ có thể định nghĩa một ngôn ngữ hoàn chỉnh, ai đó có thể thực hiện ngôn ngữ đó một cách ngớ ngẩn. Tuy nhiên, việc triển khai này không hoàn thành không có nghĩa là ngôn ngữ không hoàn chỉnh (thay vào đó có nghĩa là việc triển khai không tuân thủ). Các chi tiết của một ngôn ngữ và các chi tiết của việc thực hiện một ngôn ngữ cụ thể sẽ được công nhận là những điều riêng biệt, đây là lý do tại sao việc gọi một ngôn ngữ được giải thích hoặc biên dịch, v.v.


6
Bạn có thể nói rõ hơn về "XSLT không được coi là ngôn ngữ lập trình". Tôi chưa bao giờ thấy điều này và IMO tôi thậm chí sẽ đặt câu hỏi về kiến ​​thức hoặc năng lực của ai đó với PL khi nói điều này. Tôi thậm chí không thể nghĩ ra bất kỳ lý do nào khiến XSLT không nên được coi là PL (XSLT có thể là một trường hợp nhẹ của việc sử dụng tarpit nhưng đó là một vấn đề khác).
bhaak

@bhaak Tôi không nói rằng nó không nên được coi là ngôn ngữ lập trình. Các ngôn ngữ chuyển đổi dữ liệu thường không được coi là ngôn ngữ lập trình, điều này hoàn toàn không nói gì nếu chúng là hoặc không phải là ngôn ngữ lập trình. Tôi đã thấy logic kinh doanh trong XSLT và cá nhân tôi coi đó là ngôn ngữ lập trình. Nhưng tôi có lẽ sẽ không, nếu lần đầu tiên tôi không nhìn thấy nó ở nơi làm việc. Trong trường hợp nào, ai quan tâm?
yannis

Bạn có thể thêm một hoặc hai câu về ý nghĩa của việc hoàn thành.
phant0m


@ think123 Tôi không nghĩ rằng tôi có thể đưa ra một định nghĩa đơn giản hơn định nghĩa trong Wikipedia và tôi đã liên kết với bài viết có liên quan trong câu trả lời.
yannis

5

Cụm từ "Tôi biết điều đó khi tôi nhìn thấy nó" là một biểu thức thông tục mà người nói cố gắng phân loại một sự kiện hoặc sự kiện có thể quan sát được, mặc dù danh mục này mang tính chủ quan hoặc thiếu các tham số được xác định rõ ràng. Cụm từ này được sử dụng nổi tiếng bởi Thẩm phán Tòa án Tối cao Hoa Kỳ Potter Stewart để mô tả bài kiểm tra ngưỡng của ông về sự tục tĩu trong Jacobellis v. Ohio (1964).

- "Tôi biết điều đó khi tôi thấy nó" bài viết Wikipedia

Giống như tục tĩu, tôi nghĩ tất cả chúng ta đều biết một ngôn ngữ lập trình khi chúng ta nhìn thấy một ngôn ngữ. Rõ ràng OP làm điều đó, vì bạn đã đánh giá C ++ là ngôn ngữ lập trình và HTML không phải là một ngôn ngữ.

Vậy chính xác mục tiêu của việc theo đuổi một định nghĩa chính thức là gì? Yannis đã đưa ra một danh sách lớn về lý do tại sao định nghĩa phổ biến nhất, tính đầy đủ của Turing, là thiếu sót: nó dẫn đến việc phân loại thách thức bài kiểm tra "Tôi biết khi tôi nhìn thấy nó".

Tôi nói với bạn rằng bất kỳ định nghĩa nào bạn có thể đưa ra sẽ dẫn đến một số ngôn ngữ mà tất cả chúng ta cảm thấy không phải là ngôn ngữ "lập trình" sẽ được phân loại là như vậy; hoặc với một số ngôn ngữ mà tất cả chúng ta cảm thấy ngôn ngữ "lập trình" sẽ được phân loại là không được như vậy.

Tại sao không đi với ruột của bạn? Tôi sử dụng một heuristic đơn giản: một ngôn ngữ lập trình là một ngôn ngữ mà mục đích chính của tôi, theo quan sát của tôi, là để viết các chương trình. Không đánh dấu nội dung. Không chuyển đổi XML. Để viết chương trình mục đích chung. Tôi chỉ muốn biết điều đó khi tôi nhìn thấy nó hơn là cố gắng đưa ra một định nghĩa chính thức và tôi không thấy bất kỳ giá trị thực sự nào có thể đến từ việc thử định nghĩa như vậy.


Nhưng bây giờ bạn đang giới hạn "ngôn ngữ lập trình" thành "ngôn ngữ lập trình mục đích chung". Cái sau là những gì mọi người thường có nghĩa khi họ nói "ngôn ngữ lập trình", nhưng theo đuổi chính xác các đặc điểm xác định của "ngôn ngữ lập trình" cũng có ý nghĩa trong việc hiểu ngôn ngữ lập trình là gì, cách thức hoạt động và những hạn chế của chúng. Ví dụ, bất kỳ lập trình viên lành nghề nào cũng phải nhận ra vấn đề tạm dừng khi họ gặp phải nó, điều này sẽ khó khăn nếu không nghiên cứu ranh giới lý thuyết của các ngôn ngữ lập trình.
JesperE

@JesperE: Tôi rất vui khi giới hạn phán đoán "Tôi biết điều đó khi tôi thấy nó" đối với các ngôn ngữ lập trình ít nhất là khá chung chung về mục đích. Ngoài ra tôi không đồng ý rằng "bất kỳ lập trình viên lành nghề" nào cũng cần bất kỳ kiến ​​thức nào về vấn đề tạm dừng - tôi biết rằng kiến ​​thức của tôi về giáo dục khoa học máy tính chính thức của tôi chưa bao giờ liên quan đến tôi trong gần hai thập kỷ phát triển chuyên nghiệp.
Carson63000

1
Nếu bạn không phải mang nó lên, điều đó có thể tốt. Điều đó không có nghĩa là không quan trọng để biết. Bạn không đánh giá chất lượng dây an toàn của mình bằng tần suất sử dụng thực tế, phải không?
JesperE

Theo heuristic của bạn, có phải là một ngôn ngữ lập trình?
Brian

@Brian: thú vị! Tôi đoán tôi đã luôn luôn chỉ nghĩ đơn giản của elisp như một thực hiện Lisp, mà rõ ràng là một ngôn ngữ lập trình, mặc dù điều này đặc biệt thực hiện cụ thể nhiều hơn nữa trong phạm vi của nó mục đích.
Carson63000

2

Các ngôn ngữ đánh dấu chủ yếu xử lý cách hiển thị thông tin và chúng thường thiếu trong cơ sở hạ tầng lập trình các biến, toán, so sánh, ra quyết định (nếu ... sau đó), vòng lặp (trong, trong khi), v.v.

HTML tự nó là tĩnh; nghĩa là, giống như một trình xử lý văn bản, nó có nghĩa là để trình bày thông tin như nó vốn có. Chỉ với việc bổ sung một số loại ngôn ngữ lập trình (thường là các ngôn ngữ script như JavaScript, PHP, v.v.), các trang web HTML có thể có nội dung "thay đổi". Các ngôn ngữ kịch bản cung cấp các khả năng "lập trình" với các biến, toán học, so sánh, ra quyết định, vòng lặp, v.v.


0

HTML là một ngôn ngữ khai báo. Nó không tự làm được gì nhiều, nó chỉ mô tả một tài liệu và nội dung của nó (sử dụng các thẻ có ý nghĩa ngữ nghĩa).

C ++ mặt khác làm một cái gì đó. Nó định nghĩa các hàm và các lớp, nhưng nó cũng mô tả cách các hàm này hoạt động cùng nhau, cách đầu vào và đầu ra của chúng được gắn với nhau theo một cách có ý nghĩa và toàn bộ ứng dụng sẽ chạy như thế nào.

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.