Префикс (информатика)
В информатике подстрока — это непустая связная часть строки.
Формальное определение
Пусть , где
, является подстрокой 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.
Основные принципы работы с префиксами в программировании
Префикс — это часть названия переменной, функции или метода, которая добавляется перед именем. Префиксы широко используются в программировании для идентификации переменных и функций, которые относятся к определенной группе или модулю.
Принципы использования префиксов
1. Четкость и понятность
Префиксы должны быть понятны, легко запоминающимися и отражать суть переменной или функции, которую они идентифицируют. Они должны быть также консистентными в рамках всего проекта.
2. Избегайте длинных префиксов
Префиксы должны быть длиной не более нескольких символов. По возможности, используйте общепринятые префиксы (например, "str" для строковых переменных, "int" для целочисленных переменных), если это соответствует содержанию переменной или функции.
3. Используйте префиксы для группировки переменных
Вы можете использовать префиксы для группировки переменных, относящихся к определенному модулю, классу или функции. Например, все переменные, относящиеся к базе данных, могут начинаться с префикса "db".
4. Избегайте излишнего использования префиксов
Тем не менее, не стоит использовать префиксы там, где они не требуются. Некоторые языки программирования (такие как Go) требуют явного указания префиксов, но в других языках (например, Python) это не является обязательным.
Примеры использования префиксов
Python
Swift
Заключение
Префиксы — это удобный способ организации переменных и функций в программировании. Они делают код более читабельным, консистентным и понятным, позволяя разработчикам лучше ориентироваться в больших проектах. Однако, следует помнить, что избыточное использование префиксов может привести к излишней сложности и затруднить дальнейшую работу с проектом.
Что значит «префикс» в языке программирования си?
Префикс — первая часть имени переменной, обычно общая для разных переменных одного типа.
Например:
string strAddress nofollow» href=»http://test/» target=»_blank»>http://test/»;
Здесь «str» — это префикс. Это префикс по типу переменной, str для string, i или n — для int и т. д.
Примерно так делается в соответствии с венгерской нотации.
Возможен еще префикс «по смыслу»:
string rawAnswer = HTTPLibrary::get(«http://service/api.json»);
JSONObject jsonAnswer = JSONLibrary::parse(rawAnswer);
Здесь «raw» означает, что первая переменная содержит «сырой» (необработанный) ответ сервера в виде строки в формате JSON, из нее сложно извлечь значения и этого не нужно делать непосредственно, а затем мы эту строку парсим и во второй переменной у нас лежит модель JSON на базе класса JSONObject, который позволяет извлекать значения.
Применяется в ботах, работающих с API, возвращающих ответ в формате XML/JSON, например, у otvet.mail.ru именно такое API
Иногда это удобно, если правильно применять, позволяет фильтровать список всплывающих подсказок (IntelliSense или подобных) и таким образом быстрее вспоминать полное имя переменной