Яку користь має "Smalltalk": ":"?


12

become:Повідомлення в Smalltalk викликає один об'єкт зміни в інший, впливаючи на всі посилання на нього.

Яке використання має ця мовна функція? Чи звикає він до реального коду? Це просто цікавість? Чи вважається хорошою / поганою практикою його використання?

Відповіді:


11

Гілад Брача розповідає про become:якусь тривалість:

Одна з найбільш унікальних та найпотужніших функцій Smalltalk - це також одна з найменш відомих поза межами спільноти Smalltalk. Це маленький метод, який називається стати:.

Що станеться: це поміняти місцями ідентичності свого приймача та його аргумент. Тобто після

a стати: b

всі посилання на об'єкт, позначений a перед точкою виклику, відносяться до об'єкта, який позначався b, і навпаки.

Знайдіть хвилину, щоб це зрозуміти; ви можете неправильно зрозуміти це як щось тривіальне. Йдеться не про заміну двох змінних - це буквально про те, що один об'єкт стає іншим. Мені не відома жодна інша мова, яка має цю особливість. Це особливість величезної сили - і небезпеки.

Розгляньте завдання розширити свою мову для підтримки стійких об'єктів. Скажімо, ви хочете завантажити об'єкт з диска, але не бажаєте транзитивно завантажувати всі об'єкти, на які він посилається (інакше це просто деаріалізація об'єкта). Таким чином, ви завантажуєте сам об'єкт, але замість того, щоб завантажувати його прямі посилання, ви замінюєте їх на об’єкти лушпиння.

Лушпиння виступає за реальні дані про вторинне зберігання. Ці дані завантажені ліниво. Коли ви дійсно потрібно викликати метод на лушпиння, його doesNotUnderstand: метод завантажує відповідний об'єкт даних з диска (але знову ж таки, не транзитивно).

Потім, це стає:, замінюючи всі посилання на лушпиння посиланнями на щойно завантажений об'єкт, і повторює виклик.

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

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

Звичайно, ви не повинні використовувати стають: випадково. Він коштує, що може бути непосильним у багатьох реалізаціях. На початку Smalltalks став: дешево, тому що всі об'єкти посилалися опосередковано за допомогою таблиці об'єктів. У разі відсутності таблиці об’єктів, станьте: переміщайте купу таким чином, як сміттєзбірник. Чим більше пам’яті у вас, тим дорожчим стає: стає.

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

Стати: має декілька варіацій - один із способів стає: змінює ідентичність об'єкта A на інший об'єкта B, так що посилання на точку A зараз на B; посилання на Б залишаються незмінними. Це часто корисно робити: масово - перенесення ідентифікацій усіх об'єктів у масиві (або однонаправлене, або двонаправлене). Група стає: те, що робить це магією атомічно, відмінно підходить для впровадження рефлексивних оновлень у систему, наприклад. Ви можете змінити цілий набір класів та їх екземпляри за один раз.

Ви навіть можете уявити собі безпечний тип:. Двосторонній стає: безпечний лише для типу, якщо тип A ідентичний типу B, але стає одним із способів: вимагає лише, щоб новий об'єкт був підтипом старого.

Можливо, час переглядати, чи є об’єктна таблиця насправді хорошою справою.

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


Мене б більше хвилювало becomeвплив на мій розум, ніж на виконання моєї програми ...
Бенджамін Ходжсон

Hardware support could ease the performance penalty.З усіх місць, про які я чув, громада Smalltalk була найвизначнішою. Чому ми повинні "витрачати" апаратні вдосконалення на створення ідеалістичних парадигм програмування, коли це може призвести до підвищення продуктивності, зниження енерговитрат або збільшення можливостей.
Олександр - Відновіть Моніку

2

Його не використовують багато. У зображенні Pharo 5, яке я відкрив, є 9 відправників #become :, 7 з яких проходять одиничні тести. Він використовується в компіляторі при генерації коду та в бібліотеці серіалізації Fuel для заміни проксі-серверів за їх вмістом.


Цікаво. Для чого використовують одиничні тести?
dpk

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