The OpenNET Project / Index page

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

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

05.07.2019 09:43

Опубликован релиз языка системного программирования Rust 1.36, основанного проектом Mozilla. Язык сфокусирован на безопасной работе с памятью, обеспечивает автоматическое управление памятью и предоставляет средства для достижения высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime.

Автоматическое управление памятью в Rust избавляет разработчика от манипулирования указателями и защищает от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo, позволяющий получить нужные для программы библиотеки в один клик. Для размещения библиотек поддерживается репозиторий crates.io.

Основные новшества:

  • Стабилизирован типаж (trait) Future, который представляет значение, вычисление которого возможно ещё не завершено в процессе использования блоков async / .await. Определяемые при помощи Future асинхронные значения дают возможность продолжить выполнение в потоке полезной работы, попутно ожидая завершения вычислений определённого значения;
  • Стабилизирована библиотека alloc, предоставляющая умные указатели и коллекции для управления размещаемыми в памяти значениями. Для выделения памяти в std теперь применяется тип Vec, который реэкспортируются из alloc. Отдельное использование alloc имеет смысл в приложениях не привязанных к std ("#![no_std]"), а также в библиотеках, рассчитанных на применение в подобных программах без std;
  • Для обхода проверок корректной инициализации значений предложен промежуточный тип MaybeUninit, который можно использовать вместо функции mem::uninitialized, в качестве её более безопасной альтернативы. Функция mem::uninitialized удобна для быстрого создания массивов, но вводит компилятор в заблуждение, так как создаёт видимость выполнения инициализации, но в действительности значение остаётся неинициализированным. MaybeUninit позволяет явно указать компилятору, что значение неинициализировано, учесть связанное с этим возможное неопределённое поведение, а также в программах организовать проверку через "maybe_t:" и поэтапную инициализацию с пометкой её завершения при помощи вызова ".assume_init()". С появлением MaybeUninit функция mem::uninitialized переведена в разряд устаревших и не рекомендована к использованию;
  • Техника NLL (Non-Lexical Lifetimes), расширившая систему учёта времени жизни заимствованных переменных, стабилизирована для языка Rust 2015 (изначально NLL поддерживался только Rust 2018). Вместо привязки времени жизни на лексическом уровне, NLL осуществляет учёт на уровне набора указателей в графе потока выполнения. Подобный подход позволяет увеличить качество проверки заимствования переменных (borrow checker) и допустить выполнение некоторых видов корректного кода, использование которого ранее приводило к выводу ошибки. Новое поведение также существенно упрощает отладку;
  • Включена новая реализация ассоциативных массивов HashMap, основанная на применении структуры Swiss Table (автоматически загружается hashbrown::HashMap, если явно не указано иное, например, std::HashMap, который основан на SipHash 1-3). Программный интерфейс остался прежним, а заметные разработчику отличия сводятся к увеличению производительности и снижению потребления памяти;
  • В пакетный менеджер cargo добавлена опция "--offline", включающая режим работы без обращения по сети, при котором при установке зависимостей используются только прокэшированные в локальной системе пакеты. Если зависимость отсутствует в локальном кэше, то будет выведена ошибка. Для предварительной загрузки зависимостей в локальный кэш перед переходом в offline можно использовать команду "cargo fetch";
  • Реализована возможность вызова макроса "dbg!" с указанием нескольких аргументов;
  • Признак "const", определяющий возможность использования в любом контексте вместо констант, применён для методов Layout::from_size_align_unchecked, mem::needs_drop, NonNull::dangling и NonNull::cast;
  • В разряд стабильных переведена новая порция API, в том числе стабилизированы методы task::Waker, task::Poll, VecDeque::rotate_left, VecDeque::rotate_right, Read::read_vectored, Write::write_vectored, Iterator::copied, BorrowMut (для строк) и str::as_mut_ptr.


  1. Главная ссылка к новости (https://blog.rust-lang.org/201...)
  2. OpenNews: Выпуск языка программирования Rust 1.35
  3. OpenNews: Intel развивает открытую прошивку ModernFW и гипервизор на языке Rust
  4. OpenNews: Cloudflare опубликовал реализацию VPN WireGuard на языке Rust
  5. OpenNews: Выпуск операционной системы Redox OS 0.5, написанной на языке Rust
  6. OpenNews: Релиз языка программирования Rust 2018 (1.31)
Лицензия: CC-BY
Тип: Программы
Ключевые слова: rust
При перепечатке указание ссылки на opennet.ru обязательно
Обсуждение (52) Ajax | 1 уровень | Линейный | Раскрыть всё | RSS
  • 1.1, Аноним (1), 09:52, 05/07/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Почему пишут что развиваемого Mozilla? Вроде как Mozilla там уже давно не причем. Даже в оф доках мозилла не упоминается больше нигде.
     
     
  • 2.2, Аноним (2), 10:02, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • +5 +/
    Формально проект независимый, но осконвной костяк разработчиков трудоустроен в Mozilla.

    PS. https://internals.rust-lang.org/t/mozilla-is-hiring-for-the-rust-team-2019/994

     
  • 2.14, Растохейтер (?), 14:42, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Так они пишут и о том, что он системный. Мало ли что они пишут )
     

  • 1.3, Аноним (3), 10:13, 05/07/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    > обеспечивает автоматическое управление памятью

    не обеспечивает ведь, это то, что он призван избегать

     
     
  • 2.4, Аноним (4), 10:44, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • +5 +/
    автоматическое управление памятью ≠ сборка мусора
     
     
  • 3.24, Аноним (24), 17:32, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Похоже Аноним выше путает 'автоматическое' и 'динамическое' управление.
     
  • 2.5, Andrey Mitrofanov_N0 (??), 10:45, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    >> обеспечивает автоматическое управление памятью
    > не обеспечивает ведь, это то, что он призван избегать

    Вы в отрицаниях-то не путайтесь................

    То, что в ём нет сборки мусора...
    ...не означает, что "управление ресурсами" (подсчёт ссылок, передача владения, другие правильные приседания) --
    -- не управление памятью.

    ...[I]"" important in Rust because we have no pervasive GC to rely on for memory management. ""[/I] --https://doc.rust-lang.org/nomicon/obrm.html

    И да, оно "автоматическое" по большей части, видимо.  Более автоматическое, чем "традиционное" Си-шное...  КМК

     
     
  • 3.6, КО (?), 10:56, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    подсчет ссылок это тоже вариант запуска GC, но как указано в приведенной Вами цитате, он не pervasive.

     
     
  • 4.7, Andrey Mitrofanov_N0 (??), 11:04, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    > подсчет ссылок это тоже вариант запуска GC, но как указано в приведенной
    > Вами цитате, он не pervasive.

    Вы мне это прекратите,  не путайте!!!...

    ...подсчёт ссылок и подсчёт ссылок.  В rust же подсчёт ссылок, а в сканировании памяти в GC - подсчёт ссылок.

    И это три большие разницы!  Совсем не похоже даже.

     
     
  • 5.8, funny.falcon (?), 11:36, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Оппонент сказал, что RC является разновидностью GC. И это правда. Просто прочитайте немного про теорию GC.

    Все книжки, статьи по GC начинаются с того, что есть два базовых алгоритма GC: RC и TracingGC. (Базовый TracingGC в свою очередь делится на базовый Mark&Sweep и базовый copying).

    Если вы почитаете теорию по оптимизации и совершенствовании RC, то увидите, что все улучшения RC сводятся к внесению в него элементов TracingGC: cycle detection, delayed stack scanning и прочее.

    Так что, разница есть, но есть и много общего.

     
     
  • 6.9, Andrey Mitrofanov_N0 (??), 12:49, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • –2 +/
    > Оппонент сказал, что RC является разновидностью GC. И это правда.

    RC и GC - разновидности MM.

    >Просто прочитайте
    > немного про теорию GC.

    О семантике, что ли, поговорим?  Расширительное против узкого толкования?

    Спасибнунафиг.  Сам иди.

     
     
  • 7.12, funny.falcon (?), 14:01, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    https://en.m.wikipedia.org/wiki/Garbage_collection_(computer_science)

    Strategies:
    - Tracing
    - Reference Counting

    В этом вопросе я ничего не выдумываю, а пользуюсь официальной терминологией.

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

     
     
  • 8.13, Andrey Mitrofanov_N0 (??), 14:18, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • –3 +/
    Уф Спасибо за разъяснение А то уж я было подумал А не стоило, не стоило ... текст свёрнут, показать
     
  • 6.10, Andrey Mitrofanov_N0 (??), 12:55, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    >>>[B]подсчет ссылок это тоже вариант запуска GC[/B]
    > Оппонент сказал, что RC является разновидностью GC. И это правда.

    И да, он сказал совсем не это.
    Про "запуск" - особенно мило.
    Опять самозванные капитаны набегают....   Бида.

    malloc()/free() -- "это тоже вариант запуска GC" (ц) КО-самозванец.

    >Просто прочитайте немного

    Да! "Просто прочитайте", что он написал.
          

     
     
  • 7.11, Sw00p aka Jerom (?), 13:11, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    >malloc()/free() -- "это тоже вариант запуска GC" (ц) КО-самозванец.

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

     
  • 5.15, Junior frontend developer (?), 14:49, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    В расте memory management времени компиляции. То есть статический и ручной, хотя и значительно более автоматический, чем в C языках. RC сборка мусора строго по желанию.
     
  • 4.40, epishman (ok), 00:38, 06/07/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    В расте подсчет ссылок не более чем опция, основной режим - автоматическая деструкция в момент выхода переменной из области видимости.
     
     
  • 5.53, Andrey Mitrofanov_N0 (??), 12:03, 08/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    > В расте подсчет ссылок не более чем опция, основной режим - автоматическая
    > деструкция в момент выхода переменной из области видимости.

    Прямо как в Си??  Не может быть.

     

  • 1.16, user90 (?), 15:16, 05/07/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Но синтаксис-то - говна кусок! Реально блевотные рефлексы.
     
     
  • 2.17, user90 (?), 15:21, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Чо там, 3 вида скобок? Упорыши, конченные!
     
     
  • 3.19, iLex (ok), 16:06, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Там клавиатурный тренажёр. Когда через каждые две строчки приходится набирать конструкции вроде
    self.node.upgrade().unwrap().read().unwrap().db.write().unwrap().tx = num
    то начинаешь думать, что язык разрабатывался в качестве замены программы "Соло на клавиатуре" с целью повысить скорость печати кодеров.
     
     
  • 4.21, fghj (?), 16:32, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > Когда через каждые две строчки приходится набирать конструкции вроде
    > self.node.upgrade().unwrap().read().unwrap().db.write().unwrap().tx = num

    Так это же здорово, чем меньше "кодеров" которые ошибки не могут нормально обработать,
    тем лучше. Значит отличный синтаксис.

     
  • 4.23, Anonim (??), 17:14, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    >программы "Соло на клавиатуре" с целью повысить скорость печати кодеров.

    Она для этого, мягко говоря, не подходит

     
  • 3.26, freehck (ok), 19:37, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    > Чо там, 3 вида скобок? Упорыши, конченные!

    В ANSI C тоже три вида скобок. Вот же упороши конченные, а? =)

     
  • 3.35, Аноним84701 (ok), 22:00, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > Чо там, 3 вида скобок? Упорыши, конченные!

    В смысле - слишком мало вариантов написания, по сравнению с "классикой"?
    [code]
    ??=include <stdio.h>                                                                    
    %:include <stdint.h>                                                                    
                                                                                            
    int hi(void) <% return 1337; }                                                          
                                                                                            
    int main(void) <%                                                                        
        int foo[10:> = ??< 0 %> ;                                                            
        foo<:0] = 1337;                                                                      
        printf("hello %d %d", foo??(0??), hi());                                            
      return 0;                                                                              
    ??>

    % gcc -std=c99 hello.c && ./a.out
    hello 1337 1337%
    [/code]

     
     
  • 4.42, Аноним (42), 08:46, 06/07/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Триграфы в сишечке - это архаизм, а попытка их выдать за "common practice" - натягивание совы на глобус и жульничество.
     
     
  • 5.47, Аноним84701 (ok), 11:44, 06/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    > а попытка их выдать за "common practice" - натягивание совы на глобус и жульничество.

    В примере только 3 (вот ведь совпадение!) вида скобок в разных, допустимых вариантах написания.
    Где и почему вы там углядели попытку выдать эти варианты за "common practice" -- непонятно.
    Как впрочем и обоснование (не)"упоротости" по количеству задействованных вариантов скобок: 3 варианта - норма, 4 варианта "упоротость!!".


     

  • 1.18, Sphynkx (ok), 15:31, 05/07/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Надо как-то навести порядок с библиотеками. Репа большая, но много либ  брошенных, недописанных, прототипов/проб.. Что-либо серьезное написать может оказаться трудно по неожиданным причинам ;-))
     
  • 1.20, Аноним (20), 16:14, 05/07/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Был у нас в универе тренировочный проект на Си, вот всё хочу попробовать написать подобный на Rust, чтобы посмотреть, так сказать, что он из себя представляет и на сколько он "убийца Си"
     
     
  • 2.49, Илья (??), 08:16, 07/07/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Держите в курсе. Не забудьте выложить на гитхаб. Вот вам описание вашего проекта:

    "Simple, functional, free, idiomatic, component-based cross-platform toolkit for developing beautiful zero-cost reliable and efficient software."

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

     

  • 1.22, Аноним (22), 16:47, 05/07/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Мне в Расте не нравятся две вещи 1 Работа со строками Из предпосылки, что ра... текст свёрнут, показать
     
     
  • 2.25, Ordu (ok), 17:41, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    > Из предпосылки, что работа с Юникодом требует продуманного подхода разрабы Раста сделали странный вывод, что всю работу с Юникодом нужно просто переложить на плечи программистов.

    Этот вывод был сделан из другой предпосылки: zero cost abstractions. Скорость выполнения программы -- это небесплатная вещь для программиста, многие абстракции усложняют написание быстрой программы, потому что прячут тормозные операции. Но если есть корреляция между тормознутостью операции и многословностью её описания, то написание программы становится сложнее, но становится проще видеть где возникают тормоза.

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

     
     
  • 3.27, Аноним (27), 20:34, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    А ниче что уже изобрели такое понятие как DLL Правильный ответ почему они не сд... текст свёрнут, показать
     
     
  • 4.28, Ordu (ok), 20:57, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Я бы рекомендовал, прежде чем критиковать, всё же ознакомиться с документацией ... текст свёрнут, показать
     
     
  • 5.30, Аноним (27), 21:25, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Я все правильно прочитал. Ты просто не знаешь всех возможностей ICU, чтобы говорить в таком тоне про юникод и как с ним "просто" работать.

    Ты вот скажи, какой из этих двух примеров правильный:
    1. https://docs.rs/alphanumeric-sort/1.0.6/alphanumeric_sort/
    2. https://github.com/ucarion/natural-sort-rs

     
     
  • 6.32, Аноним (32), 21:36, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    https://hsivonen.fi/encoding_rs/
    https://crates.io/crates/encoding_rs
     
     
  • 7.33, Аноним (27), 21:45, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Спасибо.
    Вот все, кто там кричит, что в расте все ок с юникодом гляньте в этот проект и посмотрите сколько тут работы сделано.
     
     
  • 8.34, Аноним (32), 21:49, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Чем ты не доволен в итоге ... текст свёрнут, показать
     
     
  • 9.37, Аноним (27), 22:32, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Я всем доволен Просто не надо говорить, что вот-вот любой прям ща за пару часов... текст свёрнут, показать
     
  • 6.39, Ordu (ok), 23:17, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Я все правильно прочитал. Ты просто не знаешь всех возможностей ICU, чтобы
    > говорить в таком тоне про юникод и как с ним "просто"
    > работать.

    Каких например возможностей ICU, по-твоему, я не знаю?

    > Ты вот скажи, какой из этих двух примеров правильный:
    > 1. https://docs.rs/alphanumeric-sort/1.0.6/alphanumeric_sort/
    > 2. https://github.com/ucarion/natural-sort-rs

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

     
  • 5.31, Аноним (27), 21:33, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Еще пример https://github.com/lifthrasiir/rust-natord
     
  • 5.45, Анон54346345 (?), 10:45, 06/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    В std:str нельзя работать с графемами.
     
     
  • 6.50, Ordu (ok), 11:01, 07/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Хм. Действительно. Но я вроде видел там класс Grapheme. Попутал видимо что-то.
     
  • 4.29, Аноним (32), 21:02, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    >> Надо сначала запилить свою либу для юникода?

    Ты совсем упоролся или выпил крепко? В расте Юникод из коробки.

     
     
  • 5.41, epishman (ok), 00:43, 06/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Он не упоролся, его просто дважды на хабре упороли, и в лоре только что забанили, вот он прибежал изливать жидкость сюда :)))
     
  • 4.36, Аноним84701 (ok), 22:19, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • +1 +/
    >> zero cost abstractions
    >> Скорость выполнения программы -- это небесплатная вещь для программиста, многие абстракции усложняют написание быстрой программы, потому что прячут тормозные операции
    > А ниче что уже изобрели такое понятие как DLL? Правильный ответ почему

    Побуду Кэпом:
    если вы спрячите абстракцию в DLL, то быстрее она не станет, скорее медленнее (вызов функции VS. инлайн).
    Ваш КО.

    > Я вот про отсутствие юникода только сейчас узнал и это просто феерично.

    https://doc.rust-lang.org/std/primitive.char.html
    > A character type.
    >  The char type represents a single character. More specifically, since 'character' isn't a well-defined concept in Unicode,
    > [b]char is a 'Unicode scalar value'[/b], which is similar to, but not the same as, a 'Unicode code point'.

    Ох уж эти фееричные анонимы с фееричными комментариями к фееричным новостям.

     
     
  • 5.38, Аноним (27), 22:36, 05/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    >если вы спрячите абстракцию в DLL, то быстрее она не станет, скорее медленнее (вызов функции VS. инлайн).

    Ну не надо этого. Выше уже дали пример конвертора кодировок на расте. Иди заинлайн его. Это даже не проблема раста, это в любом ЯП так. Все что не вмещается в 25 (условно) строчек переделывается (рефакторится, называйте как хотите) в функции _со_всеми_вытекающими_ последствиями.
    Зачем? Чтобы легче было как минимум это поддерживать и тестировать. В любом ЯП.

     
     
  • 6.43, Аноним (43), 10:07, 06/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    >Иди заинлайн его.

    Может LLVM так и сделает для некоторых функций, если посчтиает нужным. С другой стороны при использовании ДЛ гарантированно не будет произведено оптимизаций кода библиотек. https://llvm.org/docs/Passes.html#transform-passes

     
  • 2.44, Аноним (43), 10:40, 06/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Ситуация потихоньку исправляется. https://doc.rust-lang.org/edition-guide/rust-2018/module-system/path-clarity.h
    mod.rs тоже больше необязателен.
     

  • 1.46, Аноним (43), 10:45, 06/07/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Раздражает - почему на первом месте при упомниании раста стоит безопасное управление паматью, а не единая, удобная система документации (в т.ч. и для сторонних библиотек).
    Это кмк самый сильный буст языку из всех возможных
     
     
  • 2.48, epishman (ok), 17:37, 06/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    Система документации хорошая, но в большинстве крейтов лишь нагенеренная дока, и пара дохлых примеров, дока это как раз слабая сторона, приходится постоянно в чятике сидеть а не работать...
     
     
  • 3.51, burjui (ok), 20:00, 07/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    А ещё, внезапно, можно читать исходники вместо того, чтобы сидеть в каком-то непонятном "чятике" и ковырять в носу. Работнички, мля.
     

  • 1.52, Zloten (?), 20:02, 07/07/2019 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Мне одному кажется, что ребята сотворили несостворимое, а именно ЯП более уродливый чем плюсы...
     
     
  • 2.54, Andrey Mitrofanov_N0 (??), 12:07, 08/07/2019 [^] [^^] [^^^] [ответить]  
  • +/
    > Мне одному кажется, что ребята сотворили несостворимое, а именно ЯП более уродливый
    > чем плюсы...

    В питоне-3 это исправят.

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



    Спонсоры:
    MIRhosting
    Inferno Solutions
    Hosting by Ihor
    Хостинг:

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