что такое семантика в программировании
Имена или семантика классов в программировании
1. При программировании на придумывание имен может уходить ощутимо много времени. Казалось бы, такая маловажная вещь, как имя. И вот только сегодня я осознал, почему я трачу на это время, и почему, в итоге, это не напрасная трата времени.
Придумывание имени для модели, класса (предметной области) — важно и при проектировании, и при кодировании. Ведь имя несет с собой огромное облако ассоциаций из реальной жизни, из других областей.
Выбор имени — это один из этапов проектирования, когда какие-то сложные вещи — операции, объекты, отношения, скрываются уровнем абстракции. То есть скрываются за назначенным именем.
Если имя выбрано неудачно и оно с искажениями отражает то, чем является модель, оно будет мешать не только тем, кто в будущем будет читать код и документацию. Оно мешает непосредственно сейчас при проектировании, сбивает с толку. Неудачное имя мешает детализировать модель, мешает продумывать отношения этой модели с другими моделями или с пользователем.
Как вы яхту назовете, так она и поплывет.
2. Свежий личный пример. Пишу код для запуска предустановленных виртуальных машин у различных облачных провайдеров. Сначала у меня получилось, что моделью, то есть объектом, который юзер настраивает и создает пошаговой формой, в которой потом хранятся результаты установки, и с которой пользователь потом может выполнять другие действия, сначала стала Instance — экземпляр виртуальной машины. Такое название тянуло за собой лишние для этой задачи свойства — хранить историю изменения состояний, отслеживать актуальное состояние инстанса у провайдера и показывать его в юзерской панели. Их можно было не реализовывать, но они все-время маячат на фоне, т.к. это общепринятое поведение инстансов. В то время как исходная задача очень простая и минимальная — запустить инстанс, установить и настроить на нем софт, и выдать пользователю результат.
Название не нравится, модель сужена до LaunchedInstance, то есть «запущенный сейчас экземпляр виртуальной машины». Такое ограничение отсекает лишние понятия, но у этого имени все еще много ассоциаций, отвлекающих от основной короткой задачи.
В итоге правильное имя для модели стало Launch, т.е. непосредственно операция запуска. Методы и атрибуты класса остались остались прежними, изменилось только название. Но оно теперь содержит в себе только необходимый минимум и не несет избыточной смысловой нагрузки. После этого стало проще развивать логику работы класси и организовывать взаимодействие с другими компонентами проекта.
3. Продумывание имени — это непосредственная часть проектирования. И если вы не можете подобрать удачное слово и чувствуете неудовлетворенность, то скорее всего вы либо плохо продумали модель и она не реализует то, чем вы ее назвали, либо плохо продумали эту часть проекта и нужна вообще другая модель.
Время, потраченное на выбор имени, тратится не зря. Его можно воспринимать как самое ранее тестирование модели — некий интеграционный тест, проверяющий, правильно ли разработчик представляет задачу.
Семантика (программирование)
Сема́нтика в программировании — дисциплина, изучающая формализации значений конструкций языков программирования посредством построения их формальных математических моделей. В качестве инструментов построения таких моделей могут использоваться различные средства, например, математическая логика, λ-исчисление, теория множеств, теория категорий, теория моделей, универсальная алгебра. Формализация семантики языка программирования может использоваться как для описания языка, определения свойств языка, так и для целей формальной верификации программ на этом языке программирования.
Подходы
См. также
Литература
Полезное
Смотреть что такое «Семантика (программирование)» в других словарях:
Семантика вычислений — Семантика вычислений это определение процесса вычисления в виде последовательности правил перезаписи, которое вместе с представлением о сходимости впервые были использованы в контексте исчисления. Сходимость важна также в системах… … Википедия
Семантика (значения) — Семантика (от др. греч. σημαντικός обозначающий): В Викисловаре есть статья « … Википедия
ПРОГРАММИРОВАНИЕ ТЕОРЕТИЧЕСКОЕ — математическая дисциплина, изучающая математич. абстракции программ, трактуемых как объекты, выраженные на формальном языке, обладающие определенной информационной и логич. структурой и подлежащие исполнению на автоматич. устройствах. П. т.… … Математическая энциклопедия
Нейро-лингвистическое программирование — Нейролингвистическое программирование (НЛП) (англ. Neuro linguistic programming) (также встречается вариант «нейро лингвистическое программирование») комплекс моделей, техник и операционных принципов (контекстуально зависимых убеждений),… … Википедия
Доказательное программирование — использовавшаяся в 1980 х годах в академических кругах технология разработки программ для ЭВМ с доказательствами правильности доказательствами отсутствия ошибок в программах (понимая, в рамках данной теории, ошибки как несоответствия между… … Википедия
Нейролингвистическое программирование — Запрос «НЛП» перенаправляется сюда; см. также другие значения. Не следует путать с нейролингвистикой. Возможно, эта статья содержит оригинальное исследование. Добавьте ссылки … Википедия
Общая семантика — Для термина «Семантика» см. другие значения. Общая семантика (англ. General Semantics, фр. sémantique от греч. σημαντικός обозначающий) эмпирическая дисциплина, представляющая собой систематическую методологию по… … Википедия
Присваивание (программирование) — Содержание 1 Определение присваивания 1.1 Алгоритм работы оператора присваивания … Википедия
Присвоение (программирование) — Содержание 1 Определение присваивания 1.1 Алгоритм работы оператора присваивания … Википедия
Нейролингвистическое программирование: Библиография — Одна из статей на тему Нейролингвистическое программирование (НЛП) Основные статьи НЛП · Принципы · НЛП психотерапия · История Новый код · НЛП и наука · Библиография · Словарь Принципы и методы Моделирование · Метамодель · Милтон модель Позиции… … Википедия
Понятие семантики в информатике
Вы будете перенаправлены на Автор24
Понятие семантики в информатике — это формализация значений структур программных языков через их формальные математические модели.
Введение
Термин семантика происходит из языка Древней Греции, где sēmantikos означало «значительный». В современный обиход его ввёл французский учёный Мишель Бреаль.
Под семантикой понимается наука, изучающая смысловое значение слов (семантика лексики) и предложений, то есть семантические текстовые структуры и фразы.
Семантика сродни таким дисциплинам, как семиология, основы логики и другие. Комплект терминов, который имеет общий фактор семантики, является семантическим полем. Семантика, как наука, занимается изучением лингвистических и философских смыслов языков, в том числе языков программирования. Она взаимосвязана со словами, фразами, символикой и всем тем, что они обозначают. Задачами трактовки языкового смысла обычно относились к сферам психологии, а не лингвистики. Но именно лингвистика занимается изучением трактовки различной символики и знаков, применяемых в разных общественных сферах при конкретных условиях и контексте. В письменности такие параметры как пунктуация, абзацы и общая структура, обладают семантическим содержанием. Формализованное представление анализа семантики тесно взаимосвязано с некоторыми другими научными сферами, такими как лексикология, синтаксис, прагматика, этимология и тому подобными.
Понятие семантики в информатике
Семантические основы программных и других языков считаются одной из важнейших задач и сферой деятельности информатики. Информатика сформировала разные методы, описывающие с формальной стороны языки программирования, которые базируются на математической логике. Под семантикой в программировании понимается направление, которое изучает формальные значения структурных построений языков программирования при помощи выстраивания их формализованных математических моделей. Инструментом создания этих моделей служат математическая логика и другие разделы математики. Формальное описание семантики языка программирования возможно применять как для создания инструкций по применению языка, его свойствах, так и для формальной проверки правильности написания программ на данном программном языке. Под семантикой языка понимается смысл, который несут слова этого языка. Применительно к программированию это изначальный смысловой посыл операторов, базовых языковых конструкций и тому подобное. Например:
Готовые работы на аналогичную тему
Рисунок 1. Пример. Автор24 — интернет-биржа студенческих работ
С логической точки зрения эти программные коды выполняют одинаковые действия и итоги их работы аналогичны. Но одновременно следует отметить, что по семантике это пара различных циклов. И ещё пример тегов:
Рисунок 2. Пример. Автор24 — интернет-биржа студенческих работ
Их запись смотрится абсолютно схожей, а по семантике значение первого тега — это письмо курсивом, а второй означает логическое выделение.
Операционная семантика применяется для синтаксических терминов языка. Она изучает текстовую правильность определения функций, которые обеспечивают применение к аргументу, а не в математической трактовке понимания термина функции. Можно выделить следующие типы операционной семантики:
Семантика аксиоматическая. Семантику всех синтаксических языковых построений возможно представить как некоторый комплект аксиом или законов вывода, который применяется, чтобы вывести итоги работы таких построений. Для понимания смысла написанной программы, эти законы вывода и аксиомы нужно применять точно так, как при попытках доказать стандартные математические теоремы. Если предположить, что параметры входных переменных связаны определёнными ограничениями, то аксиомы и законы вывода, возможно использовать, чтобы получить ограничения на величины других переменных после окончания действия программного оператора. После выполнения программы, можно получить доказательства правильности итоговых результатов и того, что они входят в диапазон заявленных ограничений на них по отношению к входным данным. Другими словами, подтверждено, что выходные параметры являются значениями требуемой функции, которые определены исходя из значений входных параметров.
Семантика денотации. Она находит соответствие между выражениями в программе и действительными математическими объектами. Это означает, что выражения являются обозначением математических объектов. Очень важные, можно сказать пионерские итоги формирования денотационных семантик сделаны в публикациях Д. Скотта и К. Страчей в начале семидесятых годов прошлого века. Скотт впервые выстроил модель λ-исчисления, которая основана на представлениях об общем отчасти упорядоченном множестве. Чтобы реализовать такую модель, он применил функции, которые являются непрерывными на этом множестве.
Семантика интерпретаций. Это выражение операционной семантики конструкций в обозначениях языков программирования низкого уровня (вплоть до машинных кодов). Эта методика даёт возможность определять фрагменты программы, которые исполняются замедленно, и часто применяются в требуемых участках программных систем, чтобы оптимизировать программный код.
Семантика трансляций. Это выражение операционной семантики конструкций в обозначениях программных языков высокого уровня. Эта методика позволяет осуществлять изучение языка, на основании уже известных программисту и похожих языков.
Семантика трансформации. Это выражение операционной семантики языковых конструкций в обозначениях самого этого языка. Этот тип семантики выступает главной составляющей метапрограммирования.
Сегодняшние исследования в области семантики направлены главным образом на выстраивание систем, позволяющих доказать корректность и оптимальность работы создаваемых программных продуктов.
Семантика в программировании
Сема́нтика — в программировании — система правил определения поведения отдельных языковых конструкций. Семантика определяет смысловое значение предложений алгоритмического языка.
См. также
* Семантическая паутина
* Семантика вычислений
Смотреть что такое «Семантика в программировании» в других словарях:
Семантика — в программировании система правил истолкования отдельных языковых конструкций. Семантика определяет смысловое значение предложений алгоритмического языка. По английски: Semantics См. также: Языки программирования Финансовый словарь Финам.… … Финансовый словарь
семантика — Раздел языкознания, исследующий с семиотических (семиотика – наука о знаках и знаковых системах) позиций смыслы и значения единиц языка (слов, предложений и др.), его выражений и логических форм, участвующих в его порождении, построении и… … Справочник технического переводчика
Семантика (программирование) — Для термина «Семантика» см. другие значения. Семантика в программировании дисциплина, изучающая формализации значений конструкций языков программирования посредством построения их формальных математических моделей. В качестве инструментов… … Википедия
Семантика функции — Интерфейс прикладного программирования (англ. Application Programming Interface, API [эй пи ай]; по русски чаще произносят [апи]) набор готовых констант, структур и функций, используемых при программировании пользовательских приложений и… … Википедия
Присваивание — Присваивание механизм в программировании, позволяющий динамически изменять связи объектов данных (как правило, переменных) с их значениями. Строго говоря, изменение значений является побочным эффектом операции присвоения, и во многих… … Википедия
Присваивание (программирование) — Содержание 1 Определение присваивания 1.1 Алгоритм работы оператора присваивания … Википедия
Присвоение (программирование) — Содержание 1 Определение присваивания 1.1 Алгоритм работы оператора присваивания … Википедия
НЛП — Нейролингвистическое программирование (НЛП) (англ. Neuro linguistic programming) (также встречается вариант «нейро лингвистическое программирование») комплекс моделей, техник и операционных принципов (контекстуально зависимых убеждений),… … Википедия
Нейро-лингвистическое программирование — Нейролингвистическое программирование (НЛП) (англ. Neuro linguistic programming) (также встречается вариант «нейро лингвистическое программирование») комплекс моделей, техник и операционных принципов (контекстуально зависимых убеждений),… … Википедия
Нлп — Нейролингвистическое программирование (НЛП) (англ. Neuro linguistic programming) (также встречается вариант «нейро лингвистическое программирование») комплекс моделей, техник и операционных принципов (контекстуально зависимых убеждений),… … Википедия
Что такое семантика в программировании
Формальная и интуитивная семантика языка программирования на примерах JS и JSX.
О чем этот материал: о̶т̶в̶е̶т̶ ̶н̶а̶ ̶г̶л̶а̶в̶н̶ы̶й̶ ̶в̶о̶п̶р̶о̶с̶ ̶ж̶и̶з̶н̶и̶,̶ ̶в̶с̶е̶л̶е̶н̶н̶о̶й̶ ̶и̶ ̶в̶с̶е̶г̶о̶ ̶т̶а̶к̶о̶г̶о̶ как писать понятный код?
Но, бывает, можно натолкнуться на чужой, совершенно неизвестный код, который выглядит лаконичным и понятным. Сразу ясно какую задачу он решает и как. Причем такой код может быть даже на другом языке программирования или с использованием неизвестного стека, но, почему-то, он нормально читается, интуитивно рассказывая свою историю.
Вот я и задался вопросом, есть ли, все же, какие-то универсальные правила построения и структурирования кода, которые бы не зависели от конкретного языка программирования или стека? Я решил попробовать найти ответ на этот вопрос копнув в самую глубь, изучив что такое язык программирования в общем и какие он может иметь обобщенные особенности из которых можно вывести правила лучших практик. Получилось поверхностное исследование, которое лишь приоткрыло всю глубину, сложность и историю вопроса, но определяющее четкое направление пути.
Например, классическим примером декларативного программирования является код в функциональном стиле:
Но что можно сказать про такой код:
Так же можно рассмотреть классический «императивный» код:
Он кажется более сложным, чем приведенные снипеты выше, но если посмотреть на результирующий машинный код, то код с for и if покажется вполне простым и декларативным, т.к. он скрывает то как работать с памятью на системном уровне.
Как-то на ревью PR на работе я увидел чрезмерно «функциональный» подход в написании определенного набора действий и попробовал переписать этот код на «императивщину». Детали кода не важны, с первого взгляда видно, что «императивный» код (снизу) короче и в нем лучше выделены смысловые конструкции за счет их подсветки, а еще он производительнее.
Но спрашивая коллег многие высказывались за то что функциональный код им нравится больше и стоит использовать его. Тогда я устроил голосование в чате. Как же было забавно наблюдать за тем как мнение делится поровну и кому-то был понятнее функциональный подход, а кому-то императивный:
P.S. код был в итоге переписан в функциональном стиле, но с вынесением определенной логики в отдельные функции.
Си́нтаксис (др.-греч. σύν-ταξις — составление) — раздел лингвистики, изучающий строение и функциональное взаимодействие различных частей речи в предложениях, словосочетаниях и пр. языковых единицах.
Сема́нтика (от др.-греч. σημαντικός «обозначающий») — раздел лингвистики, изучающий смысловое значение единиц языка.
Если попробовать детально разобраться в семантике, как составляющей программного языка, то можно прийти к истории, общей теории языков программирования и, в частности, области компиляторов и формальному (математическому) доказательству корректности программ. На этот счет есть хорошая вводная лекция университетского курса «Языки программирования и компиляторы». Я немного перескажу ее.
Эволюция ЯП в улучшении абстракций: машинные коды, переменные (асемблер), процедуры и условные переходы (фортран), структуры (алгол68, паскаль), ООП, функции высшего порядка и развитые системы типов. Сейчас мы, программисты, пользуемся этим, зачастую, незадумываясь как работают языки высокого уровня, какая история за ними стоит и почему они именно такие, какие есть. Но интересно то что сам принцип ЭВМ в процессе развития языков не менялся.
Вот, еще один, похожий код. Интересный вопрос, какая у него может быть разница в производительности и почему? Продвинутые знания ЯП о работе итераторов могут подсказать, что for of должен быть немного медленнее, но здесь скрывается еще одна хитрая проблема.
Если в проекте используются прокси или геттеры и сеттеры, то в любой случайной точке кодовой базы никогда нельзя быть до конца уверенным есть здесь они или нет. Это невидимый контекст, что бы узнать о котором иногда, особенно в больших проектах, требуется исследовать большое количество связанного кода. Таким образом приходится либо постоянно быть не уверенным в читаемом коде, либо производить его многочисленные инспекции. Решением этой проблемы может быть использование паттерна «декоратор», или любое явное использование контекста и зависимостей.
Так же react-router нарушает принци SSoT, если в приложении имеется глобальный стейт менеджер, из-за чего компоненты использующие и роутер и стор часто имеют какие-то костыли или выступают мостом между двумя стейтами. Хорошим решением было бы использование роутинга через глобальный стор.
Есть подход «рендерМетодов», который подразумевает вынесение каких-то логических частей JSX в отдельные методы, но проблема с ним заключается в том что связанность такого кода сильно увеличена из-за разброса props и не отсутствия отображения этих методов в react-devtools (отображается просто портянка JSX, не понятно откуда взявшаяся).
Что бы избежать проблем с рендерМетодами достаточно вынести их тело в отдельные компоненты. При этом их проще будет отследить в react-devtools, а некоторые зависимости класса, которые получаются из контекста, скорее всего получится перенести в новые дочерние компоненты и разгрузить таким образом связанность в родительском компоненте.
Это наглядный пример того как игнорируя заветы семантики можно получить практические проблемы, которые решаются исправлением кода к семантической верности.
«render-props» через children тоже подходит на явный пример антипатерна семантики. Да, сам подход хорошо решает технические проблемы, но сильно ухудшает читаемость кода, нарушая принципы ответственности JSX. Решением может быть использование сведе’ния render-prop’ов.
Плохие советы по рендер-пропам дают даже на популярном ресурсе css-tricks:
Random Users
Loading.
Можно попробовать не использовать JSX для контейнеров. Интересно, что тогда код больше похож на использование хуков.
Loading.
Random Users
Так во втором примере errorView и bodyView проще вынести в отдельные компоненты и уменьшить связанность.
Показательным примером важности семантики расстановки блоков кода являются новые хуки в React.js
В этом примере код на классах был переписан на хуки и, помимо сокращения количества строк, можно увидеть что смысловые блоки сгруппировались, благодаря чему понимать какие-то конкретные процессы, описанные кодом, стало проще. Т.е. интуитивную семантику можно повышать не только за счет другого синтаксиса, но и за счет правильной расстановки блоков кода. Идеальный баланс: сохранение одинаковой функциональности интуитивной и формальной семантики при минимальном количестве кода.
Говоря обобщенно за кодочитаемость отвечает семантика. В частности под этим может подразумеваться множество аспектов языка: правильное использование типов данных и их особенностей, синтаксических конструкций, реализованных паттернов программирования (прокси), макросов и метапрограммирования и многое другое. Конечно, невозможно охватить такое многообразие перечнем небольших и конкретных правил, которые помогут писать исключительно идеальный код. Но общий вывод я мог бы сделать такой: явный код не содержит скрытых контекстов или скрытого поведения.
В читаемом и понятном коде нет разница между интуитивной и формальной семантикой.