Обновить

Комментарии 11

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

Ну если не увидишь, как специалист при переходе с ассемблера на ЯВУ начинает компилировать программу на Си в ассемблерный код для поиска ошибок… ( Си в свое время такое позволял). :)))

И как эти ваши ассемблеры изучать...я смотрю на начало его и уже голова кругом...

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

 

                Худший вариант объяснения, что такое указателей, это начать с ячеек памяти… для людей знакомых только с ЯВУ. В свое время они появились в Си, который позиционировался как «высокоуровневый» ассемблер, вероятно чтобы напрямую работать с памятью и соответственно упростить компиляцию в команды ассемблера. Наворотили специальных обозначений и сделали «головную боль» для бедных программистов.

                Переменная – это имя и значение (ну и тип в нормальных языках), просто на одно значение может указывать несколько имен и соответственно при операции присваивания нужно различать, что присваивается значение новой переменной или дополнительное имя значению старой переменной.

Из этого текста понятно, что есть указатель (оно и без объяснений понятно), но основная проблема в понимании зачем этот указатель нужен. То же самое можно сделать с помощью переменных и оно будет в разы понятнее, без всяких этих разыменований.

Указатели нужны чтобы обойти ограничение передачи аргументов в функцию по значению. Если просто передать в функцию целочисленную переменную, например, то изменение аргумента внутри функции никак не повлияет на переменную снаружи, так как при вызове значение было просто скопировано. Передача же указателя копирует значение указателя - адрес ячейки памяти, а имя адрес, можем изменить исходную переменную уже внутри функции. То есть в обоих случаях аргументы передаются по значению, только в первом значение - само число, а во втором - адрес переменной.

Интересно, при чем здесь конкретно Go - понятие указателя существовало за много десятилетий до этого языка

Вот да, я ожидал что-то про Garbage collector в golang и как он работает с указателями.

Указатель — это значение, которое хранит адрес другой переменной.

Мне кажется, эта строка звучит слишком инородно для текста на русском. Переменная может что-то "хранить", значение может чем-то "являться" и т. д. Но фраза "значение что-то хранит" звучит слишком обывательски для обучающего материала. Лучше поискать вариант поточнее.

Кстати, мне обычно нравится следить за ходом мысли Дейва Чейни, он большой молодец, но конкретно этот его пост показался не очень удачным. Это тот редкий случай, когда вместо дословного перевода более выигрышно смотрелся бы "вольный перевод" или переработанная статья.

Парочка go-специфичных вещей типа того, что если создать переменную внутри функции на стэке, а потом вернуть указатель на нее, то она будет перемещена в кучу, при этом передача указателя на локальную переменную при обычном вызове функции такого эффекта не имеет и работает также, как передача указателя в C. И да, про выделение статичного куска памяти и ручное управление выделением освобождением, минуя сборщик мусора, тоже было бы интересно почитать, а ведь такое есть.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации