Насколько «низко» находится C как язык «низкого уровня»? [Закрыто]

Ubuntu 12.04 LTS, 14.04 LTS, 16.04 LTS, 17.10, 18,04 LTS

можно сделать это через Терминал:

  1. GIMP

    sudo apt-get autoremove gimp gimp-plugin-registry
    
  2. Удаления Добавляет, что следующий PPA

    sudo add-apt-repository ppa:otto-kesselgulasch/gimp
    sudo apt-get update
    
  3. Переустанавливает последний GIMP

    sudo apt-get install gimp
    
23
задан John Saunders 17 February 2011 в 14:26
поделиться

3 ответа

Человек, который создает аппаратное обеспечение (процессор, материнскую плату и т. Д.), Также предоставляет свой машинный язык (язык ассемблера). Это становится самым низким уровнем. Затем другой человек пишет компилятор для C, который конвертирует синтаксис C в родной язык ассемблера для этого оборудования (пожалуйста, исправьте меня, если я ошибаюсь). С C вы можете использовать сборку, следовательно, достигнут самый низкий уровень !!

3
ответ дан 29 November 2019 в 01:51
поделиться

C сегодня используется во многих случаях как «переносимый язык ассемблера», потому что семантика языка может быть в значительной степени лишь тонким слоем над базовой архитектурой машины.

В прошлом было довольно просто посмотреть на строки кода на C и понять, каким будет реальный машинный язык, который будет генерировать код на C.

Если рассматривать его целиком вместе с окружающей средой разработки, то легко получить полный контроль над структурой памяти структур данных и общим размещением памяти. Имейте в виду, что этот вид кода C, в целом, не переносим, ​​поскольку он опирается на детали реализации компилятора, которые стандарт C позволяет гибко использовать, и он основан на реализации. Но в целом сам код C может быть САМОГО переносимым. Именно этот аспект языка привел к его популярности в таких системах, как Unix, благодаря возможности переноса большей части ОС между компьютерами при минимально возможных аспектах реализации, скажем, на ассемблере. 113]

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

Простой надуманный пример выглядит примерно так:

int func(int a, int b) {
    int c;
    int d;

    d = 10;
    return a * d;
}

В простом компиляторе реализация вполне может выделить 4 целых в стеке, 2 для аргументов и 2 для рабочих переменных. Очевидная оптимизация заключается в том, чтобы вообще не выделять переменную 'c', поскольку она не используется. Дальнейшая оптимизация заключается в том, чтобы игнорировать и d, и просто использовать константу 10. И даже более умный компилятор может хорошо видеть, как используется эта функция, и автоматически встроить ее в вызывающую функцию, полностью исключая вызов подпрограммы.

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

1
ответ дан 29 November 2019 в 01:51
поделиться

Тот факт, что вы задаете этот вопрос, выражает вашу наивность предмета. Это не так просто.

В конце - C не обладает полным гибким языком ассемблера, но он подходит близко. В ней отсутствуют такие функции, как Tail Recursion

Но в большинстве случаев C делает все, что вам нужно - вероятно, нужно -

-3
ответ дан 29 November 2019 в 01:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: