Язык программирования против языка разметки против языка сценариев

38

До сих пор я не знаю КЛЮЧЕВЫХ различий между этими тремя. Когда кто-то спрашивает меня об этом, я только говорю им, что C # - это язык программирования, HTML и XML - это языки разметки, а JavaScript и VBScript - это языки сценариев. Но какие ключевые отличия отличают их друг от друга?

rcadaoas
источник
Не забывайте запрашивать языки!
Кайл Делани

Ответы:

38

Позвольте мне попытаться найти разделительную линию между этими тремя типами языка. Конечно, будут многочисленные исключения и контрпримеры, так как это только мое мнение.

  • Язык разметки используется для управления представлением данных, например, «представлять эти имена пользователей в виде списка маркеров или в виде таблицы».

  • Язык сценариев используется для посредничества между программами для генерации данных. Это особенно верно для языков сценариев оболочки, таких как bash, но если вы задумаетесь об этом, также Python или Perl возникли из-за необходимости выполнять задачи в UNIX без написания программы на C. Программа, которую вы контролируете большую часть времени на этих языках является переводчиком самого языка , который выполняет общие задачи для вас. Другими типичными программами, с которыми вы взаимодействуете, являются серверы баз данных или веб-серверы.

    Возвращаясь к метафоре списка пользователей, на языке сценариев вы просите базу данных «дать мне все имена пользователей», а затем просите веб-сервер «отправить этот список пользователей этому запрашивающему».

  • Язык программирования используется для преобразования данных . Это достигается созданием инструкций процессора, которые перезаписывают входные данные в выходные данные; надеюсь, желаемый результат. Примерами преобразования данных являются вычисление суммы из числа сложений, или решение системы дифференциальных уравнений из набора условий, или запись и чтение из древовидной структуры согласованным образом с учетом последовательности возможных одновременных запросов. ,

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

Обратите внимание, что языки сценариев являются подмножеством языков программирования, т. Е. Язык может быть как «сценарием», так и «программированием»: Python регулярно используется для «посредничества между программами», а также для «преобразования данных». Существуют и другие языки, такие как Java, которые редко используются для «посредничества между программами» не потому, что это невозможно, а потому, что они не предназначены для того, чтобы упростить это. Ключевая особенность языка сценариев заключается в том, что он может управлять другими программами, подобно тому, как сценарий дает подсказку актеру начать свою роль.

logc
источник
7
Языки сценариев формально являются подклассом языков программирования. (Я также видел, как такие языки, как C и Java, полностью интерпретируются с помощью REPL; барьер неплотный в обоих направлениях…)
Donal Fellows
1
@DonalFellows: вы правы. Я ответил с учетом этого, но я явно не использовал выражение «одно является подмножеством другого». Кроме того, я не подразумевал, что одна категория интерпретируется, а другая нет, потому что я знал, что это слабое различие.
журнал
1
@DonalFellows: я отредактировал свой ответ, чтобы явно упомянуть, что один является подмножеством другого.
журнал
1
Я поддерживаю этот ответ как единственный (пока), который утверждает, что языки разметки - это языки, которые описывают структуру данных.
Идан Арье
3
@ JörgWMittag: я знал, что будут исключения, поэтому я начал с «будет множество исключений» :) Иначе, где в своем ответе я подразумеваю, что язык сценариев не компилируется? Я пытался сконцентрироваться на цели языков именно для того, чтобы избежать этой ловушки ...
logc
11

Язык разметки - это язык, который используется для представления структурированных данных. Например, HTML позволяет указать, что некоторая часть документа является заголовком или какая-то другая часть является списком, по сравнению с простым текстовым документом.

Языки разметки не считаются языками программирования¹.

Разница с языками программирования не всегда очевидна. Например, XSLT является полным по Тьюрингу языком², но основан на XML, который является языком разметки.

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

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

Не всегда очевидно, является ли язык программирования языком сценариев, как не всегда очевидно, является ли язык компилированным или интерпретированным. Например, PHP может быть скомпилирован в промежуточный байт-код³, а затем преобразован в машинный код JIT-компилятором, хотя он все еще рассматривается как язык сценариев⁴.

Смотрите также: Разделение мета-волос Стивена Лотта.


XML «XML не является языком программирования». См XML в 10 баллов .

² «XSLT - полный по Тьюрингу язык». См. XSLT в Википедии.

«HHVM компилирует Hack и PHP в промежуточный байт-код. Затем этот байт-код динамически преобразуется в машинный код x64 во время выполнения с помощью компилятора JIT (Just-in-Time) ». См. HHVM .

сценариев Языки в списке языков программирования по типу Википедии.

Арсений Мурзенко
источник
16
Языки никогда не компилируются и не интерпретируются. Языки просто есть . Компиляция и интерпретация - это черты компилятора или интерпретатора (дух!), Используемые для реализации языка. Термины «скомпилированный язык» или «интерпретируемый язык» даже не имеют смысла, они относятся к разным уровням абстракции. Если бы Englisch был типизированным языком, «скомпилированный язык» был бы TypeError! Любой язык может быть реализован интерпретатором, каждый язык может быть реализован компилятором.
Йорг Миттаг
@ JörgWMittag «Каждый язык может быть реализован интерпретатором, каждый язык может быть реализован компилятором» - на 100% верно?
Спартак
@spartacus Я называю это нерешительным "нет". Я думаю, что любой язык, который может быть скомпилирован, также может быть интерпретирован (просто выполнить инструкцию вместо того, чтобы сохранить ее), но я слышал, что гомоиконичность сильно ограничивает возможность компиляции
Izkata
@Izkata Я бы не сказал, что сама гомоконичность изменяет возможность компиляции, но метапрограммирование, которое она допускает, означает, что большая часть компиляции должна быть отложена до времени выполнения, если вообще.
Марк Херд
1
Часть «Язык сценариев» является совершенно неправильной, как уже указывал Jörg W Mittag. И сверху нет объяснения «язык программирования».
Дэвид Рааб
2

Чтобы создать любой вид таксономии, вам нужно сначала задать себе несколько вопросов:

  • Объекты, которые я собираюсь поместить в какие-либо отношения, определены правильно?
  • Если так, они действительно существуют?
  • Я ограничиваю себя только определенным типом отношений между объектами, или существует установленное требование для системы использовать только законные отношения?

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

Языки программирования

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

Таким образом, языки программирования являются теми, которые программируют компьютеры.

Скриптовые языки

Не четко определены Понятие этого термина открыто для толкования. Исторически сложилось так, что языки программирования, у которых не было компилятора для создания машинного кода, назывались так. По сегодняшним стандартам это поместило бы все популярные языки программирования без Ассемблеров в эту категорию. Даже так называемые низкоуровневые языки, такие как C, требуют времени выполнения с уже существующими процедурами, поэтому двоичные файлы, получаемые при компиляции программы на C, не являются полностью машинным кодом, но также время от времени обращаются к среде выполнения.

Языки разметки

Не четко определены Всякий раз, когда используется этот термин, представляется, что цель состоит в том, чтобы описать язык программирования с очень ограниченным словарным запасом, в основном используемый для создания визуального или звукового изображения. Может быть трудно увидеть XML как программирование чего-либо, но если вы посмотрите на разметку Man или TexInfo, вы увидите, что «специальные» символы на самом деле являются инструкциями интерпретатора.

Также возможно дать интерпретацию «программирования» для языка XML, что-то вроде этого:

< := 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
...

Итог: это разделение на сегодняшний день не кажется очень значимым, оно может дать вам только некоторую интуицию относительно того, с каким языком вы столкнулись, но оно не даст вам точного определения.

wvxvw
источник
1

Все три понятия несколько перекрываются, поэтому вы можете получить бесконечные аргументы, является ли XSLT языком программирования или Python является языком сценариев или нет.

Язык разметки является языком , который представляет собой структурированные данные в текстовом формате , HTML является наиболее хорошо известен, но есть многочисленные форматы для различных целей, как SVG для графики, WSDL для описания веб - сервисы , интерфейсов, Resx для Resouce файлов. нетто и тд. Практическое правило заключается в том, что язык разметки не описывает процесс или алгоритм (как это делает язык программирования), а представляет собой чистые данные. Но это также фундаментальное CS понимание , что естьнет принципиальной разницы между кодом и данными. Некоторые языки разметки, такие как XSLT, имеют циклы и условные выражения, такие как «настоящий» язык программирования, а некоторые языки программирования, такие как Prolog, представляют собой почти чистые данные без процесса, указанного в коде. А Lisp настолько размывает строку, что рассматривает свой собственный код как структурированный формат данных.

Что касается различия между языком программирования и языком сценариев , это историческое различие , которое является почти устаревшим сегодня. В старые времена мы собирали автономные программы, написанные, скажем, на C, а затем у нас были языки сценариев, такие как сценарии оболочки или Word Basic, которые интерпретировались и предназначались для манипулирования другими программами и инструментами. Сегодня эта линия довольно размыта, поскольку у нас есть разные уровни компиляции и интерпретации (компиляция байт-кода, JIT-компиляция и т. Д.), А также различные независимые от языка API. Так что различие не так уж полезно.

JacquesB
источник
0

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

Разница между языками программирования и языками сценариев очень нечеткая, оба имеют тенденцию к полноте, поскольку с ними можно решать любые вычислимые задачи. Есть несколько общих «подсказок», которые вы можете найти, чтобы увидеть, является ли язык языком программирования или нет.

  • Языки сценариев часто интерпретируются, а не компилируются, или, по крайней мере, предоставляют возможность интерпретации.
  • Языки сценариев часто создаются для быстрой работы, а не для быстрой работы.
  • Языки сценариев, как правило, поставляются с очень обширными стандартными библиотеками. Многие языки программирования делают то же самое, но для них это не обязательно.

Но в конце концов, если язык является языком сценариев или языком программирования, это скорее вопрос соглашения, а не каких-либо строгих критериев. Даже приведенные выше советы - это просто тренды, вы найдете языки программирования, которые отвечают всем критериям языка сценариев, но все еще считаются языками программирования.

Пьер Андерссон
источник
4
Языки никогда не компилируются и не интерпретируются. Языки просто есть . Компиляция и интерпретация - это черты компилятора или интерпретатора (дух!), Используемые для реализации языка. Термины «скомпилированный язык» или «интерпретируемый язык» даже не имеют смысла, они относятся к разным уровням абстракции. Если бы Englisch был типизированным языком, «скомпилированный язык» был бы TypeError! Любой язык может быть реализован интерпретатором, каждый язык может быть реализован компилятором. Можно даже автоматически сгенерировать компилятор из интерпретатора и наоборот.
Йорг Миттаг
@ JörgWMittag это правда, что ни один язык по своей сути не скомпилирован или интерпретирован. Но часто есть соглашения о том, как это обычно выполняется, и это в основном то, что я имею в виду здесь.
Пьер Андерссон