Плюсы / минусы молчаливого программирования в 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) молчаливый код интерпретируется при его разборе, и это означает, что бывают случаи, когда явный код чище, потому что вы можете оставьте код в ожидании значений переменных, которые определены только во время выполнения.

Другие вопросы по тегам