Префикс (информатика)
В информатике подстрока — это непустая связная часть строки.
Формальное определение
Пусть , где
, является подстрокой L длины j − i + 1 .
Если i = 0 , то S называется префиксом L длины j + 1 .
Если j = n − 1 , то S — суффикс L длины j − i + 1 .
Пример
С точки зрения информатики строки «кипед», «Вики», «дия» являются подстроками строки «Википедия»; при этом «Вики» — префиксом, а «дия» — суффиксом.
Получение подстроки
Если line — исходная строка, begin — позиция первого символа подстроки, end — позиция последнего символа подстроки, то подстрока subline вычисляется следующим образом:
В языке C
char * subline = (char *)malloc(end — begin + 2);
if (subline == NULL)
<
fprintf(stderr, «ERROR: malloc failed!»);
exit(1);
>
subline[end — begin + 1] = ‘\0’;
В языке python подстрока является слайсом (срезом) (англ. slice ).
В языке В языке Pascal
SubStr := Copy(SourceStr, StartCharIndex, SubStrLength);
Операции с подстрокой
Помимо простой задачи выделения подстроки из строки по двум индексам существует и более сложная задача поиска индексов, указывающих на заданную подстроку в строке (поиск вхождения подстроки в строку).
См. также
Wikimedia Foundation . 2010 .
Полезное
Смотреть что такое «Префикс (информатика)» в других словарях:
Суффиксное дерево — Суффиксное дерево бор, содержащий все суффиксы некоторой строки (и только их). Позволяет выяснять, входит ли строка w в исходную строку t, за время O(|w|), где |w| длина строки w. Содержание 1 Основные определения и описание структуры … Википедия
Дерево суффиксов — Суффиксное дерево способ организации данных (строк), позволяющий выяснять, входит ли строка w в строку t, за время O(|w|), где |w| длина строки w. Содержание 1 Основные определения и описание структуры 2 Свойства суффиксных д … Википедия
Идентификатор цифрового объекта — (также используется словосочетание Цифровой идентификатор объекта, ЦИО, digital object identif … Википедия
Пи-исчисление — исчисление в теоретической информатике исчисление процессов, изначально разработанное Робином Милнером, Иоахимом Парровом и Дэвидом Уолкером как продолжение работы над исчислением общающихся систем. Целью исчисления является возможность… … Википедия
Франция — (France) Французская Республика, физико географическая характеристика Франции, история Французской республики Символика Франции, государственно политическое устройство Франции, вооружённые силы и полиция Франции, деятельность Франции в НАТО,… … Энциклопедия инвестора
Зализняк, Андрей Анатольевич — Андрей Анатольевич Зализняк А. А. Зализняк во время лекции о берестяных грамотах из раскопок 2008 года Дата рождения … Википедия
Префиксное дерево — Префиксное дерево абстрактный тип данных (АТД), структура данных, позволяющая хранить ассоциативный массив, ключами которого являются строки. В отличие от б … Википедия
Префиксный код — Эту статью следует викифицировать. Пожалуйста, оформите её согласно правилам оформления статей. Префиксный код в теории кодирования код со словом переменной длины, имеющий такое св … Википедия
Позиционная система — счисления система счисления, в которой один и тот же числовой знак (цифра) в записи числа имеет различные значения в зависимости от того места (разряда), где он расположен. Изобретение позиционной нумерации, основанной на поместном значении цифр … Википедия
Префиксы в системе команд IA-32
Сегодня я хочу рассказать вам о префиксах в системе команд Intel IA-32 в 32- и 64-битных вариантах (также именуемых как x86 и x86_64). Но для начала напомню вкратце общую структуру IA-32 инструкции:
- Префиксы. Могут отсутствовать. Может присутствовать сразу несколько.
- Опкод. Может состоять из одного, двух или трех байтов.
- Mod_R/M байт. Используется для адресации операндов. Может отсутствовать в кодировке, если инструкция не имеет явных операндов.
- SIB (Scale Index Base) байт. Второй байт, использующийся для адресации операндов в памяти. Может отсутствовать.
- Байт смещения адреса (англ. displacement). 1, 2, 4 или ни одного байта.
- Константа (англ. immediate). 1, 2, 4 или ни одного байта.
Однобайтные префиксы
Практически с самых первых процессоров Intel в системе команд IA-32 начали использоваться однобайтные префиксы. О них уже было написано на Хабре, по этой причине я про них рассказывать не буду.
Обязательные префиксы
С появлением расширения SSE часть однобайтных префиксов, а именно 0xf2 , 0xf3 , 0x66 в некоторых случаях стали иметь смысл части опкода. Появились так называемые обязательные префиксы (англ. mandatory prefixes). Примеры таких инструкций приведены ниже.
Кодировка | Инструкция | Обязательный префикс |
---|---|---|
0x0f 0x10 | MOVUPS | — |
0xf2 0x0f 0x10 | MOVSD | 0xf2 |
0xf3 0x0f 0x10 | MOVSS | 0xf3 |
0x66 0x0f 0x10 | MOVUPD | 0x66 |
Не сложно заметить, что кодировки этих инструкций отличаются только префиксом. Опкод у них совпадает – 0x0f 0x10 . При этом семантика у этих инструкций различна. Например, MOVSD копирует из одного операнда в другой 64 бита, а MOVUPD – 128 бит.
Префикс REX
В определенный момент появилась необходимость в поддержке 64-битного адресного пространства и расширения числа адресуемых регистров. С этой задачей успешно справились разработчики AMD, добавив префикс, названный REX . Данный префикс также является однобайтным, и имеет вид 0x4* . Его биты используются для расширения уже существующих полей, кодируемых в Mod_R/M байте, а также ширины операнда. На рисунке приведен пример использования REX префикса для адресации регистров.
Стоит отметить несколько особенностей, связанных с использованием этого префикса. Кодировка 0x4* соответствует префиксу только в 64-битном режиме, во всех остальных режимах она соответствует вариантам инструкций INC/DEC . Интересным свойством данного префикса является то, что он должен быть расположен непосредственно перед байтом опкода, в противном случае он игнорируется. Если REX префикс используется вместе с инструкцией требующей присутствия другого обязательного префикса, он должен быть расположен между этим префиксом и байтом кода операции.
Префикс VEX
С введением расширения AVX в системе команд IA-32 появился новый префикс, названный VEX . Он уже не однобайтный. Он может состоять либо из двух, либо из трех байт в зависимости от первого байта префикса. 0xc4 и 0xc5 соответственно.
Поля R , X , B , W несут тот же смысл, что и соответствующие поля REX префикса. Поле pp предоставляет функциональность, эквивалентную обязательным SIMD префиксам (например, b01 = 0x66 ). А поле m-mmmm может соответствовать целым двум байтам опкода (например, 0b00011 = 0x0f 0x3a ). Поле L определяет длину вектора: 0 – 128 бит, 1 – 256 бит.
Использование VEX префикса предоставляет следующие преимущества:
- Поддержка до четырех операндов.
- Поддержка 128-битных XMM регистров и 256-битных YMM регистров.
- Сжатие кодировки уже введенных инструкций.
- Удаление необходимости использования REX префикса для адресации регистров общего назначения ( R8 – R15 ), векторных регистров XMM8 – XMM15 ( YMM8 – YMM15 ). VEX позволяет кодировать те же поля, что и REX , и, вдобавок, несколько новых.
Префикс EVEX
Не так давно Intel анонсировал появление нового расширения набора команд с названием AVX3 или AVX512 . С появлением этого расширения также появился и новый префикс, получивший название EVEX . Его описание можно найти в Intel Architecture Instruction Set Extensions Programming Reference.
Он представляет собой усовершенствованный вариант VEX префикса, имеет длину уже в 4 байта и начинается с байта 0x62 , который во всех режимах, кроме 64-битного соответствует инструкции BOUND , редко используемой в современных программах.
Приведу некоторые, на мой взгляд, интересные особенности EVEX префикса:
- Два бита для длины вектора – LL` – необходимые для поддержки векторов размером 128, 256 и 512 бит.
- Поддержка адресации новых 512-битных регистров ZMM8 — ZMM31 .
- Поддержка регистров маски операндов (англ. opmask registers). Поле EVEX.aaa .
- EVEX.mm – эквивалент поля VEX.m-mmmm , но занимает два бита вместо пяти.
Заключение
В заключение хочется отметить некоторые причины появления настолько сложной и, местами, не логичной системы команд. История развития системы команд Intel IA-32 начинается в 70-х годах прошлого столетия, когда ни о каких 64-битных режимах не было и речи. Кроме Intel существенный вклад в эволюцию IA-32 внесла компания AMD. Много усилий было потрачено на поддержание обратной совместимости между различными моделями процессоров. Множество интересных фактов, связанных с развитием архитектуры IA-32 можно найти в статье A. Fog’a.
Практическое руководство по именованию классов, функций и переменных
«В компьютерном программировании соглашение об именах — набор правил для выбора последовательности символов, которая будет использоваться для идентификаторов, которые обозначают переменные, типы, функции и другие объекты в исходном коде и документации», — «Википедия»
Придумывать названия сложно!
В этой статье мы сосредоточимся на методе именования (P)A/HC/LC для того, чтобы улучшить читаемость кода. Эти рекомендации можно применить к любому языку программирования, в статье для примеров кода используется JavaScript.
Что значит (P)A/HC/LC?
В этой практике используется следующий шаблон для именования функции:
Что обозначает префикс (P)?
Префикс расширяет смысл функции.
Описывает свойство или состояние текущего контекста (обычно — логическое значение).
Указывает, имеет ли текущий контекст определенное значение или состояние (обычно — логическое значение).
Отражает положительный условный оператор (обычно — логическое значение), связанный с определенным действием.
Действие — это сердце функции
Действие — это глагольная часть имени функции. Это самая важная часть в описании того, что делает функция.
Получает доступ к данным немедленно (сокращение от getter для внутренних данных).
Безусловно присваивает переменной со значением A значение B.
Возвращает переменную к её начальному значению или состоянию.
Выполняет запрос данных, для которого требуется время (например, асинхронный запрос).
Удаляет что-то откуда-то.
Например, если у вас есть коллекция выбранных фильтров на странице поиска, удаление одного из них из коллекции — это removeFilter , а не deleteFilter (именно так вы и скажете на английском языке):
Полностью стирает что-то. После операции сущность перестаёт существовать.
Представьте, что вы редактор контента, и есть пост, от которого вы хотите избавиться. Как только вы нажали на кнопку delete-post, CMS выполнила действие deletePost , а не removePost .
Создает новые данные из существующих. Обычно это применимо к строкам, объектам или функциям.
Обработка действия. Часто используется при именовании обратного вызова.
Контекст
Контекст — это область, с которой работает функция.
Функция — это часто действие с чем-то. Важно указать, какова её рабочая область или, по крайней мере, ожидаемый тип данных.
В итоге
Пять принципов именования переменных
В этом разделе мы предложим некоторые правила именования переменных, которые улучшат читаемость кода.
1. Следуйте S-I-D
Имя должно быть коротким (Short), интуитивно понятным (Intuitive) и описательным (Descriptive).
2. Избегайте сокращений
Не используйте сокращения. Обычно они только ухудшают читаемость кода. Найти короткое, описательное имя может быть сложно, но сокращения не могут быть оправданием для того, чтобы этого не делать. Например:
3. Избегайте дублирования контекста
Всегда удаляйте контекст из имени, если это не снижает его читабельность.
4. Отражайте в имени ожидаемый результат
5. Учитывайте единственное/множественное число
Как и префикс, имена переменных могут быть единственного или множественного числа в зависимости от того, имеют ли они одно значение или несколько.
Полезный фреймворк для именования ваших классов, функций и переменных
«В компьютерном программировании соглашение об именах — набор правил для выбора последовательности символов, которая будет использоваться для идентификаторов, которые обозначают переменные, типы, функции и другие объекты в исходном коде и документации». Википедия
В этой статье мы попытаемся сосредоточиться на методе именования A/HC/LC, который может улучшить читаемость кода.
Хотя эти правила можно применить к любому языку программирования, мы будем использовать JavaScript, чтобы проиллюстрировать их на практике.
Что такое (P)A/HC/LC?
Эта практика предлагает использовать следующий шаблон для наименования.
Что такое префикс (Prefix)?
Префикс улучшает значение функции.
Описывает характеристику или состояние текущего контекста (обычно логическое).
Описывает, имеет ли текущий контекст определенное значение или состояние (обычно логическое).
should
Отражает положительное условное выражение (обычно логическое) в сочетании с определенным действием.
Действия (Action) — это суть функции
Действия — это глагольная часть имени вашей функции. Они являются наиболее важной частью описания того, что делает функция.
Немедленный доступ к данным (т.е. быстрый метод получения внутренних данных).
Декларативно устанавливает переменную со значением A в значение B.
reset
Устанавливает переменную обратно в ее начальное значение или состояние.
fetch
Запрашивает данные, на что требуется время (например, асинхронный запрос).
remove
Что-то откуда-то убирает.
Например, если у вас есть коллекция фильтров на странице поиска, удаление одного из них из коллекции — это removeFilter, а не deleteFilter (и это то, как вы, естественно, произносите это по-английски):
delete
Полностью стирает что-то.
Представьте, что вы редактор контента, и у вас есть печально известный пост, от которого вы хотите избавиться. После того, как вы нажали кнопку удаления публикации, CMS выполнила действие deletePost, а не removePost.
compose
Создает новые данные из существующих данных. В основном это применимо к строкам, объектам или функциям.
handle
Обрабатывает действие. Часто используется при именовании метода обратного вызова.
Наконец, Контекст (Context)
Контекст — это область, в которой работает функция.
Функция часто — это действие над чем-то. Важно указать, каков его рабочий домен или, по крайней мере, ожидаемый тип данных.
В итоге
5 рекомендации по именованию переменных
В этом разделе мы попытаемся сосредоточиться на некоторых правилах и протоколе именования переменных, которые улучшат читаемость кода.
1. S-I-D
Имя должно быть Кратким, Интуитивно понятным и Описательным (Short, Intuitive and Descriptive).
2. Избегайте сокращений
Не используйте сокращений. Они только ухудшают читаемость кода. Найти короткое описательное имя может быть сложно, но сокращение — не оправдание для того, чтобы этого не сделать. Например:
3. Избегайте дублирования контекста
Всегда удаляйте контекст из имени, если это не ухудшает его читабельность.
4. Отражайте ожидаемый результат
5. Учитывайте единственное/множественное число
Как и префикс, имена переменных могут быть единственными или множественными, в зависимости от того, содержат ли они одно значение или несколько.