LINUX.ORG.RU

Посмотрел я этот ваш Rust

 ,


6

8

Вобщем, дошли руки потыкать палочкой.

Я вот что не пойму - зачем и кому он нужен, ну правда?

Это же новый C++. То есть, чрезмерно переусложненный язык, в котором, как говорил Луговский, разобраться может разве что хорошая зубрилка, а не хороший программист, но при этом не дающий никаких бонусов к продуктивности, и никакими киллер-фичами не обладающий.

Close to metal? Нет, извините, мне когда надо будет close to metal - я пойду сишку возьму. Которая реально, и Close To Metal, и со стабильным ABI, так важным для низкоуровневого программирования, и так далее. А если просто производительности не будет хватать, в том числе там из-за GC, так ведь - что в Java, что в Common Lisp, есть огромное количество возможностей затюнить производительность до нужного уровня, при этом не стреляя себе в ногу.

Продуктивность разработчика? Я сильно в этом сомневаюсь. Потому что вот есть языки программирования, предлагающие наибольшую продуктивность, не ограничивающие пользователя практически никак, и, конечно, вместе с тем, довольно сильно нагружающие межушной нервный узел, довольно нетривиальные для изучения. Как пример, лиспы всевозможные. Но Rust в их число не входит. Там на каждом углу костыли, подпорки, железные двери с замками, и чуть что так обухом по голове можно получить.

Наконец, ну безопасность чтоли, хваленая? Ну, опять нет. Взять тот же unsafe. Если вам нужна прямо таки безопасность-безопасность - берите что-нибудь вроде хаскеля(или какого-нибудь Coq, или что-нибудь подобное, с зависимыми типами, если совсем упоролись), ну или на худой конец, что-нибудь вроде Java, где все безопасно прямо как в дурдоме с мягкими стенами.

Вобщем, не вижу зачем этот язык нужен, нам и C++ хватает, если надо не ехать, а шашечки(т.е. тупо позадротствовать, да).

★★★
Ответ на: комментарий от byko3y

Естественно, все сидящие в этом треде очень хотят узнать, что же генерирует компилятор на Си. Пожалуйста:

0x000000000040057d <+61>:	mov    $0x1,%esi
0x0000000000400582 <+66>:	cmp    $0x1,%ebx
0x0000000000400585 <+69>:	je     0x4005cf <main+143>
0x0000000000400587 <+71>:	lea    -0x1(%rbx),%esi
0x000000000040058a <+74>:	cmp    $0x2,%ebx
0x000000000040058d <+77>:	je     0x4005df <main+159>
0x000000000040058f <+79>:	imul   %ebx,%esi
0x0000000000400592 <+82>:	lea    -0x2(%rbx),%eax
0x0000000000400595 <+85>:	cmp    $0x3,%ebx
0x0000000000400598 <+88>:	je     0x4005cf <main+143>
0x000000000040059a <+90>:	imul   %eax,%esi
0x000000000040059d <+93>:	lea    -0x3(%rbx),%edx
0x00000000004005a0 <+96>:	cmp    $0x4,%ebx
0x00000000004005a3 <+99>:	je     0x4005cf <main+143>
0x00000000004005a5 <+101>:	imul   %edx,%esi
0x00000000004005a8 <+104>:	lea    -0x4(%rbx),%eax
0x00000000004005ab <+107>:	cmp    $0x5,%ebx
0x00000000004005ae <+110>:	je     0x4005cf <main+143>
0x00000000004005b0 <+112>:	imul   %eax,%esi
0x00000000004005b3 <+115>:	lea    -0x5(%rbx),%edx
0x00000000004005b6 <+118>:	cmp    $0x6,%ebx
0x00000000004005b9 <+121>:	je     0x4005cf <main+143>
0x00000000004005bb <+123>:	imul   %edx,%esi
0x00000000004005be <+126>:	lea    -0x6(%rbx),%eax
0x00000000004005c1 <+129>:	cmp    $0x7,%ebx
0x00000000004005c4 <+132>:	je     0x4005cf <main+143>
0x00000000004005c6 <+134>:	imul   %eax,%esi
0x00000000004005c9 <+137>:	sub    $0x7,%ebx
0x00000000004005cc <+140>:	imul   %ebx,%esi
0x00000000004005cf <+143>:	mov    $0x400a42,%edi
0x00000000004005d4 <+148>:	xor    %eax,%eax
0x00000000004005d6 <+150>:	callq  0x4004f0 <printf@plt>
0x00000000004005db <+155>:	xor    %eax,%eax
0x00000000004005dd <+157>:	pop    %rbx
0x00000000004005de <+158>:	retq   
0x00000000004005df <+159>:	mov    $0x2,%esi
0x00000000004005e4 <+164>:	jmp    0x4005cf <main+143>
byko3y ★★★★
()
Ответ на: комментарий от byko3y

Ну и справедливости ради отмечу, что все-таки я ошибся с «сишный код быстрее раза в три». Цифра беспруфная пока что, можете сами забенчить - у меня SBCL нету и возиться с ним не планирую. Я предполагаю, что более реалистична разница в полтора-два раза.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

Компилятор си тупо делает развертку цикла. Ессно для произвольного N, это как-то бессмысленно.

Он итерирует через два и при этом делит результат на два.

Это не итерирование через 2, это работа с меткой типа(typetag) fixnum.

Почему нельзя было сгенерировать «CMP RAX, RDX» вместо двух команд «MOV RDX, RBX; CMP RAX, RDX» — мне тоже не ясно.

Разница абсолютно neglibile

Компилятор Си расширяется, внезапно…. при помощи Си. Вот так сюрприз.

Никак он не расширяется, на практике. Никто с собой компилятор Си не таскает.

Это плохой цикл, компиляторы C/C++/Pascal сгенерируют код, который уделает этот раза в два.

Ничего подобного.

lovesan ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.