The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Выпуск языка программирования Rust 1.37"
Отправлено Ordu, 17-Авг-19 22:53 
В C есть абстракции, если ты их не видишь, то это значит, что ты не кодил на ассемблере. Возьмём, скажем, понятие "переменная". В ассемблере такого понятия, по-хорошему, нет. Там есть регистры, есть стек, есть RAM. И ты перекладываешь значения с места на место. Некоторые места в RAM могут иметь вполне определённую семантику, и такие места можно назвать переменными, но подчастую работа с этими переменными сводится к тому, чтобы забрать оттуда значение, что-то с ним сделать, положить обратно. В C же, переменная -- это переменная, она может располагаться на стеке, в куче, в статической памяти, в регистре, иногда это определяется контекстом, но очень часто компилятор за тебя решает, когда и какая переменная будет представляться регистром, а когда ячейкой стека.

А типы? В асме нет типов, тип значения определяется операцией, которую ты выполняешь. Если add -- это целочисленное сложение 32-х битных целых, то она будет складывать 32-х битные флоаты как целые числа. В C тип определяется типом переменной или другого источника/приёмника откуда ты берёшь или куда ты кладёшь значение. Если ты используешь операцию + для сложения целых, то она сложит целые. Если ты используешь её для сложения float'ов, она сложит флоаты. При этом при необходимости типы аргументов будут приведены до соответствия друг-другу. Особенно эти сишные типы заметны на указателях: для асма нет разницы между целым значением, void* и char*. Ты когда пишешь на асме думаешь об указателях как о целых числах. В C же, указатель с некоторой натяжкой можно назвать целым числом, но в зависимости от типа указателя операция сложения будет выдавать разные значения. (char*)0 + 1 даст 1, а (int*)0 + 1 даст 4.

В C есть функции -- это тоже абстракции. В ассемблере есть код и есть данные, деление между ними условно -- ты можешь сделать jmp на данные, или прочитать байт кода в регистр. В асме ты можешь создавать функции, но при этом ты можешь сделать call в середину функции, или jmp из одной функции в другую. И, я отмечу, это не всегда глупость, это может быть вполне осмысленным и полезным действием. Скажем, tail call'ы так и делаются -- вместо call func/ret, мы делаем jmp func. Функции с несколькими точками входа тоже не редкость в асме.

Абстракции есть в любой проблеме, о которой ты в состоянии думать. Если ты не видишь этих абстракций, значит ты недостаточно глубоко копнул.

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру