Представлен (https://mail.mozilla.org/pipermail/rust-dev/2012-October/002... релиз экспериментального языка программирования Rust 0.4 (http://www.rust-lang.org/), развиваемого проектом Mozilla. Rust является языком со строгой типизацией, сфокусированным на безопасной работе с памятью и обеспечении высокого параллелизма выполнения заданий (возможность порождать тысячи и даже миллионы подпроцессов). Исходные тексты проекта распространяются (https://github.com/mozilla/rust/) под лицензией MIT. Компилятор поддерживает сборку для платформ Linux (x86 и x86_64), FreeBSD (x86_64), Mac OS X (x86 и x86_64) и Windows (x86), включая возможность кросс-компиляции и сборки сразу для нескольких целевых платформ. Параллельно с Rust развивается экспериментальный браузерный движок Servo (https://github.com/mozilla/servo), написанный на языке Rust и отличающийся поддержкой многопоточного рендеринга web-страниц и распараллеливанием операций с DOM (Document Object Model).
По структуре язык напоминает C++, но существенно отличается в некоторых деталях реализации синтаксиса и семантики, а также ориентацией на блочную организацию структуры кода, которая позволяет реализовать задачи в виде легковесных сопрограмм. Автоматическое управление памятью избавляет разработчика от манипулирования указателями и защищает от возникающих из-за низкоуровневой работы с памятью проблем, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера и т.п. Rust поддерживает смесь императивных процедурных и объектно-ориентированных методов с такими парадигмами, как функциональное программирование и модель акторов, а также обобщённое программирование и метапрограммирование, в статических и динамических стилях.С момента прошлого выпуска внесено около 2200 изменений (https://github.com/mozilla/rust/wiki/Doc-detailed-release-no.... При подготовке новой версии основное внимание было уделено стабилизации синтаксиса языка и реализации поддержки передачи результатов функций через указатели. Поддержка ранее используемого метода передачи аргументов прекращена. Из других важный улучшений можно отметить начальную поддержку JIT-компиляции и "аккуратного" сборщика мусора. Вместо классов ('class') теперь предлагается использовать более простые структуры ('struct'). Переименованы некоторые неоднозначные элементы, например, вместо ret теперь следует использовать return, вместо alt - match, вместо import - use. Для эффективного взаимодействия между задачами реализована поддержка неименованных каналов (pipe), добавлена новая библиотека с инструментами синхронизации (std::sync).
<center>
<table style="border: 1px solid rgb(176, 177, 144); border-collapse: collapse; background: none repeat scroll 0% 0% rgb(221, 225, 194);" cellpadding="2" cellspacing="0" width="60%" border="1">
<tr><td><font color="#461b7e">
fn main() {
for ["Alice", "Bob", "Carol"].each |name| {
let name = copy *name;
do task::spawn {
let v = rand::Rng().shuffle([1, 2, 3]);
for v.each |num| {
io::print(fmt!("%s says: '%d'\n", name, *num))
}
}
}
}
</font></td></tr></table>
</center>Базовые возможности языка:
- Ориентация на безопасность:
- Аккуратная работа с памятью - никаких нулевых и потерянных указателей. Автоматическое управление памятью;- Контроль изменчивости. Объекты неизменяемы (Immutable) по умолчанию;
- Безопасность динамического выполнения: обработка сбоев, исключения, ведение лога, RAII / dtors;
- Typestate: возможность определения сложных инвариантов, контролирующих структуры данных.
- Ориентация на параллельность и эффективность кода:
- Явный контроль памяти, контролирование схемы распределения памяти;- Крайне легкие задачи, формируемые в виде сопрограмм. Лёгкость в порождении тысяч и миллионов подпроцессов;
- Итераторы стека (фактически лямбда-блоки без распределения кучи);
- Статическая, нативная компиляция с созданием исполняемых файлов ELF, PE, Mach-o;
- Прямой и простой интерфейс для кода на языке Си;
- Ориентация на практическое применение:
- Мультипарадигменный, функциональный, императивно-процедурный, объектно-ориентированный, поддерживающий параллельную actor-модель;- Функции первого класса с биндингами;
- Нет номинальных типов (http://en.wikipedia.org/wiki/Nominative_type_system) или иерархии типов;
- Мультиплатформенный, поддерживается Windows, Linux, Mac OS X, *BSD;
- Хранение строк в UTF8, разнообразие низкоуровневых типов;
- Работает с существующими нативными наборами инструментов: GDB, Valgrind, Shark и т.д.;
- Практическая возможность нарушения правил: возможность игнорирования правил безопасности, если чётко указано, когда и как их нарушать.
URL: https://mail.mozilla.org/pipermail/rust-dev/2012-October/002...
Новость: http://www.opennet.me/opennews/art.shtml?num=35097
Для каждого языка должны быть samples легкодоступны, чтобы на практике и наглядно показывать зачем Это и его(языка) возможность
> for ["Alice", "Bob", "Carol"].each |name| {
> let name = copy *name;После таких ананонов пестон кажется верхом совершенства.
Чем-то Ruby напомнило
Вот да, только не ясно зачем for, если логичнее просто [el1, el2, el3].each |el|
for позволяет использовать break.
Да, и правда так. Спасибо за объяснение.
А кто мешает в итераторе использовать break?
Разговор о Rust, а не о Ruby.
а зачем в ruby break, если вместо each можно использовать [1,2,3].detect{|x| condition }?
Даешь кол-во Яп = кол-во программистов
Чо, еще один Rust? :)А вообще если серьезно, у них там документик есть, где написано, что Мозилла не планирует переводить его когда-либо для продакшна, и останется экспериментальным.
Ну и конечно неясно, что с этими всеми языками делать: зачастую, многие, так и не успев опериться, умирают
Ну как что. Напишите на нем незаменимый софт и зарабатывайте на его поддержке всю оставшуюся жизнь.
Разработчики Mathematica и AutoCAD гарантируют это.
есть одна проблема: в таком случае, кто-то должен для вас поддерживать сам язык, точнее интерпретатор/компилятор и средства разработки
например написать быстро, минут за 20, какую-нибудь одно-двух- разовую утилитку - самое милое дело на каком-нибудь простом и быстром языке )
Shell, не?
> Shell, не?с базой, блек джеком и шлюхами? неа, не надо :)
Что только не придумают лишь бы PHP, Python, Perl, Rubi ... в браузер не интегрировать.
> Что только не придумают лишь бы PHP, Python, Perl, Rubi ... в
> браузер не интегрировать.s/Rubi/Ruby/
в браузерах вполне достаточно одного недоязыка
да и то щас его ярые rails-ruby-онанисты выпиливают и пытаются запилить coffeescript, а он еще лучше, в конце концов он компилируется в JavaScript!
Оно умеет компилится в arm?
> Оно умеет компилится в arm?
Ъ
> Вместо классов ('class') теперь предлагается использовать более простые структуры ('struct').То есть, все таки больше С, чем С++.
Если бы он еще CUDA/OpenCL мог использовать (у них вроде как раз печально с классами), тогда вполне мог бы стать примечательным.
> Если бы он еще CUDA/OpenCL мог использоватьЭЭэ так если заявлен простой интерфейс с си... ?
В общем то задумка неплохая, но для демонстрации возможностей мозилле надо как минимум переписать на этом свой браузер :)
> В общем то задумка неплохая, но для демонстрации возможностей мозилле надо как минимум переписать на этом свой браузер :)
> https://github.com/mozilla/servoНу так это только движок. Вот если они на этом файрфокс перепишут и получат +200 к производительности и +50 к крутизне концепций - это будет разговор :)
>у них вроде как раз печально с классамиС классами и метапрограммированием в CUDA всё ОК, нет только виртуальных методов. В любом случае, использовать полиморфизм в SIMT вычислениях - полная глупость.
> Аккуратная работа с памятью - никаких нулевых и потерянных указателей. Автоматическое управление памятью;Как это понимать ? Указатель нужно всенепременно инициализировать ? Что значит в данном контексте потерянный указатель ?
> Крайне легкие задачи, формируемые в виде сопрограмм. Лёгкость в порождении тысяч и миллионов подпроцессов;Эта как ?
> Статическая, нативная компиляция с созданием исполняемых файлов ELF, PE, Mach-o;Где тогда сборщик мусора проживает ? Или он в тот же самый файлец прописывается ? Это какого же размера он тогда будет ?
А если на этом чуде скажем динамическую библиотечку написать, где будет жить сборщик мусора ?
> Или он в тот же самый файлец прописывается ? Это какого же размера он тогда будет ?где тут фантастика-то?
в Python -- сборщик мусора умещается внутри libpython2.XXX.so.YYY.ZZZ и вродебы это не занимает немыслеммое число мегобайт :-D
А еслиф ахота всё статически слинковать, чтобы не зависеть от тантайма на конкретной машине ?
> А еслиф ахота всё статически слинковать, чтобы не зависеть от тантайма на
> конкретной машине ?"тантайма" читать как "рантайма"
> "тантайма" читать как "рантайма"А как насчет "еслиф" и "ахота"? Граммар-наци, тащи ружье! :)
> А еслиф ахота всё статически слинковать, чтобы не зависеть от тантайма на конкретной машине ?Походу программист из вас такой же как писатель коментов.
> в Python -- сборщик мусора умещается внутри libpython2.XXX.so.YYY.ZZZ и вродебы это не
> занимает немыслеммое число мегобайт :-DВ статье написано "СТАТИЧЕСКАЯ НАТИВНАЯ КОМПИЛЯЦИЯ" - делаем упор на слово статическая.
Или тогда надо пояснить что сие означает.
> Что значит в данном контексте потерянный указатель ?Не найденный сборщиком, как я понимаю.
>> Крайне легкие задачи, формируемые в виде сопрограмм. Лёгкость в порождении тысяч и миллионов подпроцессов;
> Эта как ?Это без минимум одного мегабайта на новый поток, как в C.
> Где тогда сборщик мусора проживает ? Или он в тот же самый файлец прописывается ? Это какого же размера он тогда будет ?Так же как и у Go.
> Это без минимум одного мегабайта на новый поток, как в C.И кто будет "рулить" этим хозяйством, ОС или они сами?
Слово "подпроцессы" по отношению к Венде, которую они тоже поддерживают, совершенно непонятно. Там либо нормальные процессы либо потоки, и то и другое "разруливается" самой ОС. При создании потока в Венде не обязательно иметь мегабайт стека, можно указать сколько надо.
Коротко говоря, нифига не понятно с этими миллиардами легковесных "подпроцессов".
Надежда тока на Ищавина, может он растолкует.
Я без понятия как в винде, насколько я понимаю, идеология та же, что у Go и Erlang, никаких системных потоков и процессов не создается, все в одном и том же адресном пространстве одного процесса. Это в общем случае. На практике, создается по одному «контролирующему» процессу на ядро, который и выполняет эти легковесные потоки со своим встроенным планировщиком. По факту система управляет только этими оболочками в которых находятся «подпроцессы». К сожалению, более конкретно я не могу рассуждать, так как не моя стихия.
Получаются "зелёные потоки", то есть они сами "унутре" всем рулят.
Если я правильно помню, в Win есть унаследованные еще с Win16 API для управления нитями - вполне себе легковесные потоки в UserSpace. Правда они работают в режиме кооперативной многозадачности и должны сами отдавать управления. Если данный функционал в Rust реализован подобным способом, то возникает вопрос, как обрабатывается ситуация блокировки на вводе-выводе, или, например, бесконечный цикл.
Во сколько раз медленнее C++, кто проверял?
А то пишут, в 10 раз медленнее и другие отрицательные моменты.
Никто не будет заниматься оптимизацией компилятора на этапе разработке ещё синтаксиса языка
Какой же у него жуткий синтаксис...
Сколько еще будет языков, созданных лишь потому, что кому-то хочется, чтобы Python или Javascript был похож на C?
> Rustхорошее название =)