Говоря о языках программирования, каково определение магии? - PullRequest
5 голосов
/ 28 февраля 2009

Слово «магия» часто встречается здесь в таких контекстах, как «язык X просто имеет слишком много магии» или «платформа Y обычно избегает магии». Однако, кажется, что термин довольно плохо определен, что люди знают, когда видят его. Например, считается, что Java содержит очень мало магии, но сборщик мусора многое скрывает от программиста. Если магия просто означает абстракцию, которая скрывает детали, то почему это считается плохой вещью, учитывая, что никто больше не пишет большие программы на языке ассемблера? Если магия означает нечто большее, то что это значит?

Ответы [ 13 ]

10 голосов
/ 28 февраля 2009

«Любая достаточно продвинутая технология неотличима от магии» - Артур Кларк.

На самом деле не совсем так - магия используется для сложных и скрытых, а не продвинутых (хотя, по-видимому, дизайнеры думали, что они продвинуты), таких как системы, которые требуют определенных состояний перед вызовами процедур (модели потоков COM), а также «автоматические преобразование типов (варианты VB, Javascript ==, автобокс Java).

Как только системы скрывают от программиста детали того, что они больше не предсказуемы, они становятся волшебством. Вы застряли с повторением вызова на языке, который вы не понимаете, потому что это имело правильный эффект в прошлом. Это плохая магия или вуду.

Есть и хорошая магия - http://aggregate.org/MAGIC/

8 голосов
/ 28 февраля 2009

Что-то волшебное, пока вы игнорируете это / вы не знаете, как это работает.

4 голосов
/ 28 февраля 2009

Магия очень зависит от вашего понимания.

Я написал довольно много Си и Си ++, прежде чем начал писать на Java. Я должен был распределить и освободить всю мою память. Это было не очень весело, когда у меня начались утечки памяти. Как только я начал писать на Java, я знал (в основном), что происходит за кулисами, чтобы создать все мои экземпляры объектов. Таким образом, для меня это не так много волшебства (я сделал распределение, но как он на самом деле хранит объекты и знает, когда освобождать их, немного более "волшебно" для меня), чем для кого-то, кто начал на Java (которому никогда не приходилось обращаться с памятью вручную.)

Другой пример - ORM. Я развернул свою временную структуру Object Relational Mapping в начале проекта, пока у меня не было времени, чтобы по-настоящему разобраться и изучить Hibernate или что-то подобное. Мне приходилось писать в таких вещах, как картографы ResultSet, Lazy Loading и базовое кэширование Теперь, когда я вернусь и заменю этот материал более зрелыми объектами, отображаемыми в Hibernate или JPA, у меня все еще будет базовое понимание того, что происходит. Если вы никогда не использовали JBDC или что-то подобное, все, что вам нужно знать, это то, что данные передаются из базы данных в объект и обратно.

Каждый имеет дело с определенным уровнем магии в своей карьере. Мы не можем знать все. Магия действительно может быть синонимом абстракции. Когда это становится «слишком волшебным» - это когда Абстракция начинает скрывать вещи, которые вы должны уметь контролировать. Примером на днях было то, что в программе JSF я не знал, как запустить контекст JSF. JSF просто делает это, когда вы впервые переходите на страницу JSF. Мне нужно было начать контекст с обычного сервлета. В итоге мне пришлось создать фиктивную JSF-страницу, чтобы справиться с ней. У меня просто не было времени в этом проекте, чтобы изучить «магию» JSF-управления контекстом.

4 голосов
/ 28 февраля 2009

В Microsoft это обычно используется двумя способами

1) Отрицательным образом (вероятно, наиболее распространенное использование). Например, кто-то может сказать следующее: «Я не понимаю; сначала вы проведете рефакторинг API, затем вы сохраните старый API и создадите слой между ними, который выполняет магию?»

Подразумевается, что магический компонент слишком сложен, слишком неопределен или слишком «что-то».

Другой негативный контекст - когда что-то определено наивно: это часто случается, когда кто-то предполагает, что есть простое решение сложной проблемы, потому что он не понимает, что проблема действительно сложна. Блог Раймонда Чена полон подобных примеров.

2) Реже термин «магия» используется положительно. Но это случается. Полезно ссылаться на вещи, которые выполняют сложные задачи, которые просто работают. Для меня NTFS это такая магия. NTFS действительно, действительно зрелый и скрывает много сложности за некоторыми довольно простыми API. Таким образом, компилятор можно рассматривать как «магический» - вы действительно глубоко понимаете, как работает компилятор C ++? Я не ... я просто верю, что они делают.

3 голосов
/ 28 февраля 2009
Например,

Ruby on Rails - это Магия.

На базовом уровне, особенно при наивном подходе, существует большой толстый слой между вашим минималистским кодом и базой данных, а затем Magic Happens, и вы получаете грубую функциональность и все остальное.

Некоторые люди могут жить с этим очень высоким уровнем опыта, но в конце концов вы начнете сталкиваться с барьерами, где вам нужно будет понять «секрет» «уловки», чтобы вы могли лучше манипулировать им до самого конца.

Сами языки не имеют много магии (ну, может быть, Пролог - это ядро ​​несколько магическое), но современные фреймворки и промежуточное ПО могут быть переполнены этим.

Честно говоря, каждый раз, когда вы сталкиваетесь с системой или компонентом, который делает "что-то удивительное", и вы удивляетесь, "как они это делают", это волшебство.

3 голосов
/ 28 февраля 2009

Магия имеет то же значение, что и в другом контексте: что-то со скрытой сложностью и логикой. Это не всегда плохо, но для программистов (которые являются волшебниками для неопытных людей) это так. Магия не магия, когда вы (можете) знать, как она работает, как она выглядит.

Например, магические константы: константы со скрытым значением.

Когда мы говорим о «черной магии», возникающей в каком-то запутанном коде, мы подразумеваем, что в этом коде происходит что-то, чего мы не понимаем; или что-то не написано, но скрыто от читателя кода.

В некоторых случаях вы говорите о магии положительно: когда вы не видите реальной сложности простого понимания того, как использовать вещь. Например, некоторый действительно сложный код может быть скрыт в крошечном и простом в использовании интерфейсном классе. Это кажется волшебным, потому что это делает сложную вещь с простым использованием. Это хорошая магия (но редко).

2 голосов
/ 28 февраля 2009

Интересное в стороне: термин magic связан с формальными языками программирования, которые являются одной из теоретических основ информатики. В книге Моргана «Программирование из спецификаций» у нас есть определение магии:

w:[true, false]

Это обозначение имеет вид:

w:[P, Q]

и представляет собой программу, которая при выполнении в состоянии, в котором P имеет значение true, завершается в состоянии, в котором Q имеет значение true, при этом изменяются только переменные в w.

В этом контексте «магия» - это неизлечимая программа, которая может перевести программу из любого состояния (поскольку true всегда true) в невозможное (поскольку false никогда не может быть true).

Гораздо более простая программа:

w:[true, true]

- программа, которая всегда завершается, но не гарантирует какого-либо конкретного результата. Это может быть реализовано с помощью простого skip.

Очевидно, что этим техническим определением злоупотребляют, когда люди говорят о magic программах, так как это должно означать, что программа недостижима. Тем не менее, термин остается разговорным, так как приятно представить, что что-то волшебное происходит за кулисами, когда мы не знаем или не понимаем, как что-то работает.

1 голос
/ 24 февраля 2010

Классическая волшебная история из приложения на жаргоне.

http://catb.org/jargon/html/magic-story.html

иди почитай.

1 голос
/ 28 февраля 2009

Вы называете что-то «волшебным», когда не понимаете этого.

Люди были обожжены в средние века, когда они делали / знали / говорили что-то, чего остальные люди не могли понять. Их обвиняли в создании "магии".

Вы называете код / ​​рамки / язык "волшебством", когда не понимаете, что он делает. Проще назвать что-то «волшебным», чем тратить время на то, чтобы понять это.

Магия не существует!

Вместо того, чтобы называть что-то "волшебным", запачкайте руки и поймите, что делает эта вещь ... Или назовите это "неисследованной частью (вашего) знания".

0 голосов
/ 01 марта 2009

Для некоторых хороших примеров черной магии посмотрите документацию в исходном коде Perl; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...