2009-04-14 4 views
43

Я столкнулся с J/K/APL несколько месяцев назад, проработав свой путь через некоторые проблемы project euler, и был заинтригован, мягко говоря. Для каждого элегантного 20-битного решения python, которое я произвел, было бы gobsmacking 20 character J решение, которое выполнялось в десятую часть времени. Я очень хотел изучить некоторые основные J, и сделал несколько попыток поднять словарный запас, но нашел кривую обучения довольно крутой.Кто-нибудь порекомендовал бы изучать J/K/APL?

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

Некоторые личные обстоятельства, чтобы рассмотреть, если вы заботитесь:

  • Я люблю математику, и использовать его каждый день в своей работе (как математика для запуска), но если честно, я не чувствую ограниченный инструментами, которые я использую (например, python + NumPy), поэтому я не могу использовать это оправдание.
  • У меня нет особого желания работать в финансовой индустрии, которая, по-видимому, является главным портом захода для пользователей K, по крайней мере. Плюс я должен научиться C# следующим языком, поскольку это основной язык, на котором я работаю. Так что практически говоря, J почти определенно не должен быть следующим языком, который я изучаю.
  • Я достаточно хорошо знаком с MATLAB, поэтому использование языка программирования на основе массива не будет представлять собой потрясающий сдвиг парадигмы.

Любые советы тех, кто знаком с этими языками, будут высоко оценены.

ответ

52

Тысячи лет назад я был программистом APL. К тысячам, я имею в виду еще в 70-х годах, когда пользовательский набор символов означал, что у нас были специальные печатные терминалы с клавиатурой и набором символов APL, и IBM selectical typeballs со специальными символами и т. Д.

Я пошел на лекцию Кен Айверсон: «Почему APL был классным».

Его тезис был таким. Когда-то долгое разделение было серьезным математическим делом, предназначенным для аспирантов. Обозначение таких вещей, как повторение десятичных разложений, связано с большой кучей математической символики. Когда-то даже что-то вроде «отрицательного» номера требовалось уточнить.

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

Точка APL (и J и K) должна суммировать большие алгоритмы в порядке.

В настоящее время я программист на Python.Я обнаружил, что мое раннее знакомство с APL исказило мой мозг, заставив меня спросить: «Что это значит?» и «это операция многократного использования?» и «что является содержательным резюме для всего этого алгоритмического пуха?»

Кроме того, поскольку я преследую проблемы Project Euler, «функциональное программирование lite» Python, поддерживаемое моими «пропитанными Джином воспоминаниями APL», очень полезно при решении упражнений.

+2

Спасибо за то, что Стивен - будет интересно посмотреть, насколько это влияет на мой собственный Python. Кроме того, если вы не возражаете, я спрашиваю, каково ваше имя пользователя в Project Euler? Вы публикуете свои решения Python? – ozan

+1

На ProjectEuler я «slott». Нет, я не отправляю свои решения. Я только уровень 1, прямо сейчас - у меня есть два, чтобы добраться до уровня 2. –

+2

+1 тысячи лет назад. Но никогда не давайте подробностей - это просто портит веселье. –

9

Я думаю, что ваши 3 балла показывают, что вам НЕ НУЖНО учиться J. Однако я не могу придумать какую-либо ситуацию, когда изучение нового языка вредно.

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

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

7

Я работал в качестве программиста APL несколько лет назад в 1970-х годах. Я люблю язык, но не использовал его в течение многих лет.

Это отличный язык для некоторых вещей, но я действительно не могу использовать его для веб-разработки, например.

Для этого важны статистические и матричные операции. Вы можете решить проблему программирования лайнера в 3 символа. Гораздо проще доказать правильность этой реализации LP, чем та, которая берет страницы на C, например.

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

+1

В финансах знание Q/Kdb + может быть довольно полезным помощником –

8

В эльдарные дни я был разработчиком языка APL, кодирующим в ассемблере 370. Я поместил J в OS2, но не научился использовать его для реальной работы. Я сейчас работаю в Java и PHP и оцениваю Python. После первых трех разделов учебника Python меня поразило много общего с APL, которое привело меня сюда.

Я настоятельно рекомендую изучать APL или J как интеллектуальное упражнение. Это изменит ваш подход к программированию (деформирует ваш мозг) и, вероятно, поможет вашему кодированию на Python. Кроме того, есть несколько рабочих мест для программистов APL и J и, вероятно, меньше программистов, чем рабочих мест.

11

Я зарабатываю на жизнь APL с 1980 года. Я смотрю в будущее, чтобы продолжать делать это еще несколько лет. Не очень приятно использовать APL, язык предлагает выдающиеся функции отладки. Современные реализации - это полноценные функциональные языки и объектно-ориентированные.

Я встречал много людей с годами, спрашивая меня, как долго я предполагаю, что смогу продолжить работу с APL. Этими парнями были dbase и PL/1 и ALGOL, Pascal и Forth, C и Focus и другие программисты. Понял?!

+6

Не могли бы вы объяснить, как вы зарабатываете деньги с помощью APL? – defhlt

+1

@defhlt http://aplteam.com/ –

11

J немного напоминает джинна: ​​его нужно хранить внутри бутылки. Поддержание большого количества пакетного программного обеспечения в J - серьезная боль. Поддержание интерфейсов (Windows или веб-сайтов, потому что да, вы можете настроить J для ответа на Apache для создания веб-выхода) в J - экспериментальный, малоизвестный круг ада.

С другой стороны, использование J отлично, если вы хотите: проанализировать, просеять, анализировать, хруст и т. Д. Некоторые данные, чтобы поиграть с ним, выяснить мелкое зерно алгоритма или произвести впечатление на сети с максимально возможной способностью подсчитать, сколько треугольников подходит по кругу, а что нет.

Я подошел очень близко к добавлению J в качестве выключателя транзакций в моем профиле карьеры на careers.stackoverflow.com, но в конечном итоге я его оставил. Для меня использование J в порядке, производство J, однако, не является.

EDIT:

Это было время назад. Я все еще плохо думаю о полных J решениях на производстве (то есть, все ваши MVC). Начиная с исходного ответа, я использовал J как COM в проекте C#, где J снабжен большой матрицей, которая была бы неуклюжей для управления на C# с большим удовлетворением.

Часть нашей работы - это сделать модели данных и код . Это непросто преодолеть это качество и очень краткий синтаксис J. В нескольких системах, в отличие от J, есть простые в работе - с IDE и имеют достаточную поддержку, позволяющую упорядочить код по-человечески. Возможности über-матрицы J не компенсируют то, чего им не хватает.

16

Я работал в J и APL в течение большей части последних 25 лет и могу полностью рекомендовать обоим. Я все еще вернусь к тому или иному, когда у меня есть любая форма обработки данных ad-hoc, и я использовал ее в Project Euler.

Если вас интересует Project Euler, то J определенно тот, который нужно выбрать. Его поддержка бесконечных целых чисел и простых чисел делает его очень подходящим.

14

J - мой основной язык программирования для Project Euler и для личного использования на работе. Я никогда не сталкивался с лучшим языком для обработки массивов, и парадигма молчаливого программирования полезна и заставляет задуматься, как только вы ее повесите. (Полезно, потому что на самом деле это заставляет задуматься). Достижение уровня знаний на начальном уровне на этом языке затруднено, а чтение кода других людей - это интеллектуально дисциплинированная деятельность, но настойчивость имеет серьезные выигрыши из-за власти, гибкости и лаконичности языка.

Это говорит о причине, почему я резервирую его за персональный использование на работе заключается в том, что (1) никто другой на работе не использует его, (2) кривая обучения достаточно крутая, так что мне не разумно спрашивать мои коллеги, чтобы забрать его, и (3) тот факт, что вы можете создавать сложные программы в одной строке кода, затрудняет чтение строки кода, особенно если вы ее не пишете сами. (Я ожидаю потратить, по крайней мере, полчаса, изучая строку кода, в которой используются десять или более операторов, если они не использовались таким образом, чтобы я полностью понял базовые принципы.)

Некоторые примеры забавных функций J:

1) Любая функция, определенная для работы с одним номером, может быть использована для работы с массивами произвольного ранга. Например:

NB. totient(n) = n * \prod_{p|n} (1 - 1/p) 
totient=: * [email protected]%@~.&.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. Аналогичным образом, вы можете взять функцию, определенную для работы с рангами-2 (матрицами) и применить ее к любому массиву более высокого ранга, просто используя соединение «(ранг)».

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 
5

Да, научиться APL/J/K, это даст вам уникальную возможность заглянуть в то, что возможно.

I что @ MPelletier «сколько треугольников вписывается в круг» и подразумевается «... но не для реальных проблем», является немного близоруким. Да, в IDE J Software нет некоторых вещи, но создание собственной среды IDE не является большой проблемой, и хорошая среда IDE может замаскировать плохой язык (сокращение от 20 строк до 20 символов - это , а не, который будет чихать.) Я делаю APL, пока @ KaiJaeger, если не дольше, и мой ум может быть извращен, но я никогда не был счастлив программированием ничем другим.

6

Это забавное подтверждение для меня, пятидесятилетнего человека.

Ранее сегодня я решил изучить новый язык программирования 21-го века после 27-летнего перерыва в нулевом программировании. Я выбрал Python, довольно наугад, опасаясь основанного на ги и объектно-ориентированного мира, в котором мы все сейчас живем.

К моему большому удовольствию, мои годы, зарабатывающие на жизнь как парень APL еще в начале 80-х, означают, что я буквально сжимаю материал, мгновенно понимая :) Просто подумал, что я поделюсь этим.