Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.97/29: Рейтинг темы: голосов - 29, средняя оценка - 4.97
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4

Почему с++ может работать с разными процессорами а на Ассемблере приходится писать код под разные

19.08.2020, 10:42. Показов 7592. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я смотрел библиотеки с++ видел тоже что код заточен под разные процессоры. Хотелось бы получить больше информации по этому поводу.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.08.2020, 10:42
Ответы с готовыми решениями:

почему может не работать код ?
Label10->Font->Style <<fsUnderline <<fsBold ; ошибок никаких не выдает...

Почему писать на ассемблере опасно?
Говорят пишут вирусы,и можно испортить CMOS,или это мифы?

Вход под разными интерфейсами c# (на разные формы)
Добрый день! Нужно, чтобы при вводе определенного логина и пароля переходило на определенную форму, заранее спасибо!

42
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
19.08.2020, 21:37
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Nexi99 Посмотреть сообщение
Так я и не понял как приспосабливается код под разные архитектуры
Вам же сказали много раз что компилятор С++ генерирует код под конкретную архитектуру, что еще нужно? Есть компилятор С++ которых генерирует код под x86, есть компилятор который генерирует под ARM и т.д. Это всё делает компилятор С++, в него заложено как должен транслироваться С++ код в машинный код конкретной архитектуры. Всё.

Нужно больше? Есть исходники компиляторов, того же GCC например, откройте и посмотрите. Но вы вряд ли там что-то поймете.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
19.08.2020, 21:38
Цитата Сообщение от Nexi99 Посмотреть сообщение
Так я и не понял как приспосабливается код под разные архитектуры, то ли на с++ все процессоры есть
При помощи макросов #ifdef для каждого процессора пишется свой ассемблерный код.
Ассемблер это набор команд процессора. Какие-то процессоры совместимы по командам, для них он может быть одинаковым. Но в общем случае он разный, тем более когда ты его используешь в языках высокого уровня, типа с++.
0
Эксперт .NET
 Аватар для Rius
13836 / 7910 / 1709
Регистрация: 25.05.2015
Сообщений: 24,017
Записей в блоге: 14
19.08.2020, 23:10
Цитата Сообщение от Nexi99 Посмотреть сообщение
Я смотрю нормально никто не знает как это работает.
А я смотрю, вы игнорируете то, что вам объясняют.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
19.08.2020, 23:34  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
А я смотрю, вы игнорируете то, что вам объясняют.
Последние 2 поста натолкнули меня на мысли. И всё таки если я правильно вас понял с++ заточен на все процессоры, а на Ассемблере код пишется автоматом под процессор, это как буд-то бы кто то пишет на Ассемблере(этот процесс называется Ассемблированием), может они не сильно отличаются, просто вы тоже конкретно не отвечаете.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
20.08.2020, 00:15
Nexi99, https://www.youtube.com/watch?v=JUTaIJPnPQo
0
Эксперт .NET
 Аватар для Rius
13836 / 7910 / 1709
Регистрация: 25.05.2015
Сообщений: 24,017
Записей в блоге: 14
20.08.2020, 00:20
Nexi99,
Вот пишем, к примеру, исходник:
C
1
2
3
4
5
6
7
8
9
10
int function(int a) {
  int i, r;
  
  
  for (i = 0, r = 0; i < a; i++) {
    r += a;
  }
  
  return r;
}
Компилим его компилятором GCC для ARM с параметрами по умолчанию
Bash
1
arm-none-eabi-gcc -S source.c
Получаем ассемблерный листинг
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
    .cpu arm7tdmi
    .eabi_attribute 20, 1
    .eabi_attribute 21, 1
    .eabi_attribute 23, 3
    .eabi_attribute 24, 1
    .eabi_attribute 25, 1
    .eabi_attribute 26, 1
    .eabi_attribute 30, 6
    .eabi_attribute 34, 0
    .eabi_attribute 18, 4
    .file   "source.c"
    .text
    .align  2
    .global function
    .syntax unified
    .arm
    .fpu softvfp
    .type   function, %function
function:
    @ Function supports interworking.
    @ args = 0, pretend = 0, frame = 16
    @ frame_needed = 1, uses_anonymous_args = 0
    @ link register save eliminated.
    str fp, [sp, #-4]!
    add fp, sp, #0
    sub sp, sp, #20
    str r0, [fp, #-16]
    mov r3, #0
    str r3, [fp, #-8]
    mov r3, #0
    str r3, [fp, #-12]
    b   .L2
.L3:
    ldr r2, [fp, #-12]
    ldr r3, [fp, #-16]
    add r3, r2, r3
    str r3, [fp, #-12]
    ldr r3, [fp, #-8]
    add r3, r3, #1
    str r3, [fp, #-8]
.L2:
    ldr r2, [fp, #-8]
    ldr r3, [fp, #-16]
    cmp r2, r3
    blt .L3
    ldr r3, [fp, #-12]
    mov r0, r3
    add sp, fp, #0
    @ sp needed
    ldr fp, [sp], #4
    bx  lr
    .size   function, .-function
    .ident  "GCC: (GNU Tools for Arm Embedded Processors 7-2018-q2-update) 7.3.1 20180622 (release) [ARM/embedded-7-branch revision 261907]"
А потом компилим компилятором GCC для x86
Bash
1
/c/MinGW/bin/gcc.exe -S source.c
И получаем другой ассемблерный листинг
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
    .file   "source.c"
    .text
    .globl  _function
    .def    _function;  .scl    2;  .type   32; .endef
_function:
LFB0:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    subl    $16, %esp
    movl    $0, -4(%ebp)
    movl    $0, -8(%ebp)
    jmp L2
L3:
    movl    8(%ebp), %eax
    addl    %eax, -8(%ebp)
    addl    $1, -4(%ebp)
L2:
    movl    -4(%ebp), %eax
    cmpl    8(%ebp), %eax
    jl  L3
    movl    -8(%ebp), %eax
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
LFE0:
    .ident  "GCC: (MinGW.org GCC Build-2) 9.2.0"
1
738 / 705 / 110
Регистрация: 29.05.2015
Сообщений: 4,362
20.08.2020, 06:45
Компилятор С++ (как и компилятор ассемблера) не создаёт машинные коды. Он создаёт объектный файл .obj. А уже другая программа - редактор связей (линкер) - создаёт из одного или нескольких объектных файлов исполняемый код (для винды файл .exe), который и должен исполняться на нужном типе процессора.

При этом сам текст программы может быть написан на разных языках. В результате компиляции будут созданы объектные файлы, и если линкер не найдёт ошибок (ему всё понравится) - он создаст исполняемый файл.

По крайней мере, так раньше работало, как сейчас - не знаю.
0
Эксперт .NET
 Аватар для Rius
13836 / 7910 / 1709
Регистрация: 25.05.2015
Сообщений: 24,017
Записей в блоге: 14
20.08.2020, 08:41
alexu_007, под компилятором здесь для простоты подразумевается весь toolchain.

Добавлено через 1 час 49 минут
Nexi99, а вот тот же исходник после компилятора GCC для AVR
Bash
1
r:\avr-gcc-10.1.0-x64-windows\bin\avr-gcc.exe -S source.c
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
    .file   "source.c"
__SP_H__ = 0x3e
__SP_L__ = 0x3d
__SREG__ = 0x3f
__tmp_reg__ = 0
__zero_reg__ = 1
    .text
.global function
    .type   function, @function
function:
    push r28
    push r29
    rcall .
    rcall .
    rcall .
    in r28,__SP_L__
    in r29,__SP_H__
/* prologue: function */
/* frame size = 6 */
/* stack size = 8 */
.L__stack_usage = 8
    std Y+6,r25
    std Y+5,r24
    std Y+2,__zero_reg__
    std Y+1,__zero_reg__
    std Y+4,__zero_reg__
    std Y+3,__zero_reg__
    rjmp .L2
.L3:
    ldd r18,Y+3
    ldd r19,Y+4
    ldd r24,Y+5
    ldd r25,Y+6
    add r24,r18
    adc r25,r19
    std Y+4,r25
    std Y+3,r24
    ldd r24,Y+1
    ldd r25,Y+2
    adiw r24,1
    std Y+2,r25
    std Y+1,r24
.L2:
    ldd r18,Y+1
    ldd r19,Y+2
    ldd r24,Y+5
    ldd r25,Y+6
    cp r18,r24
    cpc r19,r25
    brlt .L3
    ldd r24,Y+3
    ldd r25,Y+4
/* epilogue start */
    adiw r28,6
    in __tmp_reg__,__SREG__
    cli
    out __SP_H__,r29
    out __SREG__,__tmp_reg__
    out __SP_L__,r28
    pop r29
    pop r28
    ret
    .size   function, .-function
    .ident  "GCC: (GNU) 10.1.0"
0
 Аватар для Annemesski
2692 / 1349 / 485
Регистрация: 08.11.2016
Сообщений: 3,739
20.08.2020, 12:22
Цитата Сообщение от Nexi99 Посмотреть сообщение
Последние 2 поста натолкнули меня на мысли. И всё таки если я правильно вас понял с++ заточен на все процессоры, а на Ассемблере код пишется автоматом под процессор, это как буд-то бы кто то пишет на Ассемблере(этот процесс называется Ассемблированием), может они не сильно отличаются, просто вы тоже конкретно не отвечаете.
Еще раз: С++ - компилируемый язык высокого уровня, код на С++ вообще никакого отношения не имеет аппаратной реализации (собственно это и значит - высокий уровень), задача компилятора транслировать код высокого уровня в двоичный исполняемый код. Если непонятно, как бы сказать, "сверху", попробуем зайти "снизу".

Процессорная команда имеет следующую структуру
Code
1
| КОП | ОПЕРАНД_1 | ОПЕРАНД_2 |
это набор бит (нулей и единиц) в количестве определяемом архитектурой процессора, где КОП - код операции - определяющий настройки мультиплексоров, сумматоров адреса и прочего в БУК (блоке управления командами) процессора и настройки арифметико-логических устройств необходимые для выполнения соответствующей операции. В полях ОПЕРАНД_1/ОПЕРАНД_2 находятся либо непосредственно данные над которыми выполняется операция, либо адреса (регистров процессора, стэка, ОЗУ) по которым эти данные расположены, где брать данные для выполнения текущей команды и куда разложить результаты её выполнения диктует КОП.
Исполняемый файл программы есть непрерывная последовательность таких структур которая при отправке на исполнение загружается в ОЗУ вычислительной системы и скармливается процессору.
Так вот - это и есть ассемблер который пишется в самом лучшем случае в HEX-редакторе непосредственно формирующем двоичный код вооружившись справочником по системе команд конкретного процессора, то есть это самый низкий уровень и переносимость такого кода ограничена этой самой системой команд, то есть если два различных процессора, что называется пуля в пулю, работают в одной системе команд, то такой код будет переносим, если же система команд одного процессора является расширенной относительно другого, то код будет переносим в одну сторону - от "слабого" собрата к "сильному", а вот наоборот только в частных случаях когда код не использует расширенную систему команд. Если же системы команд различаются в корне, например КОП за номером 0x0A одного процессора означает операцию безусловного перехода, а другого инкремент значения аккумулятора или, скажем, КОП одного занимает 7 бит, а другого 8, то... ну Вы поняли.

Уровнем выше располагается компилируемый ассемблер который представлен мнемоникой языка (все вот эти вот: mov, div, add, cmp, jmp, etc...) такой код уже редактируется текстовым редактором и компилируется в двоичный исполняемый файл по правилам для конкретной архитектуры, то есть теперь компилятор как бы выполняет роль справочника по системам команд процессоров. Это обеспечивает более гибкую систему переносимости кода, но(!!!) не исполняемого файла который все равно придется компилировать отдельно под разные архитектуры, разными компиляторами.

Еще выше уровнем уже располагаются языки высокого уровня которые располагают абстрактными конструкциями снабженными правилами перевода оных в компилируемый ассемблер который компилируется в исполняемый файл, как Вы (я надеюсь) уже поняли, с привязкой к архитектуре процессора.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
20.08.2020, 12:27
Цитата Сообщение от Nexi99 Посмотреть сообщение
Последние 2 поста натолкнули меня на мысли. И всё таки если я правильно вас понял с++ заточен на все процессоры, а на Ассемблере код пишется автоматом под процессор, это как буд-то бы кто то пишет на Ассемблере(этот процесс называется Ассемблированием), может они не сильно отличаются, просто вы тоже конкретно не отвечаете.
Ты бы для начала научился худо-бедно программировать на ассемблере. Зачем ты вообще в него полез, если даже не знаешь, что это такое, что он делает и зачем нужен?
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
28.08.2020, 23:48
Цитата Сообщение от Annemesski Посмотреть сообщение
код на С++ вообще никакого отношения не имеет аппаратной реализации (собственно это и значит - высокий уровень), задача компилятора транслировать код высокого уровня в двоичный исполняемый код
Высокий уровень значит не совсем это.
И cfront Страуструпа транслировл код на С++ на другой язык высокого уровня, как некоторые современные компиляторы.

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

Цитата Сообщение от Nexi99 Посмотреть сообщение
получается что с++ тоже статический как и Ассемблер.
Для большинства компиляторов с++ получается так. Но, в то же время, есть низкоуровневые аппаратно-(но не платформо-)независимые ILasm и Webassembly, для которых генерация и выполнение машинозависимых инструкций откладывается до момента запуска программы на выполняющей программу системе.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
29.08.2020, 00:05  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
Для большинства компиляторов с++ получается так. Но, в то же время, есть низкоуровневые аппаратно-(но не платформо-)независимые ILasm и Webassembly, для которых генерация и выполнение машинозависимых инструкций откладывается до момента запуска программы на выполняющей программу системе.
Грубо говоря чёткого ответа не дали мне ребята выше а вопрос сложный. Возникают всё равно вопросы. Один из них когда код компилируется он будет работать только на твоём процессоре, а на другом судя по вашему ответу может не работать т.е. возможно придётся перекомпилировать программу на другом компьютере или сишный компилятор откомпилирует его под большинство процессоров которые ему известны.
Также возникает вопрос а что если будут созданы новые процессоры, как компилятор с++ про них узнает чтобы применить все нужные ассемблерные штучки. Так что хоть тут и все умные но толком никто не знает как это происходит.

Я на данный момент понял следующее.
Компилятор может использовать универсальные команды для перевода кода в машинный язык.
В компилятор может быть вшита методика и база процессоров под которые он может этот код собрать.

Мне вот интересно если я напишу на Ассемблере функцию и задумаю передать в с++ как мне накрыть её такими возможностями или какую методику придумать чтобы эту функцию приспособить под другой процессор?
0
 Аватар для Nishen
1359 / 857 / 366
Регистрация: 26.02.2015
Сообщений: 3,831
29.08.2020, 00:24
Цитата Сообщение от Nexi99 Посмотреть сообщение
а на другом судя по вашему ответу может не работать т.е. возможно придётся перекомпилировать программу
А попробовать написать программу, скомпилировать её и запустить на двух разных компьютерах ты не можешь?
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
29.08.2020, 01:00
Цитата Сообщение от Nexi99 Посмотреть сообщение
Один из них когда код компилируется он будет работать только на твоём процессоре, а на другом судя по вашему ответу может не работать
Может быть и так, что программа будте компилироваться на твоём процессоре, но будет не будет на нём работать, а будет работать на машине твоего друга с модным процессором, способным выполнять модные суперпупергипертензорные инструкции.

Цитата Сообщение от Nexi99 Посмотреть сообщение
Мне вот интересно если я напишу на Ассемблере функцию и задумаю передать в с++ как мне накрыть её такими возможностями или какую методику придумать чтобы эту функцию приспособить под другой процессор?
А зачем для этого ассемблер?

Цитата Сообщение от Nexi99 Посмотреть сообщение
Также возникает вопрос а что если будут созданы новые процессоры, как компилятор с++ про них узнает чтобы применить все нужные ассемблерные штучки. Так что хоть тут и все умные но толком никто не знает как это происходит.
Это постоянно происходит.
Компиляторы пока не настолько умные, чтобы скачивать PDFки с описаниями новых инструкций, и себя модифицировать, чтобы их использовать.
Когда IBM выпускает очередное поколение своих мейнфреймов: Z14, Z15 etc., она обновляет свои ассемблеры и компиляторы, чтобы использовать новые возможности аппаратуры.

А если придумают что-то новое AMD, ARM или Intel, то, чтобы прикладные Windows-программисты могли оптимизировать программы под новые процессоры, программистам Microsoft нужно изучить документацию, доработать ассемблеры и компиляторы, отладить на образцах, представленных разработчиками аппаратуры, и выпустить очередное обновление MS Visual Studio.
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
29.08.2020, 01:06  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
А зачем для этого ассемблер?
Ну не хватает мне с++ он ограничен этой статикой сильно. И судя по ответам именно от вас очень сильно. Значит всё таки он статически рассчитан на процессоры тоже и под них он может Ассемблировать коды.
Значит грубо говоря это правда что под каждый процессор нужно учить программиста для написания кода на Ассемблере.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
29.08.2020, 01:12
Цитата Сообщение от Nexi99 Посмотреть сообщение
Ну не хватает мне с++ он ограничен этой статикой сильно.

Не по теме:

По моему вы вообще не понимаете о чем говорите и что вам нужно... Что скорее всего вызвано сильным недостатком знаний в данной области. Вам бы учебники почитать хотя бы того же С++ прежде чем лезть в assembler...

0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
29.08.2020, 01:23
Можно научить не программиста, а программу на языке высокого уровня генерировать инструкции процессора и складывать их в исполняемые файлы в формате, подходящем для загручика приладных программ ОС.
Большинство современных ассемблеров, компоновщиков, компиляторов и отладчиков написаны на языках высокого уровня, в т.ч и на с++.
Если ассемблер умеет формировать коды инструкций, то почему Ваша программа на с++ не сможет?
Сложные задачи эффективнее решать, используя оптимизированные высокоуровневые инструменты.

Или Вы Ассемблером называете что-то иное?
0
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4
29.08.2020, 02:37  [ТС]
Цитата Сообщение от politoto Посмотреть сообщение
Сложные задачи эффективнее решать, используя оптимизированные высокоуровневые инструменты.
Ну это понятно. Языки якобы пишутся на "самих себе" это я уже понял, понятное дело что так как вы говорите легче, зачем изучать и переписывать уже созданные правила когда можно взять часть оболочки высокого уровня и модернезировать её чтобы она было более продвинутой. Да хватит для 95% моих целей С++ от и до, просто мозг хочет развиваться.
0
738 / 705 / 110
Регистрация: 29.05.2015
Сообщений: 4,362
29.08.2020, 07:42
Цитата Сообщение от Nexi99 Посмотреть сообщение
когда можно взять часть оболочки высокого уровня и модернезировать её чтобы она было более продвинутой. Да хватит для 95% моих целей С++ от и до, просто мозг хочет развиваться.
Nexi99, а какие программы ты уже написал на языке любого уровня? Что-то подсказывает мне, что никакие. И твоему мозгу ещё долго нужно "развеваться", что-бы начать что-то "модернезировать".
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
29.08.2020, 07:44
Если не хватает гибкости серийных процессоров, изучайте, например, FPGA и программно-языковой инструментарий, используемый для задания их конфигурации. И получите не жалкие 5%, а ещё более 95% для развития мозга.

В некоторых системах ассемблеров вообще нет и не было.
Что касается гибкости с++, то подобный код не обязан даже компилироваться, но, на машинах т.н. фон-неймановской(манчестерской) архитектуры, зачастую, работает ожидаемым образом:
C++
1
2
3
4
5
6
7
8
#include <cstdint>
 
int32_t*
mycode(){
 
    return reinterpret_cast<int32_t*>(mycode);
 
}
Если нужна гибкость иного рода, то программу на с++ можно дополнить, например, каким-нибудь лиспом, возможно, самодельным или попсовыми lua и пайтоном. И JIT-ассемблером, написанным на современном с++.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.08.2020, 07:44

Есть ли архиватор, который под разными паролями распаковывал бы разные архивы ?
Здраствуйте, мне нужна такая вот опция, я беру 3 разных тхт документа, добавляю их под разными паролями в один архив. и далее мне надо...

Почему данный код игнорирует 1-ый символ и приходится первую букву дублировать?
Здравствуйте, подскажите пожалуйста почему данный код игнорирует 1-ый символ и приходится первую букву дублировать ? #include...

Как может сервер-сайд код работать или не работать на конкретном компе?
Всем привет! Вот такая проблема. Есть сайт, все работает ок, но - один из компов имеющий Win98 и IE6.0 and service pack 1 работает очень...

Что почитать что бы писать на ассемблере под arm?
Подскажите книги где учат программировать ARM только на ассемблере!

Может ли компьютер сам писать код и проверять его?
Всем привет! Такая мысль возникла, а что, если бы компьютер сам писал код, а программист бы лишь руководил процессом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru