The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Опубликован язык программирования Julia 1.11

10.10.2024 21:09

Опубликован релиз языка программирования Julia 1.11, сочетающего такие качества как высокая производительность, поддержка динамической типизации и встроенные средства для параллельного программирования. Синтаксис Julia близок к MATLAB с заимствованием некоторых элементов из Ruby и Lisp. Метод манипуляции строками напоминает Perl. Код проекта распространяется под лицензией MIT.

Ключевые особенности языка:

  • Высокая производительность: одной из ключевых целей проекта является достижение производительности близкой к программам на языке Си. Компилятор Julia основан на наработках проекта LLVM и генерирует эффективный нативный машинный код для многих целевых платформ;
  • Поддержка различных парадигм программирования, включая элементы объектно-ориентированного и функционального программирования. Стандартная библиотека предоставляет в том числе функции для асинхронного ввода/вывода, управления процессами, ведения логов, профилирования и управления пакетами;
  • Динамическая типизация: язык не требует явного определения типов для переменных по аналогии со скриптовыми языками программирования. Поддерживается интерактивный режим работы;
  • Опциональная возможность явного указания типов;
  • Синтаксис, превосходно подходящий для численных вычислений, научных расчётов, систем машинного обучения и визуализации данных. Поддержка многих числовых типов данных и средств для распараллеливания вычислений.
  • Возможность прямого вызова функций из библиотек на языке Си без дополнительных прослоек.



Основные изменения в Julia 1.11:

  • Новые возможности языка
    • Добавлен тип Memory, который является низкоуровневой альтернативой типу Array. Тип Memory требует меньших затрат и имеет быстрый конструктор, являясь при этом альтернативой Array там, где не требуется полный набор его возможностей. Например, многомерные массивы. Во внутренней реализации, большая часть методов типа Array реализована поверх типа Memory, что существенно ускорило некоторые функции, например push.
    • Добавлено ключевое слово "public". Идентификаторы, которые промаркированы как "public", рассматриваются как внешний программный интерфейс. Идентификаторы с ключевым словом "export" рассматриваются похожим образом. Но основное различием между "public" и "export" в том, что имена, помеченные "public", не включаются в контекст модуля при использовании "using" в зависимых модулях.
    • Пакет ScopedValue реализует динамическую область видимости при использовании в параллельном программировании Threads/tasks.
    • Файл Manifest.toml теперь может быть переименован в формате Manifest-v{major}.{minor}.toml для использования конкретной версией Julia. Например, файл Manifest-v1.11.toml будет использован версией 1.11, а файл Manifest.toml в той же директории будет использоваться прочими версиями Julia.
    • Добавлена поддержка Unicode 15.1.
  • Изменения в языке
    • В процессе прекомпиляции обработчик "atexit" запускается до формирования результирующего файла. Это позволяет пользователям безопасно завершать фоновое выполнение (например триггеры по таймеру или периодические оповещения), а также явно высвобождать ресурсы перед завершением программы.
    • Файлы покрытия кода и выделения памяти больше не формируются в процессе прекомпиляции. Кроме того, в этих режимах кэши pkgimage используются для пакетов, которые также не отслеживаются. Это означает, что тесты покрытия (по умолчанию для julia-actions/julia-runtest) используют кэши pkgimage для всех остальных пакетов, от которых зависит тестируемый. Это позволяет ускорить тестирование.
    • Указание пути в JULIA_DEPOT_PATH теперь обрабатывается иначе. При наличии одного пути, только этот путь будет вставлен в значение внутренней переменной DEPOT_PATH. Если последним символом является ":", то переменная DEPOT_PATH получит значение, содержащее всё то, что было указано до ":", а также перечень системных путей, где находится Julia.
    • Файлы кэша предварительной компиляции теперь можно перемещать, а их актуальность теперь проверяется с помощью хеша содержимого исходных файлов, а не с помощью "mtime".
  • Улучшения компилятора/среды выполнения
    • Обновлена эвристика сборщика мусора, позволяющая работать со страницами памяти в целом вместо индивидуальных объектов.
    • Добавлена поддержка аннотирования Base.@assume_effects в коде.
  • Изменения параметров командной строки
    • Точка входа теперь строго определена как Main.main(args). Точка входа должна быть определена макросом @main (см. документацию). Если точка входа задана в скрипте, запускаемом в командной строке (например "julia script.jl или julia -e expr"), julia запустит функцию Main.main автоматически. Это сделано для унификации исполнения скриптов и их компиляции, когда загрузка кода может происходить для компиляции, а выполнение метода Main.main только на этапе запуска исполняемого файла. При использовании Julia в интерактивном режиме изменений нет. Весь код исполняется последовательно. Аргументы "--compiled-modules" и "--pkgimages" могут быть выставлены в режим existing, который заставляет Julia использовать существующие кэши, но не создавать новые.
    • Аргумент "--project" теперь может получать значение @script для указания размещения файла Project.toml относительно запускаемого скрипта. Например "--project=@script/foo" для поддиректории foo. Если ничего не указано, то есть "--project=@script", это будет аналогично "--project=@.", когда файл Project.toml ищется в текущей директории.
  • Многопоточные изменения
    • В макросе Threads.@threads можно указать режим планировщика :greedy, который удобен для неравномерной вычислительной нагрузки. Новая структура (со спецификатором public, но не export) "struct Base.Lockable{T, L<:AbstractLock}" представляет собой обёртку для упорядочивания параллельного доступа к элементам составных типов, в целом упрощая код.
  • Изменения системы сборки
    • Файл Makefile для сборки Julia и LLVM использует стратегии оптимизации PGO и LTO. См. contrib/pgo-lto/Makefile.
  • Новые библиотечные функции
    • Добавлены три новых типа в рамках идеи текста с аннотацией - Pair{Symbol, Any}, например ':lang => "en"' или ':face => :magenta'. Если это возможно, то аннотации сохраняются в процессе операций над строками, например конкатенции.
    • Конкретный тип AnnotatedString реализует AbstractString. Этот тип является обёрткой над строкой, позволяя добавить аннотацию по диапазону символов. Тип AnnotatedString широко используется в новой стандартной библиотеке StyledStrings для отображения информации на экране со стилем.
    • Конкретный тип AnnotatedChar реализует AbstractChar. Является обёрткой над символом и позволяет присоединить список аннотаций к нему.
    • Конкретный тип AnnotatedIOBuffer реализует IO, повторяет интерфейс типа IOBuffer, но имеет специализированные методы read/write для аннотирования потока. Может использоваться как построитель строк или как средство склейки аннотированных и не аннотированных строк.
    • Метод "in!(x, s::AbstractSet)" всегда возвращает true. Но если элемент x не входит в s, то он будет вставлен.
    • Новая функция Libc.mkfifo является обёрткой C-функции mkfifo для Unix платформ.
    • Метод "logrange(start, stop; length)" создаёт логарифмическую последовательность с указанным количеством, вместо фиксированного шага.
    • Методы "copyuntil(out, io, delim)" и "copyline(out, io)" копируют данные из потока io в поток out::IO.
    • Метод "eachrsplit(string, pattern)" возвращает итератор по разбитым элементам строки справа налево.
    • Метод Sys.username() возвращает имя текущего пользователя.
    • Методы Sys.isreadable(), Sys.iswritable() могут быть использованы для определения разрешений пользователя на чтение и запись данных.
    • Метод GC.logging_enabled() возвращает true если журналирование операций сборщика мусора включено через GC.enable_logging.
    • Тип IdSet теперь экспортируется из Base и является общедоступным.
    • Макрос "@time" теперь сообщает значение счётчика конфликтов блокировки, если используется ReentrantLock, который необходимо ожидать. А также добавлен макрос "@lock_conflicts", которые возвращает этот счётчик.
    • Макрос Base.Cartesian.@ncallkw разработан по аналогии с Base.Cartesian.@ncall, но позволяет добавить аргументы в форме ключевых слов для вызова функции.
    • Новая функция Docs.hasdoc(module, symbol) сообщает имеет ли запрошенное имя symbol описания docstring.
    • Новая функция Docs.undocumented_names(module) возвращает имена недокументированных функций запрошенного модуля module.
  • Новые возможности известных методов
    • Метод invmod(n, T) для предопределённого целого типа T теперь вычисляет обратное по модулю целое n по новому алгоритму.
    • Метод invmod(n) предоставляет сокращённую форму вызова invmod(n, typeof(n)) для целых типов.
    • Метод replace(string, pattern...) теперь поддерживает опциональный аргумент IO для возврата значения в поток вместо возврата строки типа String.
    • Новые методы allequal(f, itr) и allunique(f, itr) с аргументом функции-предиката.
    • Метод sizehint!(s, n) теперь поддерживает опцию "shrink", позволяющую отключить отсечку элементов.
    • Передача IOBuffer как аргумента stdout при порождении процессов, теперь работает с полной синхронизацией "wait" или "success", поэтому в Base.BufferStream нет больше необходимости проверки доступности.
    • Метод "closewrite" больше не вызывается автоматически для переданного потока после закрытия процесса. Используйте метод "wait" для процесса, а затем принудительно вызывайте "closewrite". Или используйте форму метода open с функций для автоматической обработки закрытия.
    • Метод "@timed" теперь дополнительно возвращает оценку времени компиляции и перекомпиляции, обусловленной нестабильностью типов.
    • Метод "filter" теперь может работать с NamedTuple.
    • Метод Iterators.cycle(iter, n) запускается на итераторе "iter" фиксированное n число раз.
    • Метод zero(::AbstractArray) применяется рекурсивно, например zero([[1,2],[3,4,5]]) порождает [[0,0],[0,0,0]] вместо генерации ошибки.
    • Метод include_dependency(path; track_content=true) подключает зависимости на основе хэш-значения прекомпилированного кода, а не mtime.
  • Изменения базовой библиотеки
    • Метод write(::IO, ::AbstractArray) используется для рекурсивного вызова методов "write" для каждого элемента массива, но теперь записывается представление в памяти каждого значения. Например, вызов write(io, 'a':'b') запишет 4 байта каждого символа, вместо сокращенного представления UTF-8 для каждого из них. Новый формат совместим с Array, делая возможным использовать метод "read!" для обратного чтения значений.
    • Невозможно определить метод "length" для итераторов с состоянием в общем виде. В связи с потенциально некорректной работой итераторов Stateful, метод length(::Stateful) удалён.
    • StyledStrings
      • Новая стандартная библиотека для стилевого представления строк.
      • Структура Faces является контейнером стилевой информации (цвет, декораторы и пр.), а также предоставляет каркас удобного, расширяемого (via addface!), и адаптируемого (с применением пользовательских Faces.toml и loadfaces!) подхода к отображению содержимого со стилями.
      • Макрос @styled_str предоставляет удобный способ создания аннотированных строк AnnotatedString с различными атрибутами-стилями. Например,
        
           StyledStrings.addface!(:orange => StyledStrings.Face(foreground = 0xFF7700))
           styled"{orange:this is orange text}"
        
    • Libdl
      • Новый тип LazyLibrary экспортируется из библиотеки Libdl для создания ленивых цепочек загрузки библиотек, изначально используемых в формате JLL.
    • LinearAlgebra
      • Метод cbrt(::AbstractMatrix{<:Real}) теперь возвращает матрицу действительных значений квадратных корней для входной матрицы действительных значений.
      • Метод вычисления собственных значений "eigvals/eigen(A, bunchkaufman(B)) and eigvals/eigen(A, lu(B))" использует алгоритмы Bunchkaufman (LDL) и LU декомпозиции B, соответственно, для эффективного вычисления обобщённых собственных значений (eigen: и eigenvectors) от A и B. Вторым аргументом метода передаётся результат методов bunchkaufman или lu.
      • Специализированный метод "eigvals/eigen(::Hermitian{<:Tridiagonal})", который предназначен для симметричных тридиагональных матриц и использует средства LAPACK.
      • Структурированные матрицы теперь сохраняют оси родительских(для Symmetric/Hermitian/AbstractTriangular/UpperHessenberg), либо оси главных диагоналей (для ленточных матриц).
      • Методы bunchkaufman и bunchkaufman! теперь определены для типов AbstractFloat, Rational и их комплексных вариаций. Метод bunchkaufman теперь поддерживает типы Integer, внутренне преобразуя их к Rational{BigInt}. Добавлена функция inertia, которая вычисляет инерцию диагонального фактора процедуры BunchKaufman для объекта действительной симметричной или Эрмитовой матрицы. Для комплексных симметричных матриц, метод inertia только вычисляет количество собственных значений диагонального фактора.
      • Пакеты, который определяют метод матричного умножения mul! с сигнатурой mul!(::AbstractMatrix, ::MyMatrix, ::AbstractMatrix, ::Number, ::Number) больше не будут иметь неоднозначность, взаимодействуя с пакетом LinearAlgebra. Ранее при умножении возникали неоднозначности между пользовательским типом матрицы MyMatrix и структурированными матрицами, предоставляемыми пакетом LinearAlgebra, например AbstractTriangular. Подобные проблемы устранены для операций mul! с типами матрица-вектор.
      • Методы lu и issuccess(::LU) теперь поддерживают аргумент allowsingular. Если он имеет значение true, допустимая факторизация с фактором U с недостаточным рангом будет считаться успешной, а не выдавать ошибку. Такие факторизации теперь отображаются путем печати множителей вместе с пометкой "rank-deficient", а не сообщения "Failed Factorization".
    • Random
      • Метод rand теперь применим для типов, переданных в форме Tuple.
      • Метод rand теперь применим для типов, переданных в Pair.
      • Для начального запуска генератора случайных чисел RNG модуля Random теперь можно использовать отрицательные числа.
      • Инициализация генератора случайных чисел теперь может быть выполнена строкой, например seed!(rng, "a random seed").
    • REPL
      • Нажатие на клавишу Tab для завершения подсказки теперь подсвечивается светлым шрифтом. Для выключения этого режима примените Base.active_repl.options.hint_tab_completes = false интерактивно или в скрипте startup.jl:
        
         if VERSION >= v"1.11.0-0"
          atreplinit() do repl
              repl.options.hint_tab_completes = false
          end
        end
        
      • Meta-M с пустым приглашением теперь переключает контекстный модуль между предыдущим неосновным контекстным модулем и основным, упрощая переключение туда и обратно.
    • Dates
      • Недокументированная функция adjust больше не экспортируется, но задокументирована.
    • Statistics
      • Пакет Statistics теперь является обновляемым без всего комплекта Julia.
    • Distributed
      • Метод pmap теперь использует по-умолчанию CachingPool.
  • Устаревшие и удалённые методы
    • Методы Base.map, Iterators.map, и foreach с единственным аргументом больше не поддерживаются.
  • Внешние зависимости
    • Библиотека libuv обновлена с версии 1.44.2 до 1.48.0.
    • Метод tput больше не используется для проверки возможностей терминала. Он заменён средствами разбора terminfo, реализованными полностью на Julia.
    • Terminfo используется по умолчанию. Если в системе он отсутствует, то Julia может быть собрана с опцией Makefile WITH_TERMINFO=0.
  • Улучшения инструментов
    • CI теперь выполняет ограниченную автоматическую проверку типов во всех запросах слияния.


 
  1. Главная ссылка к новости (https://julialang.org/blog/202...)
  2. OpenNews: Выпуск языка программирования Julia 1.10
  3. OpenNews: Новый открытый динамический язык программирования Julia, использующий наработки проекта LLVM
  4. OpenNews: Выпуск языка программирования Zig 0.11.0
  5. OpenNews: Релиз языка программирования Nim 2.0
  6. OpenNews: Выпуск языка программирования Crystal 1.6
Автор новости: Аноним
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/62026-julia
Ключевые слова: julia
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (103) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, corvuscor (ok), 21:40, 10/10/2024 [ответить] [﹢﹢﹢] [ · · · ]  []     [к модератору]
  • +/
    Хороший, годный язык.
    Жаль только, что на RISC-V не хотят портировать.
     
     
  • 2.2, Аноним (2), 21:48, 10/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Экзотика пока ещё RISC-V. Тем не менее, народ ковыряется - https://discourse.julialang.org/t/julia-installation-on-risc-v-build-failing-a
     
  • 2.39, Подпынявый Швайнокарась (?), 06:30, 11/10/2024 [^] [^^] [^^^] [ответить]  []     [к модератору]
  • +9 +/
    > Жаль только, что на RISC-V не хотят портировать.

    Потому что никто не будет делать научные расчёты на одноплатниках с производительностью четвёртого пня.

     
     
  • 3.52, Аноним (52), 09:52, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Так RISC-V в перспективе это ещё и суперкомпьютеры
     
  • 3.61, corvuscor (ok), 10:35, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Ох, коллега!
    Давайте вы мне не будете рассказывать, чем я буду заниматься, а чем нет.
    А то как-то неудобно выходит.
     
  • 2.93, Аноним (93), 22:51, 11/10/2024 [^] [^^] [^^^] [ответить]  []     [к модератору]
  • +/
    Да и на расте переписывать никто не спешит. Сразу видно - очередное нинужно эта ваша Julia.
     

  • 1.3, Филимон Любопытный (?), 22:04, 10/10/2024 [ответить] [﹢﹢﹢] [ · · · ]  [] []     [к модератору]
  • +/
    Кто-нибудь знает почему на FreeBSD Julia не собирается из портов и как это исправить ?
     
     
  • 2.5, Аноним (2), 22:18, 10/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +1 +/
    Вообще-то вот инструкция - https://docs.julialang.org/en/v1/devdocs/build/freebsd/. Если не работает, имеет смысл открыть issue на гитхабе.
     

  • 1.6, Самый Лучший Гусь (?), 22:36, 10/10/2024 [ответить] [﹢﹢﹢] [ · · · ]  [] []     [к модератору]
  • +3 +/
    Довольно сложный язык много подводных камней и непоняток
     
     
  • 2.8, Аноним (-), 22:47, 10/10/2024 [^] [^^] [^^^] [ответить]  []     [к модератору]
  • +1 +/
    Как язык Julia очень проста. Синтаксис за вечер можно освоить. Сложности могут быть с написанием макросов, но они начинающим не нужны. И есть очевидные сложности изучения новых библиотек.
     
     
  • 3.54, Аноним (54), 10:04, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Джулию не понимает чатгпт, поэтому сложна. И на курсах от скилбрейнс не преподают. Это чтобы её выучить надо книги читать, а не видео смотреть - вкатун такое не выучит.
     
     
  • 4.60, Аноним (2), 10:32, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Чатгпт понимает. Могут быть некоторые проблемы, если задача касается библиотек, где сильно меняли API, но в целом, работает. Причём, были даже наблюдения, что генерируемый на Julia код в целом правильнее, чем на Питоне (сказывается, что на Джулии студенты и школьники свои поделки на гитхаб не выкладывают).
     
     
  • 5.68, Аноним (68), 11:45, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Он даже питон не понимает и генерирует совершенно случайный булшит, который каким-то чудом может работать (хоть и не так, как предполагает бот). А вы тут хотите от него эзотерические языки.
     
     
  • 6.79, Аноним (2), 14:23, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    https://discourse.julialang.org/t/julia-ranking-fairly-good-in-code-generating
     
  • 6.86, decaprox (?), 16:37, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Ну хз, чувак, я регулярно генерирую вспомогательные скрипты в chatgpt и claude.
    Периодически использую claude для генерации простых драйверов. Там это крайне удобно: создаешь проект, заливаешь в knowledge base datasheet и всякую сопутствующую инфу а-ля стиль кодирования и т.д. Даешь задачу оно генерит. Это как иметь виртуального джуна, но как и за реальным за ним надо проверять, что оно сделало. Но в целом каких-то радикальных промахов обычно не бывает.
     
     
  • 7.88, Аноним (68), 18:38, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +1 +/
    Генеративные сети могут экономить время на тривиальщине, но ровно до тех пор, пока не окажется, что они его не экономят, а цена ошибки ощутимо возрастает (как и их количество). И если чатгпт хотя бы генерирует код, который в теории как-то работает (чего может даже оказаться достаточно, хотя обычно надо несколько раз указать на проблемы), то клауде генерирует какую-то дичь, надёрганную непонятно как и откуда, которая выглядит замечательно (по сравнению с тем же чатгпт), но содержит невообразимое количество ошибок, которые ты ещё долго бкдешь искать. Ой, даже не начинай, чувак.
     
  • 2.105, Аноним324 (ok), 21:03, 12/10/2024 [^] [^^] [^^^] [ответить]  []     [к модератору]
  • –1 +/
    Обычный матлабообразный фотраносодержащий язык. Все непонятки возникают если ты начинаешь мыслить как программист, а не как инженер или учёный.
     

  • 1.7, Аноним (7), 22:44, 10/10/2024 [ответить] [﹢﹢﹢] [ · · · ]  [] []     [к модератору]
  • +/
    В принципе, хороший язык с достойно организованной ориентацией на научные вычисления. Дай Дарвин ему ресурсов для развития. Но сам нашёл лучшую замену. Язык, компилируемый в бинарный код, работающий без всяких прослоек. Рекламировать не буду.
     
     
  • 2.9, Bonbon (?), 22:49, 10/10/2024 [^] [^^] [^^^] [ответить]  []     [к модератору]
  • +4 +/
    Асемблер?
     
     
  • 3.81, Аноним (81), 14:34, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    C
     
  • 2.10, ddp (?), 22:56, 10/10/2024 [^] [^^] [^^^] [ответить]  []     [к модератору]
  • +1 +/
    да вы интриган! И я заинтригован.
     
  • 2.11, Самый Лучший Гусь (?), 23:04, 10/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Rust не считается за замену. Он не предназначен для научных рассчетов.
     
  • 2.13, Эндрю Келли (?), 23:23, 10/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Zig?
     
  • 2.19, Аноним (19), 01:01, 11/10/2024 [^] [^^] [^^^] [ответить]  []     [к модератору]
  • +1 +/
    Если пригоден для научных вычислений, компилируемый сразу в машинный код... С++ !
     
     
  • 3.120, случайноувидел (?), 11:30, 16/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    FORTRAN же!
     
  • 2.22, OpenEcho (?), 02:05, 11/10/2024 [^] [^^] [^^^] [ответить]  [] []     [к модератору]
  • +/
    > Язык, компилируемый в бинарный код, работающий без всяких прослоек. Рекламировать не буду.

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

     
     
  • 3.51, Аноним (51), 09:47, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Вот за это мне язык и нравится )
    (Аноним 7)
     
     
  • 4.98, OpenEcho (?), 10:51, 12/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +1 +/
    > Вот за это мне язык и нравится )
    > (Аноним 7)

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

     
  • 2.23, Аноним (23), 02:38, 11/10/2024 [^] [^^] [^^^] [ответить]  [] []     [к модератору]
  • +/
    Я тоже на естественный отбор надеюсь, но в другом смысле.

    Julia создали как язык, который решит "проблему двух языков" (прототип приходится делать на одном удобном языке типа питона, релиз на другом быстром типа C++; неудобно, поэтому делаем язык, удобный как питон и быстрый как C++).

    В итоге получилось, что Julia не прыгает выше питоновских JIT'ов и математических либ и назначение языка замяли. Зачем он теперь нужен? Просто так.

    В сообществе пользуются уникальным термином "time to first plot" (время до первого графика), потому что запуск тормозит. Статические бинарники занимали сотни мегабайт, память не экономит, часть решений продиктована NIH-синдромом (конкатенация строк через оператор умножения).

     
     
  • 3.28, Аноним (28), 02:59, 11/10/2024 [^] [^^] [^^^] [ответить]  []     [к модератору]
  • +/
    > конкатенация строк через оператор умножения

    Оператор + тоже некорректно использовать несмотря на популярность этого в мейнстримных языках.

     
     
  • 4.32, Аноним (23), 03:32, 11/10/2024 [^] [^^] [^^^] [ответить]  []     [к модератору]
  • +7 +/
    str1 + str2 - узнаваемость, правило наименьшего удивления.
    [str1 str2] - математичность, преемственность с MATLAB/Octave
    str1 * str2 - "видали как я могу, а!? да я три бутылки залпом могу"
     
     
  • 5.89, Sem (??), 18:45, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    А str1.str2 забыли
     
  • 5.108, Прохожий (??), 01:56, 13/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Как уже заметили выше, забыли str1.str2 (Perl).
    Добавлю str1 || str2 (PL/SQL).
     
     
  • 6.111, Аноним (111), 16:16, 13/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Добавлю тогда уж до кучи Visual Basic: Str1 & Str2 (кстати тоже логичный как и Str1 + Str2)
     
  • 6.118, mos87 (ok), 21:08, 13/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Это обычный оператор стандартного SQL

    Умничанье не проканало.

     
  • 4.42, Аноним (2), 07:35, 11/10/2024 [^] [^^] [^^^] [ответить]  []     [к модератору]
  • +1 +/
    Во-первых, для конкатенации есть метод string("abc", "def"), который ещё и типы умеет преобразовывать. А во-вторых, объяснение почему нельзя использовать * как операцию склейки приводится тут - https://docs.julialang.org/en/v1/manual/strings/#man-concatenation

    Причина в том, что с математической точки зрения операция + должна гарантировать коммутативность. То есть 1 + 2 == 2 + 1. Но со строками это не проходит. А вот операция матричного умножения не является коммутативной по определению. Поэтому её и взяли для конкатенации.

     
     
  • 5.46, Аноним (23), 08:04, 11/10/2024 [^] [^^] [^^^] [ответить]  []     [к модератору]
  • +/
    > с математической точки зрения операция + должна гарантировать коммутативность
    > In mathematics, + usually denotes a commutative operation (#man-concatenation)

    .

    > должна гарантировать
    > usually denotes

    ...

    Её взяли из-за NIH-синдрома. Так-то и операция умножения над векторами должна умножать вектора.



    'abc' * transpose('def') == 29696  % MATLAB


     
     
  • 6.47, Аноним (23), 08:20, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +1 +/
    Да и если избегать +, в языках программирования для конкатенации уже использовали 5 других операторов:
       ~  <>  ++  .  ..

    Julia захотела отличиться от всех этих языков (Wolfram Mathematica, Haskell, D, Lua, Perl...).

     
  • 5.85, Аноним (85), 16:24, 11/10/2024 [^] [^^] [^^^] [ответить]  [] []     [к модератору]
  • +/
    Хм, а операция умножения разве не должна быть коммутативной?
     
     
  • 6.87, Аноним (2), 16:40, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +1 +/
    >  Хм, а операция умножения разве не должна быть коммутативной?

    Матричное умножение? Нет, не должна. Матричное сложение может быть коммутативным.

     
  • 5.109, Прохожий (??), 02:00, 13/10/2024 [^] [^^] [^^^] [ответить]  []     [к модератору]
  • +/
    > А вот операция матричного умножения не является коммутативной по определению. Поэтому её и взяли для конкатенации.

    Причём здесь матрицы? Речь же о строках. По аналогии? Ну тогда так и говорить надо.

     
  • 3.49, ИмяХ (ok), 09:21, 11/10/2024 [^] [^^] [^^^] [ответить]  [] []     [к модератору]
  • +1 +/
    >>прототип приходится делать на одном удобном языке типа питона, релиз на другом быстром типа C++; неудобно

    Как это? Наоборот же, очень удобно сначала накидал тяп-ляп быстренько, чтоб работало, а потом пишешь нормально. Так всегда делается, даже если всё на одном языке. Тем более при переписывании одновременно производится и аудит и рефакторинг в одном флаконе.

     
     
  • 4.57, Аноним (-), 10:21, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +2 +/
    Если язык прототипа отличается от целевого и не используется автоматическая трансляция кода, это означает, что оба раза будет тяп-ляп. И после переписывания на другой язык придётся отдельно делать рефакторинг и переписывание уже под прод. Джулийный подход с написанием прототипа на ней же всегда будет дешевле, чем связка питон + что-то ещё. Не говоря уже о том, что квалификация одного универсального джулийного программиста будет выше, чем питониста + чеготоещениста. Он и задачу понимать будет, и оптимизацию решения.
     
  • 4.99, YetAnotherOnanym (ok), 11:09, 12/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Если тебе удобно так - ну, ок, не вопрос, пожалуйста. Кому-то (в т.ч. мне) удобнее сразу на целевом языке - не надо тратить время на изучение отдельного языка для этапа тяпляпинга, не надо насиловать мозги переключением с одного языка на другой, не надо переделывать внутреннюю логику работы программы под другой язык.
     
  • 3.102, Илья (??), 11:41, 12/10/2024 [^] [^^] [^^^] [ответить]  []     [к модератору]
  • –1 +/
    > прототип на одном удобном языке типа питона

    Часто прототипы не переписывают, а живут с ними в мучениях.

    Поэтому и нужны языки, которые и удобные, и быстрые, и гибкие. C#, go, rust.

    Питон вообще не поддается рефакторингу. Чуть что, - рантайм исключение.

    Не повторяйте ошибки

     
     
  • 4.110, Прохожий (??), 02:05, 13/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    > Питон вообще не поддается рефакторингу

    Это из чего следует?

     
     
  • 5.121, Илья (??), 11:05, 17/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Из практики. Из отсутствия культуры.

    У нас была команда пэйфон девелоперов. Так они просто писали код, затем при первой проблеме выкидывали его и переписывали с нуля.

     
  • 2.35, Аноним (35), 04:17, 11/10/2024 [^] [^^] [^^^] [ответить]  [] []     [к модератору]
  • +1 +/
    >Но сам нашёл лучшую замену. Язык, компилируемый в бинарный код, работающий без всяких прослоек. Рекламировать не буду.

    Fortran?

     
     
  • 3.36, Аноним (36), 05:46, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +1 +/
    так Фортран быстрее Си на математических вычислениях и сами математики прекрасно это знают, и задел библиотек у них в нем огромный. Поэтому спроса на новинку не будет в принципе.
     
     
  • 4.82, Аноним (81), 14:36, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    > задел библиотек

    кривых. Не стал бы доверять - пишем только сами.

     
     
  • 5.100, YetAnotherOnanym (ok), 11:23, 12/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    > кривых

    Лично провёл аудит?
    > пишем только сами.

    Лол. Успехов.

     
  • 2.50, Аноним (51), 09:46, 11/10/2024 [^] [^^] [^^^] [ответить]  [] []     [к модератору]
  • +2 +/
    Никто пока не назвал :)  Уже становится забавным. Zig — тепло, но не он.

    Ребята, ещё попытка. Компилируемый в нативный код на большинстве известных платформ и ОС. Строгая типизация. Простой как топор синтаксис. Чрезвычайно легко реализовывать научные вычисления, хотя предназначен скорее для системного программирования. Мощная система макросов. Входит в десятку языков, генерирующих наиболее быстрый код. Как уже освоивший этот язык, добавлю пару недостатков: не самая развёрнутая документация. Сравнительно медленная компиляция.

    Подпись: Аноним 7  )

     
     
  • 3.56, Аноним (56), 10:17, 11/10/2024 [^] [^^] [^^^] [ответить]  []     [к модератору]
  • +/
    this is Nim
     
     
  • 4.62, Аноним (51), 10:58, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Бинго! )
     
     
  • 5.112, Аноним (111), 16:17, 13/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Бинго - это Mojo. Хотя и Python 3.15 обещает быть компилируемым
     
  • 3.59, Аноним (68), 10:30, 11/10/2024 [^] [^^] [^^^] [ответить]  []     [к модератору]
  • +/
    Ну, явно не си, у сей со всем перечисленным всё в порядке. Видимо, плюсы.
     
     
  • 4.63, Вячеслав (??), 10:59, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +1 +/
    Это подумал Я V Z Hare Carbon Elena Это подумал Claude 3 5 Sonnet Я ... большой текст свёрнут, показать
     
     
  • 5.65, Аноним (68), 11:17, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Твой бот бракованный. У D рантайм, для системного программирования не очень. Согласно чатгпт, существуют определённые способы исключения GC, но, что-то сомнительно, видимо, это задача уровня написать ОС на GO. Nim сомнительно.
     
  • 5.67, Аноним (51), 11:30, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Што это за Claude Спросил у ChatGPT Что это за язык программирования Компил... большой текст свёрнут, показать
     
  • 2.55, Аноним (54), 10:04, 11/10/2024 [^] [^^] [^^^] [ответить]  []     [к модератору]
  • +1 +/
    Common Lisp, реализация SBCL.
     

  • 1.12, DEF (?), 23:14, 10/10/2024 [ответить] [﹢﹢﹢] [ · · · ]  [] []     [к модератору]
  • –1 +/
    Перешёл на него с убогих и тормознутых R и Python.
     
     
  • 2.16, Аноним (16), 00:45, 11/10/2024 [^] [^^] [^^^] [ответить]  []     [к модератору]
  • +2 +/
    А как же NumPy и Numba?
     
     
  • 3.44, Аноним (-), 07:45, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Слишком коряво по синтаксису. Даже близко нет лаконичности Джулии. И чрезмерный расход вычислительных ресурсов. Несерьёзно.
     
  • 2.83, Аноним (81), 14:37, 11/10/2024 [^] [^^] [^^^] [ответить]  []     [к модератору]
  • +1 +/
    Согласен с Вашими определениями. Но перешел на C++.
     

  • 1.14, Bottle (?), 00:36, 11/10/2024 [ответить] [﹢﹢﹢] [ · · · ]  [] []     [к модератору]
  • +1 +/
    У-у-ух, не нужны нам эти ваши питоны и джулии, нам подавай только ANSI C!
     
     
  • 2.119, Говносборки_конспиреишн_фузе (?), 00:09, 14/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    А , что будешь делать когда python mako затребует? Есть что то чем заменить ?
     

  • 1.17, голос из леса (?), 00:48, 11/10/2024 [ответить] [﹢﹢﹢] [ · · · ]  [] []     [к модератору]
  • +/
    Julia такое же дурацкое название как и Go. Хуже не придумаешь, гуглить что-то себе дороже. Для go уже давно синонимом стало "golang". А здесь? "Julialala"?
     
     
  • 2.20, Аноним (19), 01:04, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Juliabla
     
  • 2.21, Bottle (?), 01:18, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +4 +/
    Нормальные названия, всяко лучше, чем буквы из алфавита брать.
     
  • 2.30, DEF (?), 03:11, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    julialang.org - как бы намекает...
     
  • 2.37, Аноним (36), 05:48, 11/10/2024 [^] [^^] [^^^] [ответить]  []     [к модератору]
  • +1 +/
    а C как деды гуглили?)
     
     
  • 3.71, Аноним (71), 12:53, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Дедам это было не нужно, т.к. руководство по Си шло вместо мануала к игре под названием UNIX OS.
     
     
  • 4.84, Аноним (81), 14:40, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +1 +/
    C/C++ есть везде помимо UNIX. В этом достоинство - компилируется (адекватным компилятором) в любой системе. Недавно ради смеха взял и сделал тот же код вообще в экзотике.
     
  • 4.95, Аноним (36), 07:37, 12/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Изучая эти руководства максимум можно было достичь уррвня джуна, ибо всё описано было поверхностно. Например арифметика указателей максимум простой пример обмена значениями двух переменных. Чтоб научиться серъезно нужны были совсем другие книжки.
     
     
  • 5.96, Аноним (36), 07:43, 12/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    у меня был такой свиток, распечатанный на барабанном принтере
     
  • 2.103, Аноним (103), 19:11, 12/10/2024 [^] [^^] [^^^] [ответить]  []     [к модератору]
  • +/
    Трое создателей языка во время очередной попойки пошли к Джулии. на утро, чтобы она не подавала в суд, сказали что назовут язык в честь неё. Ведь ночка была та ещё.
     

  • 1.29, Аноним (28), 03:02, 11/10/2024 [ответить] [﹢﹢﹢] [ · · · ]  [] []     [к модератору]
  • +/
    > StyledStrings

    Зачем это на практике?

     
     
  • 2.43, Аноним (2), 07:40, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Для разукрашивания текста, выводимого в консоль. И для формирования отчётов. Идея в том, что к частям строки можно навесить атрибуты отображения, для которых прописать стиль. То есть, формируем строку в вычислительной части программы, навешиваем стили на кусочки, из которых её формируем, а потом кидаем на отображение.

    https://julialang.github.io/StyledStrings.jl/dev/examples/

     
     
  • 3.45, Жироватт (ok), 08:03, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    > отчеты

    И чем это лучше готовых шаблонов?

     
     
  • 4.48, Аноним (2), 09:20, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Поскольку оно только что появилось, очевидно, никто реального опыта использования не имеет. Чисто в теории разница с шаблонами в том, что в одном случае код надо кусочками компоновать по частям шаблона (в зависимости от того чем шаблон делаем), во втором - формируем линейную строку и полностью развязываем отображение от кода. Да ещё и можем легко нанизывать разные схемы отображения на одну и ту же строку без перекомпоновки кода.
     

  • 1.38, Подпынявый Швайнокарась (?), 06:29, 11/10/2024 [ответить] [﹢﹢﹢] [ · · · ]  [] []     [к модератору]
  • +1 +/
    > основан на наработках проекта LLVM

    И это прекрасно.

     
     
  • 2.117, mos87 (ok), 21:04, 13/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Тому що швидчее закопают
     

  • 1.64, Анон1110м (?), 11:01, 11/10/2024 [ответить] [﹢﹢﹢] [ · · · ]  [] []     [к модератору]
  • +/
    О нет. Здесь же есть вот эти end как в Pascal.
     
     
  • 2.90, Аноним (90), 18:59, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Тогда тем более годно
     
  • 2.106, Аноним324 (ok), 21:05, 12/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Которые как и в матлабе можно тупо не писать.
     

  • 1.66, Аноним (66), 11:19, 11/10/2024 [ответить] [﹢﹢﹢] [ · · · ]  [] []     [к модератору]
  • –1 +/
    >Высокая производительность

    julia - это скриптота. Поэтому о высокой производительности можно забыть. Чтобы собрать статический бинарник, придется запихивать целый интерпретатор.

     
     
  • 2.69, Аноним (69), 12:26, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Перед тем как писать комментарии, стоит хотя бы поверхностно ознакомиться с предметной областью.... Ну или почитать как работает компилятор Julia. Тесты же производительности присутствуют на главной странице сайта языка.
     
     
  • 3.72, Аноним (68), 12:55, 11/10/2024 [^] [^^] [^^^] [ответить]  []     [к модератору]
  • +/
    Мало ли, что там написано. Вон даже чатгпт утверждает, что жулия язык с динамической типизацией и рантаймом, сиречь питон, и других вариантов использования не подразумевает (т.е. нельзя как жаву скомпилировать без вм при отказе от части функциональности).
     
     
  • 4.73, Аноним (-), 13:33, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    > Мало ли, что там написано.

    А код посмотреть на гитхабе и проверить слабо?

     
     
  • 5.74, Аноним (68), 14:07, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • –1 +/
    Естественно, синтетика позволяет показывать красивые графики для недалёких. Это конкурент жаваскрипта и никому не нужен ещё один жаваскрипт.
     
  • 3.76, Аноним (66), 14:13, 11/10/2024 [^] [^^] [^^^] [ответить]  []     [к модератору]
  • +/
    Я-то знаком с этой скриптотой. Даже простой джулиевский хеллоуворлд выжирает 250 мегабайт, потому что интерпретатор запускается.
     
     
  • 4.78, Аноним (78), 14:21, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Ок. Не занимайтесь больше программированием.
     

  • 1.75, Аноним (75), 14:08, 11/10/2024 [ответить] [﹢﹢﹢] [ · · · ]  [] []     [к модератору]
  • +/
    'occursin' — наверное смешно было, когда имя функции придумывали ('случись грех'). А у меня сразу же стойкое мнение - "разрабы - придурки".
     
     
  • 2.77, Аноним (2), 14:19, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    > А у меня сразу же стойкое мнение - "разрабы - придурки".

    Нет, это всего лишь незнание английского языка в части использования глаголов с местоимением (первый аргумент) в треьем лице.

     

  • 1.91, Аноним (91), 19:42, 11/10/2024 [ответить] [﹢﹢﹢] [ · · · ]  [] []     [к модератору]
  • +/
    >поддержка динамической типизации

    Но зачем? Из-за динамической типизации куча проблем вылазит в рантайме.
    >Высокая производительность: одной из ключевых целей проекта является достижение производительности близкой к программам на языке Си. Компилятор Julia основан на наработках проекта LLVM и генерирует эффективный нативный машинный код для многих целевых платформ;

    Управления памятью в нём нет, из-за динамической типизации данные всегда придётся оборачивать и тратить дополнительное время на проверки во время исполнения.

     
     
  • 2.92, Аноним (2), 20:47, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Динамическая типизация позволяет использовать язык в блокнотике и не думать об и... большой текст свёрнут, показать
     
     
  • 3.94, Аноним (91), 23:29, 11/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +1 +/
    С учётом Хиндли-Милнера, которые используется во многих функциональных языках, н... большой текст свёрнут, показать
     
     
  • 4.97, Аноним (2), 08:28, 12/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    У вас всё замешано в кучу В Julia декларируется динамическая типизация, и это м... большой текст свёрнут, показать
     
     
  • 5.104, Аноним (91), 20:24, 12/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    >"Динамическая типизация" - это признак синтаксиса языка, а не этапа выполнения программы.

    Наоборот. Динамеческая - во премя выполнения, статическая - во время компиляции. А с точки зрения синтаксиса - явная/неявная.
    >JSON - это не тип данных, а формат обмена данными

    Да, но формат диктует определённые ограничения на типы. В каких-то языках, например Ocaml, json парсится в определённый тип, и особенности формата, например ключи в виде строк явно отображены в самом типе данных. В других языках, система типов недостаточно выразительна, чтобы описать все ограничения в виде типа, и он будет рабираться в нетипизированный объект.

     
     
  • 6.107, Аноним (2), 21:12, 12/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    > Наоборот. Динамеческая - во премя выполнения, статическая - во время компиляции.

    Если хотите, считайте, что в Джулии динамической типизации нет. Поскольку после компиляции методов с выведенными конкретными типами, никаких накладных расходов на их выполнение нет.

    > Да, но формат диктует определённые ограничения на типы.

    https://quinnj.github.io/JSON3.jl/stable/#Basic-reading-and-writing
    https://quinnj.github.io/JSON3.jl/stable/#Read-JSON-into-a-type
    https://quinnj.github.io/JSON3.jl/stable/#Parametric-types

    разбор в Dict, разбор в структуру, разбор с возможность валидации данных...

     
     
  • 7.113, Аноним (91), 17:55, 13/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    >Если хотите, считайте, что в Джулии динамической типизации нет

    Факты не зависят от желания
    >Поскольку после компиляции методов с выведенными конкретными типами, никаких накладных расходов на их выполнение нет

    Расходы есть на компиляцию. И в случае изменения типа данных на перекомпиляцию существующего кода. Например, есть функция, которая иногда по недосмотру возвращает string вместо date.
    >разбор в Dict, разбор в структуру, разбор с возможность валидации данных...

    Вы меня не поняли. В системе типов можно описать, что в качестве ключа может быть только строка, а в качестве значения не может быть, например даты. И если вы работаете с данными без схемы, например как в утилите jq, то джулия вам ничем не поможет

     
     
  • 8.115, Аноним (2), 18:55, 13/10/2024 [^] [^^] [^^^] [ответить]      [к модератору]
  • +/
    Для этого у Джулии есть прекомпиляция и запуск кода модульных тестов И бинарник... текст свёрнут, показать
     

  • 1.116, mos87 (ok), 21:00, 13/10/2024 [ответить] [﹢﹢﹢] [ · · · ]  []     [к модератору]
  • +/
    Возможно, в сабже что-то быстро.
    Но это не точно ¯\_(ツ)_/¯
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2025 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру