Нотация в программировании это

Содержание

Нотация в программировании это

Категория:Нотации

Пространства имён

Действия на странице

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

Нотация используется для отображения моделей в рабочих продуктах (документах).

Для отражения одного или нескольких видов модели в каком-то виде документов используются нотации, поддерживающие (supports) тот язык, который использует (uses) тот или иной вид моделей. Один язык может быть использован множеством видов моделей, а вид модели использует только один язык.

Содержание

Письменные нотации

Типы письменности человеческих языков:

  • Пиктографический — письменный знак привязан к определенному объекту.
  • Идеографический — письменный знак привязан к определённому смыслу.
  • Фоноидеографический — письменный знак привязан и к смыслу, и к звучанию
    • Логографический — письменный знак обозначает определённое слово
    • Морфемный — письменный знак обозначает определённую морфему (см. «Китайская письменность»)
  • Фонетический — письменный знак привязан к определённому звучанию

Нотации в программировании

  • Форма Бэкуса — Наура (сокр. БНФ, Бэкуса — Наура форма) — формальная система описания синтаксиса, в которой одни синтаксические категории последовательно определяются через другие категории. БНФ используется для описания контекстно-свободных формальных грамматик. Существует расширенная форма Бэкуса — Наура (РБНФ), отличающаяся лишь более ёмкими конструкциями.
  • Венгерская нотация — соглашение об именовании переменных, констант и прочих идентификаторов в коде программ. Суть венгерской нотации сводится к тому, что имена идентификаторов предваряются заранее оговорёнными префиксами, состоящими из одного или нескольких символов. При этом, как правило, ни само наличие префиксов, ни их написание не являются требованием языков программирования, и у каждого программиста (или коллектива программистов) они могут быть своими.
  • Математические языки разметки нотации для представления математических формул:
    • TeX/LaTeX
    • MathML
  • Различные нотации, разработанные для определения регулярных выражений.

Нотации в управлении

  • Therblig — базовые элементарные движения в управлении операциями

Нотации в математике

  • Нотации для представления различных математических идей
    • Нотации в теории вероятностей
    • Прямоугольная система координат
    • Нотации для дифференциального исчисления
    • «O» большое — математическое обозначение для сравнения асимптотического поведения функций. Применяется, например, для определения вычислительной сложности алгоритма.
    • Z-нотация — формальный язык спецификации, используемый для описания и моделирования программ и их формальной верификации.
    • Порядковая индексация
    • Форма записи числовых множеств
  • Системы представления очень больших чисел
    • Нотация Конвея
    • Стрелочная нотация Кнута
    • Нотация Штейнгауза — Мозера
  • Системы счисления
    • по способу изображения чисел системы
      • Позиционные
      • Непозиционные
      • Смешанные
    • по основаниям системы счисления
      • двоичная
      • десятичная
      • восьмеричная
      • шестнадцатеричная
      • двоично-десятичная
    • по форме представления чисел
      • естественная форма (форма с фиксированной запятой)
      • нормальная форма (форма с плавающей запятой)
  • Обозначения математических операций
    • Инфиксная нотация
    • Польская нотация
    • Обратная польская нотация

Нотации в физике

  • Для обозначения физических величин и понятий в физике используются буквы латинского и греческого алфавитов, а также несколько специальных символов и диакритических знаков. Поскольку количество физических величин больше количества букв в латинском и греческом алфавитах, одни и те же буквы используются для обозначения различных величин. Для некоторых физических величин принято несколько обозначений (например для энергии, скорости, длины и других), чтобы предотвратить путаницу с другими величинами в данном разделе физики.
  • Диакритические знаки добавляются к символу физической величины для обозначения определённых различий (производная, векторная величина, средне значение, оператор и др.).
  • Бра и кет (англ. bra-ket < bracket скобка) — алгебраический формализм, предназначенный для описания квантовых состояний. Называется также обозначениями Дирака. В матричной механике данная система обозначений является общепринятой.
  • Обозначение тензоров. Тензор обычно обозначают некоторой буквой с совокупностью верхних (контрвариантных) и нижних (ковариантных) индексов. При смене базиса ковариантные компоненты меняются так же, как и базис (с помощью того же преобразования), а контравариантные — обратно изменению базиса (обратным преобразованием).

Графические нотации

  • Семейства IDEF (Integrated DEFinition):
    • IDEF0 (функциональное моделирование);
    • IDEF1.X (информационное моделирование);
    • IDEF3 (моделирование деятельности или процессное моделирование).
  • ARIS eEPC (Extended Event Driven Process Chain) – расширенная нотация описания цепочки функций процесса, управляемого событиями.
  • Диаграмма Ганта
  • PERT
  • BPMN
  • Язык моделирования UML

Страницы в категории «Нотации»

Показано 12 страниц из 12, находящихся в данной категории.

Венгерская нотация (Hungarian Notation)

Резюме документа

«Венгерское соглашение» об именах идентификаторов Чарльза Симонии.

Примечание от dr. GUI

Еще во времена разработки первых версий DOS, доктор Чарльз Симонии представил соглашение об именах идентификаторов, в котором для указания функционального назначения объекта, представленного идентификатором используется добавление префикса к имени идентификатора.

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

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

Возможно самой важной публикацией, пропагандирующей Венгерскую нотацию была первая книга, читаемая почти каждым Windows — программистом: «Windows programmin» Чарльза Петцольда. В книге данное соглашение использовалось для примеров и примечаний и было кратко описано в первой главе.

Данный документ представляет первоначальный вариант работы Симонии.

Соглашение об идентификаторах в программе.

Данный документ предназначен для изложения основных достоинств о формальном формировании идентификаторов.

При введении нового идентификатора в программу, хороший программист учитывает следующие факторы:

  1. мнемоническое значение: идентификатор должен легко запоминаться
  2. смысловое значение: роль идентификатора должна быть ясна из его названия
  3. преемственность: часто рассматривается как чисто эстетическая идея, но все же, похожие объекты должны иметь похожие идентификаторы.
  4. скорость решения: придумывание, ввод и редактирование идентификатора не должны занимать слишком много времени, идентификатор не должен быть слишком длинным.

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

Преимущества Соглашений

Данные соглашения об идентификаторах обеспечивают удобную технологию для формирования имен, удовлетворяющих вышеупомянутым критериям. Основной идеей является передача основных характеристик идентификатора как части в его названии. Эта простая идея, безусловно, требует уточнения (что, например, предполагается под «критерием», что делать если они(критерии) не уникальны?). Однако, давайте сначала оговорим общие положения.

Читать еще:  Return code 1603 hp ошибка

Названия будут мнемоническими в строго определенном смысле: идентификатор будет очевиден для того, кто помнит название характеристики или принцип его построения.

Названия имеют смысловое значение: должна быть возможность отобразить любое название в наборе характеристик.

Названия будут непротиворечивы, так как произведены теми же самыми правилами.

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

Выражения в программе могут быть проверены на преемственность методами, похожими на обычные измерения свойств объекта.

Правила обозначения

Предлагаются следующие правила обозначения:

1) Описание характеристики идентификатора входит в идентификатор. Удобной пунктуацией является указание характеристики перед названием, с разделением их (началом названия с большой буквы в Cи, например: rowFirst: row — характеристика, Fist — название).

2) Название отличают идентификаторы, имеющие один и тот же тип и существующие в одном контексте. Контекстом может являться как система в целом, так и блок, процедура, структура данных в зависимости от среды программирования. Если существует стандартное название, оно должно быть использовано. Выбор должен быть максимально простым, так как требуется уникальность идентификатора только в пределах определенного контекста.

3) Простые типы названы короткими тегами, которые выбраны программистом. Такие теги должны быть интуитивно понятны большинству программистов.

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

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

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

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

Например мы создаем графическую программу. В данном случае у нас существует тип данных «цвет». Естественным желанием является сделать префикс color для обозначения цвета. Однако при детальном рассмотрении может оказаться, что применение термина color более удобно в приложении к названию, например: LineColor. Для обозначения цвета более выгодным является сокращение, например clr. clrDefault.

Обозначение для упрощения написания.

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

Обозначение для процедур.

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

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

2) Начинайте название процедуры с тега типа возвращаемого значения, если таковое существует.

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

4) В конец названия можно добавить список тегов некоторых или всех формальных параметров, если есть смысл.

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

Таблица 1. Некоторые примеры для названий процедуры

Венгерская нотация

Венге́рская нота́ция в программировании — соглашение об именовании переменных, констант и прочих идентификаторов в коде программ. Своё название венгерская нотация получила благодаря программисту компании Microsoft венгерского происхождения Чарльзу Симони (венг. Simonyi Károly ), предложившему её ещё во времена разработки первых версий MS-DOS. Эта система стала внутренним стандартом Майкрософт [1] .

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

Применяемая система префиксов зависит от многих факторов:

  • языка программирования (чем более «либеральный» синтаксис, тем больше контроля требуется со стороны программиста, а значит, тем более развита система префиксов. К тому же использование в каждом из языков программирования своей терминологии также вносит особенности в выбор префиксов);
  • стиля программирования (объектно-ориентированный код может вообще не требовать префиксов, в то время как в «монолитном» для разборчивости они зачастую нужны);
  • предметной области (например, префиксы могут применяться для записи единиц измерения);
  • доступных средств автоматизации (генератор документации, навигация по коду, предиктивный ввод текста, автоматизированный рефакторинг и т. д.).

Содержание

Примеры

Префиксы, задающие тип

Как видно в приведённом примере, префикс может быть и составным. Например, для именования строковой переменной-члена класса использована комбинация префиксов «m_» и «s» ( m_sAddress ).

Префиксы, задающие смысл

Венгерская нотация для приложений:

За и против

Среди программистов есть как сторонники, так и противники использования венгерской нотации. Противники утверждают, что она громоздка и лишь ухудшает понимание кода. Сторонники утверждают, что слишком многие неверно понимают основную идею и неправильно пользуются нотацией.

Преимущества

  • Если встроенного механизма типизации не хватает, венгерская нотация позволяет записывать подтип переменной — например, int cPrice может означать, что переменная имеет не просто целый тип, а валютный (currency). Именно такое применение префиксов было предложено Симони [2] . Это может пригодиться:
    • В низкоуровневом программировании (когда набор доступных типов настолько узок, что, например, целый тип не отличается от булевого).
    • В языках с динамической типизацией, например PHP, где одна и та же переменная может хранить значения любого типа.
    • В инженерных расчётах (для записи единиц измерения). Это позволяет избавиться от немалого количества ошибок простым подсчётом размерностей.
    • В других местах, где переменные одного и того же типа предназначены для хранения разнородных данных — например, в коде защиты от компьютерных взломщиков префикс может указывать на «безопасные» и «небезопасные» данные (SQL-инъекция, XSS).
  • Венгерская нотация удобна для написания больших программ в неполнофункциональных (по современным меркам) редакторах без автоматизированной навигации по тексту. Скорее всего, именно поэтому она стала стандартным стилем кода в WinAPI.
  • Удобно при именовании объектов, для которых тип очевиден — например, кнопку «OK» можно назвать btnOk .
  • Две переменные разного типа, но объединённые логически, могут иметь имена, отличающиеся лишь префиксом. Например, поле ввода для поиска и кнопка «Поиск» могут именоваться как txtSearch и btnSearch . Такая практика позволяет делать названия переменных короткими и в то же время осмысленными.
Читать еще:  Структурно модульное программирование

Этот стиль выбора имён называется «венгерской» записью по названию родины руководителя отдела программирования Microsoft Чарльза Симони, который его изобрёл. (А не потому, что его использование придаёт программам такой вид, будто они написаны на венгерском языке [3] )

Недостатки

  • Некоторые программисты считают, что использование префиксов делает имена переменных менее понятными и, таким образом, ухудшает читаемость кода. [4]
  • Если известно имя переменной без префиксов, подчас трудно восстановить её префиксы.
  • Система автодокументации, если она не понимает системы префиксов, отсортирует алфавитный список по префиксу, что может отрицательно сказаться на качестве документации. Впрочем, имена функций обычно префиксами не снабжают.
  • Запись нескольких префиксов из-за частого использования заглавных букв и знаков подчёркивания может стать «пляской на кнопке ⇧ Shift».
  • Средства навигации, которые включены в современные редакторы кода, и так позволяют видеть тип любой переменной и быстро переходить к точке, где она определена — то есть, использование префиксов может быть избыточным.
  • При изменении типа потребуется изменять имя переменной (большинство программистских редакторов не могут делать это автоматически). [4]
  • Существуют и другие средства задания типа переменной в её имени: например, слова is, has и т. д. для булевского типа ( IsLoggedIn ), count для счётчика ( RefCount ), множественное число для массива ( UserIds ). В языках, в которых заглавные буквы не эквивалентны строчным, регистр букв также может кодировать что-либо.

Известный противник венгерской нотации — Линус Торвальдс: «Вписывание типа переменной в её имя (так называемая венгерская нотация) ущербно — компилятор и так знает типы и может проверить их, и это запутывает программиста» [5] .

См. также

Примечания

  1. Hungarian Notation
  2. Джоэл Спольски. Как заставить неправильный код выглядеть неправильно
  3. Венгерский язык, хоть и имеет латинский алфавит, считается крайне неудобочитаемым для неосведомлённых.
  4. 12Inside C++ — Венгерская нотация
  5. «Linux kernel coding style». Документация по ядру Linux (на английском).

Wikimedia Foundation . 2010 .

Смотреть что такое «Венгерская нотация» в других словарях:

Венгерская нотация — — соглашение программистов об именовании переменных, констант и прочих идентификаторов в коде программы. Свое название венгерская нотация получила благодаря программисту компании Майкрософт венгерского происхождения Чарльзу Шимоньи(венг.… … Справочник технического переводчика

Динамическая типизация — Типизация данных Типобезопасность Вывод типов Динамическая типизация Статическая типизация Строгая типизация Мягкая типизация Зависимые типы Утиная типизация Основная статья: Строгая типизация Динамическая типизация приём, широко… … Википедия

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

Тип данных — (встречается также термин вид данных) фундаментальное понятие теории программирования. Тип данных определяет множество значений, набор операций, которые можно применять к таким значениям и, возможно, способ реализации хранения значений и… … Википедия

Стандарт оформления кода — (стандарт кодирования, стиль программирования) (англ. coding standards, coding convention или programming style) набор правил и соглашений, используемых при написании исходного кода на некотором языке программирования. Наличие общего… … Википедия

Шимоньи, Чарлз — Чарльз Симони Космонавт Страна: США Специальность: Программный архитектор Миссии: Союз ТМА 10 Союз ТМА 9 … Википедия

Зарезервированное слово — (или ключевое слово) в языках программирования слово, имеющее специальное значение. Идентификаторы с такими именами запрещены. В лексическом анализе зарезервированное слово фигурирует как одна лексема особого типа. Содержание 1 Примеры 2… … Википедия

Валютный тип — Тип данных Содержание 1 История 2 Определение 3 Необходимость использования типов данных … Википедия

Симони, Чарльз — Чарльз Симони Космонавт Страна … Википедия

Список изобретателей — Здесь представлен список изобретателей, которые обогатили мир, сделали изобретения, которыми пользуется всё человечество. Помимо имени изобретателя даются годы его жизни и страна (или страны), в которой он жил и работал, а также наиболее значимые … Википедия

Эффективность алгоритмов: простое объяснение большого «О»

Перевод статьи «Algorithm’s Efficiency | Big O “In Simple English”».

Начнем с забавной истории.

Родом я из Демократической Республики Конго в Центральной Африке. У нас там очень низкая скорость интернет-связи. Например, при открытии Gmail загрузка может занимать от 3 до 5 минут (порой процесс прерывается по time out).

В 2009 году подобная проблема со скоростью интернета была у одной компании в Южной Африке. У этой компании было два офиса в 50 милях друг от друга. Сотрудники решили провести занимательный эксперимент и посмотреть, не будет ли быстрее пересылать данные при помощи голубиной почты.

Они поместили 4GB данных на флешку, прикрепили ее к голубю и выпустили его из офиса, чтобы он полетел в другой офис. И…

Почтовый голубь оказался быстрее интернет-связи. Он победил с большим отрывом (иначе история не была бы такой забавной). Больше того, когда голубь долетел до второго офиса, а случилось это через два часа, через интернет загрузилось только 4% данных.

Сложность. Анализ времени работы. Нотация большого «О»

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

Точное время работы скрипта или алгоритма определить сложно. Оно зависит от многих факторов, например, от скорости процессора и прочих характеристик компьютера, на котором запускается этот скрипт или алгоритм. Поэтому нотация большого «О» используется не для оценки конкретного времени работы кода. Ее используют для оценки того, как быстро возрастает время обработки данных алгоритмом в привязке к объему этих данных.

Временная и пространственная сложность

Когда вы пишете код — любой код, на любом языке программирования — вы имеете дело с двумя видами сложности: временной и пространственной.

  • Временная сложность алгоритма определяет число шагов, которые должен предпринять алгоритм, в зависимости от объема входящих данных (n).
  • Пространственная сложность алгоритма определяет количество памяти, которое потребуется занять для работы алгоритма, в зависимости от объема входящих данных (n).
Читать еще:  Ошибка лицензирования rdp

Постоянное время: O(1)

Обратите внимание, что в истории с голубем, рассказанной выше, голубь доставил бы и 5KB, и 10MB, и 2TB данных, хранящихся на флешке, за совершенно одинаковое количество времени. Время, необходимое голубю для переноса данных из одного офиса в другой, это просто время, необходимое, чтобы пролететь 50 миль.

Если использовать О-нотацию, время, за которое голубь может доставить данные из офиса А в офис Б, называется постоянным временем и записывается как O(1). Оно не зависит от объема входящих данных.

Вот пример кода JavaScript с временной сложностью O(1):

Линейное время: O(n)

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

Если использовать О-нотацию, мы можем сказать, что время, нужное для передачи данных из офиса А в офис Б через интернет, возрастает линейно и прямо пропорционально количеству передаваемых данных. Это время записывается как O(n), где n — количество данных, которое нужно передать.

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

Вот пример кода на JavaScript с временной сложностью O(n):

Квадратичное время: O(n2)

Квадратичное время представляет алгоритм, производительность которого прямо пропорциональна квадрату размера входящих данных.

Распространенный пример такого алгоритма — два вложенных цикла. По мере увеличения вложенности растет и временная сложность (O(n³), O(n⁴) и т. д.).

Экспоненциальное время: O(2^n)

Если сложность алгоритма описывается формулой O(2^n), значит, время его работы удваивается с каждым дополнением к набору данных. Кривая роста функции O(2^n) экспоненциальная: сначала она очень пологая, а затем стремительно поднимается вверх. Примером алгоритма с экспоненциальной сложностью может послужить рекурсивный расчет чисел Фибоначчи:

Логарифмическое время: O(log n)

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

Бинарный поиск это алгоритм поиска в отсортированных массивах. Работает он следующим образом. В отсортированном наборе данных выбирается серединный элемент и сравнивается с искомым значением. Если значение совпадает, поиск завершен.

Если искомое значение больше, чем значение серединного элемента, нижняя половина набора данных (все элементы с меньшими значениями, чем у нашего серединного элемента) отбрасывается и дальнейший поиск ведется тем же способом в верхней половине.

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

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

Вот обычный порядок возрастания времени:

  • O(1) — постоянное время
  • O(log n) — логарифмическое время
  • O(n) — линейное время
  • O(n²) — квадратичное время
  • O(2^n) — экспоненциальное время
  • O(n!) — факториальное время

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

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

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

ЯЗЫКИ И СИСТЕМЫ ПРОГРАММРОВАНИЯ.

Способы описания ЯП.

Для описания ЯП используются две системы описания:

  1. Нотация Бэкуса – впервые предложена при описании языка Algol;
  2. Нотация IBM (разработана фирмой для описания языков Cobol и JCL).

Обе нотации используют следующее обозначение: — угловые скобки (или двойные кавычки) обозначают элемент программы, определяемый пользователем ( , , “Условие” и пр.). В соответствующих местах реальной программы будет находится идентификатор переменной, список параметров и прочее.

Нотация Бэкуса содержит конструкцию следующего вида:

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

Правая часть включает совокупность элементов, соединённых знаком |, которая трактуется как «или» и объединяет альтернативы – различные варианты значения, определяемого элемента. Части соединяются оператором ::=, который может трактоваться, как является по определению.

Нотация IBM включает следующие элементы:

  1. [ ] — квадратные скобки, обозначают возможное отсутствие элемента конструкции. Например, return [ ] – в этой конструкции не обязательно;
  2. < >– фигурные скобки,

означает обязательное присутствие одного из

  1. | — вертикальная черта, разделяет список значений обязательных элементов, одно из которых должно быть выбрано;
  2. … — горизонтальное многоточие, следующая после некоторой синтаксической конструкции, обозначает последовательность конструкций, той же самой формы, что и предшествующее многоточию конструкция. Например,

< >[, ]…> обозначает, что одно или более , разделённых запятыми, может появиться между фигурными скобками.

Рекурсивное определение в IBM-нотации не используются.

Классификация языков программирования.

Определяющие факторы классификации обычно жёстко не фиксируется. Чтобы продемонстрировать пример типичной классификации опишем наиболее часто применяемые факторы, дадим им условные названия и дадим образцы ЯП.

Элементы языков программирования.

Алфавит – совокупность символов, отображаемых на устройте печати и экранах/вводимых с клавиатуры терминалов. Обычно это набор символов — Latin-1 с исключением управляющих символов. Иногда в это множество включаются неотображаемые символы с указанием правил их записи (комбинирование в лексемы).

Лексика – совокупность правил образования цепочек символов (лексем), образующих идентификаторы (переменные и метки), операторы, операции и другие лексические компоненты языка.

Сюда же включаются зарезервированные ключевые слова ЯП, предназначенные для обозначения операторов, встроенных функций и прочее.

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

Синтаксис – совокупность правил обозначения языковых конструкций или предложений ЯП — блоков, процедур, составных операторов, условных операторов, цикла и прочее. Особенностью синтаксиса является принцип вложенности (рекурсивность) правил построения конструкций. Это значит, что элемент синтаксиса языка в своём определении прямо или косвенно в одной из его частей содержит сам себя. Например, в определении оператора цикла телом цикла является оператор, частным случаем которого является всё тот же оператор цикла.

Семантика – смысловое содержание конструкций предложений языка.

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

Семантические ошибки возникают при недопустимом использовании операции массивов, функций, операций и пр.

Зарезервированные служебные слова, имеющиеся в каждом ЯП. Могут быть использованы только по своему специальному назначению (как имена функций, операторов, операций и пр.)

IT Новости из мира ПК
Добавить комментарий