Комментарии 10
Скажите, пожалуйста, а каким образом в J реализована работа с памятью (я не уловил, но возможно, я что-то пропустил)? Есть ли указатели?
Какие примитивные типы поддерживаются (в качестве элементов массивов, например) — были упомянуты числа и строки, есть ли другие возможности? Есть ли другие составные структуры данных, кроме массивов и коробок — и можно ли реализовать свои (что, в сущности, возвращает нас к первому вопросу)?
Какие примитивные типы поддерживаются (в качестве элементов массивов, например) — были упомянуты числа и строки, есть ли другие возможности? Есть ли другие составные структуры данных, кроме массивов и коробок — и можно ли реализовать свои (что, в сущности, возвращает нас к первому вопросу)?
J написан на С. Можно найти исходники. Правда их изучить не представляется возможным, потому что они на С пишут как на джее ))
Работа с памятью — сишные malloc. Выделяются массивы в куче. Единица данных — n-мерный массив. 0-мерный — скаляр, 1-мерный — вектор, 2-мерный — матрица и т.д. На счет, выделяются ли и скаляры в куче — не знаю, не интересовался.
Массив имеет всегда одинаковый тип элементов — булевский (0,1), целый, целый с любым количеством знаков, действительный с плавающей точкой, рациональный, комплексный, символьный, symbol ('sdf, 'sdfsfd — нечто похожее на символьный тип в Scheme) и боксы. Боксы — это некий аналог нетипизированных указателей. В массивах из боксов можно хранить разнотипные данные. В боксе можно хранить и другие массивы, поэтому боксами реализуются деревья, например.
Также есть специальные значения — +бесконечность, -бесконечность, неопределенность.
Надеюсь, ничего с типами не пропустил.
Работа с памятью — сишные malloc. Выделяются массивы в куче. Единица данных — n-мерный массив. 0-мерный — скаляр, 1-мерный — вектор, 2-мерный — матрица и т.д. На счет, выделяются ли и скаляры в куче — не знаю, не интересовался.
Массив имеет всегда одинаковый тип элементов — булевский (0,1), целый, целый с любым количеством знаков, действительный с плавающей точкой, рациональный, комплексный, символьный, symbol ('sdf, 'sdfsfd — нечто похожее на символьный тип в Scheme) и боксы. Боксы — это некий аналог нетипизированных указателей. В массивах из боксов можно хранить разнотипные данные. В боксе можно хранить и другие массивы, поэтому боксами реализуются деревья, например.
Также есть специальные значения — +бесконечность, -бесконечность, неопределенность.
Надеюсь, ничего с типами не пропустил.
То есть если нужно реализовать чистый связный список без массивов (например, для графов), использование J никаких преимуществ перед С не дает?
В J связный список не нужен. Такой список – это слишком что-то низкоуровневое. Если Вы пишете программу на относительно низкоуровневом языке, на С, то Вы создаете структуру данных из совсем слабых абстрактно примитивов. И когда Вам для некоторого алгоритма достаточно связного списка, то не нужно создавать больше функционала, на этом Вы и останавливаетесь.
J из коробки работает с массивами, причем, только с ними. Вектор – это уже и есть список. Связный список – это слишком низкоуровневые детали, говорящие об оптимальности поиска и вставок. J слишком высокоуровневый, нельзя думать о таких вещах. Создавать другие типы данных, не массивы, не имеет смысла даже потому, что все глаголы с ними работают. Глаголы являются обобщенными в плане, что можно передавать массивы с разными типы элементов, но передаваться должны массивы.
С помощью массивов из боксов (коробок, как здесь написано), можно создавать деревья. Так что можно работать с задачами, которые естественно решаются с помощью деревьев. Графы таким образом, понятно, не создадите, разве что искусственные метки придумать, потому что указателей или ссылок нет и массивы имутабельны. Но задачи с графами можно прекрасно решать матричным способом. Создаете вектор вершин и матрицу переходов.
Есть еще в J классы. Можно создать кусок кода, любой по форме, который допустим будет хранить и существительные (т.е. данные). А потом создавать экземпляры классов и каждый экземпляр будет иметь свои отдельные данные. Так что можно создать и какую-то сложную абстракцию.
J написан на С и он, конечно, не может его обогнать по гибкости и возможности оптимизаций. Он дает преимущество – рассматривание задач в другом совершенно виде, в виде матриц/массивов. Совершенно меняется взгляд на алгоритмы. Позволяет задачи решать очень кратко. При этом его быстродействие сравнимо с С.
J из коробки работает с массивами, причем, только с ними. Вектор – это уже и есть список. Связный список – это слишком низкоуровневые детали, говорящие об оптимальности поиска и вставок. J слишком высокоуровневый, нельзя думать о таких вещах. Создавать другие типы данных, не массивы, не имеет смысла даже потому, что все глаголы с ними работают. Глаголы являются обобщенными в плане, что можно передавать массивы с разными типы элементов, но передаваться должны массивы.
С помощью массивов из боксов (коробок, как здесь написано), можно создавать деревья. Так что можно работать с задачами, которые естественно решаются с помощью деревьев. Графы таким образом, понятно, не создадите, разве что искусственные метки придумать, потому что указателей или ссылок нет и массивы имутабельны. Но задачи с графами можно прекрасно решать матричным способом. Создаете вектор вершин и матрицу переходов.
Есть еще в J классы. Можно создать кусок кода, любой по форме, который допустим будет хранить и существительные (т.е. данные). А потом создавать экземпляры классов и каждый экземпляр будет иметь свои отдельные данные. Так что можно создать и какую-то сложную абстракцию.
J написан на С и он, конечно, не может его обогнать по гибкости и возможности оптимизаций. Он дает преимущество – рассматривание задач в другом совершенно виде, в виде матриц/массивов. Совершенно меняется взгляд на алгоритмы. Позволяет задачи решать очень кратко. При этом его быстродействие сравнимо с С.
PS. «по гибкости» — я конечно подразумевал — какие структуры данных можно на С сделать. На джее попросту об этом не заморачиваются. Пусть оптимальную структуру данных подбирает интерпретатор
Большое спасибо, стало гораздо понятнее!
Безусловно, матрицу смежности как вариант задания графов в памяти никто не отменял.
Безусловно, матрицу смежности как вариант задания графов в памяти никто не отменял.
Офтопик, конечно, но языки прибывают с такой скоростью, что скоро закончатся буквы в латинице. Что безусловно радует )
Статьи хорошие, да и сам J — очень интересный язык программирования. Однако меня несколько удивило наличие всех этих цифровых глаголов: «1 :» и «4 :» ещё более-менее понятно (т.к., очевидно, эти константы связаны с представлением AST в трансляторе), но «6:!» — это уже что-то за гранью разумного. Есть какое-нибудь логичное объяснение, откуда такие названия?
В дополнение к ссылкам крайне рекомендую J Reference Card for 6.02
www.jsoftware.com/jwiki/HenryRich?action=AttachFile&do=view&target=J602_RefCard_color_letter_current.pdf
Без такой таблицы поиск нужных глаголов, в процессе изучения, может очень растянуться.
www.jsoftware.com/jwiki/HenryRich?action=AttachFile&do=view&target=J602_RefCard_color_letter_current.pdf
Без такой таблицы поиск нужных глаголов, в процессе изучения, может очень растянуться.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Язык программирования J. Взгляд любителя. Часть 4. Коробки и циклы. Заключение