Фрагмент — это программный термин, обозначающий небольшую область повторно используемого исходного кода , машинного кода или текста. Обычно это формально определенные оперативные единицы, которые можно включить в более крупные программные модули . Управление фрагментами является функцией некоторых текстовых редакторов , редакторов исходного кода программ , IDE и сопутствующего программного обеспечения . Это позволяет пользователю избежать повторного ввода текста в ходе рутинных операций редактирования. [1]
В практике программирования «фрагмент» относится в узком смысле к части исходного кода, которая буквально включается программой-редактором в файл и представляет собой форму программирования копирования и вставки . [2] Это конкретное включение отличается от методов абстракции, таких как функции или макросы , которые являются абстракцией внутри языка. Таким образом, фрагменты в основном используются, когда эти абстракции недоступны или нежелательны, например, в языках, в которых отсутствует абстракция, или для ясности и отсутствия накладных расходов.
Фрагменты аналогичны статической предварительной обработке, включенной в редактор, и не требуют поддержки компилятора. С другой стороны, это означает, что фрагменты не могут быть неизменно изменены постфактум и, таким образом, уязвимы для всех проблем программирования копирования и вставки. По этой причине фрагменты кода в основном используются для простых разделов кода (с небольшим количеством логики) или для шаблонов, таких как уведомления об авторских правах, прототипы функций, общие структуры управления или импорт стандартных библиотек.
Управление фрагментами — это функция текстового редактора, популярная среди разработчиков программного обеспечения или других лиц, которым регулярно требуется контент из каталога повторно вводимого текста (например, с исходным кодом или шаблоном ). Часто эта функция оправдана, поскольку содержимое меняется лишь незначительно (или совсем не меняется) при каждом вводе.
Текстовые редакторы, включающие эту функцию, обычно предоставляют механизм управления каталогом и отдельными «фрагментами» точно так же, как текстовый редактор и операционная система позволяют управлять отдельными файлами. Эти базовые возможности управления включают в себя такие операции, как просмотр, добавление, редактирование, удаление, сортировку, фильтрацию, группировку, переименование и сохранение фрагментов в репозитории , каталоге или базе данных . Некоторые редакторы предоставляют возможность макросов для фрагментов, позволяя создавать прототипы функций и структуры управления переменными на основе стандартного шаблона.
Некоторые программные приложения, такие как Eclipse , NetBeans и Microsoft Visual Studio ( внутри используются фрагменты, вдохновленные TextMate ), а также другие IDE включают встроенные части структуры для упрощения кодирования.
Другие приложения, такие как Macromedia Dreamweaver, также используют эти фрагменты кода для веб-разработки .
JIT - компиляторы могут «объединять» предварительно скомпилированные разделы кода в более длинные сегменты объектного / машинного кода . Это значительно сокращает время интерпретации и одновременно ускоряет выполнение.
Фрагменты можно использовать внутри интерфейсов командной строки, таких как bash, zsh ( GNU Linux /Unix-like) или powershell ( MS Windows ). Такие функции, как завершение и замена заполнителей, могут поддерживаться, а могут и не поддерживаться.
Рассмотрим процесс замены значений двух переменных x и y. Предполагая слабую типизацию и не обращая внимания на конфликт имен, это представлено кодом:
температура = хх = уу = температура
При вставке фрагмента программисту предлагается ввести значения двух параметров. Если предположить, что это type foo
и bar
, которые являются фактическими именами переменных, которые они хотят поменять местами, это даст код:
температура = Фуфу = барбар = температура
Если впоследствии фрагмент будет изменен, скажем, для использования __temp
вместо temp
, это не изменит уже вставленный код, но будет использоваться при последующих вставках фрагмента.
Фрагмент этого может быть представлен как:
температура = 1 доллар США1 доллар = 2 доллара$2 = температура
В дополнение к базовым возможностям управления, описанным ранее, функции управления фрагментами можно классифицировать по объему взаимодействия между фрагментами и текстовым редактором или приложением, в котором они размещены.
Эти группы функций фрагментов включают в себя:
Тип поддержки сценариев различается, но может включать в себя такие функции, как запуск команд оболочки , предоставление диалогового окна графического интерфейса или другие методы взаимодействия пользователя с операционной системой; другие приложения; или другие подкомпоненты самого хостингового приложения.
Заполнители — это элементы внутри фрагмента, которые должны быть предоставлены пользователем или другим внешним процессом. Значения заполнителей не определяются до тех пор, пока текст фрагмента не будет вставлен во время сеанса редактирования.
Заполнители могут иметь специальный синтаксис разметки , который позволяет редактору определять границы заполнителей относительно другого текста в текущем буфере редактирования.
Другие приложения используют графические пользовательские интерфейсы и модальные диалоговые окна , которые позволяют пользователю вводить одно или несколько значений для заполнителей.
Заполнители обычно обозначаются каким-либо специальным символом или последовательностью символов, чтобы отличить их от остального текста фрагмента. Некоторые системы позволяют называть заполнители фрагментов именованными идентификаторами . Идентификаторы могут быть полезны для поддержки таких функций, как дублирование или преобразование заполнителей.
В следующем примере используются идентификаторы first_name
, last_name
и item
:
Здравствуйте , {% first_name %} {% Last_name %} , Ваша партия {% item %} теперь готова к выдаче.Спасибо {% first_name %} !
Пример фрагмента синтаксиса TexMate :
Здравствуйте, ${ 1 : first_name } ${ 2 : Last_name } , Ваш груз стоимостью $ { 3 : item } готов к выдаче . _ Спасибо ${ 4 : first_name } !
Это позволяет пользователю указать, что значение, указанное для одного заполнителя, должно быть реплицировано в нескольких местах относительно всего текста программируемого фрагмента. В предыдущем примере именованный заполнитель first_name
является примером такого использования.
Это позволяет пользователю указать, что одно или несколько значений, предоставленных для заполнителя, должны быть реплицированы и преобразованы в других местах текста программируемого фрагмента. Например, пользователь может указать заголовок документа в одной части фрагмента и указать, что заголовок документа должен повторяться в других местах, причем первый экземпляр должен быть написан заглавными буквами, а все остальные — строчными.
Для приложений, поддерживающих фрагменты сценариев , диапазон поддерживаемых функций программирования различается. Ниже перечислены некоторые функции, которые обычно реализуются для программируемых фрагментов.
Хотя простой текст является фундаментальной функцией даже тех приложений, которые поддерживают только непрограммируемые «статические» фрагменты, программируемые фрагменты также используются для работы с простым текстом.
Однако одна из распространенных сложностей заключается в том, что в средах, поддерживающих программируемые фрагменты, часто приходится проводить различие между тем, что считается «простым текстом», и тем, что считается «инструкциями по программированию». Еще больше усложняет это различие тот факт, что приложения, поддерживающие программируемые фрагменты, почти всегда включают поддержку распознавания нескольких языков программирования либо посредством базовой подсветки синтаксиса , либо посредством выполнения встроенных команд.
По этим и другим причинам выдача простого текста из программируемых фрагментов почти всегда требует осторожности, чтобы избежать проблем с синтаксисом и коллизиями разделителей .
Программируемые фрагменты часто включают в себя возможность устанавливать привязку к существующей области видимости или пространству имен переменных , из которой пользователь может выбирать любые константы или переменные. Они могут включать такие значения, как адрес электронной почты пользователя, вошедшего в систему на данном компьютере, текущее системное время и дата или выходное значение функции.
Скриптовые фрагменты часто связаны с одним или несколькими активными в данный момент файлами. Следовательно, переменные могут также включать переменные среды и аргументы, которые определяют имя файла, позицию курсора и родительский каталог, а также другую статистику, относящуюся к файлам в текущем сеансе редактирования.
Скриптовые фрагменты могут позволять выполнение кода на одном или нескольких языках программирования . Это может включать один или несколько отдельных языков или язык, специфичный для приложения, в котором этот язык размещен.
Самая простая альтернатива фрагментам кода — это подпрограммы в библиотеках. Подпрограммы можно включать в библиотеку программного обеспечения многократного использования и использовать в нескольких проектах программирования.
Шаблоны проектирования в объектно-ориентированном программировании и функциональном программировании — это методы, которые могут позволить программистам избежать или сократить практику многократного вставки фрагментов кода в разные части кода с небольшими изменениями каждый раз. В языках семейства C для этой цели иногда используются препроцессоры .
Однако недостатком этого подхода является то, что сложнее запомнить шаблон или документацию.
По состоянию на 2021 год появились некоторые сложные инструменты глубокого обучения , которые могут помочь вывести определенные функции из читаемого человеком текста и создать соответствующие фрагменты исходного кода (например, GitHub Copilot ). [3] [4]
Для каждого экземпляра C&P мы также отметили связь между скопированным фрагментом кода и кодом в другом месте базы кода.