Кто-нибудь порекомендовал бы изучать J / K / APL?[закрыто]

StackOverflow https://stackoverflow.com/questions/747625

Вопрос

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

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

Некоторые личные обстоятельства, которые следует учитывать, если вы хотите:

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

Мы были бы очень признательны за любые советы от тех, кто знаком с этими языками.

Это было полезно?

Решение

Тысячи лет назад я был программистом APL.Под тысячами я подразумеваю далекие 70-е, когда пользовательский набор символов означал, что у нас были специальные печатающие терминалы с клавиатурой APL и набором символов, а также наборные шары IBM selectric со специальными символами и т.д.

Я ходил на лекцию Кена Айверсона на тему "Почему APL была крутой".

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

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

Смысл APL (а также J и K) заключается в том, чтобы суммировать большие алгоритмы в аккуратную нотацию.

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

Кроме того, поскольку я преследую Проект Эйлер проблемы "functional programming lite" на 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 - это серьезная проблема.Поддержание интерфейсов (на базе Windows или Web, потому что да, вы можете настроить J для ответа Apache для создания веб-вывода) в J - это экспериментальный, малоизвестный круг ада.

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

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

Редактировать:

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

Частью нашей работы является создание моделей данных и кода говори.Непросто соединить это качество и очень лаконичный синтаксис J .Некоторые фреймворки, в отличие от J, имеют простую в работе среду IDE и обладают достаточной поддержкой, позволяющей упорядочивать код понятным для человека способом.Сверхматричные возможности J не компенсируют того, чего ему не хватает.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top