Форум программистов, компьютерный форум, киберфорум
C (Си)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для orcali
0 / 0 / 0
Регистрация: 26.12.2023
Сообщений: 14

Компилятор, препроцессор, язык Си

26.12.2023, 21:49. Показов 2404. Ответов 22

Студворк — интернет-сервис помощи студентам
Всем привет. Стал изучать указатели и возник вопрос, связанный с инициализацией переменных и адресов. Что происходит с компилятором? Решил провести и программу для теста.
Алгоритм такой
1. Создать переменную
2. Выйти из области видимости
3. Создать переменную
4. Вернуться в область видимости
5. Проверить адрес
Программа работает как и ожидалось, смещение в стеке 4 байта, но если повторить итерацию,
то адреса дадут неожиданный результат, что сломало мне мозг. Для объяснении проблемы выведу адресацию
в таком стиле X+0.

Алгоритм выглядит так:
инициализация X+0(имя переменной = i)
выход из {}
инициализация другой переменной, где ей дают X+4(потому что int занимает в стэке 4 байта, если я правильно понимаю)
вход в {}, где снова инициализируется i, и ей снова дается адрес X+0
инициализация переменной i в другой области видимости{}, где ей даётся адрес X+8
но прикол в том, что на этот раз, программа выдала адреса другим образом.
Ожидалось адресация X+0, X+4, X+8 и т.д.,
но она выдала X+0, X+8, X+4. Вопрос почему?
Второй вопрос, как компилятор хранит переменные. Почему он понимает, что в одном месте к переменной X я обращаюсь по адресу X+0, а в другом месте к переменной Х, я обращаюсь по адресу X+N?
Программа написана таким алгоритмом:
C
1
2
3
4
5
for(int fori = 0; fori < 3; fori++){
    if(fori == 1){инициализация j}
    if(fori == 2 {инициализация i}
    for(инициализация i){}
}
Добавлено через 1 минуту
Вот полный код
C
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
#include <stdio.h>
#define GETTABLE(DATA)\
    printf("\naddress("#DATA")\t\t%d\
        \nvariable("#DATA")\t\t%d\
        \ndata("#DATA")\t\t%d", &DATA, DATA, *DATA);
 
int main(void){
 
    int *p1, *p2;
    printf("int=%d", sizeof(int));
    for(int fori = 0; fori < 3; fori++){
        if(fori == 1){
            int j = 51;
            p2 = &j;
            GETTABLE(p2);
        }
        if(fori == 2){
            int i = 3333;
            p2 = &i;
            GETTABLE(p2);
        }
 
        for(int i = fori; i < 10; i++){
            if(i == fori){
                p1 = &i;
                GETTABLE(p1);
            }
        }
        GETTABLE(p1);
    }
    
    return 0;
}
Добавлено через 1 час 1 минуту
Решил дописать код только что. У меня появилась теория, что инициализация переменных идет либо в порядке исполнения, либо с конца кода программы. Добавил 3 и 4ый указатель.
Алгоритм инициализации:
p2 p3 p4 p1 если рассматривать с точки зрения кода
p1 p2 p4 p3 если рассматривать с точки зрения исполнения программы. Адресация не соответствует ожиданиям
x+0 x+12 x+4 x+8
если рассматривать адресацию слева-направо и справа-налево с точки зрения кода и исполнения, это невозможно ни при каких обстоятельствах.
Как и нелогичное поведение программы
C
1
printf("%d %d %d %d" i, i++, ++i, i)
, где результат программы зависит от компилятора.

Добавлено через 9 минут
Всё. Я разобрался в теме. Инициализация переменных идет снизу вверх, не по алгоритму, а снизу вверх по коду. Просчитался.
C
1
2
3
4
if(p2=вторая инициализация по алгоритму)
if(p3=четвертая инициализация)
if(p4=третья инициализация)
for(p1=первая инициализация)
адресация выстроилась таким образом
p1, p4, p3, p2
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.12.2023, 21:49
Ответы с готовыми решениями:

Как настроить компилятор Visual Studio 2017 на язык Си?
В свойствах проекта меняю на компилировать на си, после запуска отладки выходит ошибка и открывается новый проект corecrt_wconio.h и т. д....

Русский язык в консоли Windows 10. IDE: CodeLite. Компилятор: TDM-GCC-32
Здравствуйте. Windows 10. IDE: CodeLite. Компилятор: TDM-GCC-32 В файле main.cpp такой код: #include &lt;iostream&gt; #include...

Ассемблер - это макропроцессор, транслятор, препроцессор, интерпретатор, компилятор, кросскомпилятор или транслитератор?
макропроцессор транслятор препроцессор интерпретатор компилятор кроскомпилятор транслитератор ??

22
913 / 339 / 135
Регистрация: 18.07.2017
Сообщений: 1,485
27.12.2023, 16:25
Лучший ответ Сообщение было отмечено orcali как решение

Решение

Цитата Сообщение от orcali Посмотреть сообщение
Инициализация переменных идет снизу вверх, не по алгоритму, а снизу вверх по коду
Инициализация - присвоение значения переменной, если меня совсем маразм не съел и с выделением памяти под переменные не связан вообще никак.
C
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
#include <stdio.h>
#define GETTABLE(DATA) printf("("#DATA")=%u ->\t%u\n", &DATA, DATA);
 
int main(void){
    printf("int=%d\n", sizeof(int));
    int j1; GETTABLE(j1); // Область видмости main - X
    int j2; GETTABLE(j2); // Область видмости main - X + 4
    int j3; GETTABLE(j3); // Область видмости main - X + 8
    { // Начало новой области видимости (назовем L1)
        int i1; GETTABLE(i1); // Область видмости i1
        {
            int i2; GETTABLE(i2);
            {
                int i3; GETTABLE(i3);
            }
        }
        int i4; GETTABLE(i4); // Область видмости L1
        {
            int i5; GETTABLE(i5);
            {
                int i6; GETTABLE(i6);
            }
        }
 
        {
            int i7; GETTABLE(i7);
        }
    }
    
    return 0;
}
Code
1
2
3
4
5
6
7
8
9
10
11
int=4
(j1)=2847890124 ->  0
(j2)=2847890128 ->  0
(j3)=2847890132 ->  0
(i1)=2847890136 ->  0
(i2)=2847890144 ->  0
(i3)=2847890148 ->  0
(i4)=2847890140 ->  0
(i5)=2847890144 ->  0
(i6)=2847890148 ->  0
(i7)=2847890148 ->  0
Получается что сначала выделяется место под переменные функции main, потому что это область видимости верхнего уровня, а затем поочередно считается для каждого следующего уровня, причем рекурсивно.

Поэтому адреса i2 = i5, i3 = i6 Это разные области видимости, но одного уровня.
Кроме того можно видеть что i6 = i7. Это похоже на оптимизацию, (создание-удаление переменных на стеке выполняется с помощью push-pop команд).
0
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 859
27.12.2023, 20:04
а если включить оптимизацию и не выводить в явном виде на экран адрес переменной, то этого адреса может и не быть
0
фрилансер
 Аватар для Алексей1153
6440 / 5634 / 1127
Регистрация: 11.10.2019
Сообщений: 14,980
27.12.2023, 21:57
Цитата Сообщение от orcali Посмотреть сообщение
1. Создать переменную
2. Выйти из области видимости
3. Создать переменную
4. Вернуться в область видимости
5. Проверить адрес
Программа работает как и ожидалось, смещение в стеке 4 байта, но если повторить итерацию,
то адреса дадут неожиданный результат, что сломало мне мозг. Для объяснении проблемы выведу адресацию
в таком стиле X+0.
объясняется так: компилятор играет адресами автоматических переменных так, как посчитает нужным. Без объяснений.
Если хочется немного контроля - нужно пользоваться динамической памятью

Добавлено через 41 секунду
Цитата Сообщение от orcali Посмотреть сообщение
препроцессор
при чём тут препроцессор - осталось непонятным
0
 Аватар для orcali
0 / 0 / 0
Регистрация: 26.12.2023
Сообщений: 14
27.12.2023, 22:51  [ТС]
Всем спасибо за ответы. Я думал, что меня 060$рут. Вообще у меня было вопросов 6, но я решил прежде чем задавать их на форуме прогуглить. И 4 из них пропало. Я буквально вчера узнал, что такое #define. Я думал это константа, спасибо авторам учебников, которые называют ее константой. Я столько мучился, а все мои проблемы решала она. Вернусь к теме. Начну с моего ошибочного умозаключения, который я написал в конце, и никто не подправил, мб потому что из-за наличия понимания в этой теме, не заметили мою ошибку. Я стал вести адресацию как Х+N, но я уверен, что вы все знаете про то, что стэк находится в конце процесса. Так что адресация идет X-N, где X самый последний байт. Из-за чего я сделал ошибочное заключение, утвердив, что адресация переменных идет снизу вверх по коду. Что никто не подправил. На самом деле, адресация идет в порядке текста в коде. И чем больше адрес, тем ближе переменная к началу стека, где стек находится в конце процесса. Алексей1153, я не совсем согласен с вашим ответом, потому что "компилятор играет так, как посчитает нужным". Какой вывод я должен сделать из этого? Компьютер работает как посчитает нужным? Еще вы не поняли почему я упомянул препроцессор. Ответ простой. Затупил как и на протяжении всей этой темы.

Добавлено через 5 минут
Цитата Сообщение от assemberist Посмотреть сообщение
Поэтому адреса i2 = i5, i3 = i6 Это разные области видимости, но одного уровня.
Кроме того можно видеть что i6 = i7. Это похоже на оптимизацию, (создание-удаление переменных на стеке выполняется с помощью push-pop команд).
(j1)=2295042652 -> 32531
(j2)=2295042648 -> 3282959024
(j3)=2295042644 -> 0
(i1)=2295042640 -> 0
(i2)=2295042632 -> 3282864000
(i3)=2295042628 -> 0
(i4)=2295042636 -> 32531
(i5)=2295042624 -> 0
(i6)=2295042620 -> 0
(i7)=2295042616 -> 0

У меня программа отработала так, у каждого свой адрес
0
фрилансер
 Аватар для Алексей1153
6440 / 5634 / 1127
Регистрация: 11.10.2019
Сообщений: 14,980
27.12.2023, 22:54
Цитата Сообщение от orcali Посмотреть сообщение
я не совсем согласен с вашим ответом, потому что "компилятор играет так, как посчитает нужным".
от согласия или несогласия поведение компилятора не поменяется

Цитата Сообщение от orcali Посмотреть сообщение
Компьютер работает как посчитает нужным?
компьютер - это электронное устройство, оно работает так, как посчитает нужным код программы.
А код работает так, как посчитал нужным программист
0
 Аватар для orcali
0 / 0 / 0
Регистрация: 26.12.2023
Сообщений: 14
27.12.2023, 22:56  [ТС]
С такими ответами я точно стану гиком
0
913 / 339 / 135
Регистрация: 18.07.2017
Сообщений: 1,485
28.12.2023, 02:03

Не по теме:

Цитата Сообщение от orcali Посмотреть сообщение
Я думал, что меня 060$рут.
Вопрос интересный, проблема изложена, собственный анализ есть, в конце четко поставленные вопросы. За что обсирать-то? За уважительное отношение?)


Цитата Сообщение от orcali Посмотреть сообщение
Я думал это константа, спасибо авторам учебников, которые называют ее константой.
Мда, это директива препроцессора. Если интересно, то могу посоветовать такой вот сайт https://www.c-cpp.ru/books читал его, когда си учил.
Цитата Сообщение от orcali Посмотреть сообщение
Что никто не подправил. На самом деле, адресация идет в порядке текста в коде. И чем больше адрес, тем ближе переменная к началу стека, где стек находится в конце процесса.
Не совсем так. Стек может расти как вверх, так и вниз. Это зависит от архитектуры процессора. В x86 стек растет вниз. Так что добавление чего-нибудь в стек уменьшает значение его вершины (см. вложение).
Цитата Сообщение от orcali Посмотреть сообщение
У меня программа отработала так, у каждого свой адрес
В моем случае переменные растут, но я запускал код в онлайн компиляторе, так что я не могу ничего утверждать ни про железо, ни про то с каким уровнем оптимизаций собирался код. Виноват, надо было-таки это упомянуть чтобы недопонимания не было.
Миниатюры
Компилятор, препроцессор, язык Си  
0
из племени тумба-юбма
 Аватар для мама Стифлера
2523 / 1819 / 419
Регистрация: 29.11.2015
Сообщений: 8,852
Записей в блоге: 15
28.12.2023, 02:49
Цитата Сообщение от orcali Посмотреть сообщение
Всем спасибо за ответы. Я думал, что меня 060$рут
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
28.12.2023, 13:43
Цитата Сообщение от orcali Посмотреть сообщение
я не совсем согласен с вашим ответом, потому что "компилятор играет так, как посчитает нужным". Какой вывод я должен сделать из этого? Компьютер работает как посчитает нужным?
Задача компилятора сохранить видимое поведение.
В частности для корректной работы локальная переменная совсем не обязательно должна быть в стеке, и совсем не обяательно ее помещение в стек (если оно действительно нужно) должно быть в том порядке, в котором вы ее объявили в коде.
Если адрес переменной не нужен и она умещается в регистр - она будет в регистре.
Если оптимизатор посчитал, что выгоднее (с точи зрения, например, скорости доступа) переставить местами размещение в стеке двух объявленных вами переменных - он сделает это.
Компилятор работает как посчитает нужным, при условии соблюдения видимого (требуемого программистом и при отсутствии UB) поведения.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
28.12.2023, 21:36
Цитата Сообщение от assemberist Посмотреть сообщение
создание-удаление переменных на стеке выполняется с помощью push-pop команд
Нет. Никакие "push-pop команды" никакого отношения к созданию-удалению переменных на стеке не имеют. См. ссылки ниже.

Цитата Сообщение от orcali Посмотреть сообщение
Я буквально вчера узнал, что такое #define. Я думал это константа, спасибо авторам учебников, которые называют ее константой.
Причина этого заключается в том, что #define - основной способ объявления именованных констант в языке С. Именно это, скорее всего, было сказано в вашем учебнике, а вы уже сами додумали это все до некоего огульного "называют ее константой".

Цитата Сообщение от orcali Посмотреть сообщение
что вы все знаете про то, что стэк находится в конце процесса.
Нет. Не обязательно. Под стек, как правило, заранее резервируется область адресного пространства фиксированного размера. Не имеет никакого значения, где находится эта область.

Цитата Сообщение от orcali Посмотреть сообщение
На самом деле, адресация идет в порядке текста в коде.
Грубейше не верно. В общем случае порядок расположения локальных переменных одной и той же функции в памяти никак не связан с порядком их определения в коде вообще.

Все это уже подробно разбиралось

Расположение переменных в памяти
Структура стека в MSVC

Цитата Сообщение от orcali Посмотреть сообщение
Почему он понимает, что в одном месте к переменной X я обращаюсь по адресу X+0, а в другом месте к переменной Х, я обращаюсь по адресу X+N?
Этого момента в примере разглядеть не удалось. О чем речь вообще? Где тут "в одном месте X+0, а в другом X+N"?
1
 Аватар для orcali
0 / 0 / 0
Регистрация: 26.12.2023
Сообщений: 14
29.12.2023, 12:35  [ТС]
Спс за ссылки. Я пробежался глазами, теперь нужно смотреть их код, и вдумчиво читать, что там написано.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Этого момента в примере разглядеть не удалось. О чем речь вообще? Где тут "в одном месте X+0, а в другом X+N"?
Я думаю на этот вопрос отвечать не буду, чтобы сэкономить ваше время, потому что этот вопрос как и 90% вопросов связанных с ПК это владение неправильными знаниями абстракций, и абсолютным пониманием ничего. Обойдемся без словесных прелюдий, у меня возник возможно для большинства "тупой" вопрос, но я не смог найти ответ на него, ни в гугле, ни на форуме.
----Вопрос-1----
Чем отличается Hello World в консоли, от Hello World драйверов, от Hello World операционных систем, от Hello World ядра операционной системы?

----Словесные прелюдии----
Если я захочу что-то из этого написать, то мне всегда предложат написать Hello world. Я видел разные блок-схемы абстракций ПК, и не находил блок-схему со всеми уровнями. Я буквально вчера узнал, что такое X-система, но поленился узнать какие аналоги ее есть. В общем вся моя боль заключается в том, как закрасить пиксель на уровне ядра. Как покорить всё это железо.
Я хочу покорить железо настолько, чтобы ставить Linux на микроконтроллер жесткого диска, и компрометировать безопасность операционных систем. В общем хочу вертеть ПК как кубик-Рубика. Я хотел бы стать пентестером, но я не хочу взламывать сайты, это не очень интересно. Хотя проникнуть на сервак сайта и получить root-права это интересно. Но мне до всего этого пока-что далеко. Не много проседает настроение, потому что прошло много времени, и я ничему не научился. Спасибо чуваку, который на этом форуме скинул скриншот поисковика гугла(на самом деле яндекса, просто гугл звучит лучше). В принципе я понимаю, как я выгляжу со стороны для прошаренных. В теории можно просто кидать скриншоты гугла, когда у людей возникают вопросы. Но есть разные методы обучения. Иногда нужно провести диалог, для того, чтобы проверить информацию на ее корректность, и понять куда двигаться дальше. Весь интернет превратился в то, что один двоичник списывает у другого. Один скажет ахинию, так его еще начнет цитировать весь интернет. "Язык Си написан на язык Си". Я думаю первые программисты, которые писали первые компиляторы с помощью перфокарт(или чего-либо еще), каждый раз переворачиваются в гробах от этой фразы. Да, язык Си прошел раскрутку через Си++(точнее компилятор, если я всё правильно понимаю), но прежде Си++ использовался фортран и ассемблер https://qna.habr.com/q/1083290.Также можно посмотреть процентное соотношение https://github.com/gcc-mirror/gcc.

----Вопрос-2----
Как называются нюансы в ЯП?
----Приведу пример----
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
 
int main(){
    int a = -1;
    int b = 1;
    int c = 0;
 
    /* с запятой можно играться по разному */
    if(a, c)
        printf("Don't look at me");
    if(b, a)
        printf("Look at the magic\n");
    if(b, c)
        printf("Don't look at me");
    if(b, c, a)
        printf("Magic!\n");
    if(c, b)
        printf("Look how handsome I am");
 
    return 0;
}
Хотя не все изучают, что такое && и что такое ==. Но есть вопрос. Что такое запятая? Почему в одном случае текст появляется, в другом нет? Я необразованный самоучка и часто обращаюсь к друзьям, которые учатся в ВУЗах, и они очень часто не знают ответов на мои вопросы. Т.е. они не знают чем отличается signed int от простого int. Этот вопрос возник в цикле for(), но я думаю проблема была в опечатке, потому что когда я попытался восстановить ошибку через пару месяцев, компилятор говорил всё ок. Хотя в тот момент, они обратились к другому айтишнику, который шарит больше них, цитирую его ответ: "Но нет смысла задаваться такими вопросами пока ты мал и глуп и не занимаешься какой-то околокомпиляторразработкой". Но он мне объяснил, это то, что мне досталось из пересланного сообщения в качестве ответа. А вспомнил, там была ошибка в том, что нужно было использовать int или я так понял причину ошибки. Хотя вероятность опечатки высока.

Добавлено через 12 минут
Да, и жалкое это зрелище, когда на вопрос, - как сделать человека? - тебе всегда отвечают, - лепи из пластилина! ИЗ ПЛАСТИЛИНА МОЖНО СДЕЛАТЬ ВСЁ!!!! - еще раздражает, когда пытаются выставить идиотом. Особенно когда задаешь вопросы про то, как работает ПК(как выглядит человечек), тебе так поверхностно и легко отвечают. Еще мнят о себе высоко. Ты несколько лет делаешь сайты, а написать ядро или какой-нибудь драйвер не можешь. Очень сложно найти свет во тьме интернета. На форумах часто несут ахинию, кругом невежество, либо безбрежность. Спорят программисты на темы "нужен ли ассемблер?" и т.п. И кому верить? Проблематика вопроса "как сделать человека" в IT заключается в том, что тот кто задает этот вопрос: не знает что такое рука, что такое нога и т.п. Я помню когда во втором классе спросил у учителя по информатике: "Что такое радиоэлементы? Что такое триггеры? Вычислительная техника? Что такое перфокарты? Как их вставляли в компьютеры? Можете мне рассказать про процессор с архитектурой Фон-Неймана? Чем отличаются диалекты языков ассемблера? Как написать компилятор? Что такое микроконтроллеры? Почему флешка это не компьютер, хотя на ней стоит микроконтроллер, а микроконтроллер это компьютер? Что такое ядро ОС? Что такое драйвера? Что такое docker? Что такое интернет-протоколы? X-протоколы? Файловые системы? Файлы? Почему я не могу посмотреть код директории на линуксе, если философия линукса директория это файл, всё - файл? Что такое операционная система? и т.д.", и все эти вопросы я задал ей в одном вопросе, - что такое провод? - в итоге она посмотрела на меня как дольаеьа. А какой вопрос может задать мальчик во втором классе, который думает, что компьютер сделан из проводов? Хотя суть этого вопроса была в том, как из красного шнурка получился Counter-Strike: Source.

Простите, накипело
0
 Аватар для orcali
0 / 0 / 0
Регистрация: 26.12.2023
Сообщений: 14
29.12.2023, 13:42  [ТС]
Вот еще пример. Этапы компиляции. Давайте посмотрим на разные схемы. Когда я задаю вопросы на темы работы ПК, у меня такое ощущение, что люди обучаются по четвертой картинке. Еще раз извиняюсь, форумчане, накипело. За полгода, ох, как накипело. Давайте посмотрим на первые три схемы. Да, схемы делают для упрощенной иллюстрации, но это привожу примеры как появляется невежество из-за небрежности(или невежества, потому что интернет это списать у другого двоичника и написать статью или еще хуже, залить видео на ютюб). Все эти схемы несут свои недостатки. Первая схема несет важную информацию о том, что в одном из этапов компиляции, код превращается в ассемблерный. Хотя умалчиваются остальные этапы. В других этапах умалчивается об ассемблере. Вторая иллюстрация делает упор на объединение проекта. Третья иллюстрация пытается показать весь путь, игнорируя ассемблер. Прикол в том, что таких схем много, и это наверно создает нагрузку на форумы в виде невежественных вопросов и невежественных ответов, которые появлялись на небрежных ответах других шарющих людей. Я никого не обвиняю, просто получился какой-то френдли фаир или что-то т.п. (Я не имел ввиду, что я думаю, что я шарю). Просто самоучке очень сложно отличать it's true от it's false, особенно, когда тебе часто отвечают, что это просто или ты еще тупой или в духе "из пластилина можно сделать всё что угодно!". Кстати, если в эту тему попадет какой-нибудь типичный самоучка, который вместо того, чтобы гуглить попадет на эту тему, в принципе я думаю ему было бы полезно что-то узнать из всей этой темы. Особенно момент "true/false", когда натыкаешься постоянно на споры прогеров. Очень полезно я думаю новичкам(это просто совет себе и резюмирую полученную инфу для себя, проделать такой опыт). Хорошо, что когда изучают интернет-протоколы, хотя бы показывают утилиты tracerout(для Linux, для windows tracert) и ping. А то я бы со всем потерял веру в человечество
Bash
1
2
3
4
5
6
cd /usr/include ; cat stdio.h
cd ~/YourPorject ;
gcc -S HelloAssembler.c
cat HelloAssembler.s
gcc HelloAssembler.s
./a.out
Миниатюры
Компилятор, препроцессор, язык Си   Компилятор, препроцессор, язык Си   Компилятор, препроцессор, язык Си  

Компилятор, препроцессор, язык Си  
0
 Аватар для orcali
0 / 0 / 0
Регистрация: 26.12.2023
Сообщений: 14
29.12.2023, 13:46  [ТС]
В общем я иду к тому, что хочу дорасти до такого уровня, чтобы говорить: "это не меня заперли с вами, это вас заперли со мной"))
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
29.12.2023, 19:45
orcali, учатся по книгам. Вот например маааленький список для тем "язык+алгоритмы+архитектура": (https://www.cyberforum.ru/post12974695.html) Для драйверов и низкого уровня в целом будет свой список. Для написания ОС - свой. Для уровня железа - свой.
На форумах никто не будет для вас писать книги. Вам могут ответить на конкретный вопрос, который вы должны сформулировать, читая книгу. Нет смысла ждать другого. На общие вопросы - вы получите общие ответы, которые, как правило, будут зависеть от специфики опыта отвечающего.
Что касается статей и видео: максимум - это практическое пособие к книгам. В смысле сначала вы читаете, потом идете смотреть видео, где, возможно, покажут какой-то пример или точку зрения. Только так. Не наоборот.

Чтобы выучиться - надо много вкалывать. Очень много. Ждать, что вам все до косточек объяснят - наивно. Даже самый лучший объясняльщик не сможет это сделать, если вы не возьмете за труд его послушать.

А еще есть такая штука как "контекст". Схемы, которые вы привели выше, объясняют что-то в контексте, т.е. чтобы их понимать правильно, нужно знать какой контекст предполагался. Здесь нет никакого абсолютного знания. Есть подходящий для текущей задачи контекст. Поэтому на один и тот же вопрос можно найти множество казалось бы разных ответов, и если игнорировать контекст, то будет казаться, что ответа нет вообще.

И да, учиться, только чтобы в итоге кого-то "нагнуть" (как "нагнул" автор цитаты, которую вы привели) - это так себе цель.

Добавлено через 1 час 32 минуты
Цитата Сообщение от orcali Посмотреть сообщение
Чем отличается Hello World в консоли, от Hello World драйверов, от Hello World операционных систем, от Hello World ядра операционной системы?
Окружением.
В консоли у вас есть библиотека времени исполнения, командная оболочка.
В драйвере - API ядра.
В операционной системе - загрузчик, BIOS и т.д. (Hello World есть здесь: https://wiki.osdev.org/Bare_Bones)

Цитата Сообщение от orcali Посмотреть сообщение
Что такое запятая?
В вашем примере - бинарный оператор (comma operator).
Работает так: для двух подвыражений a, b возвращается результат последнего. При этом оба подвыражения выполняются указанном порядке.
https://en.cppreference.com/w/... ator_other

Цитата Сообщение от orcali Посмотреть сообщение
Почему в одном случае текст появляется, в другом нет?
Потому что результат выражений разный.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    int a = -1;
    int b = 1;
    int c = 0;
 
    // результат 0, потому что с == 0, 0 - это FALSE, значит в условие мы не попадем
    if(a, c) 
    // результат -1, потому что a == -1, -1 - то TRUE, потому что любое ненулевое - это TRUE, в условие мы попадаем
    if(b, a)
    // результат 0, потому что с == 0, 0 - это FALSE, значит в условие мы не попадем
    if(b, c) 
    // результат -1, потому что a == -1, -1 - это TRUE, потому что любое ненелевое - это TRUE, в условие мы попадаем
    // выражение (b, c, a) означает (b, c), а
    if(b, c, a)
    // результат 1, потому что b == 1, 1 - это TRUE, потому что любое ненулевое - это TRUE, в условие мы попадаем
    if(c, b)
2
 Аватар для orcali
0 / 0 / 0
Регистрация: 26.12.2023
Сообщений: 14
29.12.2023, 20:52  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
orcaliЧтобы выучиться - надо много вкалывать. Очень много. Ждать, что вам все до косточек объяснят - наивно. Даже самый лучший объясняльщик не сможет это сделать, если вы не возьмете за труд его послушать.

И да, учиться, только чтобы в итоге кого-то "нагнуть" (как "нагнул" автор цитаты, которую вы привели) - это так себе цель.
Благодарю и очень сильно уважаю. Еще хочу извиниться, если кого-то обидел. У меня правда очень накипело за 6 месяцев. Я уважаю программистов, которые делают игры на движке UNITY и программистов, которые делают веб-сайты. Я хочу знать компьютер и разбираться в нем лучше всех. Возможно я скажу еще оскорбительное предложение для кого-нибудь, но я хочу быть архитектором, а не кирпичики на тротуар класть, и еще люди которые кладут кирпичики на тротуар могут вести себя максимально не толерантно. Еще раз извиняюсь накипело.

Я сейчас сижу на работе, и ко мне пришел клиент, и я как раз ему рассказал про эту тему, которую сейчас мы с вами обсуждаем и про свою позицию. Он программист. По его мимике и сарказму было понятно, что я безнадежен. Это очень неприятно было, но меня это не остановит. Хотя я ему рассказал, что не хочу делать сайты. Мне это не интересно. Еще я высказал свои мысли о том, что хочу изучить ассемблер, чтобы понять как работает ПК. Ему не понравилась эта идея. Хотя в интернете я видел, что пентестерам нужен ассемблер. За то он меня подьеьал за место, в котором я работаю. Но я выбрал это место за 12 часов свободного времени и легкого потока клиента, где можно сидеть с ноутбуком и изучать ПК. В общем всё идет к тому, что я скоро начну читать книжки по философии стоицизма и продолжать изучение. Мне нужно понять все эти абстракции, и как они связаны между собой со всеми подводными камнями(не прям со всеми, но чтобы выработалась корочка). В общем меня ждет долгий тернистый путь.

Я буквально вчера узнал, что я дое6истый. Обычно я не пытаюсь лезть в дебри, углубляться и т.д. Но я не знаю почему когда интересуюсь ПК, у меня миллиард вопросов, причем дотошно-придирчивых. Я никогда таким не был. И возможно из-за того, что программисты не лезут в дебри, на свет появляются schoolхакеры, которые за 5 минут с помощью эксплойтов могут компрометировать ПО, в котором более >50млн строчек кода.

Добавлено через 17 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
orcali
C
1
    // результат -1, потому что a == -1, -1 - то TRUE, потому что любое ненулевое - это TRUE, в условие мы попадаем
Я почему-то думал, что -1 это FALSE. Хотя если его перевести в двоичную систему, то там 8*sizeof(int) столько раз true.
0000 0001
1111 1110
1111 1111
Миллион раз благодарю. Ты не представляешь как мне стало легче. Побольше бы таких людей.
0
 Аватар для orcali
0 / 0 / 0
Регистрация: 26.12.2023
Сообщений: 14
29.12.2023, 21:03  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
orcali
Окружением.
В консоли у вас есть библиотека времени исполнения, командная оболочка.
В драйвере - API ядра.
В операционной системе - загрузчик, BIOS и т.д. (Hello World есть здесь: https://wiki.osdev.org/Bare_Bones)
[/CLANG]
Последний вопрос, чтобы не мучить форум и не наглеть. Есть ли где-нибудь информация о том, где какие окружения есть. Сейчас читаю книгу "Операционные системы" автор-Тоненбраум. Относительно книга сложная или не простая. Тем не менее, автор еще не раскрыл все абстракции и вроде как не рассказал, на сколько их раскроет. Надо было предисловие прочитать. Не бейте. Выражение, что на любом ЯП можно сделать всё что угодно. Действительно напрягает. Ты говоришь, что все эти программы отличаются окружением. Можно ли действительно любым ЯП выйти ЗА окружение? Это точно последний вопрос, потому что я действительно, сейчас поступаю как у6люд0к, потому что вы накидали очень много информации, на переваривании которой у меня по идеи, должно уйти более года.
Миниатюры
Компилятор, препроцессор, язык Си  
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
29.12.2023, 21:31
orcali, У Танненбаума есть еще одна книга "Архитектура компьютера", многие вопросы освещаются там.

Цитата Сообщение от orcali Посмотреть сообщение
Можно ли действительно любым ЯП выйти ЗА окружение?
Любым? Нет. Можно выйти только тем, который работает на нижестоящем уровне абстракции.

Цитата Сообщение от orcali Посмотреть сообщение
Есть ли где-нибудь информация о том, где какие окружения есть.
Например, вот:
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
29.12.2023, 22:08
Цитата Сообщение от orcali Посмотреть сообщение
"Язык Си написан на язык Си"
Вряд ли имелось в виду это.
Скорее "Компилятор языка Си написан на Си". И это правда. В том смысле, что это можно сделать.
Это никак не противоречит тому, что первый компилятор был написан на чем-то другом. Как только реализация была завершена, компилятор можно было попробовать переписать на реализованном языке. Это показатель жизнеспособности языка и зрелости реализации. Если ваш компилятор способен скомпилировать сам себя, значит вы определенно пришли к успеху.

Цитата Сообщение от orcali Посмотреть сообщение
в одном из этапов компиляции, код превращается в ассемблерный
В современных условиях это не так. Нет никакого смысла транслировать код в ассемблер (который по существу нужен только для человека), если можно сразу создавать машинный код.

Цитата Сообщение от orcali Посмотреть сообщение
можно посмотреть процентное соотношение
Справедливости ради, gcc - это целый конгломерат реализаций языков, а не только Си. И не весь код, который там есть, это код самих компиляторов. Там еще есть поддержка системы сборки, тесты и т.д. Но да, современный gcc - это в основном реализация на C и С++.
0
 Аватар для orcali
0 / 0 / 0
Регистрация: 26.12.2023
Сообщений: 14
30.12.2023, 11:02  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
orcali, У Танненбаума есть еще одна книга "Архитектура компьютера", многие вопросы освещаются там.
Ааааааааааааааааааааааааааа. Я хотел прочитать эту книгу. Я смотрел в ютюбе, что нужно пентестерам, и там чувак перечислил следующее(у этих книг автор Танненбраум). Видео найти не могу:
1. Современные операционные системы
2. Архитектура компьютера
3. Интернет-протоколы
4. Язык Си
5. Язык Ассемблера
Не в ту сторону рокировку сделал. Надо было делать в короткую сторону, а я сделал в длинную. У меня пока такой план:
ОС->АрхитектураПК->ИнтернетПротоколы->Библия Kali Linux -> Собеседование
Также параллельно
Язык Си->Собеседование->Ассемблер->Собеседование->Эксплойты->Собеседование и т.д.
Также мне нужно подумать над тем, какие проекты мне показывать. Чтобы показать, что я могу.
Если этот путь ничего не даст, надо будет думать что дальше делать. Я хотел бы заниматься физическим пентестом, когда ты проникаешь в банк, взламываешь видео-камеры, подделываешь пропуска и т.п. Или пентест в более запретные и более защищенные места. Хочу как можно дальше держать свою IT-деятельность от WEB-сайтов(хотя это самый популярный путь пентестеров). Кстати, внизу прилипил картинку, я ее называю "распятие программистов", как 1 превращается в 0, и как 0 превращается в 1. У меня на днях на мониторе вышел конденсатор из строя. Починил мой друг. Кстати, прародители хакеров это радиотехники. У меня в голове давно вертится мысль, как вывести транзистор из строя на компьютере. Точнее написать программу для этого. Теперь я задумался, а что если написать программу, которая взорвет все конденсаторы на мониторе. Но это вряд ли возможно, потому что от таких вещей защищают блоки питания, которые 220V преобразуют в 5V. А вот вывести биполярный транзистор с плавающим затвором, с помощью программы в теории можно. Просто сделать программу, которая будет бесконечно перезаписывать один и тот же бит в памяти, пока тот не выйдет из строя. А проверить это можно чтением байта. По идеи, если я туда запишу
1111 1111, а выведу 1 бит из строя,
то на выходе должен получить
1101 1111
И операционная система не должна это заметить. По крайней мере я на это надеюсь
В общем еще раз благодарю, и низкий поклон. Просто не дотерпел, и полез на форум.
Изображения
 
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.12.2023, 11:02
Помогаю со студенческими работами здесь

Компилятор с языка PL/1 на язык Ассемблер
Подскажите как написать компилятор на языке Си. Может быть есть примеры какие-нибудь, книги понятные. Начинала читать Ахо, Ульмана, как то...

Можно ли сделать язык(компилятор к нему тоже), который бы не зависел от ОС и програмного обеспечения?
Можно ли сделать язык(компилятор к нему тоже), который бы не зависел от ОС и програмного обеспечения? Может работать, как PHP, или ASP

Препроцессор
Профессионалы, ответте вот на какой вопрос: Мне необходимо получить файл, который образуется после обработки препроцессором, т.е....

Препроцессор
Можно ли как-нибудь исходный файл .с пропустить только через препроцесоор и получить результат?

Препроцессор
Задание: В function.cpp описать функции Вfunction.h описать прототипы, создать проверку(#ifndef) и определить имена...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru