LINUX.ORG.RU

У кого-то на хабре бомбануло от Столярова

 , ,


2

8

https://habr.com/ru/post/598219/

Если вкратце, растофанатик решил доказать, что его любимый язычок тоже умеет в нулевой рантайм, отключил std и core, и у него даже получилось собрать хелловорлд «как на сишечке».
Правда руст в этом состоянии даже два числа сложить не может (а весь хелловорлд по сути написан на ассемблере), в то время как сишечка без библиотек остаётся той же сишечкой, достаточно пары обёрток над сисколлами.

Ваше мнение?

★★★★★

Последнее исправление: TheAnonymous (всего исправлений: 3)

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

Можно, кстати, пойти и другим путём: вместо приседаний с боровом просто написать unsafe код с сырыми указателями. И при этом контроля будет больше, чем в том же си, так как для остального владение отслеживается и алиасинг ссылок (не указателей) предотвращается.

Но для растофанатиков это куда большее табу, чем пихать всюду .clone().

quantum-troll ★★★★★
()
Ответ на: комментарий от slackwarrior

И COBOL, COBOL туда же! До сих пор в Штатах крутится на мейнфреймах в тамошних банках и собесах. Нанятые пенсионеры все это поддерживают за огромные деньги. На DevWorks, или что там вместо него сейчас, куча материалов по сабжу. Но что-то новое уже пилят на Java.

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

Сигнал получается не сразу при запуске, а там, где он и должен быть: при попытке использования zero-runtime

starting program: /home/user/a.out 

Breakpoint 2, 0x0000555555555185 in main ()
=> 0x0000555555555185 <main+42>:	e8 76 ee ff ff	callq  0x555555554000
(gdb) disass
Dump of assembler code for function main:
   0x000055555555515b <+0>:	endbr64 
   0x000055555555515f <+4>:	push   %rbp
   0x0000555555555160 <+5>:	mov    %rsp,%rbp
   0x0000555555555163 <+8>:	sub    $0x10,%rsp
   0x0000555555555167 <+12>:	mov    %edi,-0x4(%rbp)
   0x000055555555516a <+15>:	mov    %rsi,-0x10(%rbp)
   0x000055555555516e <+19>:	cmpl   $0x1,-0x4(%rbp)
   0x0000555555555172 <+23>:	jg     0x555555555191 <main+54>
   0x0000555555555174 <+25>:	mov    $0x1e,%edx
   0x0000555555555179 <+30>:	lea    0xe90(%rip),%rsi        # 0x555555556010 <dunno>
   0x0000555555555180 <+37>:	mov    $0x1,%edi
=> 0x0000555555555185 <+42>:	callq  0x555555554000
   0x000055555555518a <+47>:	mov    $0x1,%eax
   0x000055555555518f <+52>:	jmp    0x5555555551ef <main+148>
   0x0000555555555191 <+54>:	mov    $0xc,%edx
   0x0000555555555196 <+59>:	lea    0xe93(%rip),%rsi        # 0x555555556030 <hello>
   0x000055555555519d <+66>:	mov    $0x1,%edi
   0x00005555555551a2 <+71>:	callq  0x555555554000
   0x00005555555551a7 <+76>:	mov    -0x10(%rbp),%rax
   0x00005555555551ab <+80>:	add    $0x8,%rax
--Type <RET> for more, q to quit, c to continue without paging--q
Quit
(gdb) ni

Program received signal SIGSEGV, Segmentation fault.
0x0000555555554000 in ?? ()
=> 0x0000555555554000:	7f 45	jg     0x555555554047
(gdb) x/s $pc
0x555555554000:	"\177ELF\002\001\001"

Мог быть и чуть позже, если бы первая страница программы была исполнимая.

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

Но что-то новое уже пилят на Java.

Модные молодежные и танцевальные подпорки для приложений зеленого экрана на AS/400, которые продолжают выполнять критичные рассчеты на коболе и там у них... и здесь у нас :)

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

https://www.protechtraining.com/ibm-i-iseries-as400-concepts-with-ile-cobol40...

https://www.protechtraining.com/as400-cobol-differences-and-interactive-progr...

https://www.ibm.com/docs/en/rdfi/9.6.0?topic=cobol400-language-reference#ToC

https://en.wikipedia.org/wiki/IBM_i#Programming

«Programming languages available from IBM for IBM i include RPG, Control Language, C, C++, Java, EGL, COBOL, and REXX. Compilers were previously available for Pascal, BASIC, PL/I and Smalltalk but have since been discontinued. The Integrated Language Environment (ILE) allows programs from ILE compatible languages (C, C++, COBOL, RPG, and CL), to be bound into the same executable and call procedures written in any of the other ILE languages. » (с)

В эту игру можно играть в двоем :)

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 1)
Ответ на: комментарий от rumgot

скорость разработки

слишком много работы

Надо остановиться на чём-то одном.

переписать unreal на rust можно

Наверное, можно. Но это же работать надо, а это обычно не то, что с растопроектами происходит. Например, Amethyst.

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

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

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

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

Тогда критики просто скажут: раз вы начали использовать unsafe, то rust уже гарантировать безопасность полностью не может, а потому проще уже писать на C или C++ и не маяться дурью :)

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

У меня сложилось впечатление, что Столярову напели про раст студенты, а сам он с ним особо и не знакомился.

Вообще раст сложный язык для старых программистов. Его надо изучать с открытым мозгом, а не исходя их своих представлений о том, как надо. Не все так могут. А когда первый вопрос к расту - как написать связанный список и услышав ответ «никак» забываешь про язык - толку от такого мнения нет.

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

Вообще раст сложный язык для старых программистов. Его надо изучать с открытым мозгом, а не исходя их своих представлений о том, как надо. Не все так могут.

Это чтобы «уверовать» в раст надо иметь открытый чистый мозг. А в освоении большой разницы нет.

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

Вот пример посложнее выводящий некоторою системную информацию на голых системных вызовах и без использования сторонних модулей и заголовков (SYSTEM – встроенный в компилятор модуль для небезопасного кода и процессороспецифичного функционала).

MODULE A;
	IMPORT S := SYSTEM;
	
	CONST
		stdinFd = 0;
		stdoutFd = 1;
		stderrFd = 2;
		
		B_OS_NAME_LENGTH* = 32;
		B_FILE_NAME_LENGTH* = 256;
	
	TYPE
		ByteArr = ARRAY [untagged] OF BYTE;
		
		system_info* = RECORD [untagged]
			boot_time*: LONGINT;
			cpu_count*: INTEGER;
			max_pages*, used_pages*: LONGINT;
			cached_pages*: LONGINT;
			block_cache_pages*: LONGINT;
			ignored_cache_pages*: LONGINT;
			needed_memory*, free_memory*: LONGINT;
			max_swap_pages*, free_swap_pages*: LONGINT;
			page_faults*: INTEGER;
			max_sems*, used_sems*: INTEGER;
			max_ports*, used_ports*: INTEGER;
			max_threads, used_threads*: INTEGER;
			max_teams*, used_teams*: INTEGER;
			kernel_name*: ARRAY B_FILE_NAME_LENGTH OF SHORTCHAR;
			kernel_build_date*: ARRAY B_OS_NAME_LENGTH OF SHORTCHAR;
			kernel_build_time*: ARRAY B_OS_NAME_LENGTH OF SHORTCHAR;
			kernel_version*: LONGINT;
			abi*: INTEGER;
		END;

	PROCEDURE [code] Eval (val: INTEGER);
	PROCEDURE [code] Syscall (op: INTEGER)
		0CDH, 063H, (* INT 99 *)
		0C3H; (* RET *)
	PROCEDURE [code] SyscallRet (op: INTEGER): INTEGER
		0CDH, 063H, (* INT 99 *)
		0C3H; (* RET *)
	
	PROCEDURE [noframe] Exit (code: INTEGER);
	BEGIN Syscall(38);
	END Exit;
	
	PROCEDURE [noframe] Write (fd: INTEGER; pos: LONGINT; IN [nil] buffer: ByteArr; bufferSize: INTEGER) :INTEGER;
	BEGIN RETURN SyscallRet(145);
	END Write;
	
	PROCEDURE [noframe] GetSystemInfo (OUT systemInfo: system_info): INTEGER;
	BEGIN RETURN SyscallRet(242);
	END GetSystemInfo;
	
	PROCEDURE WriteString (IN str: ARRAY OF SHORTCHAR);
	BEGIN
		Eval(Write(stdoutFd, 0, S.VAL(ByteArr, str), LEN(str$)));
	END WriteString;
	
	PROCEDURE WriteChar (ch: SHORTCHAR);
		VAR str: ARRAY 2 OF SHORTCHAR;
	BEGIN
		str[0] := ch;
		str[1] := 0X;
		WriteString(str);
	END WriteChar;
	
	PROCEDURE WriteInt (val: LONGINT);
	BEGIN
		IF val = MIN(LONGINT) THEN
			WriteString("-9223372036854775808");
		ELSIF val < 0 THEN
			WriteString("-"); WriteInt(-val)
		ELSE
			IF val >= 10 THEN
				WriteInt(val DIV 10);
			END;
			WriteChar(SHORT(CHR(val MOD 10 + ORD("0"))));
		END;
	END WriteInt;
	
	PROCEDURE Do*;
		VAR info: system_info;
	BEGIN
		Eval(GetSystemInfo(info));
		WriteString("Kernel name: " + info.kernel_name + 0AX);
		WriteString("Kernel build date: " + info.kernel_build_date + 0AX);
		WriteString("Kernel build time: " + info.kernel_build_time + 0AX);
		WriteString("Kernel version: "); WriteInt(info.kernel_version); WriteChar(0AX);
		WriteString("Pages: "); WriteInt(info.used_pages); WriteString(" / "); WriteInt(info.max_pages); WriteChar(0AX);
		Exit(0);
	END Do;

END A.

(!) DevElfLinker2.LinkExe A.Do Syscalls.so := A /

Вывод:

Kernel name: kernel_x86
Kernel build date: Sep 22 2022
Kernel build time: 04:59:10
Kernel version: 1
Pages: 143060 / 2051104

X512 ★★★★★
()
Ответ на: комментарий от vM
> strace ./Syscalls.so
[  2065] <... image_relocated resumed>  () (104 us)
[  2065] set_area_protection(0x83a9, 0x5) = 0x00000000 No error () (50 us)
[  2065] get_system_info(0x717757bc) = 0x00000000 No error () (38 us)
Kernel name: kernel_x86
[  2065] write(0x1, 0x0, 0x717756ae, 0x18) = 0x00000018 () (49 us)
Kernel build date: Sep 22 2022
[  2065] write(0x1, 0x0, 0x7177567a, 0x1f) = 0x0000001f () (58 us)
Kernel build time: 04:59:10
[  2065] write(0x1, 0x0, 0x71775646, 0x1c) = 0x0000001c () (70 us)
Kernel version: [  2065] write(0x1, 0x0, 0x13dc778, 0x10) = 0x00000010 () (79 us)
1[  2065] write(0x1, 0x0, 0x71775622, 0x1) = 0x00000001 () (56 us)

[  2065] write(0x1, 0x0, 0x71775632, 0x1) = 0x00000001 () (42 us)
Pages: [  2065] write(0x1, 0x0, 0x13dc78c, 0x7) = 0x00000007 () (41 us)
1[  2065] write(0x1, 0x0, 0x717755d2, 0x1) = 0x00000001 () (40 us)
5[  2065] write(0x1, 0x0, 0x717755e2, 0x1) = 0x00000001 () (39 us)
3[  2065] write(0x1, 0x0, 0x717755f2, 0x1) = 0x00000001 () (41 us)
8[  2065] write(0x1, 0x0, 0x71775602, 0x1) = 0x00000001 () (42 us)
3[  2065] write(0x1, 0x0, 0x71775612, 0x1) = 0x00000001 () (50 us)
3[  2065] write(0x1, 0x0, 0x71775622, 0x1) = 0x00000001 () (45 us)
 / [  2065] write(0x1, 0x0, 0x13dc794, 0x3) = 0x00000003 () (45 us)
2[  2065] write(0x1, 0x0, 0x717755c2, 0x1) = 0x00000001 () (66 us)
0[  2065] write(0x1, 0x0, 0x717755d2, 0x1) = 0x00000001 () (88 us)
5[  2065] write(0x1, 0x0, 0x717755e2, 0x1) = 0x00000001 () (74 us)
1[  2065] write(0x1, 0x0, 0x717755f2, 0x1) = 0x00000001 () (53 us)
1[  2065] write(0x1, 0x0, 0x71775602, 0x1) = 0x00000001 () (155 us)
0[  2065] write(0x1, 0x0, 0x71775612, 0x1) = 0x00000001 () (106 us)
4[  2065] write(0x1, 0x0, 0x71775622, 0x1) = 0x00000001 () (92 us)

[  2065] write(0x1, 0x0, 0x71775632, 0x1) = 0x00000001 () (93 us)
[  2065] exit_team(0x0) () (63 us)

Сколько раз тут выполняется INT 99 ?

Много. Я не заморачивался с оптимизациями вроде буфферизации вывода.

X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 1)

Ну что сказать, автор прав, а Столяров и вправду странный, если считает байтики и всерьёз несёт ахинею про «зеро рантайм». У меня был препод, который учил как быстро умножать на константу с помощью сдвигов и сложений, и поучал, что хоть на пентиуме, хоть на десятентиуме, а сложение всегда будет быстрее умножения. Эта информация не очень хорошо состарилась.

На практике, конечно, если кому-то надо делать ядро OS на расте, он запилит библиотечку со своим минимальным core в котором будет сложение интов и какая-то функция для вывода строки. А потом он добавит макрос println! и о чудо, форматированный вывод раста станет работать, так же безопасно как в большом. Да в общем-то уже пилят и ядро ос на расте и кусочек раста в линупс интегрируют. А прохвессор всё ещё поучает, что предметы тяжелее воздуха летать не могут.

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

Неверно. Плюсы как раз и планировались как замена сишечки. В первых книгах из 80х в примерах писали код для как бы драйверов на плюсах, с базовым классом device от которого наследовались символьный и блочный, от которых, по задумке авторов, должен был бы наследоваться класс реального драйвера. Вообще считалось самоочевидным, что плюсы это как си, только лучше и вообще на си пишут только ретрограды. Потом перестали пытаться быть и умными и красивыми одновременно, добавили исключения и rtti и пошли конкурировать с java. Но, по факту, то что не получилось не значит что не хотелось.

Раст пока что не сдался, всё «умное» пытаются делать средствами компилятора. От опционального GC зелёных потоков отказались, неявные аллокации убрали, так что вполне себе годится на замену сишечки.

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

Первые книги вышли в середине 1980-х.

«зеро рантайм»

Кто-то про «зеро рантайм», кто-то про linux console applications

https://www.linux.com/news/top-10-linux-console-applications/

vM ★★
()
Последнее исправление: vM (всего исправлений: 1)
Ответ на: комментарий от khrundel

Плюсы как раз и планировались как замена сишечки

планироваться может и планировались, но после смерти симбиана все более менее распространенные оси по прежнему на си.

Заменить не получилось, получилось отобрать прикладной софт, который потом был отобран другими языками. Вся системщина по прежнему на си и в обозримой перспективе так оно и останется.

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

Тут чуть выше в теме раскопали, что раст запрещает делать модификации компилятора без их ведома.

Как появятся полностью сторонние реализации языка и будет известна реакция на них растосоздателей — свистните. А ещё лучше стандарт от ISO.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от hobbit

Как появятся полностью сторонние реализации языка и будет известна реакция на них растосоздателей — свистните. А ещё лучше стандарт от ISO.

А энтерпрайзные манямрии грибных эльфов (раз уж ржавчина это по грибы) останутся манямриями до появления misra-ржавчины, mil-std-ржавчины и ржавого оттенка do-178 :)

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 1)