LINUX.ORG.RU

Конкурс на простейшую программу

 


0

1

Условие: составить кратчайшую программу на любимом языке и продемонстрировать её технлогию сборки, запуска….

Бью рекорд Hello world на классическом Си. Никаких заголовочных файлов и стандартных библиотек ! Впрочем, нестандартные тоже не нужны.

В вашем любимом редакторе пишем в файл simplest.c:

int main(int argc){
        return argc;
}

компиляция : gcc simplest.c

запуск с демонстраций вывода количества аргументов программы в качестве кодов её возврата :

./a.out ; echo $? 
./a.out - ; echo $? 
./a.out - - ; echo $? 

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

202x – это будущий стандарт ( условно «23» )

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf

ISO/IEC 9899:2018 ( «2017» ) – действующий https://www.iso.org/standard/74528.html

https://files.lhmouse.com/standards/ISO%20C%20N2176.pdf

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

Спасибо, добрый человек! А язык-то развивается, оказывается. Попробую изучить. Уже начал слушать курс от Специалист …

Владимир

anonymous
()
Ответ на: комментарий от MOPKOBKA

Tiny C Compiler

Зачётно. Только с предупреждениями, что пожалел тип переменной указать.

Вот тебе моё с кисточкой в ответ на Tiny C Compiler (tcc):

$ echo 'main(int argc){return argc;}' | tcc -run - 2 3; echo $?
3
$ echo 'main(int argc){return argc;}' | tcc -run - 2 3 4; echo $?
4

По сути - там интерпретация кода C.

Android
() автор топика
Ответ на: Tiny C Compiler от Android

Простенькая компиляция-выполнение.

vM ★★
()
Ответ на: Tiny C Compiler от Android

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

gcc -Wl,--defsym,main=exit -static

Тест:

./a.out a b c ; echo $?
vM ★★
()
Ответ на: комментарий от vM

main на exit

Круто - можно вызов главной функции заменить на exit с одним параметром она и протолкнётся, но с той же компоновкой из командной строки в виде первого аргумента agrc?

Android
() автор топика
Ответ на: комментарий от Eddy_Em

Что-то у тебя, Владимир, нескладно все: хочешь ядро разрабатывать, а вместо С взялся учить совсем другой ЯП…

Можно просто - Володя. Забросил плюсы и начал учить Си по вашему совету. Читаю книгу "Программирование на C для начинающих. Перри Грег, Миллер Дин. Пойдёт для начала, Эдуард?

Владимир

anonymous
()
Ответ на: комментарий от Eddy_Em

Я не знаю, вот и спросил вашего мнения …

Владимир

anonymous
()
Ответ на: комментарий от Eddy_Em

K&R

Может кому-то Керниган с Ричи зайдут. Но не для всех. Кому-то что-то нужно искать попроще. Нас в своё время учили в ВУЗе по Бочкову с Субботиным на MS-DOS. Потом были книги «Для чайников», сейчас под брендом «Head first» издают. Короче - я бы по библиотекам рекомендовал походить (пока городские бесплатные и в них что-то такое может быть). В любом случае, стоит иметь билет в Читательский Зал.

Android
() автор топика
Ответ на: K&R от Android

Уж куда проще K&R? Я когда ее читал, все хотел что-нибудь повыше уровнем…

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

K&R

И все задания с ходу у тебя из K&R выполнялись?

Сложней надо что-то типа книг «Современного Си» или «Си в 21 веке» сейчас искать. Но тут главное, не сложность, а практичность и рациональность: чтобы реальные приложения писать или даже код ядра ОС, прошивки там…

Android
() автор топика
Ответ на: K&R от Android

И все задания с ходу у тебя из K&R выполнялись?

Нет, конечно. Постепенно...

что-то типа книг «Современного Си» или «Си в 21 веке» сейчас искать

Читал. Такое фуфло…

Eddy_Em ☆☆☆☆☆
()

Android ★
20.05.20 12:47:46

До чего занюханная тема- «Здравствуй Мир!» В тикле обсуждали уже ? Ж)

Bootmen ☆☆☆
()
Последнее исправление: Bootmen (всего исправлений: 2)
Ответ на: комментарий от Eddy_Em

Были в обсуждении 32-разрядные ELF меньше 80 байт.

Сборка и тестирование 80-байтного ELF для x64. Осторожно! Плохой код!

p(){ printf $2 | dd bs=1 seek=$1 of=narg; }
p 0 '\177ELF\2\300\213<$\260<\17\5'
p 16 '\3\0>' ; p 24 \\1
p 28 \\a ; p 32 \\30 ; p 40 \\30
p 44 \\a ; p 52 '<' ; p 54 '8\0\1'
p 64 \\1 ; p 79 \\0
chmod +x narg
strace -i ./narg a b c
vM ★★
()
Ответ на: комментарий от vM

Мне лень разбирать машкоды. Ты хоть бы показал ассемблерный исходник, а то вдруг это — патч Бармина или еще какая шняга?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от anonymous

Вот это компилится:

nop
но не запускается:
./a.out 
bash: ./a.out: не удаётся запустить бинарный файл: Ошибка формата выполняемого файла

Но я ужасно хреново знаю ассемблер (мне разве что он нужен, когда читаю листинги при компиляции сырцов под STM8, т.к. SDCC вообще оптимизировать не умеет). Возможно, есть вариант сделать что-то коротенькое и при этом исполняемое.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

objdump -D -m i386 -M x86-64 -b binary narg

Disassembly of section .data:

00000000 <.data>:
   0:	7f 45                	jg     0x47
   2:	4c                   	rex.WR
   3:	46 02 c0             	rex.RX add %al,%r8b
   6:	8b 3c 24             	mov    (%rsp),%edi
   9:	b0 3c                	mov    $0x3c,%al
   b:	0f 05                	syscall 
   d:	00 00                	add    %al,(%rax)
   f:	00 03                	add    %al,(%rbx)
  11:	00 3e                	add    %bh,(%rsi)
  13:	00 00                	add    %al,(%rax)
  15:	00 00                	add    %al,(%rax)
  17:	00 01                	add    %al,(%rcx)
  19:	00 00                	add    %al,(%rax)
  1b:	00 07                	add    %al,(%rdi)
  1d:	00 00                	add    %al,(%rax)
  1f:	00 18                	add    %bl,(%rax)
  21:	00 00                	add    %al,(%rax)
  23:	00 00                	add    %al,(%rax)
  25:	00 00                	add    %al,(%rax)
  27:	00 18                	add    %bl,(%rax)
  29:	00 00                	add    %al,(%rax)
  2b:	00 07                	add    %al,(%rdi)
  2d:	00 00                	add    %al,(%rax)
  2f:	00 00                	add    %al,(%rax)
  31:	00 00                	add    %al,(%rax)
  33:	00 3c 00             	add    %bh,(%rax,%rax,1)
  36:	38 00                	cmp    %al,(%rax)
  38:	01 00                	add    %eax,(%rax)
  3a:	00 00                	add    %al,(%rax)
  3c:	00 00                	add    %al,(%rax)
  3e:	00 00                	add    %al,(%rax)
  40:	01 00                	add    %eax,(%rax)
	...
ELF Header:
  Magic:   7f 45 4c 46 02 c0 8b 3c 24 b0 3c 0f 05 00 00 00 
  Class:                             ELF64
  Data:                              <unknown: c0>
  Version:                           139 <unknown: %lx>
  OS/ABI:                            <unknown: 3c>
  ABI Version:                       36
  Type:                              DYN (Shared object file)
  Machine:                           Advanced Micro Devices X86-64
  Version:                           0x0
  Entry point address:               0x700000001
  Start of program headers:          24 (bytes into file)
  Start of section headers:          30064771096 (bytes into file)
  Flags:                             0x0
  Size of this header:               60 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         1
  LOAD           0x0000000000000018 0x0000000700000018 0x0038003c00000000
                 0x0000000000000001 0x0000000000000001  RWE    0x0

Конкурс на простейшую программу (комментарий)

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

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

Со стандартным редактором связей ELF получается длиннее

echo 'mov (%rsp),%edi; mov $60,%al; syscall' | as; ld -s a.out -o aaa ; wc -c aaa; strace -i ./aaa uno dos tres
ld: warning: cannot find entry symbol _start; defaulting to 0000000000400078
336 aaa
[00007f6d5a8c7e97] execve("./aaa", ["./aaa", "uno", "dos", "tres"], 0x7ffe05a43320 /* 21 vars */) = 0
[000000000040007f] exit(4)              = ?
[????????????????] +++ exited with 4 +++
vM ★★
()
Ответ на: комментарий от Eddy_Em

А fasm выдаёт ELF64 разумного размера:

fasm /dev/stdin args.fasm << END                                                
format elf64 executable                                                                                
mov edi,[rsp]                                                                                          
mov al, 60                                                                                             
syscall                                                                                                
END
flat assembler  version 1.73.02  (16384 kilobytes memory)
1 passes, 127 bytes.
wc -c args.fasm; strace -i ./args.fasm раз два три
127 args.fasm
[00007fd479d70e97] execve("./args.fasm", ["./args.fasm", "\321\200\320\260\320\267", "\320\264\320\262\320\260", "\321\202\321\200\320\270"], 0x7fff43552190 /* 21 vars */) = 0
[000000000040007f] exit(4)              = ?
[????????????????] +++ exited with 4 +++

Но всё это глупости, потому что решение exit $#, предложенное почти год назад, Конкурс на простейшую программу (комментарий) Конкурс на простейшую программу (комментарий) или

!/bin/sh
exit $#

всё равно короче.

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

всё равно короче.

Да, пожалуй вы победили. У вас самый короткий …

Владимир

anonymous
()
Ответ на: комментарий от Eddy_Em

Learning GNU C

Ну если не Пу… K&R - то кто?))) тогда я - пасс. Может ты и сам будешь навороченные книжки за денежки писа́ть. А я пока остановился на Learning GNU C

Android
() автор топика
Ответ на: Learning GNU C от Android

Выглядит симпатично. Начинается не с HelloWorld’a. Но это не учебник, конечно, а краткий обзор языка. Жаль, что недописана! https://download-mirror.savannah.gnu.org/releases/c-prog-book/learning_gnu_c.html#What-are-Virtual-Functions_003f

Может быть, попробовать начать с более современной книги одного из авторов, The Go Programming Language Alan A. A. Donovan, Brian W. Kernighan и с golang.org ? А потом уже даунгредиться до К&R и книг по С99 и далее? Но если читать K&R, то читать английский текст и вдумываться, а не только копипастать примеры. Примеры без поясняющего текста могут научить плохому.

Есть ещё обсуждавшийся на LOR учебник Андрея Викторовича Столярова http://www.stolyarov.info/books/programming_intro/e2 Переиздание книг Столярова по программированию нацеленный автором на программирования чего-то вроде linux. Плюс в том, что с автором можно обсудить прочитанное и поспорить на русском языке.

Какую бы книгу Вы не выбрали, не забывайте заглядывать в нелюбимый Андреем Викторовичем стандарт, пояснения и комментарии к стандарту, документацию к используемой системе программирования на изучаемом языке и прочие справочники: https://en.cppreference.com/w/c/language http://www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf

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

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

Здравствуй, друг! Так кресты не для веба ведь …
ЗЫ - можно к тебе на праздники завалиться?

Владимир

anonymous
()
Ответ на: Ассемблер от Android

MIPSы, ARMы, s390, модная RISC-V; UEFI, Windows, Das U-Boot, платформы с Mach-O не охвачены, не говоря уже об исторических и выдуманных учебных платформах.

vM ★★
()
21 сентября 2021 г.
Ответ на: комментарий от anonymous

кресты не для веба ведь

Будем писать простейшие веб-сервера на разных языках и без языков?

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