The OpenNET Project / Index page

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

Выпуск языка программирования Julia 1.7

01.12.2021 18:06

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

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

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



Новые возможности языка Julia 1.7:

  • Новый синтаксис для создания многомерных массивов. Символы точки с запятой используются для разделения измерений массива, при этом количество точек с запятой указывает размер. Например, одна точка с запятой в "[A; B]" означает конкатенацию в первом измерении (по вертикали в одномерном массиве), две точки с запятой "[A;; B]" делают это во втором измерении (по горизонтали как новую строку матрицы), три точки с запятой ";;;" в третьем и т.д.
  • Обратная косая черта (\) в конце строки внутри строкового литерала теперь удаляет символ перевода строки и отступы. Это можно использовать для разделения длинных строк на несколько строк кода без добавления лишних символов.
  • Обратная косая черта перед новой строкой в литералах запуска консольных команд `cmd \...` теперь всегда удаляет перевод строки и интерпретирует последовательность как непрерывный строковые литерал, тогда как результат раньше не был чётко определён.
  • Выражение "(; a, b) = x" для создания отдельных переменных a и b из x. Этот синтаксис эквивалентен "a = getproperty(x, :a); b = getproperty(x, :b)".
  • Неявное перемножение теперь разрешено для символов радикалов (например, x√y и x∛y).
  • Логические операторы "&&" и "||" теперь могут быть использованы применительно к элементам массива в форме ".&&" и ".||".
  • Операторы ⫪(U + 2AEA, \Top, \downvDash) и ⫫(U + 2AEB, \Bot, \upvDash, \indep) теперь могут быть использованы в качестве бинарных операторов.
  • Добавлена опция "--check-bounds=yes|no|auto" для контроля за макросами @inbounds со значением по-умолчанию auto.

Изменения языка

  • Применяемый по умолчанию генератор псевдослучайных чисел изменён с Mersenne Twister на Xoshiro256++, поэтому все случайные числа будут разными (даже с одним и тем же начальным числом), если только не используется явный объект RNG. Новый генератор имеет лучшую производительность, превосходные статистические характеристики и используется для воспроизводимой случайности в многопоточных программах (сохраняет состояние для каждой выполняемой задачи и ответвляет отдельное состояние при создании новой задачи).
  • Деструктуризация больше не изменяет значения в процессе присвоения левой части при получении значений из правой части выражения. Например, для массива x, выражение "x[2], x[1] = x" теперь будет менять местами первый и второй элемент x, в то время как ранее для заполнения обеих записей использовалось x[1] потому что x[2] изменялся в ходе итерации присвоения x.
  • macroexpand, @macroexpand и @macroexpand1 больше не генерируют ошибку LoadError. @test_throws также был изменен, чтобы сохранить работоспособными затронутые тесты.
  • Средняя точка "·" ( \cdotpU + 00b7) и греческий интерпункт ·(U + 0387) теперь обрабатываются как эквивалент оператора точки "⋅" (\cdotU + 22c5).
  • Знак минус "−" (\minusU + 2212) теперь рассматривается как эквивалент знака дефиса-минус "-" (U + 002d).
  • Iterators.peel(itr) теперь возвращает "nothing" когда itr пусто, а не выбрасывает исключение BoundsError.
  • Несколько последовательных точек с запятой в выражении массива ранее игнорировались (например, "[1 ;; 2] == [1 ; 2]"). Теперь этот синтаксис используется для разделения измерений.
  • Несбалансированные директивы форматирования "#= ... =#" в Unicode теперь запрещены в строках и комментариях, чтобы уменьшить вероятность инъекций parse/eval кода.

Изменения параметров командной строки

  • Параметр julia --project и переменная окружения JULIA_PROJECT теперь поддерживают выбор общих сред. Например, теперь эквивалентны julia --project=@myenv и export JULIA_PROJECT="@myenv".

Изменения многопоточности

  • Внутренние функции для операций с атомарными указателями теперь определены для конкретных размеров байтов.
  • Добавлена поддержка объявления и использования отдельных полей для mutable struct как атомарных; см. новый макрос @atomic.
  • Если для переменной окружения JULIA_NUM_THREADS задано значение "auto", то количество потоков будет равно количеству потоков процессора.
  • Каждый объект Task имеет локальное состояние генератора случайных чисел, что по умолчанию обеспечивает воспроизводимое (не зависящее от расписания) выполнение кода параллельного моделирования. Генератор по умолчанию также работает параллельно значительно быстрее, чем в предыдущих версиях.
  • Задачи теперь могут перемещаться между потоками. Раньше задача всегда запускалась в том потоке, который запустил ее первым.

Новые функции библиотеки

  • Добавлены методы findmax(f, domain), argmax(f, domain) и соответствующие "min"-версии с двумя аргументами.
  • isunordered(x) возвращает true, если x - это значение, которое должно быть неупорядочено, например NaN или missing.
  • Новая функция keepat!(vector, inds), которая является эквивалентом vector[inds] списка inds целых чисел.
  • Метод lock(f, lck) для двух аргументов теперь принимает Channel качестве второго аргумента.
  • Новый функтор Returns(value) возвращает value для любых аргументов.
  • Новые макросы @something и, @coalesce которые являются версиями something и coalesce, соответственно.
  • Новая функция redirect_stdio для перенаправления stdin, stdoutи stderr.
  • Новый макрос "Base.@invoke f(arg1::T1, arg2::T2; kwargs…)" обеспечивает простой синтаксис для вызова "invoke(f, Tuple{T1,T2}, arg1, arg2; kwargs...)".
  • Новый макрос "Base.@invokelatest f(args...; kwargs…)" обеспечивает удобный способ вызова "Base.invokelatest(f, args...; kwargs...)".

Новые возможности библиотеки

  • Кортеж может быть создан с ключевым словом context в формате ":key => value", чтобы указать атрибуты для передачи в IOContext.
  • bytes2hex и hex2bytes больше не ограничиваются аргументами типа "Union{String,AbstractVector{UInt8}}" и теперь требуют только того, чтобы типы были последовательностями и имели вычислимую длину.
  • stat(file) получил более подробный и удобный show метод.

Изменения стандартной библиотеки

  • count и findall теперь принимают AbstractChar аргумент для поиска символа в строке.
  • Новые методы range(start, stop) и range(start, stop, length).
  • range теперь поддерживается start как опциональный ключевой аргумент.
  • Некоторые операции с диапазонами теперь возвращают StepRangeLen вместо StepRange позволяя быть нулевым конечному шагу. Раньше λ .* (1:9) выдавал ошибку при λ = 0.
  • islowercase и isuppercase теперь обрабатывают Unicode-категории нижнего и верхнего регистра.
  • iseven и isodd функции теперь поддерживают типы отличные от Integer.
  • escape_string теперь принимает набор символов через ключевое слово keep, для символов, которые должны оставаться такими, какие они есть.
  • getindex для NamedTuple теперь принимает кортеж символов для индексации нескольких значений.
  • Подтипы AbstractRange следуют общему поведению индексации массивов при индексировании Bool, ошибках для скаляров Bool и при обработке массивов (включая диапазоны) Bool как логических индексов.
  • keys(::RegexMatch) возвращает capture-ключи регулярного выражения по имени, или по индексу, если имён нет.
  • keys(::Generator) возвращает ключи итератора.
  • RegexMatch теперь итерируется, выдавая захваченные подстроки.
  • lpad/rpad определены в для textwidth.
  • Test.@test теперь принимает именованные аргументы broken и skip, которые повторяют поведение Test.@test_broken и Test.@test_skip, но позволяют пропускать тесты, которые заваливаются только при определенных условиях. Например
    
          if T == Float64
             @test_broken isequal(complex(one(T)) / complex(T(Inf), T(-Inf)), complex(zero(T), zero(T)))
          else
             @test isequal(complex(one(T)) / complex(T(Inf), T(-Inf)), complex(zero(T), zero(T)))
          end
    
    можно заменить на
    
          @test isequal(complex(one(T)) / complex(T(Inf), T(-Inf)), complex(zero(T), zero(T))) broken=(T == Float64)
    
  • @lock теперь экспортируется из Base.
  • Экспериментальная функция Base.catch_stack() переименована в current_exceptions() и получила конкретный тип возвращаемого значения.
  • Некоторые тригонометрические функции (sind, cosd, tand, asind, acosd, asecd, acscd, acotd, atand) теперь принимают квадратную матрицу.
  • replace(::String) теперь принимает несколько шаблонов, которые будут применяться слева направо одновременно, поэтому к любому символу будет применяться только один шаблон, а шаблоны будут применяться только к входному тексту, но не к их последовательным заменам.
  • Функция length на заданных диапазонах определённых типов больше не проверяет integer-переполнение в большинстве случаев. checked_length - новая функция, которая использует проверенную арифметику до точки переполнения, если результат может быть с переносом. Или используйте пакет SaferIntegers.jl, если есть риск переполнения диапазона.
  • Новые replace методы для замены элементов в Tuple.

Менеджер пакетов

  • В режиме консоли "julia>" для using- или import-пакетов которые не установлены, но доступны в реестре "pkg> add", предлагается установить пакет автоматически.
  • Manifest.toml использует новый формат с новыми метаданными, включая версию julia, которая сгенерировала манифест. Манифесты старого формата по-прежнему поддерживаются в исходном формате, до тех пор, пока пользователь не запустит Pkg.upgrade_manifest().
  • "pkg> precompile" теперь будет предварительно компилировать новые версии уже загруженных пакетов, а не откладывать их до следующего сеанса.
  • "pkg> rm, pin и free" теперь поддерживают аргумент "--all" для вызова действия для всех пакетов сразу.
  • Реестры, загруженные с Pkg Server (не git), больше не распаковываются в файлы, а читаются непосредственно из архива в память. Чтобы отключить эту функцию, установите переменную среды JULIA_PKG_UNPACK_REGISTRY=true.
  • Теперь можно использовать внешний исполняемый файл git вместо библиотеки libgit2 по умолчанию для загрузок, которые происходят через протокол Git, установив переменную среды JULIA_PKG_USE_CLI_GIT=true.
  • Реестры, загруженные с сервера Pkg (не git), теперь считаются неизменяемыми. Изменения, внесённые вручную в их файлы, могут не быть приняты запущенным сеансом Pkg.
  • Добавление пакетов по имени каталога в режиме REPL теперь требует добавления "./" к имени, если пакет находится в текущем каталоге; например "add ./Package" вместо "add Package". Это сделано для того, чтобы избежать путаницы между именем пакета Package и локальным каталогом Package.
  • Удалено ключевое слово mode для PackageSpec.

Линейная алгебра

  • Используйте Libblastrampoline для подключения BLAS и LAPACK во время выполнения. По умолчанию OpenBLAS подключается в составе дистрибутива Julia. Новый механизм подключения может быть использован для замены BLAS и LAPACK пользовательскими настройками.
  • На aarch64 OpenBLAS теперь использует ILP64 BLAS, также как и все другие 64-битные платформы.
  • OpenBLAS обновлен до версии 0.3.13.
  • SuiteSparse обновлен до версии 5.8.1.
  • Форма матрицы UpperHessenberg сохраняется при определенных арифметических операциях, например, при умножении или делении на UpperTriangular матрицу.
  • Действительные квазитреугольные факторизации Шура теперь можно преобразовать в сложную верхнетреугольную форму с помощью выражения "Schur{Complex}(S)".
  • cis(A) теперь поддерживает матрицы как аргументы.
  • dot поддерживает UniformScaling для типа AbstractMatrix.
  • qr[!] и lu[!] теперь поддерживают значения LinearAlgebra.PivotingStrategy одноэлементного типа в качестве необязательного pivot-аргумента: значения по умолчанию qr(A, NoPivot()) по сравнению qr(A, ColumnNorm()) с поворотом и lu(A, RowMaximum()) по сравнению с lu(A, NoPivot()) без поворота. Прежние Val{true/false} вызовы устарели.
  • det(M::AbstractMatrix{BigInt}) вызывает det_bareiss(M), который использует алгоритм Bareiss для вычисления точных значений.

REPL

  • Длинные строки теперь удаляются с использованием синтаксиса "head" ⋯ 12345 bytes ⋯ "tail" при отображении в REPL.
  • Вставка Repl примеров из буфера обмена в REPL теперь поддерживает все режимы Repl ( julia, pkg, shell, help?) и режим автоматически переключается.
  • "help?>" для модулей без строк документации теперь возвращает список экспортированных имен и выводит содержимое связанного, README.md если оно найдено.

SparseArrays

  • Новый метод sizehint!(::SparseMatrixCSC, ::Integer)\.
  • cholesky() теперь полностью сохраняет указанную пользователем перестановку.
  • issparse теперь применяется согласованно ко всем массивам-обёрткам, включая вложенные, путём проверки issparse родительского массива обёртки.

Манипуляции с датами

  • Функция Dates.periods может быть использована для получения Vector-значений из Period из CompoundPeriod.

Загрузки

  • Если заголовок cookie установлен в перенаправленном запросе, cookie теперь будет отправляться в последующих запросах.
  • Если файл ~/.netrc существует, он используется как источник паролей для веб-сайтов с аутентификацией.
  • Индикация имени сервера теперь выполняется со всеми TLS-соединениями, даже если идентичность сервера не проверена (см. NetworkOptions).
  • При проверке TLS-соединений в Windows, если сервер отзыва сертификатов недоступен, соединение разрешено; это соответствует тому, что делают другие приложения и как выполняется отзыв в macOS.
  • Теперь существует 30-секундное ожидание факта соединение и 20-секундное ожидание на отправку данных. Это гарантирует, что соединения являются живыми, или же они будут отключены менее чем через минуту.

Tar

  • Tar.extract теперь игнорирует точный режим разрешений в tarball и нормализует режимы так же, как делает это Tar.create. Что аналогично git.
  • Функции, использующие архивы tar, теперь обрабатывают жесткие ссылки: целью ссылки должен быть ранее просмотренный файл; Tar.list перечисляет запись с :hardlink типом и .link полем, указывающим путь к цели; другие функции - Tar.extract, Tar.rewrite, Tar.tree_hash - преобразуют жесткую связь в копию целевого файла.
  • Стандартный формат, созданный Tar.create и Tar.rewrite теперь включает записи для непустых каталогов. Некоторые инструменты, использующие tarball (включая докер), сбиваются с толку из-за отсутствия этих записей в каталоге.
  • Tar теперь принимает tarball с начальными пробелами в восьмеричных целочисленных полях заголовка: технически это недопустимый формат согласно спецификации POSIX, но старые tar команды Solaris создавали такие архивы, поэтому этот формат действительно встречается в дикой природе, и кажется безвредным его принимать.
  • Tar.extract теперь принимает set_permissions аргумент ключевого слова, который по умолчанию равен true; если false передаётся вместо этого, разрешения извлечённых файлов не изменяются при извлечении.

Mmap

  • mmap теперь экспортируется и доступен для использования.

DelimitedFiles

  • Readdlm теперь по умолчанию использует use_mmap=false во всех операционных системах для обеспечения стабильной надёжности в ненормальных ситуациях с файловой системой.


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


Обсуждение (115) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.2, DEF (?), 18:48, 01/12/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +6 +/
    Прекрасный язык. Быстрый, современный, продуманный. Гораздо лучше помойного тормознутого Питона, который непонятно на каком основании влез в нишу BigData и DataScience.
     
     
  • 2.3, Аноним (3), 18:55, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • +10 +/
    На основании первого.
     
     
  • 3.6, Аноним (6), 18:59, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Первый язык для бигдаты конечно же кобол.  
     
     
  • 4.122, йо (?), 06:31, 05/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Cobol же для бизнеса, банки там итп. Научные вычисления только Фортран, там массивы правильно в памяти хранятся
     
     
  • 5.123, Аноним (123), 08:49, 05/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Julia хранит матрицы в таком же формате как и Фортран - упаковка по колонке. И нумерация элементов с единицы.
     
  • 2.5, Питоняка (?), 18:59, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Сейчас есть что-то проще питона для машинного обучения? Нет, потому бухтим и ждем замену питоняки.
     
     
  • 3.8, Аноним (123), 19:14, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    > Сейчас есть что-то проще питона для машинного обучения?

    Julia?

     
     
  • 4.17, анонимуслинус (?), 20:19, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • –1 +/
    серьезно? для машинного обучения? не неу можно конечно. но сколько будет камней по дороге ещё не известно.
     
     
  • 5.20, ptr (ok), 20:40, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Ну, по крайней мере в Julia нет различий между массивом для машинного обучения и массивом, как языковой конструкцией. Чего не скажешь о Python, где массив, как конструкция языка, для вектороной обработки совершенно не пригоден.
     
     
  • 6.103, Аноноша (?), 19:16, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Самая главная проблема?
     
     
  • 7.113, ptr (ok), 22:01, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    > Самая главная проблема?

    То, что проблемы производительности решаются написанием кода на C (как в numpy)? - Да!

     
  • 5.25, Аноним (123), 21:00, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    А какие с ней проблемы в части математики? И, собственно, камни уже все известны. 3 года в проде. Скорее, галька, чем камни. А вот в питоне шаг вправо, шаг влево - непреступная скала. Когда упираешься в то, что за разумное время что-то конкретное обсчитаться не может.
     
     
  • 6.54, анонимуслинус (?), 00:57, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    ну там у нас есть nympy. хотя честно сказать не уверен, что сработает для всех . обсчет задач для ученых вполне. а вот где то еще не уверен. впрочем питон хорош как язык коротких и быстрых скриптов. когда задача не растягивается на длинное полотно. там еще имеются свои проблемы с потреблением памяти при таких больших прогах на питоне. так что не скажу что идеальный язык. но удобный точно. по крайней мере в коротких обсчетах формул. где требуется не долгая работа однотипных или меняющихся функций. в той же инженерке вполне работает на ура. а для таких программ с особой "комбайностью" я бы вообще посоветовал си и питон как обвязка сверху.
     
     
  • 7.70, Аноним (70), 09:56, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Короткие формулы легко пишутся на любом скриптовом языке. Но вот раскрыть вычислительную часть на питоне невозможно. На Julia - не проблема. Тех она для учёных и хороша. Начал с маленьких формул. Не хватило - дописал на ней же то, чего не было. И ни проблем с производительностью, ни проблем с контролем памяти.
     
     
  • 8.106, economist (?), 20:04, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Python применяет матметоды Numpy - к объектам Numpy С, С , Fortran Julia быс... текст свёрнут, показать
     
     
  • 9.108, Аноним (123), 20:51, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Что тут обсуждать Если мне надо обработать, допустим, зигзагами по диагонал... текст свёрнут, показать
     
  • 5.59, lockywolf (ok), 04:21, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Есть Tensorflow для С++.

    Ну, а /me гонял мышиное обручение на Матлабе и на R.

     
  • 4.33, Аноним (33), 21:38, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Питоняка спрашивал как ему нажать 2 кнопки, и чтобы стало красиво, а ты про программирование :)
     
     
  • 5.38, Аноним (-), 22:00, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Питоняка спрашивал как ему нажать 2 кнопки

    Прогресс.

     
     
  • 6.67, Аноним (67), 09:32, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Ну, кнопку "сделать шедевр" ведь так и не изобрели. Вот, может сделают две кнопки - "сделать" и "шедевр". :)
     
  • 3.74, канонъ (?), 10:39, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • –2 +/
    не пишу на питоне, но мне интересно следующее.

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

    Машинное зрение, обучение, биг дата - питону можно доверять? может он влиять на данные/алгоритмы, к тем результатам в которых нельзя ошибиться?  

    Можно доверять питону распознавание снимков на раковую опухоль у детей?

     
     
  • 4.78, амоним (?), 11:38, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    у детей, у взрослых какая разница обучение идет по определенному алгоритму ра... большой текст свёрнут, показать
     
     
  • 5.79, амоним (?), 11:39, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    если еще точнее - то в п.2 оценивается даже не процент правильных прогнозов, а процент неправильных. и соббсно минимизируется.
     
  • 4.86, Аноним (-), 11:59, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Машинное зрение, обучение, биг дата - питону можно доверять?

    Нет, нельзя. Были же уже публикации химиков, где из-за ошибки в библиотеке питона исследования за несколько лет ушли в пустоту.

    В астрономии питон, вроде бы, уже откровенно запрещён к использованию.

     
     
  • 5.89, Anonymus444 (?), 13:35, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • –3 +/
    Ерунда полная. Ошибка библиотеки != ошибка языка.
    А сколько ракет взорвалось и полетело не туда из-за сишечки и плюсов... ууу...
    Может не будем кидаться в крайности?
     
     
  • 6.90, Аноним (90), 13:48, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Там нет "сишечки" и "плюсов".
    Почитайте про техстек и автоматизацию в ОПК.
    Большинство языков fortran-based, а все что управляет ориентацией снарядом в пространстве - работает в рил-тайм и писано на ассемблере. Да там есть обвязки Сишные, что в QNX, что в VxWorks, но ассемблер задран сильно выше уровня аппаратной абстракции, вплоть до логики и ещё выше по стеку.
     
  • 6.91, BorichL (ok), 13:50, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Ошибка в программе на С != ошибка языка. Питон не нужен.
     
     
  • 7.92, Аноним (-), 14:27, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Вопрос то про технологию был. Нафиг такой язык, где невозможно нормально отладить и проверить код. Пусть этим питоном в школах балуются. В науке ему не место.
     
     
  • 8.99, BorichL (ok), 15:59, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Не надо плохому в школе учить, а то в результате это дерьмо потом в науку потяну... текст свёрнут, показать
     
  • 5.127, Scriptor (ok), 22:59, 13/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    По поводу астрономии ссылки есть какие-нибудь?

    Ошибка в библиотеке, строго говоря, не значит ничего в плане качества языка.

     
  • 4.98, Ахахахахахахаха (?), 15:12, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Ты плуг в коде ошибку сделал, а виноват питон? Ты когда пальчик кухонным ножом порежешь кто виноват? Нож или твои кривые руки?
     
     
  • 5.100, BorichL (ok), 16:01, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > Ты плуг в коде ошибку сделал, а виноват питон? Ты когда пальчик
    > кухонным ножом порежешь кто виноват? Нож или твои кривые руки?

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

     
     
  • 6.116, Ахахахахахахаха (?), 23:19, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Для меня все ЯП, фреймворки и тд лишь инструменты для разных задач. Что-то юзаю, о чём-то могу и не знать. И отношение к ним одинаковое. Те кто топит за одно и втупую обсирает другое(попеннет переполнен этой категорией больных) мне по-определению чужды ибо идиоты. Я одинаково презираю тех кто форсит за си или за раст или ещё за что-то и гадит другие технологии. Все вы плуги патологические. Сайонара.
     
  • 5.125, _kp (ok), 14:12, 07/12/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Особенность большинства ПО на Питоне отсутстие обработки ошибок. Ну что может пойти не так?
    Портянки маловменяемых сообщений о том, что конкретно трет яйца и почему , никому не нужны, нужно надёжное ПО. Но как бы не был прост Питон, хорошего не нем написано как то мало.

    Но это скорее проблема, когда непрофессионалы пытаются  делать что то крупное или хитрое на Питоне, причем ВЕРЯ в стабильность библиотек, многие из которых ужасны.
    Это не плохо. Всегда надо стремиться к большему. Плохо только пяткой в грудь бить, и не слушать замечаний.

     
  • 4.107, economist (?), 20:08, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    80% всех ML-проектов в медицине написаны на Python, он основной язык в DL-платформах/фреймворках. Вот эти все самые про чтение КТи рентгеновских снимков - везде удав. Аж тошнит иногда от него.  
     
     
  • 5.110, Аноним (-), 20:55, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Медицинский софт очень часто ещё и под только виндовс. Это отдельный весьма странный мир со странными клиентами и странными программистами....
     
  • 2.7, Аноним (7), 19:03, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    >(; a, b) = x

    это особенно прекрасно) гораздо нагляднее чем a, b = x.a, x.b

     
  • 2.10, Аноним (-), 19:27, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • –7 +/
    питон хорош для учёных, что-то делает, но мало шансов проверить или переделать другими студентами
     
     
  • 3.13, Аноним (6), 19:54, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Что ты несешь?
     
  • 3.55, анонимуслинус (?), 01:03, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > питон хорош для учёных, что-то делает, но мало шансов проверить или переделать
    > другими студентами

    скрипт питона не переделать?  а ты случаем не перепутал с чистым бинарем? и то можно влезть и поправить. хотя кто сейчас hex редакторы видел)))
    черт возьми питонячий скрипт простым блокнотом в винте или любым текстовиком в лине  можно открыть и посмотреть. парень ты наверно питон только в ютубе видел?))

     
     
  • 4.58, Аноним (58), 04:01, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    питон - язык для непрограммистов (в данном случае ученых). На нем можно писать исключительно write-only код, но это не проблема, т. к. питон нужен для одноразовых скриптов: накидал со стековерфлоу сниппеты, запустил, скопировал вывод скрипта в буфер обмена, удалил через Shift-Delete скриптец нахрен мимо корзины, а содержимое буфера вставляешь в курсовую. Вот это прямое назначение питона.
     
     
  • 5.61, Аноним (-), 05:45, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Питон - это полноценный язык программирования. Просто твоё больное сознание низвело его до уровня скрипта.
     
  • 5.62, Аноним (-), 08:21, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Уж кому питон не нужен, так это учёным. Питон успели запихнуть в учебные планы университетов, поэтому несколько лет у него ещё есть. Но сейчас Джулию потихоньку ставят базовым ЯП. Студенты подрастут, питона больше не будет.
     
     
  • 6.64, Аноним (64), 08:55, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • –3 +/
    >Студенты подрастут, питона больше не будет.

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

     
     
  • 7.65, 1 (??), 09:04, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Повторяй эту мантру почаще
     
  • 7.66, Аноним (-), 09:18, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +4 +/
    > Питон - это профессиональный язык

    Одна проблема - нет такой области, где он был бы нужен и не создавал бы проблемы. То, что студенты его пытаются пихать куда ни попадя его не делает профессиональным.

     

  • 1.4, Аноним (6), 18:58, 01/12/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Единственный нормальный питон.
     
     
  • 2.9, Аноним (123), 19:15, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    От синтаксиса питона у Julia, к счастью, только list comprehension. Остальное - нормальное.
     
     
  • 3.11, Аноним (11), 19:37, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    >нормальное
     
  • 3.81, Аноним (81), 11:43, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Нормальное?
    Питон хоть автономный, а Julia гвоздями к LLVM приколочена.
     

  • 1.12, BratishkaErik (ok), 19:51, 01/12/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Убьёт Python?
     
     
  • 2.14, Аноним (6), 19:55, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Нет как и тайпскрипт ничего не сделает с джаваскрипт, например.
     
  • 2.16, corvuscor (ok), 20:05, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • –3 +/
    Не убьет. У Julia выше порог вхождения, плюс это не ООП в привычном понимании.
    А большинство людей даже ООП понимают на уровне "штука, чтобы делать окошки и кнопочки".

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

     
     
  • 3.26, Аноним (123), 21:04, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > У Julia выше порог вхождения

    у неё синтаксис проще питона. Каких-то нерегулярностей языка типа один стиль для numpy, другой для циклов, третий для cython, у неё тоже нет. Просто пока ещё не пишут о ней на каждом заборе, но она реально проще для освоения.

     
     
  • 4.30, Аноним (33), 21:33, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Так он ещё не углублялся, тяжео с дивана встать.
     
  • 4.126, _kp (ok), 14:42, 07/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    >> У Julia выше порог вхождения
    > у неё синтаксис проще питона... она реально проще для освоения.

    Поприятнее. Но работа с файлами и там и там брайнфак подобна.
    Если с помощью сторонних библиотек файл не переварить, изящным способом, то как для любителей Питона, приходится использовать конвертеры фалов...

     
  • 3.40, Аноним (40), 22:06, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    https://www.juliafordatascience.com/cheat-sheets/
     
     
  • 4.105, corvuscor (ok), 19:36, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Вот, за это спасибо, схоронил.
     
     
  • 5.119, anonimous (?), 01:32, 03/12/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    MATLAB–Python–Julia cheatsheet
    https://cheatsheets.quantecon.org/

     
  • 2.82, Аноним (81), 11:44, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • –1 +/
    >Убьёт Python?

    Только после того, как Rust убъёт C.

     
     
  • 3.88, Аноним (88), 12:42, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • –1 +/
    То есть скоро. Спасибо за точный прогноз.
     
     
  • 4.115, _ (??), 22:59, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Ну то есть тыЩЩа-другая лет у нас есть легко? Спасибо :)
     

  • 1.15, Массоны Рептилоиды (?), 20:00, 01/12/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > поэтому этот формат действительно встречается в дикой природе, и кажется безвредным его принимать

    Не всё, что встречается в дикой природе - можно безвредно принимать. Хотя, если в меру, то можно

     
  • 1.21, Аноним (21), 20:50, 01/12/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Очередной велосипед.
     
     
  • 2.31, Аноним (33), 21:36, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Массачусетский технологический институт (December 2011).
    Ты наверное родился позже, а теперь ревнуешь, что не тебя назвали Юлей.
     
     
  • 3.104, Аноноша (?), 19:18, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Как дата влияет на велосипед?
     
  • 3.121, Аноним (121), 18:16, 03/12/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Велосипед от MIT - уже не велосипед что ли?
     
     
  • 4.128, Аноним (128), 11:32, 19/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    В колесах меньше углов.
     

  • 1.22, economist (?), 20:50, 01/12/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    То что быстрый - хорошо. То что оброс спецсимволами - плохо.

    Читабельность кода - особо важна в DataScience, т.к. тут код перечитывается не 8 раз, а все 20, причем не-программистами. И отвест

    Python никуда не лез, его взяли на вооружением сами DS-ты именно за читаемость. А что до скорости - Numpy быстр, быстрее Pandas и так ничего нет.

     
     
  • 2.32, Аноним (33), 21:37, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Немного не так. Взяли то, что попалось под рукой. А потом обрасло библиотеками, а переписывать лень.
     

  • 1.23, Аноним (23), 20:53, 01/12/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    >динамическая типизация
    >производительность близкая к программам на языке Си

    ( ͡° ͜ʖ ͡°)

     
     
  • 2.43, Аноним (43), 22:12, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • –1 +/
    У неё не простая динамическая типизация. Она под каждый тип аргументов создаёт свои методы функций и компилирует их. Второй вызов будет использовать уже готовый откомпилированный код.
     
     
  • 3.49, Аноним (-), 22:42, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    > У неё не простая динамическая типизация. Она под каждый тип аргументов создаёт
    > свои методы функций и компилирует их. Второй вызов будет использовать уже
    > готовый откомпилированный код.

    А в огороде бузина ...
    Адепты Джулии считают, что изобрели (нет) tracing/method JIT, который "почти совсем как самая настоящая компиляция" (нет) и сводит на нет (тоже нет) все недостатки динамической типизации ...


     
  • 3.50, Аноним (23), 22:47, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Разве это не стандартная оптимизация при JIT?
    (которая не всегда применима)
     
     
  • 4.52, Аноним (52), 23:05, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    > стандартная оптимизация при JIT?

    Стандартная для чего? Каждый язык с динамической типизацией по-своему это понимает. В явном виде множественные методы - это фишка Джулии.

     
  • 2.118, anonimous (?), 01:11, 03/12/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    >>динамическая типизация
    >>производительность близкая к программам на языке Си

    можно писать без указания типов, может даже будет и быстро (если компилятор сможет догадаться), если не сможет, то медленно

    можно с указанием типов, тогда быстро всегда

    но допустимо написать и так (но лучше не нужно)

    julia> function unstable(flag::Bool)
               if flag
                   return 1
               else
                   return 1.0
               end
           end
    unstable (generic function with 1 method)

    Не надо было бы им динамику вообще делать, но вот все питонистов заманивать хотят.

    Вообще у них что из матлаба взято, то ничего, а остальное похуже.

     

  • 1.27, AirToad (?), 21:20, 01/12/2021 Скрыто ботом-модератором [﹢﹢﹢] [ · · · ]     [к модератору]
  • –3 +/
     
     
  • 2.34, Аноним (34), 21:40, 01/12/2021 Скрыто ботом-модератором     [к модератору]
  • +/
     
     
  • 3.41, AirToad (?), 22:08, 01/12/2021 Скрыто ботом-модератором     [к модератору]
  • –1 +/
     
     
  • 4.45, Аноним (45), 22:15, 01/12/2021 Скрыто ботом-модератором     [к модератору]
  • –1 +/
     
     
  • 5.60, Тот_Самый_Анонимус (?), 05:44, 02/12/2021 Скрыто ботом-модератором     [к модератору]
  • –1 +/
     
     
  • 6.63, Аноним (-), 08:22, 02/12/2021 Скрыто ботом-модератором     [к модератору]
  • +/
     
     
  • 7.102, Тот_Самый_Анонимус (?), 17:56, 02/12/2021 Скрыто ботом-модератором     [к модератору]
  • +/
     
  • 5.68, Брат Анон (ok), 09:48, 02/12/2021 Скрыто ботом-модератором     [к модератору]
  • –2 +/
     
  • 5.71, Аноним (6), 10:24, 02/12/2021 Скрыто ботом-модератором     [к модератору]
  • +/
     
     
  • 6.73, Аноним (-), 10:27, 02/12/2021 Скрыто ботом-модератором     [к модератору]
  • +/
     
     
  • 7.75, Старший Аноним (?), 11:03, 02/12/2021 Скрыто ботом-модератором     [к модератору]
  • +/
     
  • 3.87, Sw00p aka Jerom (?), 12:30, 02/12/2021 Скрыто ботом-модератором     [к модератору]
  • –1 +/
     
  • 2.37, Ordu (ok), 21:53, 01/12/2021 Скрыто ботом-модератором     [к модератору]
  • –1 +/
     
  • 2.57, pdp11 (?), 03:07, 02/12/2021 Скрыто ботом-модератором     [к модератору]
  • +2 +/
     

     ....ответы скрыты (13)

  • 1.28, Аноним (33), 21:32, 01/12/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Даёшь больше закорючек в тексте программ, а то brainfuck поднадоел. Есть у меня такая прога, всем же код понятен?
    !{_}!#.$!@/#$*(_#!$%,/^$%^*(_&%?#^*^(*(_)(_)))+.
     
     
  • 2.35, Аноним (35), 21:41, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Это к математикам. У них много непонятных символов. Julia просто их позволяет оттуда использовать один в один. Символ радикала, надеюсь, не надо объяснять?
     
  • 2.36, Аноним (-), 21:41, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Не совсем. Подробнее
     
  • 2.56, анонимуслинус (?), 01:13, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Даёшь больше закорючек в тексте программ, а то brainfuck поднадоел. Есть у
    > меня такая прога, всем же код понятен?
    > !{_}!#.$!@/#$*(_#!$%,/^$%^*(_&%?#^*^(*(_)(_)))+.

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

     
  • 2.72, Аноним (6), 10:26, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Давно уже пора на эмоджи в программировании переходить. Эти ваши архаичные смайлики отстали от жизни.  
     
     
  • 3.94, Не тормози плужок (?), 15:01, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Давно уже можно использовать то что кому нравится, а не полыхать по любой фигне.
     

  • 1.39, Аноним (-), 22:05, 01/12/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Ну чего вы, вот например плоты,

    using Plots
    x = 1:10; y = rand(10); # These are the plotting data
    plot(x, y)

    оп и красота и свестит и пердит
    http://docs.juliaplots.org/latest/tutorial/

    точказапятая есть, что еще надо ?

     
     
  • 2.42, Аноним (40), 22:08, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    https://makie.juliaplots.org/stable/ поживее. А https://juliagraphics.github.io/Luxor.jl/stable/example/moreexamples/ красивше.
     
     
  • 3.46, Аноним (-), 22:15, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • –1 +/
    ну и нафиг оно кому надо ? домики сердечки рисовать
     
     
  • 4.53, Аноним (123), 23:13, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Рисовать exp(-((x-4)^2+(y-4)^2)^2/1000) + exp(-((x+4)^2+(y+4)^2)^2/1000) + 0.1exp(-((x+4)^2+(y+4)^2)^2)+0.1exp(-((x-4)^2+(y-4)^2)^2)
     
  • 4.95, Не тормози плужок (?), 15:02, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Так не рисуй. Тебя чё, заставляет кто-то? Психопат ёпт🤣
     
  • 2.44, Аноним (-), 22:13, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    А с другой стороны:

    > Julia is dynamically typed, feels like a scripting language,

    acc = Atomic{Int64}(0)

    Прям вот ощущаю теплоту и ламповость скриты.

    Плюсы закончились на точказапятой.

     
     
  • 3.47, Админ (?), 22:28, 01/12/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    А с другой стороны вот есть

    using Mmap
    A = rand(1:20, 5, 30)
    s = open("/tmp/mmap.bin", "w+")
    # We'll write the dimensions of the array as the first two Ints in the file
    write(s, size(A,1))
    write(s, size(A,2))
    # Now write the data
    write(s, A)
    close(s)

    # Test by reading it back in
    s = open("/tmp/mmap.bin")   # default is read-only
    m = read(s, Int)
    n = read(s, Int)
    A2 = mmap(s, Matrix{Int}, (m,n))


    Но тут вот чем дальше тем больше покидает ощущение нужности этой штуковины

     
     
  • 4.117, anonimous (?), 00:53, 03/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    using JLD
    A = rand(1:20, 5, 30)
    save("myfile.jld", "arr", A)
    A = load(myfile.jld", "arr")
     
     
  • 5.120, Аноним (123), 07:53, 03/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    JLD2 в чисто джулийной реализации, а не JLD. А так, ещё можно BSON.jl, Blosc.jl, Parquet.jl и пр. из https://github.com/orgs/JuliaIO/repositories...  Или даже обёртку для версионности https://juliadynamics.github.io/DrWatson.jl/dev/real_world/
     
  • 5.124, Аноним (-), 11:35, 06/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    опеннетные пользователи жульки - обычные жс нпм,карго усеры качающие всеподряд и не разбирающиеся в самом языке. чувак же цепочку нужности типов(усложненных) пытался развернуть.
     

  • 1.69, Брат Анон (ok), 09:50, 02/12/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    И конкурсы у них тоже интересные...
     
  • 1.77, Старший Аноним (?), 11:09, 02/12/2021 Скрыто ботом-модератором [﹢﹢﹢] [ · · · ]     [к модератору]
  • –3 +/
     

     ....ответы скрыты (3)

  • 1.109, Аноним (109), 20:53, 02/12/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Какой-то он шляпный. И куда с этой Julia? Не прокормишься. PHP наше всё)
     
     
  • 2.111, Аноним (-), 20:58, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Если кормиться в вебе, то лучше Ruby или Go. На Julia сейчас либо исследовательские проекты, где денег мало. Либо там, где деньги вообще не считают, но уже не в России. Впрочем, интерес к ней растёт. Недавно для singularity.net искали программистов именно на Julia.
     
     
  • 3.112, Аноним (109), 21:30, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Так Ruby вроде умер или всё же жив? А что по Go?
     
     
  • 4.114, Аноним (-), 22:53, 02/12/2021 [^] [^^] [^^^] [ответить]  
  • +/
    > Так Ruby вроде умер или всё же жив?

    Зарплаты на нём не снижаются. Интерес со стороны заказчиков опять появляется.

    >  А что по Go?

    Переносить логику, которая должна быть быстрой. Для тех, кому Java и Rust не нравятся.

     

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



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

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