Плюсы / минусы молчаливого программирования в J
Будучи новичком в J I, я часто сталкиваюсь с неявными программами, которые кажутся довольно византийскими по сравнению с более знакомой явной формой.
Теперь, просто потому, что я нахожу интерпретацию трудной, не означает, что молчаливая форма неправильна или неправильна. Очень часто молчаливая форма значительно короче, чем явная форма, и, таким образом, ее легче визуально увидеть сразу.
Вопрос к экспертам: передают ли эти молчаливые формы лучшее чувство структуры и, возможно, отфильтровывают ли основные вычислительные механизмы? Есть ли другие преимущества?
Я надеюсь, что ответ - да, и правда для некоторых нетривиальных примеров...
2 ответа
Молчаливое программирование, как правило, быстрее и эффективнее, потому что вы можете точно сказать J, что вы хотите сделать, вместо того, чтобы заставить его выяснить, как оно идет по вашему предложению. Но как кто-то, кто любит чертовское программирование, я также могу сказать, что молчаливое программирование побуждает вас думать о вещах по-J.
Чтобы испортить окончание и ответить на ваш вопрос: да, молчаливое программирование может и действительно передавать информацию о структуре. Технически, он подчеркивает значение превыше всего, но многие из операторов, которые выделяются заметно в менее тривиальных выражениях, с которыми вы столкнетесь (@: & &. ^:
чтобы назвать несколько) имеют очень связанные со структурой значения.
Канонический пример того, почему стоит писать молчаливый код, - это специальный код для модульного возведения в степень, а также уверенность в том, что есть еще много подобных ярлыков:
ts =: 6!:2, 7!:2@] NB. time and space
100 ts '2 (1e6&| @ ^) 8888x'
2.3356e_5 16640
100 ts '1e6 | 2 ^ 8888x'
0.00787232 8.496e6
Другая важная вещь, которую вы услышите, это то, что когда J видит явное определение, он должен анализировать и оценивать его каждый раз, когда применяет его:
NB. use rank 0 to apply the verb a large number of times
100 ts 'i (4 : ''x + y + x * y'')"0 i=.i.100 100' NB. naive
0.0136254 404096
100 ts 'i (+ + *)"0 i=.i.100 100' NB. tacit
0.00271868 265728
NB. J is spending the time difference reinterpreting the definition each time
100 ts 'i (4 : ''x (+ + *) y'')"0 i=.i.100 100'
0.0136336 273024
Но обе эти причины отходят от идеи, что у J очень четкий стиль решения проблем. Нет если есть ^:
, Там нет зацикливания, есть ранг. Точно так же Кен видел красоту в том, что в исчислении f+g была поточечной суммой функций - действительно, f+g определяется как функция, где (f+g)(x) = f(x) + g(х) - и поскольку J уже был настолько хорош в точечном добавлении массива, зачем останавливаться на этом?
Подобно тому, как язык наподобие Хаскелла, получает удовольствие от объединения функций более высокого порядка вместо "ручной" их полной синхронизации, так и Дж. Семантически взглянем на следующие примеры:
h =: 3 : '(f y) + g y'
-h
это функция, которая захватывает свой аргументy
вставляет его вf
а такжеg
и объединяет результаты в сумму.h =: f + g
-h
сумма функцийf
а такжеg
,(A < B) +. (A = B)
- "А меньше, чем В, или А равно В."A (< +. =) B
- "А меньше или равно В."
Это намного более алгебраично. И до сих пор я говорил только о поездах; о полезности таких инструментов, как ^:
или же &.
, Урок довольно ясен: J хочет, чтобы о ваших функциях было легко говорить алгебраически. Если бы вам пришлось обернуть все свои действия в 3 :''
или же 4 :''
Или, что еще хуже, назовите их в отдельной строке! - каждый раз, когда вы хотели применить их интересно (например, через /
или же ^:
или же ;.
) вы, вероятно, были бы очень отключены от J.
Конечно, я признаю, что вам будет нелегко найти примеры столь же изящные, как эти, поскольку ваши выражения становятся более сложными. К молчаливому стилю нужно привыкнуть. Вокаб должен быть знаком (если не второй натурой) с вами, и даже тогда иногда вам доставляет удовольствие пробираться по коду, который просто непростителен. Это может случиться с любым языком.
Не эксперт, но для меня самые большие положительные аспекты кодирования в молчаливом заключаются в том, что 1) это немного облегчает написание программ, которые пишут программы, и 2) мне немного легче понять J-подход к решению проблем (что является большой частью того, почему нравится программировать с J). Явное больше похоже на процедурное программирование, особенно если я использую контрольные слова, такие как if.
, while.
или же select.
,
Сложности заключаются в том, что 1) явный код иногда выполняется быстрее, чем молчаливый, но это зависит от задачи и алгоритма, и 2) молчаливый код интерпретируется при его разборе, и это означает, что бывают случаи, когда явный код чище, потому что вы можете оставьте код в ожидании значений переменных, которые определены только во время выполнения.