Как стать автором
Обновить

Комментарии 49

Т.е. эта статья писалась для того, чтобы все в итоге узнали великую тайну о том, что HTML — это язык разметки?
Вот это сенсация, срочно в эфир
Справедливое замечание. Отмечу, что читаю некоторые «компьютерные» интернет издания и в них часто начинают спор по указанной теме. Причем спорят до перехода на личности. Я подумал и понял, что обе стороны не правы. То есть HTML — конечно язык разметки, но под категорию декларативных языков он вполне попадает. Получается что спор у людей не корректный.

А после того как я всё это для себя уяснил — я подумал, что возможно кому-то будет полезно ознакомится с моими изысканиями.
Во имя 100% корректности хотелось бы добавить несколько занудных замечаний

1. Assembler почему-то у вас назван «полнофункциональным», хотя фактически является структурным

2. SQL, начиная с SQL-08 тьюринг-попный

3. 1с — это процедурный, а с 8 версии уже объектно-ориентированный. «Предметно-ориентированный» — это описание назначения а не парадигмы

4. XML — это не язык. XML — это один из общепринятых стандартов представления двнных. Вы же JSON языком не называете, вот и XML тоже не надо.
А что по вашему означает буква «L» в аббревиатуре «XML»?
totally-not-Language?
Структурным ассемблер был бы при наличии операторных скобок. Фактически, он является отдельной категорией языков — языком низкого уровня. Почему эта категория не представлена в классификации — не знаю.
Это просто пост внезапных откровений — ассемблер внезапно оказался, собственно, ассемблером :) На самом деле «операторные скобки» у некоторых макроассемблеров присутствуют — но тут ключевое слово «макро».
Классификация, как и большая часть справочного материала была слита мною с Википедии. Так как этот ресурс наполняют другие более умные люди, то я не стал плодить свою классификацию, а просто использовал то, что было
То есть HTML — конечно язык разметки

Конечно, HTML, который HyperText Markup Language, это язык разметки. Здесь и долгих скучных исследований проводить не надо, достаточно название посмотреть.
Статья немного напомнила мою бытность в институте. Ну знаете, когда доказываешь, что «функция, интегрируемая на отрезке интегрируемая на нём». Люди, которые любят математику, наверняка меня минусанут, но мне всё-равно забавно.
Несмотря на то, что я люблю математику, мне тоже от таких формулировок становится весело. К счастью, всегда есть альтернативные формулировки, пусть порой и более многословные.
HTML — язык разметки текста, но браузерами и многими другими программами он интерпретируется как декларативный язык программирования, содержащий инструкции как обрабатывать размеченный текст. Такие интерпретаторы используют семантику и синтаксис разметки для преобразования в свой собственный набор исполняемых инструкций сопоставляя семантики HTML семантику своей предметной области. Семантика HTML определяет чем является тот или иной фрагмент текста, а что с ним делать решает разработчик интерпретатора — этого HTML не регламентирует, лишь иногда указывая какой должен быть результат для графических или иных визуализаторов и прочих пользовательских агентов-трансформаторов в человеческое восприятие. HTML никак не регламентирует обработку своих разметочных инструкций для общих вычислительных (в широком смысле слова) систем, например таких как поисковые системы, отделываясь в редких случаях рекомендациями обращать особое внимание на те или иные куски текста для некоторых предметных областей, например, поискового ранжирования. Но производители вычислительных систем обычно это игнорируют, а то и действуют абсолютно противоположно, например, не просто игнорируя теги типа b или strong, а пессимизируя результат если им кажется, что имеет место «серая», а то и «чёрная» поисковая оптимизация.
HTML — язык разметки текста, но браузерами и многими другими программами он интерпретируется как декларативный язык программирования, содержащий инструкции как обрабатывать размеченный текст.

мм… рассуждая таким образом можно дойти до мысли, что любой формат, описывающий входные данные, определяет язык программирования, потому, что кто-то эти данные потом интерпретирует и обрабатывает. время, описанное формате ISO-8601, структуры данных IP пакетов (RFC 791), обрабатываемые маршрутизаторами.

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

По большому счету — вычисления тоже понятие относительное, проверить является ли строка числом — это вычисления?
HTML используется для записи алгоритмов, см. пример

в примере на основе некоторого частного феномена делается весьма романтичное обобщение.

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

в самом деле, если html это язык программирования, значит на нем можно решать тот же класс задач, который можно решать и на других языках, которые принято называть языками программирования. согласны? давайте будем брать такие задачи, и если найдется такая, которую нельзя решить с помощью html, это будет поводом усомниться в истинности нашего подхода. сможете такую придумать? это должно быть не труднее, чем мне заставить розу поймать мышь. =)
Вы дали определение сущности, я показала, что предмет беседы подходит под ваше определение. Если у вас есть еще какие-то отличительные признаки определяемой сущности — пожалуйста, в студию. Например, в вашей милой аллегории с кошками я могу сходу сказать, что кошки умеют самостоятельно перемещаться, являются млекопитающими (да и животными, в конце концов) и вынашивают детенышей, а также имеют паспорт.

А более точно я объяснила суть в этом комментарии.
под мое определение подходит и все то, что на чем можно написать программу для вычисления «2+2» — покажите как получить результат на предмете беседы.

черт, я упустил момент, когда в ход пошли авторитетные ссылки. ну вот тоже wiki, где прямым текстом написано, что html не является ЯП. хотя тягаться с нашим ГК конечно сложно (случись что, кого волнует мнение каких-то программистов. думаю, при достаточной сноровке, под местное определение можно и этот коммент подвести. он ведь тоже является совокупностью данных и команд, с целью порождения конкретного аудиовизуального отображения, если рассматривать его в объективной форме :)).
под мое определение подходит и все то, что на чем можно написать программу для вычисления «2+2» — покажите как получить результат на предмете беседы.

Ну я уж не виновата, что вы даете такие определения, правда?

В вашей ссылке всего лишь «not usually considered», а кроме ссылки на ГК у меня были комментарии и аргументы и примеры кода. С чем из мною написанного — вы не согласны?
Язык программирования служит для записи программ, а не алгоритмов. А программа всего лишь может содержать в себе алгоритмы, но не обязана.
Не так. Время и пакеты содержат только данные, но не содержат никаких инструкций. HTML же содержит и данные, и инструкции. Другое дело, что разные агенты эти инструкции по разному понимают, правда обычно имея в виду семантику HTML
НЛО прилетело и опубликовало эту надпись здесь
А теперь тоже самое, но без CSS. Не выйдет.

А все потому что CSS — язык программирования, а HTML — нет.
НЛО прилетело и опубликовало эту надпись здесь
Нет. Задача обычного языка программирования в обработке данных, а задача HTML в отображении данных. Он не является языком программирования и на нем нельзя произвести вычислений.

Если подходить к вопросу формально, а браузер считать интерпретатором, то HTML служит не только для отображения данных:
1. Он описывает как и куда передать эти данные (формы).
2. Он описывает как их обработать (/>) для конечного пользователя (в данном случае проверка на число — обработка).
3. Он описывает как и откуда забрать данные, и опять же как их обработать (script, style, img).

В общем, активных тегов в HTML очень-очень много, чтобы говорить, что он умеет только отображать данные. По сути даже когда он создавался — уже были и ссылки и формы, а это уже обработка данных.

Так что не могу согласиться с вашим выводом, что HTML нельзя приписать к декларативным языкам программирования.
Грубо говоря, только в контексте использования его в браузере.
Но ведь любой язык имеет смысл только в связке с компилятором/интерпретатором?
Простите, но вы немного не верно меня поняли. Я как раз приписываю его к декларативным языкам, но так как он не тьюринг-полный, то его используют в связке с тьюринг-полными языками PHP и JavaScript. В результате HTML применяют как вспомогательный для отображения данных, обработанных этими языками. Как следствие «на фоне» PHP и JavaScript называть HTML языком программирования неправильно, так как это приводит к путанице в понимании аспектов применения языка.
Его не обязательно использовать в связке с JavaScript, а уж PHP и вовсе не причем. До недавнего времени как раз таки JavaScript был вспомогательным языком (для мелких фишечек, типа меню). Да и HTML не стоит на месте — и в HTML5 опять же очень многое уже реализовано нативно.
И еще раз повторю, что HTML применяют гораздо больше, чем для отображения данных!
А называть его языком программирования или нет — видимо зависит от контекста обсуждения. Так, те же PHP и JS часто называют скриптовыми языками. А путаница в терминологии возникает только при попытке эти определения формализовать, а есть ли смысл это делать для таких обобщенных понятий?

Так что не вижу ни одной причины не считать HTML языком программирования.
Близкого знакомства с HTML5 я не сводил, потому что пока не требовалось, поэтому я соглашусь с Вашим мнением
Дополню автора sferrka:
HTML c 1986-ого года сильно изменился, и такие элементы, как script стали частью стандарта HTML5
www.w3.org/TR/html5/scripting-1.html#scripting-1

А т.к. сам JS можно считать полным по Тьюрингу, то и HTML5 стоит таковым считать.
Говорить же, что javascript другой язык не стоит, т.к. основаня разметка HTML строится на расширенной версии синтаксиса XML. И много других технологий включает в себя, если разобраться. (те же canvas и webgl, как часть стандарта HTML5)

Отмечу, что речь именно о HTML5 и именно с учётом рекомендаций W3C. Может HTML и был просто декларативным ЯП, но он вырос и стал полноценным, включающим в себя другие ЯП (что не исключено, т.к. даже в Си вы можете писать ассемблерный код и это, как часть ANSI стандарта Си)
Ошибаетесь. Язык программирования — это формальная система для записи алгоритмов. А компиляторы/интерпретаторы — это только ограниченная по своим возможностям (объем памяти, разрядность чисел и т.д.) реализация этой формальной системы. На чистом HTML (без привлечения скриптовых языков и flash) даже примитивнейший алгоритм вычисления факториала записать нельзя. И потому он не может рассматриваться как язык программирования.
На SQL тоже много лет было нельзя, SQL теперь не язык программирования?
После появления хранимых процедур — стал языком программирования. А до того, как и следует из его названия, был только языком запросов, реализующим реляционную алгебру. А реляционная алгебра является расширением теории множеств и никакого отношения к программированию не имеет.
Вы ещё вспомните им, что был SQL и DML и structured был select (query language) и вообще мог только выборку делать, а data manipulation l7e мог манипулировать с данными, что эти понятия перемешивались и возникала путаница))

А вообще нечего выкидывать из HTML script, это как из Си выкинуть libstd или даже похлеще)
Справедливости ради, от выкидывания из Си стандартной библиотеки он не перестает быть тьюринг-полным, а вот от выкидывания из HTML скриптов…
Согласен, значит «похлеще» =)
Честно говоря зашел под кат только ради голосования, а тут такой облом :)
Не хочу нарушать покой, но при помощи Angular в html можно «программировать».
Но в соответствии с MVC не нужно.
одно высказывание лучше другого :)
Вот уж верно подметили ;)
(вздохнув)
Предполагается, что автор узрит подчёркивания кривого синтаксиса у visio и проникнется глубокими знаниями у автора?

А вообще, весь вопрос сводится к тьюринг-полноте. Насколько я знаю, html не является тьюринг-полным.
Это автор все к тъюринг полоноте свел. Фактически, полнота по Тьюрингу — это лишь одна из характеристик ЯП.
SQL, например является языком программирования, хотя не являлся тьюринг полным до 2008 года.

Единственное необходимое свойство языка программирования — это исполняемость, т.е. способность к обработке входных данных.

Если в грамматике не предусмотрены механизмы обработки, а описан лишь стандарт хранения и передачи данных (как в HTML, XML, SGML, JSON, YAML ), то это не язык программирования, а спецификация.

По этой причине CSS, SQL, и даже Comment — языки программирования
В грамматике HTML (в стандарте) как раз таки предусмотрены механизмы обработки.

Например,
<form>
<input type="radio" name="test" value="1" />
<input type="radio" name="test" value="2" />
<input type="submit" />
</form>

при отправке формы должно передаться значение одного из элементов radio с одинаковыми именами. Что это, если не обработка данных?

А в html5
<input type="number" />

Предполагает проверить значение перед отправкой формы.
Опять же

<video autoplay</video>

Заставляет видео-плеер запустить видео автоматом после загрузки.

А вот XML, SGML, JSON и YAML действительно абстрактные языки разметки.
> Что это, если не обработка данных?
Указание браузеру.
Хорошая попытка, html-программисты, но нет
Программирование — это реализация алгоритмов. Всё. Никаких других функций у программирования нет.

Таким образом, единственное, что отделяет язык программирования от любой другой формальной системы — это возможность записи алгоритмов. Тех самых алгоритмов, формальное определение которых даётся исключительно через элементарный вычислитель (машина Тьюринга, машина Поста, нормальные алгорифмы Маркова, лямбда-исчисление и т.д.).

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

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

Ещё хуже дело обстоит в HTML. Если в SQL изначально были средства манипулирования данными, то в HTML введённые данные в принципе никак невозможно обработать.
Как вы верно заметили, программирование — это реализация алгоритмов. Все. И тут же себе противоречите говоря, что язык программирования обязан поддерживать написание элементарных вычислителей.
Так вот, из вашего же определения следует, что любая реализация любого алгоритма любым языком — есть программирование, а язык, использовавшийся для этого — язык программирования.
Желание что-то вычислить исходит к тем временам, когда не было высокоуровневых средств реализации алгоритмов. Но уже давным давно мне не обязательно иметь даже математические функции в языке, чтобы реализовать алгоритмы.
И, говоря про HTML:
1. Введенные данные еще как обрабатываются.
2. HTML позволяет реализовать множество алгоритмов — отображения данных, отправку данных, скачивания данных, перезагрузки страниц и т.д.
Где именно Вы видите противоречие?

1. В соответствии с теорией алгоритмов, алгоритм — это всё то и только то, что может быть решено посредством элементарного вычислителя. Из этого определения следует, что любая система, посредством которой можно записать алгоритм, должны иметь либо систему ветвлений и циклов (машины Тьюринга/Поста, императивные языки), либо систему текстовых подстановок (нормальные алгорифмы Маркова, снобол-4, рефал), либо рекурсию (лямбда-исчисление, функциональные языки).

А т.к. сам элементарный вычислитель является алгоритмом, то он может быть записан на языке программирования. Тем более, что я говорю не об идеальном вычислителе, а только об его подмножестве, ограниченном ресурсами (понятно, что бесконечную ленту на Фортране-IV реализовать невозможно).

2. Я прямым текстом говорю, что язык программирования — это не любой язык, а ФОРМАЛЬНАЯ СИСТЕМА для записи алгоритмов. Например, такими формальными системами являются блок-схемы (не современные системы построения алгоритмов из кубиков, а те, что рисовали 40 лет назад на бумаге), или более современный псевдокод, который никогда и ни кем не будет скомпилирован (если Вы изучали программирование в институте, то должны быть знакомы и с блок-схемами, и с псевдокодом). Исходный вариант языка APL никогда не был реализован в виде компилятора/интерпретатора (реализован был совершенно другой вариант — адаптированный для текстовых дисплеев), но от этого он не перестал быть языком программирования. И даже элементарные вычислители сами являются языками программирования.

3. То, что в HTML зашиты какие-то функции работы с данными не делает его языком программирования. Именно потому, что средствами HTML с этими данными НИЧЕГО нельзя сделать — как они будут введены пользователем, так их и получит сервер, или js-скрипт. HTML — это только интерфейсная прокладка между пользователем и программой, обрабатывающей эти данные. На заре программирования данные вводили переключателями на пульте, а получали результат посредством лампочек на том же пульте, но никто почему-то не считал, что пульт является языком программирования.

Применительно к машине Тьюринга, программа — это таблица состояний, а содержимое ленты — это обрабатываемые данные. И единственное, что может HTML — это заполнить ленту исходными данными перед началом работы программы. Саму программу на HTML реализовать невозможно.
Давай разберемся с вашими определениями…
В соответствии с теорией алгоритмов, алгоритм — это всё то и только то, что может быть решено посредством элементарного вычислителя.

Пруф линк, пожалуйста (на все остальное тоже прошу сразу). И еще формальное определение вашего «элементарного вычислителя»
Из этого определения следует, что любая система, посредством которой можно записать алгоритм, должны иметь либо систему ветвлений и циклов (машины Тьюринга/Поста, императивные языки), либо систему текстовых подстановок (нормальные алгорифмы Маркова, снобол-4, рефал), либо рекурсию (лямбда-исчисление, функциональные языки).

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

А т.к. сам элементарный вычислитель является алгоритмом, то он может быть записан на языке программирования. Тем более, что я говорю не об идеальном вычислителе, а только об его подмножестве, ограниченном ресурсами (понятно, что бесконечную ленту на Фортране-IV реализовать невозможно).

Т.е., из ваших же слов, алгоритм — это всё то и только то, что может быть решено посредством алгоритма?

Я прямым текстом говорю, что язык программирования — это не любой язык, а ФОРМАЛЬНАЯ СИСТЕМА для записи алгоритмов.

Опять же — это ваше личное определение. Язык программирования служит для записи программ, а не алгоритмов. А программа всего лишь может содержать в себе алгоритмы, но не обязана (и это не только мое мнение).
Так, например, мы записываем значения констант в классе
class A
{
    public const int example = 12;
}

Да и сама запись классов не является никакими алгоритмами.

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

Так что, код, написанный на HTML — абсолютно такая же компьютерная программа (так как является инструкциями). А HTML — язык программирования.
| Язык программирования служит для записи программ, а не алгоритмов

Очевидно, что теорию алгоритмов (даже на уровне первого курса математического факультета) Вы не изучали. Потому подменяете точный математический смысл используемых понятий собственными искаженными представлениями. Небольшой ликбез: ЛЮБАЯ программа является алгоритмом. И определение публичной константы в классе A — это тоже алгоритм.

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

DIXI
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории