Фрагмент — это термин программирования, обозначающий небольшую область повторно используемого исходного кода , машинного кода или текста. Обычно это формально определенные оперативные единицы для включения в более крупные программные модули . Управление фрагментами — это функция некоторых текстовых редакторов , редакторов исходного кода программ , IDE и соответствующего программного обеспечения . Оно позволяет пользователю избегать повторного набора текста в ходе рутинных операций редактирования. [1]
В практике программирования «фрагмент» узко относится к части исходного кода, которая буквально включается программой-редактором в файл, и является формой копирования и вставки программирования . [2] Это конкретное включение контрастирует с методами абстракции, такими как функции или макросы , которые являются абстракцией внутри языка. Таким образом, фрагменты в основном используются, когда эти абстракции недоступны или нежелательны, например, в языках, в которых отсутствует абстракция, или для ясности и отсутствия накладных расходов.
Фрагменты похожи на статическую предварительную обработку, включенную в редактор, и не требуют поддержки компилятора. С другой стороны, это означает, что фрагменты не могут быть неизменно изменены постфактум, и, таким образом, уязвимы для всех проблем программирования копирования и вставки. По этой причине фрагменты в основном используются для простых разделов кода (с небольшой логикой) или для шаблонов, таких как уведомления об авторских правах, прототипы функций, общие структуры управления или импорт стандартной библиотеки.
Управление фрагментами — это функция текстового редактора, популярная среди разработчиков программного обеспечения или других лиц, которым регулярно требуется контент из каталога многократно вводимого текста (например, исходного кода или шаблона ). Часто эта функция оправдана, поскольку контент меняется незначительно (или не меняется вообще) каждый раз, когда он вводится.
Текстовые редакторы, включающие эту функцию, обычно предоставляют механизм для управления каталогом и разделяют «фрагменты» таким же образом, как текстовый редактор и операционная система позволяют управлять отдельными файлами. Эти основные возможности управления включают такие операции, как просмотр, добавление, редактирование, удаление, сортировка, фильтрация, группировка, переименование и сохранение фрагментов в репозитории , каталоге или базе данных . Некоторые редакторы предоставляют возможность макросов для фрагментов, позволяя создавать прототипы функций и структуры управления переменными на основе стандартного шаблона.
Некоторые программные приложения, такие как Eclipse , NetBeans и Visual Studio от Microsoft (использующие фрагменты, вдохновленные TextMate ), а также другие IDE включают встроенные части структуры для упрощения кодирования.
Другие приложения, такие как Macromedia Dreamweaver, также используют эти фрагменты кода для веб-разработки .
Компиляторы Just-in-time ( 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
:
Привет {% имя %} {% фамилия %} , Ваш груз {% item %} теперь готов к отправке.Спасибо {% first_name %} !
Пример фрагмента в синтаксисе TexMate :
Привет ${ 1 : имя } ${ 2 : фамилия } , Ваш груз стоимостью $ { 3 : item } теперь готов к отправке . Спасибо ${ 4 : first_name } !
Это позволяет пользователю указать, что значение, указанное для одного заполнителя, должно быть воспроизведено в нескольких местах относительно всего текста программируемого фрагмента. В предыдущем примере именованный заполнитель first_name
является примером такого использования.
Это позволяет пользователю указать, что одно или несколько значений, предоставленных для заполнителя, должны быть воспроизведены и преобразованы в других местах в тексте программируемого фрагмента. Например, пользователь может предоставить заголовок документа в одной части фрагмента и указать, что заголовок документа должен быть повторен в других местах, причем первый экземпляр будет полностью заглавными буквами, а все остальные — строчными.
Для приложений, поддерживающих скриптовые фрагменты, диапазон поддерживаемых функций программирования варьируется. Ниже перечислены некоторые функции, которые обычно реализуются для программируемых фрагментов.
Хотя простой текст является основополагающей функцией, включенной даже в приложения, поддерживающие только непрограммируемые «статичные» фрагменты, программируемые фрагменты также используются для работы с простым текстом.
Однако одной из распространенных сложностей является то, что среды, поддерживающие программируемые фрагменты, часто должны проводить различие между тем, что считается «простым текстом», и тем, что считается «программными инструкциями». Еще больше усложняет это различие тот факт, что приложения, поддерживающие программируемые фрагменты, почти всегда включают поддержку распознавания нескольких языков программирования, либо посредством базовой подсветки синтаксиса , либо посредством выполнения встроенных команд.
По этим и другим причинам при выводе простого текста из программируемых фрагментов почти всегда необходимо проявлять осторожность, чтобы избежать проблем с синтаксисом и коллизиями разделителей .
Программируемые фрагменты часто включают возможность установить привязку к существующей области действия переменных или пространству имен, из которых пользователь может выбрать любую из различных констант или переменных. Они могут включать такие значения, как адрес электронной почты текущего вошедшего в систему пользователя на данной машине, текущее системное время и дату или выходное значение функции.
Скриптовые фрагменты часто связаны с одним или несколькими активными в данный момент файлами. Следовательно, переменные могут также включать переменные окружения и аргументы, которые указывают имя файла, позицию курсора и родительский каталог среди других статистических данных, относящихся к файлам в текущем сеансе редактирования.
Скриптовые фрагменты могут позволять выполнение кода на одном или нескольких языках программирования . Это может включать один или несколько автономных языков или язык, специфичный для приложения, в котором размещен язык.
Самая простая альтернатива фрагментам кода — это подпрограммы в библиотеках. Подпрограммы могут быть включены в повторно используемую библиотеку программного обеспечения и совместно использоваться несколькими проектами программирования.
Шаблоны проектирования в объектно-ориентированном программировании и функциональном программировании — это методы, которые позволяют программистам избегать или сокращать практику многократной вставки фрагментов в различные части кода с небольшими изменениями каждый раз. В языках семейства C для этой цели иногда используются препроцессоры .
Однако недостатком этого подхода является то, что сложнее запомнить шаблон или документацию.
В 2021 году появились некоторые сложные инструменты глубокого обучения , которые могут помочь вывести определенную функциональность из текста, читаемого человеком, и сгенерировать соответствующие фрагменты исходного кода (например, GitHub Copilot ). [3] [4]
каждого экземпляра C&P мы также отметили связь между скопированным фрагментом кода и кодом в другом месте кодовой базы.