Що розуміється під терміном "гак" у програмуванні?


248

Нещодавно я чув термін «гачок», розмовляючи з деякими людьми про програму, яку я писав. Я не впевнений, що саме означає цей термін, хоча з розмови я зробив висновок, що гачок - це тип функції. Я шукав визначення, але не зміг знайти гарної відповіді. Хтось міг би дати мені уявлення про те, що цей термін взагалі означає і, можливо, невеликий приклад для ілюстрації цього визначення?


3
Дивіться Hooking @ Wikipedia . Посилання поховано в одній з нижчих голосів відповідей.
Палець

Відповіді:


143

По суті, це місце в коді, яке дозволяє вам підключитися до модуля, щоб забезпечити іншу поведінку або реагувати, коли щось відбувається.


7
Це подібне до зворотного дзвінка?
Кріс

19
Гачки часто (але не завжди) використовують функції зворотного дзвінка. Наприклад, ви можете підключити систему подій за допомогою "kukeEvent (Events.STARTUP, myCallbackFunction)". Ви передаєте покажчик функції на функцію hokeEvent, тож він знає, яку функцію викликати, коли відбувається подія. Сподіваюся, що це допомагає :-)
Вільям Брендель

6
точно. Зворотний виклик - це "тип" гака.
Міхей

21
гм ... ні. Зворотний виклик - це зворотний дзвінок і не має нічого спільного з гачками, зворотні виклики просто використовуються для ВИКОНАННЯ методів гачка. Відкликання викликів - покажчики (RELJMP) на функції / методи / процедури (CALL), гачки - це модифікація запущених додатків.
спеціаліз

1
@SahilBabbar Ні. Перерва спричиняє виконання інструкцій у визначеному місці (переривання). Можливо, ви зможете підключитися до процесу обробки перерв, хоча, наприклад, змінивши таблицю, в якій перераховані місця обробників переривань, щоб ваш код спочатку викликався при перериванні (а потім ваш код викликав би раніше наявний код обробки переривань, в ромашковий ланцюжок)
Девід Тонхофер

77

Гак - це функціональність, що надається користувачем цього програмного забезпечення для власного коду за певних обставин. Цей код може збільшити або замінити поточний код.

У старі часи, коли комп’ютери були справді особистими, а віруси були менш поширеними (я говорю 80-ті), це було так само просто, як виправлення самого програмного забезпечення операційної системи, щоб зателефонувати на ваш код. Я пам’ятаю, як писав розширення на мову Applesoft BASIC на Apple II, яке просто підключило мій код до інтерпретатора BASIC, ввівши дзвінок до мого коду до того, як будь-яка з рядків була оброблена.

Деякі комп'ютери мали заздалегідь розроблені гачки, одним із прикладів є потік вводу-виводу в Apple II. Він використовував такий гачок, щоб ввести всю підсистему диска (ПЗУ Apple II були спочатку побудовані в ті часи, коли касети були основним носієм для зберігання ПК). Ви керували дисками, надрукувавши ASCII код 4 ( CTRL-D), за яким послідувала команда, яку ви хотіли виконати потім a CR, і її перехопила дискова підсистема, яка підключилася до програм друку Apple ROM.

Так, наприклад, рядки:

PRINT CHR(4);"CATALOG"
PRINT CHR(4);"IN#6"

перерахував би вміст диска, а потім повторно ініціалізував машину. Це дозволило отримати такі хитрощі, як захист ваших програм BASIC, встановивши перший рядок як:

123 REM XIN#6

потім використовуючи POKEдля вставки CTRL-Dсимволу там, де Xбув. Потім кожен, хто намагається скласти список вашого джерела, надішле послідовність повторної ініціалізації через вихідні процедури, де дискова підсистема виявить це.

Це часто таку хитрість, до якої нам довелося вдатися, щоб отримати таку поведінку.

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

Вони довгий час існували . Мейнфрейми мали їх (звані виходами), і багато програмного забезпечення мейнфреймів використовують ці засоби навіть зараз. Наприклад, безкоштовна система управління вихідним кодом, яка постачається з z / OS (називається SCLM), дозволяє повністю замінити підсистему безпеки, просто помістивши власний код у вихід.


41

У загальному сенсі "гачок" - це те, що дозволить вам, програмісту переглядати та / або взаємодіяти з / та змінювати щось, що вже відбувається в системі / програмі.

Наприклад, CMS Drupal надає розробникам гачки, які дозволяють їм вживати додаткових дій після створення «контентного вузла». Якщо розробник не реалізує гачок, вузол створюється нормально. Якщо розробник реалізує гачок, вони можуть мати якийсь додатковий код, коли він буде створений. Цей код може робити все, включаючи відкат та / або зміну оригінальної дії. Це також може зробити щось незв'язане зі створенням вузла.

Зворотний виклик можна розглядати як певний вид гачка. Реалізуючи функцію зворотного виклику в систему, ця система дозволяє вам зателефонувати за додатковим кодом після завершення дії. Однак підключення (як загальний термін) не обмежується зворотними дзвінками.

Ще один приклад. Іноді веб-розробники називають назви класів та / або ідентифікатори на елементах як гачки. Це тому, що розміщуючи ідентифікатор / ім'я класу на елементі, вони можуть потім використовувати Javascript для зміни цього елемента або "причеплення" до документа сторінки. (це розтягує значення, але воно зазвичай використовується і варто згадати)


Що ви маєте на увазі під "підключенням до сторінки документа"? Чи можете ви навести приклад? Я зрозумів перший приклад - надання елемента html ідентифікатору, щоб ви могли використовувати javacript для зміни елемента.
відданий

21

Просте сказане:

Гак - це засіб виконання спеціального коду (функції) або до, після, або замість наявного коду. Наприклад, може бути записана функція, щоб "підключити" процес входу, щоб виконати функцію Captcha, перш ніж продовжувати нормальний процес входу.


Найкраща відповідь imo
Даніель

15

Гак в програмуванні - це техніка, що використовує так звані гачки, щоб зробити ланцюжок процедур як обробник подій.


15

Гачки - це категорія функцій, яка дозволяє базовому коду викликати код розширення. Це може бути корисно в ситуаціях, коли розробник ядра хоче запропонувати розширюваність, не піддаючи їх коду.

Одне використання гачків полягає у розробці мод для відеоігор. Гра може не дозволити розробникам мод розширити базову функціональність, але гачки можуть бути додані розробниками основних модних бібліотек. За допомогою цих гаків незалежні розробники можуть мати власний код, викликаний будь-якою бажаною подією, як-от завантаження гри, оновлення інвентаря, взаємодія між особами тощо.

Поширений метод реалізації полягає в наданні функції порожнього списку зворотних викликів, а потім викрити можливість розширення списку зворотних викликів. Базовий код завжди буде викликати функцію в один і той же час і в належний час, але при порожньому списку зворотних викликів функція нічого не робить. Це за дизайном.

Отже, третя сторона має можливість написати додатковий код і додати свій новий зворотний дзвінок до списку зворотних дзвінків гачка. Маючи не що інше, як посилання на доступні гачки, вони мають розширену функціональність з мінімальним ризиком для базової системи.

Гачки не дозволяють розробникам робити щось, що неможливо зробити з іншими структурами та інтерфейсами. Вони є вибором, який слід зробити з урахуванням завдання та користувачів (сторонні розробники).

Для уточнення: гачок дозволяє розширювати та може бути реалізований за допомогою зворотного зв'язку. Відкликання викликів, як правило, не що інше, як покажчик функції; обчислена адреса функції. В інших відповідях / коментарях з'являється плутанина.


4

Гак позначає місце в коді, де ви відправляєте подію певного типу, і якщо ця подія була зареєстрована раніше за допомогою належної функції передзвонити, то вона буде оброблятися цією зареєстрованою функцією, інакше нічого не відбувається.


2

гачки можуть бути виконані, коли виникає деяка умова. наприклад, деякі зміни змінної або якась дія викликається або відбувається якась подія. гачки можуть входити в процес і змінювати речі або реагувати на зміни.


1

Часто підключення стосується підключення повідомлень Win32 або еквівалентів Linux / OSX, але більш загальним чином підключення є просто повідомлення іншого об’єкта / вікна / програми / тощо, про який ви хочете отримувати сповіщення, коли відбувається певна дія. Наприклад: Якщо всі вікна в системі сповістять вас про їхнє закриття.

Як правило, підключення є дещо небезпечним, оскільки робити це, не розуміючи, як це впливає на систему, може призвести до нестабільності або до дуже несподіваної поведінки. Це також може бути ДУЖЕ корисним за певних обставин, подумав. Наприклад: FRAPS використовує його для визначення, на яких вікнах має відображатися лічильник FPS.


1

Ланцюжок гачків - це набір функцій, в яких кожна функція викликає наступну. Що стосується ланцюга гаків, це те, що програміст може додати ще одну функцію до ланцюжка під час виконання. Один із способів зробити це - шукати відоме місце, де зберігається адреса першої функції в ланцюзі. Потім ви зберігаєте значення цього вказівника функції та перезаписуєте це значення за початковою адресою адресою функції, яку ви хочете вставити у ланцюг гака. Потім функція викликається, займається своїм бізнесом і викликає наступну функцію в ланцюжку (якщо ви не вирішите інше). Звичайно, існує ряд інших способів створення ланцюга гачків, від запису безпосередньо до пам'яті до використання засобів метапрограмування таких мов, як Ruby або Python.

Прикладом ланцюга гачків є спосіб, яким програма MS Windows обробляє повідомлення. Кожна функція ланцюга обробки або обробляє повідомлення, або надсилає його до наступної функції ланцюга.


1

У системі управління вмістом Drupal "гачок" має відносно конкретне значення. Коли відбувається внутрішня подія (наприклад, створення вмісту або вхід користувача, наприклад, модулі можуть реагувати на подію, реалізуючи спеціальну функцію "гачок"). Це робиться за допомогою конвенції про іменування - [your-plugin-name] _user_login (), наприклад, для події Вхід користувача.

Через цю конвенцію основні події називаються "гачками" і з'являються з такими іменами, як "kuk_user_login" та "kuk_user_authenticate ()" в документації API Drupal.


З цього випливає ідея, згадана вище , про "зворотний дзвінок", щоб реагувати, коли щось відбувається ". У цьому випадку зворотний виклик не реєструється явно, а базується на "магічному іменуванні". Про це зараз йде мова на drupal.org, див. Використання Symfony EventDispatcher для гачок подій
donquixote

Для узагальнення гак / зворотний виклик / слухач може бути "відомий коду виклику" різними способами (не кажучи про те, що це завершено): 1. магічні іменовані функції 2. магічні іменовані класи 3. явно зареєстровані функції 4. явно зареєстровані функції зареєстровані об'єкти (слухачі, підписники, спостерігачі) 5. явно зареєстровані імена класів (+ необов'язкові конструкторські аргументи), які потрібно інстанціювати перед тим, як зачепить гак. 6. змінивши код виклику
donquixote

1

В ДУЖЕ коротко, ви можете змінити код виклику API, наприклад, у тому, MessageBoxде він виконує іншу функцію, відредаговану вами (глобально працюватиме система широко, локально буде працювати процес широко).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.