Мне сказали, что HTML - это язык разметки, C ++ - это язык программирования, что может изменить это?

22

Мои друзья по программированию всегда говорят мне, что HTML - это язык разметки, а C ++ - это язык программирования. Когда я спрашиваю их, в чем разница, они никогда не дают мне разумного ответа.

Что может сделать C ++ языком программирования, а HTML нет?

Лукас - Лучшая Академия Кодирования
источник
5
Вы имеете в виду что-то кроме того, чтобы быть полным Тьюринга?
Маной Р.
1
@ManojR Не все языки Тьюринга считаются языками программирования, например XSLT.
Яннис
В завершение, см. Вопрос / ответ
miraculixx
1
Отличное редактирование @gnat, спасибо. Вопрос вновь открыт, устаревшие комментарии удалены.
Яннис
1
@YannisRizos Я только что скопировал разъяснения, данные ОП в комментариях . Интересно, почему так много пользователей размещают важные комментарии о своих постах в комментариях вместо редактирования; Я сам почти всегда редактирую свои сообщения в таких случаях
gnat

Ответы:

45

Язык программирования - это нотация, предназначенная для передачи инструкций машине. По этому определению и C ++, и HTML являются языками программирования, как и нотация Джозефа Мари Жаккарда, использованная в 1801 году для программирования своих станков .

Однако с распространением языков, которые используются для структурирования и / или описания данных, определение языка программирования сместилось, чтобы включать в себя только языки, которые способны выражать алгоритмы. Это более распространенное определение сегодня, и оно исключает такие языки, как HTML или XML.

В основе нынешнего определения лежит концепция полноты по Тьюрингу . Большинство языков программирования являются полными по Тьюрингу, и полнота по Тьюрингу часто указывается как одна из критических черт, отличающих язык программирования от любого другого компьютерного языка. Как правило, это достаточно хорошо, но не совсем точно:

  1. Некоторые языки, не являющиеся полными по Тьюрингу, считаются языками программирования, например, Charity .
  2. Некоторые языки, которые обычно не считаются языками программирования, являются полными по Тьюрингу, например XSLT .
  3. Одна лишь полнота Тьюринга мало что говорит о полезности языка .

В зависимости от контекста, вы можете выбрать любое определение, которое вы хотите.

Редактировать:

Кроме того, известно, что реализация языка не присваивает характеристики самому языку, например: спецификация языка может определять полный язык тьюринга, кто-то может его случайно реализовать, не допуская полноты тьюринга. Эта реализация не завершена по Тьюрингу, однако, не означает, что сам язык не является завершенным по Тьюрингу (скорее всего, это означает, что реализация не соответствует). Детали языка и детали конкретной реализации языка должны распознаваться как отдельные вещи, поэтому неправильно называть язык интерпретируемым или компилируемым и т. Д.

Яннис
источник
6
Не могли бы вы уточнить, что «XSLT не считается языком программирования». Я никогда не видел этого, и, IMO, я бы даже поставил под сомнение чьи-либо знания или компетенцию с ЛП при произнесении этого. Я даже не могу придумать причину, по которой XSLT не следует рассматривать как PL (XSLT может быть легким случаем tarpit turing, но это другая проблема).
bhaak 29.12.12
@bhaak Я не говорю, что это не следует считать языком программирования. Языки преобразования данных обычно не рассматриваются как языки программирования, которые вообще ничего не говорят о том, являются ли они языками программирования или нет. Я видел бизнес-логику в XSLT и лично считаю ее языком программирования. Но я бы, наверное, не стал бы, если бы впервые не увидел это на работе. В любом случае, кого это волнует?
Яннис
Вы можете добавить одно или два предложения о том, что значит быть завершенным.
phant0m
@ think123 Не думаю, что смогу дать более простое определение, чем определение в Википедии, и я уже дал ссылку на соответствующую статью в ответе.
Яннис
5

Фраза «Я знаю это, когда я вижу это» является разговорным выражением, с помощью которого говорящий пытается классифицировать наблюдаемый факт или событие, хотя категория является субъективной или не имеет четко определенных параметров. Фраза была классно использована судьей Верховного суда США Поттером Стюартом для описания своего порогового теста на непристойность в деле Jacobellis v. Ohio (1964).

- «Я знаю это, когда вижу» статья в Википедии

Как непристойность, я думаю, что все мы знаем язык программирования, когда мы видим тот. Очевидно, что OP делает это, поскольку вы уже определили, что C ++ - это язык программирования, а HTML - нет.

Итак, какова цель преследования формального определения? Яннис уже дал краткое изложение того, почему наиболее популярное определение, полнота Тьюринга, ошибочно: оно приводит к категоризации, которая не поддается проверке «Я знаю это, когда вижу».

Я говорю вам, что любое определение, которое вы можете придумать, приведет к тому, что некоторые языки, которые мы все считаем не «языками программирования», будут классифицированы как таковые; или на некоторые языки , которые мы все ощущаем являются языки «программирования» будут классифицированы как не быть так.

Почему бы просто не пойти с вашей кишкой? Я использую простую эвристику: язык программирования - это язык, основной целью которого, на мой взгляд и согласно моим наблюдениям, является написание программ. Не размечать контент. Не преобразовывать XML. Написание программ общего назначения. Я предпочел бы просто знать это, когда увижу это, чем пытаться закрепить формальное определение, и я не вижу никакой подлинной ценности, которая может прийти от попытки такого определения.

Carson63000
источник
Но теперь вы ограничиваете «языки программирования» «языками программирования общего назначения». Последнее - это то, что люди обычно имеют в виду, когда говорят «язык программирования», но преследование именно того, что характеризует «язык программирования», также имеет смысл в понимании того, что такое языки программирования, как они работают и каковы их ограничения. Например, любой опытный программист должен распознавать проблему остановки, когда сталкивается с ней, что было бы трудно без изучения теоретических границ языков программирования.
JesperE
@JesperE: Я рад ограничить свое суждение «Я знаю это, когда я это вижу» языками программирования, которые, по крайней мере, достаточно общие по своему назначению. Кроме того, я не согласен с тем, что «любому опытному программисту» нужны какие-либо знания о проблеме остановки - я знаю, что мои знания об этом по формальному образованию в области компьютерных наук никогда не были актуальны для меня в течение почти двух десятилетий профессионального развития.
Carson63000
1
Если вам не пришлось поднимать этот вопрос, это, наверное, хорошо. Это не значит, что это не важно знать. Вы не судите о качестве вашего ремня безопасности по частоте его использования, не так ли?
JesperE
По вашей эвристике, elisp - это язык программирования?
Брайан,
@ Брайан: интересный! Я думаю, я всегда просто думал об elisp как о реализации Lisp, который явно является языком программирования, хотя эта конкретная реализация гораздо более специфична по своему назначению.
Carson63000
2

Языки разметки в основном имеют дело с тем, как отображается информация, и, как правило, в инфраструктуре программирования отсутствуют переменные, математика, сравнение, принятие решений (если ... затем), циклы (для, пока) и т. Д.

HTML сам по себе статичен; то есть, подобно текстовому процессору, он предназначен для представления информации как есть. Только с добавлением некоторых языков программирования (обычно языков сценариев, таких как JavaScript, PHP и т. Д.) Веб-страницы HTML могут иметь «изменяющийся» контент. Языки сценариев предоставляют возможности «программирования» с переменными, математикой, сравнениями, принятием решений, циклами и т. Д.

hekimgil
источник
0

HTML является декларативным языком. Сам по себе он ничего не делает, он просто описывает документ и его содержимое (используя теги, которые имеют семантическое значение).

С ++, с другой стороны, что-то делает. Он определяет функции и классы, но также описывает, как эти функции должны работать вместе, как их входы и выходы связаны между собой осмысленным образом и как приложение должно работать в целом.

Раду Потоп
источник