Слишком резкие высказывания. Его используют. Я всеми силами тут пытаюсь объяснить, что язык семантичен, не стоит дураками китайцев например, называть, или немцев, что ж они очень семантический русский не пользуют? Чтобы понять, насколько семантический язык, надо его знать и сравнить, а не пугаться всего, что непонятно.
Это скорее психологическая реакция. Дети в школе так делают — называют всё, что непонятно, идиотизмом. Физику, математику. «какой это идиот придумал?»
Знание глагогов приводит к их узнаванию в тексте, логично. Что приводит к чтению кода. Логично. А вот, насколько сложный код можно записать и насколько легко он читается, при условии, что вы знаете язык — это и будет семантичностью.
При одинаковой сложности алгоритмов непонятный джей выигрывает у понятных языков легко. Благодаря информативности на символ. Даже если вы не мгновенно прочитаете строку, то быстрее прочитаете смысл, чем будете рыться в классах, методах, куче файлов и тому подобное. И при этом в голове строить ту же картинку из разрозненных кусков.
Вы часто на SQL-ле пишете сам движок субд? Код, который ниже, который на джее — не делает выборку, он создает возможность такой работы. Навесить парсер SQL и можно писать к такой СУБД уже какие-то запросы.
Странно, за что столько минусов? Где я не логичен?
Джей как язык не запрещает разбивать на какие угодно куски. Поэтому он в этом плане не хуже других. Джей ко всему этому позволяет снизить нагрузку на внимание и писать бОльшие куски кода, находясь в зоне комфорта. Т.е. значит, он лучше, не так ли?
То, что вы критикуете, что программист пишет большую часть логики в одном предложении, так это потому, что для него так комфортно писать, что есть, несомненно, плюсом. И ваша критика основывается только на непонимании, почему этот программист понимает этот код. А именно, не знание глаголов и правил построения. Вам кажется тот код сложным? Чистый и простой код. Просто обратите внимание на скобки. Их много? Нет. Если их не много, то внутри код читается линейно. Давайте разберем первое:
s =: ({., }. /: 12"_ o. }. — {.) @: /:~
справа налево. Первый глагол:
/:~
Обозначает отсортировать по возрастанию. Тут наверное вектор, т.к. в задаче вектор. Я давно статью читал и вообще в код не вникаю сейчас, с нуля разбираем. Сортировка — понятно, что это такое.
Далее союз @: — говорит, что после сортировки надо делать то, что в скобках.
В скобках берем три первых (с конца) глагола:
}. — {.
Отсечь голову вектора (списка) и от этого получившегося списка отнять голову.
Следующие два глагола берем:
12"_ o. }. — {.
Сначала выполняется первый левый, потом тот, что посредине, берет правую (уже вычисленную раннее) и левую часть.
12"_ — это хитрый глагол, порождающий константу (12), вне зависимости от аргументов. Просто число не подошло бы, т.к. требуется глагол, а не существительное. Т.е. по сути, далее, если в прямом режиме, без глаголов писать, то выполнится выражение:
12 o. к нашему обрезанному и отнятому списку
12 o. — это поиск угла комплексного числа. К списку применяется, значит там список комплексных чисел — применится к каждому. Берем новые два глагола:
}. /: 12"_ o. }. — {.
То же самое. Сразу левый выполняем — отрезать голову исходному отсортированному (за скобками вначале) списку. И диадный глагол сортировки — это значит, что находим перестановку для углов справа и в этом порядке располагаем список слева. Т.е. перемещаем все комплексные числа так, чтобы углы, если их взять, были отсортированы.
Снова берем два глагола:
{. ,}. /: 12"_ o. }. — {.
Взять голову отсортированного списка и запятой приклеить к списку справа — т.е. отсортированному (без головы)
Всё.
Ничего сложного в разборе такого выражения нет, оно читается линейно.
Коротко и словами объяснить, что делает глагол? находится наименьший элемент из комплексных чисел (сначала ищут по действительно части, потом по мнимой), далее точки сортируются по углам относительно него.
Зря вы так пугаетесь джея. Выучить его вполне возможно, не верная аналогия с китайским. Просто дольше, чем обычные языки. Но а разве слишком долго сами языки другие изучаются?
Я джей изучил за месяц по вечерам. Просто прочитал и опробовал все примеры в книге Lerning J. Я ее даже конспектировал. Неделю заучивал на память все глаголы. Просто, зазубривал. Наверное, для джея это важно, т.к. их там достаточно. Но и надо сказать, что такое зазубривание — не так много времени и занимает.
После этого делал первое свое большое задание. Тоже с месяц по вечерам. Было очень сложно. Но постепенно мышление привыкало мыслить массивами.
После этого был готов работать. Пошел на работу на этом языке. Хотя как-то работать и мог, нельзя сказать, что ясно понимал текст и хорошо писал. В процессе, с год этот навык улучшался.
Так что вполне в разумные сроки можно изучить. Возможно, это требует какого-то специального мышления, у меня статистики нет.
Есть особенности работы человеческого мозга, которые не позволяют эффективно парсить подобные структуры.
В отношении джея это утверждение для меня не очевидно. А личный опыт говорит об обратном.
Люди говорят, что в Лиспе скобки — самое вкусное. И что это круто. Я их не понимаю, потому как глазами разбирать, где какая скобка закрывается — мне неуютно. Джей же как раз наоборот — эргономичен. Вилки и крючки (правила построения выражений) как раз минимизируют скобки, позволяют писать и читать линейно сложные алгоритмы, а не только последовательные преобразования.
Да, джей конечно, позволяет и говнокод писать. И мой вот этот код, кстати, не показатель. Я его не особо напрягаясь написал, не рефакторил. Там в конце слишком длинные строчки (у меня большой широкий монитор )), может больше скобок чем нужно. Но для меня этот код еще в зоне комфорта, я с ним справляюсь, читаю, мог бы и пострашнее написать.
Кстати, в этом тоже плюс джея. На нем можно достаточно легко написать вот такие длинные большие штуки и они работают. И не париться. Там внизу писали, что джей используется когда много данных и мало времени. Это отчасти верно. Джей — он как инструмент для быстрой обработки данных, здесь и сейчас. Иногда и не надо ничего рефакторить, возможно, это одноразовый был бы код в реальной задаче.
В современных языках как раз избегают писать длинные выражения в одну строку. Гораздо понятнее и удобнее разбивать сложный алгоритм на несколько более простых, которые затем комбинируются понятными операторами.
Так это не недостаток джея, а преимущество.
Разбивают код на куски, когда внимание не справляется. Чем лучше сделан язык, чем меньше напрягается внимание при чтении, тем бОльшие куски способен программист «обработать» за раз. Слишком много маленьких кусков — каждый может и понятен, но на уровень выше проблема — слишком много кусков.
В общем, джей позволяет писать бОльшими кусками и не запрещает разбивать на меньшие.
Как быстро вы сможете найти ошибку в следующем алгоритме?
Плотно в проектах я давно с джеем работал. С тех пор развилось IDE хорошо, появились какие-то средства отладки. Но вообще, ни разу как-то не видел надобности в таких средствах. Действительно, через время пишется на этом языке легко. А в побольше проектах надежность кода гарантируется как обычно — юнит-тестами.
На счет выбора знаков, почему именно эти — я не в курсе истории. Наверняка были на то причины.
Но вот это:
max(a) + sum(a)/len(a)
понятно, пока оно просто. А так:
sum(a)/len(a) + max(a)
Тоже понятно. Тогда так:
sum(a)/len(a)<<2 + max(a) Упс, уже надо смотреть приоритеты.
А если надо к сумме добавить максимальное, а потом всё поделить? Только скобки. Когда как в джее всего лишь меняются местами операции. Если выражения усложняются, то вам как математику и программисту на каком-то уровне придется пойти покурить и передохнуть, чтобы понять длинное выражение со скобочками.
В этом то и плюс джея — вилки и крючки. И отсутствие приоритета операций. Именно это и позволяет писать большие выражения, а потом так же их легко читать. Вам сейчас просто кажется из-за незнания синтаксиса, что там ужас написан. Но привыкнув к нему, он начинает давать профит. В лиспе, например, тоже передумали писать, как привыкли математики. И не для усложнения, а для упрощения.
C#, допустим.
Готов поспорить, что если бы программист написал методами или в одном методе код, то в любом случае этот код выше читается намного проще. Просто пройтись глазами справа налево.
И это простенький глагол. Если бы написали побольше алгоритм, то мне только на небо надо было бы надеяться, что программист, назвав как-то метод в другом классе в другом файле, делает в том методе то, что говорит его название. Если оно говорит.
Только linq где-то сравнится с джеем, но оно не достаточно мощное, кода раза в 4 будет больше обычно. И более захламлен точками, скобками методов, ненужным именами параметров.
А вообще, где-то похоже по ощущениям. На джее вообще, ощущения как и на SQL. Только на последнем реально бывает очень тяжело выразить довольно простые мысли, в отличии от джея. Где-то в мозгах так же на SQL комбинируете множества, как и на джее, но там сложности из-за отсутствия упорядоченности, индексного доступа. На джее же всё пишется легко.
а, да. Комментарии нужны, просто я хотел кпд языка показать. Обычно, под каждый глагол аннотацию желательно писать. Потому как глаголы обобщенные, но часто при создании глагола программист какие-то ожидания на них вешает, тип массива например. Вот, в isVar нужно передавать бокс с текстовой строкой. Хотя, из тела видно, но можно, обычно пишут.
Комментарий после NB.
Не особо плюсы или шарп и естественные. Они позволяют просто давать имена. А ООП ближе к естественному мышлению, чем массивное программирование. Но имена и здесь в джее хорошо даются глаголам, можно и классы писать. Никакой разницы в этом нет. Просто джей позволяет это делать меньше. Хотите, делайте очень маленькие простые глаголы и каждому давайте имя. Будет как в С++
А вам не очевидно, что я, например, вполне себе читаю, иначе бы просто не смог бы написать сколько кода write-only?
isVar =: [:(91&>*.64&<)[:a.&i.[:{.>
Отрыть коробку, взять первый элемент со списка (символ), узнать его номер в алфавите (ASCII), и истина, если он входит в интервал — (91;64) — и называется isVar. Вспоминаем, что в прологе переменные пишутся с большой буквы.
Читается такой код элементарно, никаких хитростей нет. Просто надо знать эти элементарные глаголы и правила построения выражений.
Наверное не совсем донес идею, а наоборот испугал непонятным кодом.
Он не такой уже непонятный. Чтобы понимать язык, нужно знать его слова. Джей по словам-примитивам намного богаче, чем привычные языки программирования. Например, никого не убивает в С++, операция >>, или ++, или просто скобки {}, служебное слово class и тому подобное.
Также и здесь.
Я в посте хотел объяснить именно эту логику, потому что люди думают эмоциями в таких случаях. Если вас пугает синтаксис, то это где-то аналогично, как пугаться иностранного языка и думать, что им пользуются дураки только – он же на ваш родной не похож. Это «попроще» — просто ваши ожидания от языка. Вам хочется, чтобы он сразу был понятен. Не изучая слова. Но тогда, он либо должен быть похож на естественный язык, причем желательно родной (а таких нет еще), либо не содержать слов, а позволять их побольше самому писать. В этом случае, заметьте, что вы бъете по своим воротам. Разве не надоело в каждой новой компании разбиратьяс я с новым методом DoSomethingEveryYearBefore2012? Слова понятны, но они не из языка программирования – это наносное. А наносят бог весть что. И каждый раз нет претензий к самому языку, претензии только к предыдущим именователям.
Ожидания от языка, которого вы не знаете, не всегда играют хорошую роль. Этих глаголов здесь штук 150 и за долгое время работы они становятся узнаваемыми. Правила комбинирования глаголов довольно простые. Поэтому, еще очень спорный вопрос, на каком языке код понятнее.
Далее, наиболее важный плюс джея – это работа с многомерными массивами. Т.е. представьте себе алгоритмическую сторону ваших программ. Вам часто надо создать массив. Тут делается элементарно. Хотите траспонировать? |: без проблем. Хотите развернуть список/массив. |. без проблем. Хотите уникальные элементы найти? ~. без проблем. Вот эти маленькие комбинации избавляют вас от кучи кода в других языках и вы мыслите совсем на другом уровне. Код без циклов, практически, вы только вращаете кубы, клеите их, находите пересечения, проекции – что угодно. А то, что эти операции обозначаются значками – это во-первых кода меньше, а во-вторых не особо им из нашего мира дашь подходящее название. Это векторно-массивные операции. Которыми можно легко выражать почти любой алгоритм.
Язык — прямой наследник APL, поэтому не эзотерический.
Программы читаются, но этот навык долго нарабатывается.
В данном посте читается сравнительно легко, тут в основном explicit-форма записи. Есть tacit-форма. Ее читать сложнее. Также очень зависит от кода. Если люди много скобок пишут, не могут пользоваться нормально крюками и вилками — то читается плоховато.
да, облако скорее всего сначала получится. Там будет огромная база знаний, которую пока в телефон не запихнешь, с параллельным доступом к информации с разных «телефонов», что еще полезнее, т.к. эта база будет пополняться в одном месте.
PS. «по гибкости» — я конечно подразумевал — какие структуры данных можно на С сделать. На джее попросту об этом не заморачиваются. Пусть оптимальную структуру данных подбирает интерпретатор
В J связный список не нужен. Такой список – это слишком что-то низкоуровневое. Если Вы пишете программу на относительно низкоуровневом языке, на С, то Вы создаете структуру данных из совсем слабых абстрактно примитивов. И когда Вам для некоторого алгоритма достаточно связного списка, то не нужно создавать больше функционала, на этом Вы и останавливаетесь.
J из коробки работает с массивами, причем, только с ними. Вектор – это уже и есть список. Связный список – это слишком низкоуровневые детали, говорящие об оптимальности поиска и вставок. J слишком высокоуровневый, нельзя думать о таких вещах. Создавать другие типы данных, не массивы, не имеет смысла даже потому, что все глаголы с ними работают. Глаголы являются обобщенными в плане, что можно передавать массивы с разными типы элементов, но передаваться должны массивы.
С помощью массивов из боксов (коробок, как здесь написано), можно создавать деревья. Так что можно работать с задачами, которые естественно решаются с помощью деревьев. Графы таким образом, понятно, не создадите, разве что искусственные метки придумать, потому что указателей или ссылок нет и массивы имутабельны. Но задачи с графами можно прекрасно решать матричным способом. Создаете вектор вершин и матрицу переходов.
Есть еще в J классы. Можно создать кусок кода, любой по форме, который допустим будет хранить и существительные (т.е. данные). А потом создавать экземпляры классов и каждый экземпляр будет иметь свои отдельные данные. Так что можно создать и какую-то сложную абстракцию.
J написан на С и он, конечно, не может его обогнать по гибкости и возможности оптимизаций. Он дает преимущество – рассматривание задач в другом совершенно виде, в виде матриц/массивов. Совершенно меняется взгляд на алгоритмы. Позволяет задачи решать очень кратко. При этом его быстродействие сравнимо с С.
J написан на С. Можно найти исходники. Правда их изучить не представляется возможным, потому что они на С пишут как на джее ))
Работа с памятью — сишные malloc. Выделяются массивы в куче. Единица данных — n-мерный массив. 0-мерный — скаляр, 1-мерный — вектор, 2-мерный — матрица и т.д. На счет, выделяются ли и скаляры в куче — не знаю, не интересовался.
Массив имеет всегда одинаковый тип элементов — булевский (0,1), целый, целый с любым количеством знаков, действительный с плавающей точкой, рациональный, комплексный, символьный, symbol ('sdf, 'sdfsfd — нечто похожее на символьный тип в Scheme) и боксы. Боксы — это некий аналог нетипизированных указателей. В массивах из боксов можно хранить разнотипные данные. В боксе можно хранить и другие массивы, поэтому боксами реализуются деревья, например.
Также есть специальные значения — +бесконечность, -бесконечность, неопределенность.
Надеюсь, ничего с типами не пропустил.
Надо готовить статью точно по этой теме. Всё в нем нормально. Только высокий порог вхождения. Он читаем, читаем поболее других языков. Но к этому прийти можно после нескольких лет работы на нем. Поначалу, пару месяцев, сможете только писать и только с трудом, а читать даже свой код не сможете.
На счет производительности — не правы. Он очень производителен. Даже иногда как некоторая магия воспринимается, как он умеет так относительно быстро работать, не смотря на такую высокоуровневость. Он бывает и тупит, заметно тупит, от этого никуда не деться. Тем не менее, он прекрасно работает с библиотеками, написанными на других языках, поэтому позволяет делать точечные оптимизации узких мест. Т.е. например, в нем можно вызвать функцию из библиотеки, написанной на С, и передать туда массивы, как аргументы. И сделать с ними там уже что хотите. Я работал на высоконагруженных проектах, сделанных на J. Вполне отличный язык в плане скорости создания прототипа, удовлетворительной производительности самой по себе и оптимизации проблемных участков.
Использовал его для датамайнинга. Очень хорош как язык для быстрого создания сложных алгоритмов и обработки больших массивов данных. Т.е. в финансовой сфере, для предсказаний и т.д.
Для ГУИ там тоже есть какие-то библиотеки, но убогие, правда. Ну и действительно, хотя на нем можно решать любые задачи, какие-то неалгоритмические задачи, не требующие какой-то сложной обработки данных — не будут показывать его сильные стороны. Но есть другие языки, поэтому ГУИ удобно писать на других. Да, он также мультипарадигменный. Там можно писать не только в тацитной форме (но она самая вкусная), но и императивно, с телом, ветвлениями и циклами. Также в нем есть некоторая поддержка ООП. Можно писать классы и создавать экземпляры.
Этот язык прекрасен, как вспомогательный язык в работе. Работа с ним напоминает не программирование, а вроде у вас очень мощный калькулятор. Вы быстро можете проверить любую идею, что-то даже распарсить или сгенерировать код для другого языка. Когда на нем пишете, то ощущение, что вы быстро что-то сооружаете одноразовое. Он не заставляет думать и продумывать архитектуру, не заставляет думать, что вы что-то делаете на века. Это в общем — достоинство. У вас меньше страха перед ошибкой именно потому, что всё получается быстро. Такой себе очень сильный математический калькулятор.
Минусы скорее только такие: высокая сложность, не надейтесь научиться ему быстро. Я изучил его за месяц (прочитал книгу и запомнил все глаголы, примеры и т.д.). Еще с месяц писал первое задание, которое придумал. Это всё по вечерам. Но привыкал с год, более менее читать. И дальше тоже развивался. И думаю, еще не достиг идеала понимания этого языка. Хотя со временем он становится понятнее и понятнее.
Эта сложность языка является и причиной другого минуса — мало кадров. Т.е. выбирая его под проект, вы рискуете не найти людей.
Понятно. Спорить в общем-то нечего, у нас разные мировоззрения.
Я не утверждаю, если что, что работа должна быть ненавистной и надо ее выполнять с настроением мытья посуды. Просто думаю, что должен приносить удовлетворение процесс, а не результат. Мотивировать себя на результат — это на слишком короткие дистанции. Никто так не становится чемпионом в спорте. Никто не станет хорошим программистом, желая всего лишь взять эту высоту. Только привычка работать и только работа, долгосрочная к этому приводит. А выбрать себе деятельность, которая еще и приносит удовольствие как процесс (в моем случае программирование) — это вообще удача.
Это скорее психологическая реакция. Дети в школе так делают — называют всё, что непонятно, идиотизмом. Физику, математику. «какой это идиот придумал?»
Знание глагогов приводит к их узнаванию в тексте, логично. Что приводит к чтению кода. Логично. А вот, насколько сложный код можно записать и насколько легко он читается, при условии, что вы знаете язык — это и будет семантичностью.
При одинаковой сложности алгоритмов непонятный джей выигрывает у понятных языков легко. Благодаря информативности на символ. Даже если вы не мгновенно прочитаете строку, то быстрее прочитаете смысл, чем будете рыться в классах, методах, куче файлов и тому подобное. И при этом в голове строить ту же картинку из разрозненных кусков.
Вы часто на SQL-ле пишете сам движок субд? Код, который ниже, который на джее — не делает выборку, он создает возможность такой работы. Навесить парсер SQL и можно писать к такой СУБД уже какие-то запросы.
Джей как язык не запрещает разбивать на какие угодно куски. Поэтому он в этом плане не хуже других. Джей ко всему этому позволяет снизить нагрузку на внимание и писать бОльшие куски кода, находясь в зоне комфорта. Т.е. значит, он лучше, не так ли?
То, что вы критикуете, что программист пишет большую часть логики в одном предложении, так это потому, что для него так комфортно писать, что есть, несомненно, плюсом. И ваша критика основывается только на непонимании, почему этот программист понимает этот код. А именно, не знание глаголов и правил построения. Вам кажется тот код сложным? Чистый и простой код. Просто обратите внимание на скобки. Их много? Нет. Если их не много, то внутри код читается линейно. Давайте разберем первое:
s =: ({., }. /: 12"_ o. }. — {.) @: /:~
справа налево. Первый глагол:
/:~
Обозначает отсортировать по возрастанию. Тут наверное вектор, т.к. в задаче вектор. Я давно статью читал и вообще в код не вникаю сейчас, с нуля разбираем. Сортировка — понятно, что это такое.
Далее союз @: — говорит, что после сортировки надо делать то, что в скобках.
В скобках берем три первых (с конца) глагола:
}. — {.
Отсечь голову вектора (списка) и от этого получившегося списка отнять голову.
Следующие два глагола берем:
12"_ o. }. — {.
Сначала выполняется первый левый, потом тот, что посредине, берет правую (уже вычисленную раннее) и левую часть.
12"_ — это хитрый глагол, порождающий константу (12), вне зависимости от аргументов. Просто число не подошло бы, т.к. требуется глагол, а не существительное. Т.е. по сути, далее, если в прямом режиме, без глаголов писать, то выполнится выражение:
12 o. к нашему обрезанному и отнятому списку
12 o. — это поиск угла комплексного числа. К списку применяется, значит там список комплексных чисел — применится к каждому. Берем новые два глагола:
}. /: 12"_ o. }. — {.
То же самое. Сразу левый выполняем — отрезать голову исходному отсортированному (за скобками вначале) списку. И диадный глагол сортировки — это значит, что находим перестановку для углов справа и в этом порядке располагаем список слева. Т.е. перемещаем все комплексные числа так, чтобы углы, если их взять, были отсортированы.
Снова берем два глагола:
{. ,}. /: 12"_ o. }. — {.
Взять голову отсортированного списка и запятой приклеить к списку справа — т.е. отсортированному (без головы)
Всё.
Ничего сложного в разборе такого выражения нет, оно читается линейно.
Коротко и словами объяснить, что делает глагол? находится наименьший элемент из комплексных чисел (сначала ищут по действительно части, потом по мнимой), далее точки сортируются по углам относительно него.
Я джей изучил за месяц по вечерам. Просто прочитал и опробовал все примеры в книге Lerning J. Я ее даже конспектировал. Неделю заучивал на память все глаголы. Просто, зазубривал. Наверное, для джея это важно, т.к. их там достаточно. Но и надо сказать, что такое зазубривание — не так много времени и занимает.
После этого делал первое свое большое задание. Тоже с месяц по вечерам. Было очень сложно. Но постепенно мышление привыкало мыслить массивами.
После этого был готов работать. Пошел на работу на этом языке. Хотя как-то работать и мог, нельзя сказать, что ясно понимал текст и хорошо писал. В процессе, с год этот навык улучшался.
Так что вполне в разумные сроки можно изучить. Возможно, это требует какого-то специального мышления, у меня статистики нет.
В отношении джея это утверждение для меня не очевидно. А личный опыт говорит об обратном.
Люди говорят, что в Лиспе скобки — самое вкусное. И что это круто. Я их не понимаю, потому как глазами разбирать, где какая скобка закрывается — мне неуютно. Джей же как раз наоборот — эргономичен. Вилки и крючки (правила построения выражений) как раз минимизируют скобки, позволяют писать и читать линейно сложные алгоритмы, а не только последовательные преобразования.
Да, джей конечно, позволяет и говнокод писать. И мой вот этот код, кстати, не показатель. Я его не особо напрягаясь написал, не рефакторил. Там в конце слишком длинные строчки (у меня большой широкий монитор )), может больше скобок чем нужно. Но для меня этот код еще в зоне комфорта, я с ним справляюсь, читаю, мог бы и пострашнее написать.
Кстати, в этом тоже плюс джея. На нем можно достаточно легко написать вот такие длинные большие штуки и они работают. И не париться. Там внизу писали, что джей используется когда много данных и мало времени. Это отчасти верно. Джей — он как инструмент для быстрой обработки данных, здесь и сейчас. Иногда и не надо ничего рефакторить, возможно, это одноразовый был бы код в реальной задаче.
Так это не недостаток джея, а преимущество.
Разбивают код на куски, когда внимание не справляется. Чем лучше сделан язык, чем меньше напрягается внимание при чтении, тем бОльшие куски способен программист «обработать» за раз. Слишком много маленьких кусков — каждый может и понятен, но на уровень выше проблема — слишком много кусков.
В общем, джей позволяет писать бОльшими кусками и не запрещает разбивать на меньшие.
Плотно в проектах я давно с джеем работал. С тех пор развилось IDE хорошо, появились какие-то средства отладки. Но вообще, ни разу как-то не видел надобности в таких средствах. Действительно, через время пишется на этом языке легко. А в побольше проектах надежность кода гарантируется как обычно — юнит-тестами.
На счет выбора знаков, почему именно эти — я не в курсе истории. Наверняка были на то причины.
Но вот это:
max(a) + sum(a)/len(a)
понятно, пока оно просто. А так:
sum(a)/len(a) + max(a)
Тоже понятно. Тогда так:
sum(a)/len(a)<<2 + max(a) Упс, уже надо смотреть приоритеты.
А если надо к сумме добавить максимальное, а потом всё поделить? Только скобки. Когда как в джее всего лишь меняются местами операции. Если выражения усложняются, то вам как математику и программисту на каком-то уровне придется пойти покурить и передохнуть, чтобы понять длинное выражение со скобочками.
В этом то и плюс джея — вилки и крючки. И отсутствие приоритета операций. Именно это и позволяет писать большие выражения, а потом так же их легко читать. Вам сейчас просто кажется из-за незнания синтаксиса, что там ужас написан. Но привыкнув к нему, он начинает давать профит. В лиспе, например, тоже передумали писать, как привыкли математики. И не для усложнения, а для упрощения.
Готов поспорить, что если бы программист написал методами или в одном методе код, то в любом случае этот код выше читается намного проще. Просто пройтись глазами справа налево.
И это простенький глагол. Если бы написали побольше алгоритм, то мне только на небо надо было бы надеяться, что программист, назвав как-то метод в другом классе в другом файле, делает в том методе то, что говорит его название. Если оно говорит.
Только linq где-то сравнится с джеем, но оно не достаточно мощное, кода раза в 4 будет больше обычно. И более захламлен точками, скобками методов, ненужным именами параметров.
А вообще, где-то похоже по ощущениям. На джее вообще, ощущения как и на SQL. Только на последнем реально бывает очень тяжело выразить довольно простые мысли, в отличии от джея. Где-то в мозгах так же на SQL комбинируете множества, как и на джее, но там сложности из-за отсутствия упорядоченности, индексного доступа. На джее же всё пишется легко.
Комментарий после NB.
Не особо плюсы или шарп и естественные. Они позволяют просто давать имена. А ООП ближе к естественному мышлению, чем массивное программирование. Но имена и здесь в джее хорошо даются глаголам, можно и классы писать. Никакой разницы в этом нет. Просто джей позволяет это делать меньше. Хотите, делайте очень маленькие простые глаголы и каждому давайте имя. Будет как в С++
isVar =: [:(91&>*.64&<)[:a.&i.[:{.>
Отрыть коробку, взять первый элемент со списка (символ), узнать его номер в алфавите (ASCII), и истина, если он входит в интервал — (91;64) — и называется isVar. Вспоминаем, что в прологе переменные пишутся с большой буквы.
Читается такой код элементарно, никаких хитростей нет. Просто надо знать эти элементарные глаголы и правила построения выражений.
Он не такой уже непонятный. Чтобы понимать язык, нужно знать его слова. Джей по словам-примитивам намного богаче, чем привычные языки программирования. Например, никого не убивает в С++, операция >>, или ++, или просто скобки {}, служебное слово class и тому подобное.
Также и здесь.
Я в посте хотел объяснить именно эту логику, потому что люди думают эмоциями в таких случаях. Если вас пугает синтаксис, то это где-то аналогично, как пугаться иностранного языка и думать, что им пользуются дураки только – он же на ваш родной не похож. Это «попроще» — просто ваши ожидания от языка. Вам хочется, чтобы он сразу был понятен. Не изучая слова. Но тогда, он либо должен быть похож на естественный язык, причем желательно родной (а таких нет еще), либо не содержать слов, а позволять их побольше самому писать. В этом случае, заметьте, что вы бъете по своим воротам. Разве не надоело в каждой новой компании разбиратьяс я с новым методом DoSomethingEveryYearBefore2012? Слова понятны, но они не из языка программирования – это наносное. А наносят бог весть что. И каждый раз нет претензий к самому языку, претензии только к предыдущим именователям.
Ожидания от языка, которого вы не знаете, не всегда играют хорошую роль. Этих глаголов здесь штук 150 и за долгое время работы они становятся узнаваемыми. Правила комбинирования глаголов довольно простые. Поэтому, еще очень спорный вопрос, на каком языке код понятнее.
Далее, наиболее важный плюс джея – это работа с многомерными массивами. Т.е. представьте себе алгоритмическую сторону ваших программ. Вам часто надо создать массив. Тут делается элементарно. Хотите траспонировать? |: без проблем. Хотите развернуть список/массив. |. без проблем. Хотите уникальные элементы найти? ~. без проблем. Вот эти маленькие комбинации избавляют вас от кучи кода в других языках и вы мыслите совсем на другом уровне. Код без циклов, практически, вы только вращаете кубы, клеите их, находите пересечения, проекции – что угодно. А то, что эти операции обозначаются значками – это во-первых кода меньше, а во-вторых не особо им из нашего мира дашь подходящее название. Это векторно-массивные операции. Которыми можно легко выражать почти любой алгоритм.
Программы читаются, но этот навык долго нарабатывается.
В данном посте читается сравнительно легко, тут в основном explicit-форма записи. Есть tacit-форма. Ее читать сложнее. Также очень зависит от кода. Если люди много скобок пишут, не могут пользоваться нормально крюками и вилками — то читается плоховато.
J из коробки работает с массивами, причем, только с ними. Вектор – это уже и есть список. Связный список – это слишком низкоуровневые детали, говорящие об оптимальности поиска и вставок. J слишком высокоуровневый, нельзя думать о таких вещах. Создавать другие типы данных, не массивы, не имеет смысла даже потому, что все глаголы с ними работают. Глаголы являются обобщенными в плане, что можно передавать массивы с разными типы элементов, но передаваться должны массивы.
С помощью массивов из боксов (коробок, как здесь написано), можно создавать деревья. Так что можно работать с задачами, которые естественно решаются с помощью деревьев. Графы таким образом, понятно, не создадите, разве что искусственные метки придумать, потому что указателей или ссылок нет и массивы имутабельны. Но задачи с графами можно прекрасно решать матричным способом. Создаете вектор вершин и матрицу переходов.
Есть еще в J классы. Можно создать кусок кода, любой по форме, который допустим будет хранить и существительные (т.е. данные). А потом создавать экземпляры классов и каждый экземпляр будет иметь свои отдельные данные. Так что можно создать и какую-то сложную абстракцию.
J написан на С и он, конечно, не может его обогнать по гибкости и возможности оптимизаций. Он дает преимущество – рассматривание задач в другом совершенно виде, в виде матриц/массивов. Совершенно меняется взгляд на алгоритмы. Позволяет задачи решать очень кратко. При этом его быстродействие сравнимо с С.
Работа с памятью — сишные malloc. Выделяются массивы в куче. Единица данных — n-мерный массив. 0-мерный — скаляр, 1-мерный — вектор, 2-мерный — матрица и т.д. На счет, выделяются ли и скаляры в куче — не знаю, не интересовался.
Массив имеет всегда одинаковый тип элементов — булевский (0,1), целый, целый с любым количеством знаков, действительный с плавающей точкой, рациональный, комплексный, символьный, symbol ('sdf, 'sdfsfd — нечто похожее на символьный тип в Scheme) и боксы. Боксы — это некий аналог нетипизированных указателей. В массивах из боксов можно хранить разнотипные данные. В боксе можно хранить и другие массивы, поэтому боксами реализуются деревья, например.
Также есть специальные значения — +бесконечность, -бесконечность, неопределенность.
Надеюсь, ничего с типами не пропустил.
На счет производительности — не правы. Он очень производителен. Даже иногда как некоторая магия воспринимается, как он умеет так относительно быстро работать, не смотря на такую высокоуровневость. Он бывает и тупит, заметно тупит, от этого никуда не деться. Тем не менее, он прекрасно работает с библиотеками, написанными на других языках, поэтому позволяет делать точечные оптимизации узких мест. Т.е. например, в нем можно вызвать функцию из библиотеки, написанной на С, и передать туда массивы, как аргументы. И сделать с ними там уже что хотите. Я работал на высоконагруженных проектах, сделанных на J. Вполне отличный язык в плане скорости создания прототипа, удовлетворительной производительности самой по себе и оптимизации проблемных участков.
Использовал его для датамайнинга. Очень хорош как язык для быстрого создания сложных алгоритмов и обработки больших массивов данных. Т.е. в финансовой сфере, для предсказаний и т.д.
Для ГУИ там тоже есть какие-то библиотеки, но убогие, правда. Ну и действительно, хотя на нем можно решать любые задачи, какие-то неалгоритмические задачи, не требующие какой-то сложной обработки данных — не будут показывать его сильные стороны. Но есть другие языки, поэтому ГУИ удобно писать на других. Да, он также мультипарадигменный. Там можно писать не только в тацитной форме (но она самая вкусная), но и императивно, с телом, ветвлениями и циклами. Также в нем есть некоторая поддержка ООП. Можно писать классы и создавать экземпляры.
Этот язык прекрасен, как вспомогательный язык в работе. Работа с ним напоминает не программирование, а вроде у вас очень мощный калькулятор. Вы быстро можете проверить любую идею, что-то даже распарсить или сгенерировать код для другого языка. Когда на нем пишете, то ощущение, что вы быстро что-то сооружаете одноразовое. Он не заставляет думать и продумывать архитектуру, не заставляет думать, что вы что-то делаете на века. Это в общем — достоинство. У вас меньше страха перед ошибкой именно потому, что всё получается быстро. Такой себе очень сильный математический калькулятор.
Минусы скорее только такие: высокая сложность, не надейтесь научиться ему быстро. Я изучил его за месяц (прочитал книгу и запомнил все глаголы, примеры и т.д.). Еще с месяц писал первое задание, которое придумал. Это всё по вечерам. Но привыкал с год, более менее читать. И дальше тоже развивался. И думаю, еще не достиг идеала понимания этого языка. Хотя со временем он становится понятнее и понятнее.
Эта сложность языка является и причиной другого минуса — мало кадров. Т.е. выбирая его под проект, вы рискуете не найти людей.
Я не утверждаю, если что, что работа должна быть ненавистной и надо ее выполнять с настроением мытья посуды. Просто думаю, что должен приносить удовлетворение процесс, а не результат. Мотивировать себя на результат — это на слишком короткие дистанции. Никто так не становится чемпионом в спорте. Никто не станет хорошим программистом, желая всего лишь взять эту высоту. Только привычка работать и только работа, долгосрочная к этому приводит. А выбрать себе деятельность, которая еще и приносит удовольствие как процесс (в моем случае программирование) — это вообще удача.