Кто-нибудь порекомендует изучать J/K/APL?
Я столкнулся с J/K/APL несколько месяцев назад, работая над некоторыми проблемами проекта Эйлера, и был заинтригован, если не сказать больше. Для каждого элегантного 20-строчного Python-решения, которое я создал, было бы потрясающее 20- символьное решение J, которое выполнялось бы в десятой части времени. Я стремился выучить некоторый базовый J, и сделал несколько попыток подобрать словарный запас, но обнаружил, что кривая обучения довольно крутая.
Тем, кто знаком с этими языками, вы бы порекомендовали потратить некоторое время на его изучение (я думаю, J в частности)? Я бы сделал это больше для удовлетворения своего любопытства, чем для карьерного роста или чего-то подобного.
Некоторые личные обстоятельства, которые следует учитывать, если вы хотите:
- Я люблю математику и ежедневно использую ее в своей работе (как математик для стартапа), но, честно говоря, я не чувствую себя ограниченным теми инструментами, которые использую (например, python + NumPy), поэтому я не могу использовать это оправдание,
- У меня нет особого желания работать в финансовой индустрии, которая, по крайней мере, является основным портом захода для пользователей K. Кроме того, я действительно должен изучать C# как следующий язык, так как это основной язык, на котором я работаю. Таким образом, практически, J почти наверняка не должен быть следующим языком, который я изучаю.
- Я достаточно знаком с MATLAB, поэтому использование языка программирования на основе массива не будет представлять собой огромный сдвиг парадигмы.
Любой совет от тех, кто знаком с этими языками, будет принята с благодарностью.
10 ответов
Тысячи лет назад я был программистом APL. Под тысячами я имею в виду еще в 70-х годах, когда пользовательский набор символов означал, что у нас были специальные печатные терминалы с клавиатурой и набором символов APL, а также выборочные шарики IBM со специальными символами и т.д.
Я пошел на лекцию Кена Айверсона "Почему APL был крутым".
Его тезис был этим. Давным-давно разделение было серьезным математическим начинанием, предназначенным для аспирантов. Для обозначения таких вещей, как повторение десятичных разложений, использовалась большая куча математической символики. Когда-то даже что-то вроде "отрицательного" числа требовалось тщательно продуманная запись.
За прошедшие годы - когда мы стали лучше понимать эти абстракции - мы придумали гораздо более компактную запись сложных концепций.
Смысл APL (и J и K) состоит в том, чтобы суммировать большие алгоритмы в аккуратные обозначения.
В настоящее время я программист на Python. Я обнаружил, что мое раннее воздействие APL исказило мой мозг, заставив меня спросить "что это значит?" и "это многоразовая операция?" и "что такое содержательное резюме для всего этого алгоритмического пуха?"
Кроме того, когда я занимаюсь проблемами Project Euler, "функциональное программирование" Python, подкрепленное моими "пропитанными джином воспоминаниями об APL", очень помогает в выполнении упражнений.
J - мой основной язык программирования для Project Euler и для личного использования на работе. Я никогда не сталкивался с лучшим языком для обработки массивов, и парадигма неявного программирования полезна и заставляет задуматься, как только вы освоите ее. (Полезно, потому что на самом деле это заставляет задуматься.) Достичь начального уровня владения языком сложно, а чтение чужого кода - это интеллектуально дисциплинированное занятие, но настойчивость приносит большие плоды из-за мощи, гибкости и лаконичности языка.
Тем не менее, причина, по которой я резервирую его для личного использования на работе, заключается в том, что (1) никто на работе не использует его, (2) кривая обучения достаточно крутая, поэтому я не могу просить своих коллег подобрать ее. и (3) тот факт, что вы можете создавать сложные программы в одной строке кода, затрудняет чтение строки кода, особенно если вы сами не писали ее. (Я ожидаю потратить как минимум полчаса на изучение строки кода, в которой используются десять или более операторов, если только они не были использованы таким образом, что я полностью понимаю основополагающие принципы.)
Некоторые примеры забавных функций J:
1) Любая функция, определенная для работы с одним числом, может быть выполнена для работы с массивами произвольного ранга. Например:
NB. totient(n) = n * \prod_{p|n} (1 - 1/p)
totient=: * -.@%@~.&.q:
NB. Finding the totient of 10
totient 10
NB. Finding the totient of all numbers from 1 to 10
totient"0 (1+i.10)
Это точно такая же функция, просто работающая с атомами (одноэлементными компонентами) входного массива 1xN. Точно так же вы можете взять функцию, определенную для работы с массивами второго ранга (матрицами), и применить ее к любому массиву более высокого ранга, просто используя соединение " (rank).
2) Вы можете взять практически любую теоретически обратимую функцию в J и инвертировать ее, "повторив ее в обратном порядке". Например,
NB. Converts an array of binary digits to a decimal number
(#.) 1 0 1
5
NB. Converts a decimal number to an array of binary digits
(#.^:_1) 5
1 0 1
Я работал в J и APL в течение большей части последних 25 лет и могу полностью рекомендовать оба. Я все еще возвращаюсь к одному или другому, когда у меня есть какая-либо форма специального анализа данных, и я также использовал ее в Project Euler.
Если вы заинтересованы в Project Euler, то J, безусловно, является тем, кто выберет. Поддержка целых чисел и простых чисел бесконечной точности делает его очень подходящим.
Я зарабатываю на жизнь с APL с 1980 года. Я с нетерпением жду продолжения этого в течение еще нескольких лет. Использовать APL не только весело, язык предлагает выдающиеся функции отладки. Современные реализации - это полноценные функциональные языки, а также объектно-ориентированные.
Я встречался со многими людьми на протяжении многих лет, спрашивая меня, как долго, я думаю, я смогу продолжать APL. Этими ребятами были dbase, PL/1, ALGOL, Pascal, Forth, C, Focus и другие программисты. Понял?!
J немного похож на джина: его нужно держать в бутылке. Поддержание большого количества пакетного программного обеспечения в J - серьезная боль. Поддержание интерфейсов (Windows или веб-интерфейс, потому что да, вы можете настроить J для ответа на Apache для создания веб-вывода) в J - это экспериментальный, малоизвестный круг ада.
С другой стороны, использование J - это хорошо, если вы хотите: проанализировать, просеять, проанализировать, обработать и т. Д. Некоторые данные, чтобы поиграть с ними, выяснить тонкую грань алгоритма или произвести впечатление на интернет -сайты кратчайшим возможным способом. рассчитать, сколько треугольников вписывается в круг, а что нет.
Я был очень близок к тому, чтобы добавить J в качестве прерванного соглашения в моем профиле карьеры на сайте http://careers.stackru.com/, но в итоге я его не учел. Для меня использование J - это хорошо, производить J - нет.
РЕДАКТИРОВАТЬ:
Это было некоторое время назад. Я до сих пор плохо думаю о готовых J-решениях (то есть всех ваших MVC). С момента первоначального ответа я использовал J в качестве COM в проекте C#, где J предоставляется большая матрица, которой было бы неуклюже управлять в C#, с большим удовлетворением.
Часть нашей работы - заставить модели данных и код говорить. Это не легко соединить это качество и очень краткий синтаксис J. Некоторые фреймворки, в отличие от J, имеют простые в работе с IDE и имеют достаточную поддержку, чтобы позволить упорядочить код понятным для человека способом. Über-matrix возможности J не компенсируют то, чего ему не хватает.
Я думаю, что ваши 3 балла показывают, что вам НЕ НУЖНО изучать J. Однако я не могу представить себе ситуацию, когда изучение нового языка вредно.
Уделение времени изучению того, что вас интересует (или любого нового языка), всегда улучшает ваши другие навыки программирования. Вы изучаете различные подходы к проблемам, которые вы можете по-разному реализовать с другими языками.
Плюс, с минимальным синтаксисом J, это был бы хороший язык, чтобы гарантировать, что вы получаете правильные результаты при реализации решения на другом языке.
В былые дни я был разработчиком языка APL, программируя на 370 ассемблере. Я перенес J на OS2, но так и не научился использовать его для реальной работы. В настоящее время я работаю в Java и PHP и оцениваю Python. После первых 3 разделов учебника по Python я был поражен множеством сходств с APL, которые привели меня сюда.
Я настоятельно рекомендую изучать APL или J в качестве интеллектуального упражнения. Это изменит ваше мышление о программировании (искривит ваш мозг) и, вероятно, поможет вашему программированию на Python. Также есть несколько рабочих мест для программистов APL и J, и, вероятно, меньше программистов, чем рабочих мест.
Я работал программистом на APL несколько лет назад, в 1970-х годах. Я люблю язык, но не использовал его в течение многих лет.
Это отличный язык для некоторых вещей, но я действительно не могу использовать его для веб-разработки, например.
Для чего это здорово - это статистические и матричные операции. Вы можете решить задачу программирования лайнера в 3 символа. Гораздо проще доказать правильность реализации LP, чем, например, страницы, написанные на Си.
Так что, если вы хотите научиться этому ради радости обучения, я говорю: иди на это. Чтобы улучшить ваши перспективы трудоустройства, ну, вероятно, есть много других вещей, которые нужно изучить, что больше впечатлит потенциального работодателя.
Это забавное подтверждение для меня, пятидесятилетнего человека.
Ранее сегодня я решил выучить новый язык программирования 21-го века после 27-летнего перерыва, занимаясь нулевым программированием. Я выбрал Python, совершенно случайно, боясь основанного на графическом и объектно-ориентированном мире, в котором мы все сейчас живем.
К моему большому удовольствию, мои годы, когда я зарабатывал на жизнь парнем из APL в начале 80-х, означают, что я буквально перебираю материал с мгновенным пониманием:) Просто подумал, что поделюсь этим.
Да, изучите APL/J/K, это даст вам уникальный взгляд на то, что возможно.
Я отмечаю, что @MPelletier "сколько треугольников помещается в круг" и подразумевается "... но не для реальных проблем", немного недальновидно. Да, в IDE J Software не хватает некоторых вещей, но создание собственной IDE не является большой проблемой, и хорошая IDE может маскировать плохой язык (не нужно чихать на сокращение от 20 до 20 символов). APL, пока @KaiJaeger, если не дольше, и мой разум может быть искажен, но я никогда не был счастлив программировать с чем-то еще.