Pull to refresh
-1
0
Send message

Не нужно путать мнемокод ассемблера и машинный код. Машинный код это двоичные данные, которые непсредственно исполняет процессор, и ничего там уже не переименовывается и не изменяется. Есть ещё байт-код, например Java, но он исполняется не непосредственно процессором, а run-time интерпретатором — специальной программой, которая превращает байты этого кода в вызовы специальных подпрграмм — он так же не является машинным кодом!
Если Вы на assembler напишете программу, то каждая инструкция будет однозначно преобразована в машинный код, и если дезассемблировать полученный дамп данных, вы получите практически тот же исходный код, единственное — это символические имена меток и адресов памяти будут в виде цифр. Поэтому assembler и является языком низкого уровня. Вам нужно знать все спецификации процессора, для которого пишетсчя программа — никакой абстракции, bare metal!
Чтобы пояснить наглядно разницу низкоуровневого ассемблера и высокоуровнего С, приведу маленький пример из жизни 8-битных микропроцессоров AVR. В серии megaAVR есть блок умножения и соответствующая инструкция mul, а в tinyAVR такого блока и инструкции — нет. То есть, написанная программа на ассемблере, для megaAVR с использованием инструкций mul не может быть скомпиллирована для tinyAVR. Все операции умножения прийдется заменить подпрограммой умножения, которая использует, допустим, сложение в цикле. Это говорит о том, что программист должен знать сиецификацию целевого процессора, набор команд, регистров итд. В С можно просто написать a=b*c; и это без переделок можно скомпиллировать для любого процессора, даже не задумываясь, может ли его АЛУ перемножать числа или нет. Компилятор языка С сам заменит умножение на нужрую инструкцию или подпрограмму, в зависимости от используемого целевого процессора.

В своё время нам так разъясняли, чем отличаются языки высокогоуровня от низкого — наличием абстракции. По скольку типы данных и операции языка С абстрагированы от архитектуры — он является языком высокого уровня по определению. Например, такие вещи, как операции с плавающей точкой, являются частью стандарта языка С, однако некоторые архитектуры имеют только целочисленные АЛУ, но благодаря компилятору, программисту не надо об этом заботиться. Разработчики, использующие языки с бОльшим уровнем абстракции, как GO, например, считают С языком низкого уровня, но это не так.

Достаточно удобно иметь возможность управлять климатом (кониционер, отопление) удалённо. Таймеры — это всё хорошо, но не всегда даёт желаемый результат. Вот, например, я в основном работаю дома, но иногда нужно съездить в офис, причем время и продолжительность непредсказуемы. Жена работает в поликлинике + вызовы, то же получается непредсказуемый график. Когда дома никого нет, кондиционер выключен, но хочется войти в охлаждённую комнату. Здесь и выручает удалённое управление. С телефона, за пол-часа до планируемого прибытия, включаем кондиционер и получаем то, "о чём мечтали большевики". Так что, ничего маниакального. Если есть возможность сделать себе удобно, почему не сделать?

Про "импортозамещение" — это шутка такая? Если нет, то объясните, что именно было "замещено" с импортного на отечественное?

Вся жизнь пронеслась перед глазами. Первый мой ПК был XT-совместимый тайваньский клон с процессором 8088. Там был CGA адаптер и 2 5-дюймовых флопа. Вот, начиная с этого раритета, я почти все поколения процессоров поюзал. А прошло то всего каких-то 35 лет...

В моем случае на одном IP висит целый городок (приватная сетка/NAT). И тем не менее Гугл позволил создать логин без телефона. Похоже критерии другие. Проверил через VPN с выходом из офиса Тбилиси — тоже можно без телефона.
Интересно, а если создать ящик на gmail без телефона, скажем через VPN, а затем заходить с российских адресов, gmail потребует телефон или нет?
Страна и IP — Украина.
Не знал, что у Гугла есть такие заморочки
Только что создал еще один логин на gmail. Телефон (опционально) — не указывал. Всё работает без проблем, как и много лет назад.

На gmail у меня ящичек без телефона зарегистрирован уже лет 10.

Но эти модели совсем не из массового сегмента и не делают производителям основной выручки.

Да, цифры за квартал не такие уж красивые, возможно. Но Тесла при этом не успевает делать автомобили, приходится становиться в очередь на месяцы, а Audi или BMW я могу купить прямо сейчас, в течении наскольких минут, при чем в салоне есть приличный выбор. Если бы Тесла успевала за спросом, то графики для других производителей были бы совсем унылыми. У любого производителя самая важная задача — продать, а у Тесла эта проблема пока(!) не стоит.

Сейчас на улице +37. Что делать с такими часами? Не отходить от кондиционера?

Но ведь Intel и IBM тоже начинали с небольшого рынка. Хотя сама идеология социалистической экономики оказалась нежизнеспособной, что и привело в результате к развалу СССР. Хотя, если бы "партия и правительство" приняли курс на строительство своей "силиконовой долины", возможно, сегодня существовали бы компании из постсоветского пространства — равноправные игроки рынка процессорных архитектур. Но не сложилось.

Нет смысла? В СССР, наверное, тоже так посчитали. И вместо того, чтоб приложить усилия на создание своего процессора, решили тупо копировать (воровать) западные разработки. В результате мы имеем то, что все процессоры оказались у "потенциального противника", а экс-СССР фактически остался за бортом современной электронной промышленности. А могли бы построить свой "Интел".

"Свой" процессор говорите? Ядро, система команд разработаны в РФ? Вот у Intel — свой процессор, еще у IBM и HP тоже. Также Atmel и Microchip могут заявить, что имеют свои AVR и PIC. Немногие компании могут похвастаться наличием своего процессора, потому как дело это очень затратное. Кроме разработки архитектуры, системы команд итп, нужно еще, как минимум, разработать toolchain (компилляторы и утилиты).

Почему так происходит уже ответил выше. А делать так, конечно же не стоит. Просто С допускает такие вольности, но это на некоторых архитектурах может дать совсем другие результаты.

Вот, пример, когда переменные a1, b1 глобальные, те не помещены в стек. Адреса назначаются в другом порядке.
#include <stdio.h>
int a1;
int b1;

int main() {
int a;
int b;

int *p = &a;
int *q = &b + 1;

int *p1 = &a1;
int *q1 = &b1 + 1;

printf("%p %p %d\n", (void *)p, (void *)q, p == q);
printf("%p %p %d\n", (void *)p1, (void *)q1, p1 == q1);
return 0;
}

Компилируем без оптимизации
$ gcc 1.c
$ ./a.out
0xbedd7614 0xbedd7614 1
0x205c8 0x205d0 0
Проверил на Linux x86_64(GСС), Linux armhf (GCC), а также на ARM Cortex-M0 (компилятор ARMCC) — результаты аналогичны, не стал копипастить.

Объяснить легко — переменные внутри функций размещаются в стеке, а стек обычно растет "вниз" (на некоторых архитектурах возможно и нет, но на x86/x64 — точно). То есть следующий помещаемый элемент будет иметь адрес меньше предыущего, что мы и видим в примере. Если объявить эти переменные вне функции (глобальными), фокус может и не сработать — все зависит от реализации компилятора.
Насчет сравнения указателей — это, как уже сказали, козни оптимизации.

Можно еще добавить: "Вот когда выиграете суд у Microsoft, тогда поговорим". А к стати, юристы MS не "наезжают"? Иногда, читая новости про очередные судебные разборки из-за кликов мышкой или скругленных углов корпуса, кажется, что мир сошел с ума.

Лучше ультразвуковой в крышку.

Information

Rating
Does not participate
Registered
Activity