Был ли язык программирования C считаться языком низкого уровня, когда он вышел?

В настоящее время C считается язык низкого уровня , но еще в 70-х годах он считался низким уровнем? Был ли этот термин даже в использовании?

Многие популярные языки более высокого уровня не существовали до середины 80-х и выше, поэтому мне любопытно, как и как изменился характер низкого уровня с годами.

148 голосов | спросил joeyfb 30 J0000006Europe/Moscow 2018, 18:45:30

7 ответов


156

Это зависит от вашего определения языка высокого уровня и низкого уровня. Когда C был разработан, все, что было выше, чем сборка, считалось языком высокого уровня. Это низкий бар для очистки. Позже эта терминология сместилась до такой степени, что некоторые из них в настоящее время считают даже Java языком низкого уровня.

Даже в языковой среде высокого уровня 70-х годов стоит отметить, что C довольно низкий уровень. Язык C в основном B плюс простая система типов, а B - не более чем удобный процедурно-структурированный синтаксический слой для сборки. Поскольку система типов представляет собой ретро-образную форму поверх нетипизированного языка B, в некоторых местах вы можете оставить аннотации типов и использовать int.

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

  • автоматическое управление памятью
  • вложенные функции или замыкания
  • базовые ООП или сопрограммы
  • более выразительные типы систем (например, ограниченные диапазоном типы, пользовательские типы, такие как типы записей, сильная типизация, â € |)

C имеет некоторые интересные функции:

  • поддержка рекурсии (как следствие ее автоматических переменных на основе стека, по сравнению с языками, где все переменные имеют глобальное время жизни)
  • указатели на функции
  • Пользовательские типы данных (структуры и объединения) были реализованы вскоре после первоначальной версии C.
  • Строковое представление C (pointer-to-chars) на самом деле является большим улучшением по сравнению с B, которое кодирует несколько букв в одно машинное слово.
  • Заголовочные файлы C были взломом эффективности, чтобы сохранить единицы компиляции небольшими, но также обеспечить простую модульную систему.
  • Неограниченные указатели и арифметика указателей в стиле по сравнению с более безопасными ссылками. Указатели являются неотъемлемой небезопасной функцией, но также очень полезны для низкоуровневого программирования.

В то время, когда C был разработан, другие инновационные языки, такие как COBOL, Lisp, ALGOL (на разных диалектах), PL /I, SNOBOL, Simula и Pascal, уже были опубликованы и /или были широко использованы для конкретных проблемных областей. Но большинство из этих существующих языков были предназначены для программирования мэйнфреймов или были академическими исследовательскими проектами. Например. когда ALGOL-60 был впервые разработан как универсальный язык программирования, необходимых технологий и компьютерных наук для его реализации еще не существует. Некоторые из них (некоторые диалекты ALGOL, PL /I, Pascal) также были предназначены для низкоуровневого программирования, но они, как правило, имели более сложные компиляторы или были слишком безопасными (например, без каких-либо ограничений). Паскаль заметно не поддерживает хорошую поддержку массивов переменной длины.

По сравнению с этими языками C отказывается от «элегантных» и дорогих функций, чтобы быть более практичным для развития на низком уровне. C никогда не был прежде всего проектом исследования дизайна языка. Вместо этого это был ответвление разработки ядра Unix на миникомпьютере PDP-11, который был сравнительно ограниченным ресурсом. Для своей ниши (минималистский низкоуровневый язык для написания Unix с однопроходным компилятором, который легко переносится) C абсолютно преуспел - и более 45 лет спустя все еще существует система lingua franca программирование.

ответил amon 30 J0000006Europe/Moscow 2018, 19:18:53
141

Чтобы ответить на исторические аспекты вопроса:

Философия дизайна объясняется в языке программирования C , написанном Брайаном Керниганом и дизайнером C Деннисом Ритчи, «K & R», о котором вы, возможно, слышали. В предисловии к первому изданию говорится:

  

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

и введение гласит

  

C является относительно «низкоуровневым» языком ... C не предоставляет операций для непосредственного взаимодействия с составными объектами, такими как символьные строки, наборы, списки или массивы. Нет операций, которые манипулируют целым массивом или строкой ...

Список продолжается до тех пор, пока текст не будет продолжен:

  

Хотя отсутствие некоторых из этих функций может показаться серьезным недостатком, ... сохранение языка до скромного размера имеет реальные преимущества.

(У меня есть только второе издание с 1988 года, но в нижеследующем комментарии указано, что цитируемый текст в первом выпуске 1978 года совпадает.)

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

ответил gatkin 30 J0000006Europe/Moscow 2018, 23:38:36
36

В начале 1970-х годов C был ослепительным свежим воздухом, используя современные конструкции настолько эффективно, что всю систему UNIX можно было переписать с языка ассемблера на C с незначительным пространством или штрафом за производительность. В то время многие современники называли это языком высокого уровня.

Авторы C, в первую очередь Деннис Ритчи, были более осмотрительны и в В журнале Bell System Technical Journal говорится, что «C не является языком высокого уровня». С критической улыбкой и намереваясь быть провокационной, Деннис Ритчи сказал бы, что это язык низкого уровня. Главным из его целей дизайна для C было сохранение языка близко к машине, но обеспечивающее переносимость, то есть независимость от машины.

Для получения дополнительной информации обратитесь к оригинальной статье BSTJ:

Спасибо, Деннис. Пусть вы успокоитесь.

ответил bud wonsiewicz 30 J0000006Europe/Moscow 2018, 22:56:20
21

Как я писал в другом месте на этом сайте , когда кто-то ссылался на шаблон управления malloc /free memory как «низкоуровневое программирование»,

  

Забавно, как определение «низкий уровень» меняется со временем. Когда я впервые учился программировать, любой язык, который предоставил стандартизованную модель кучи, которая позволяет легко распределить /бесплатно шаблон, считается действительно высоким. В низкоуровневом программировании вам нужно будет отслеживать память самостоятельно (не распределения, а сами ячейки памяти!), Или написать свой собственный распределитель кучи, если бы вы чувствовали себя действительно причудливыми .

Для контекста это было в начале 90-х годов, после выхода C.

ответил Mason Wheeler 30 J0000006Europe/Moscow 2018, 18:49:15
15

Многие ответы уже упоминались в ранних статьях, в которых говорилось, что такие вещи, как «C», не являются языком высокого уровня.

Я не могу сопротивляться нагромождению, однако: многие, если не большинство или все HLL в то время - Algol, Algol-60, PL /1, Pascal - обеспечивают проверку границ массива и числовое обнаружение переполнения.

Последнее, что я проверил переполнение буфера и целого, стало основной причиной многих уязвимостей безопасности. ... Да, все еще дело ...

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

Итак, если ваше определение HLL включает в себя «автоматическое предотвращение многих ошибок низкого уровня», ну, извините, состояние кибербезопасности будет совсем другим, возможно, лучше, если C и UNIX не произошло.

ответил Krazy Glew 1 J000000Sunday18 2018, 18:01:35
8

Рассмотрим более старые и гораздо более высокие языки, которые предшествовали C (1972):

Fortran - 1957 (не намного выше уровня C)

Лисп - 1958

Cobol - 1959

Фортран IV - 1961 (не намного выше уровня C)

PL /1 - 1964

APL - 1966

Кроме того, язык среднего уровня, такой как RPG (1959), в основном язык программирования для замены систем записи на основе плагинов.

С этой точки зрения, C казался языком очень низкого уровня, только немного выше макросборников, используемых на мэйнфреймах в то время. В случае мэйнфреймов IBM для доступа к базе данных использовались макросы ассемблера, такие как BDAM (метод базового доступа к диску), поскольку интерфейсы базы данных не были перенесены в Cobol (в то время), что привело к наследию комбинации сборки и Программы Cobol по-прежнему используются на мэйнфреймах IBM.

ответил rcgldr 2 J000000Monday18 2018, 19:53:23
6

Ответ на ваш вопрос зависит от языка C, о котором он спрашивает.

Язык, описанный в Справочном руководстве Dennis Ritchie 1974 C, был языком низкого уровня, который предлагал некоторые из возможностей программирования языков более высокого уровня. Диалекты, полученные на этом языке, также были низкоуровневыми языками программирования.

Когда был опубликован стандарт 1989/1990 C, он не описал язык низкого уровня, который стал популярным для программирования реальных машин, но вместо этого описал язык более высокого уровня, который мог бы быть - но не требовался быть реализованы на более низких уровнях.

Как отмечают авторы примечания C Standard, одна из вещей, которая сделала язык полезной, заключалась в том, что многие реализации можно рассматривать как высокоуровневые ассемблеры. Поскольку C также использовался в качестве альтернативы другим языкам высокого уровня, и поскольку многие приложения не нуждались в способности делать то, что не могли выполнять языки высокого уровня, авторы Стандарта позволили реализациям вести себя произвольно если программы пытались использовать конструкции низкого уровня. Следовательно, язык, описанный стандартом C, никогда не был языком программирования низкого уровня.

Чтобы понять это различие, рассмотрите, как язык Ritchie и C89 будут просматривать фрагмент кода:

struct foo { int x,y; float z; } *p;
...
p[3].y+=1;

на платформе, где «char» - 8 бит, «int» - 16 бит big-endian, «float» - 32 бита, а в структурах нет специального дополнения или выравнивания поэтому размер «struct foo» равен 8 байтам.

На языке Ричи поведение последнего утверждения будет адрес, сохраненный в «p», добавить 3 * 8 + 2 [т.е. 26] байтов и выборки 16-битное значение из байтов на этом адресе и следующем, добавьте один к этому значению, а затем записать обратно это 16-битное значение в те же два байт. Поведение будет определяться как действие 26-го и 27-го байтов, следующих за адресом на адрес p, независимо от того, какой объект хранился там.

В языке, определенном стандартом C, в случае, если * p идентифицирует элемент «struct foo []», за которым следует как минимум еще три полные элементы этого типа, последнее утверждение добавит одно к члену y третьего элемента после * p. Поведение не будет определяться Стандарт при любых других обстоятельствах.

Язык Ричи был низкоуровневым языком программирования, потому что, хотя он позволяет программисту использовать абстракции, такие как массивы и структуры, когда удобный, он определил поведение в терминах лежащего в основе макета объектов в памяти. Напротив, язык, описанный C89 и более поздними версиями стандарты определяют вещи в терминах абстракции более высокого уровня и только определяет поведение кода, которое согласуется с этим. Качественные реализации, подходящие для низкоуровневого программирования, будут вести себя полезнее в большем количестве случаев, чем это предусмотрено Стандартом, но нет «официального» документа, определяющего, что реализация должна делать, чтобы быть подходящим для таких целей.

Язык C, изобретенный Деннисом Ритчи, является языком низкого уровня и признан таковым. Однако язык, изобретенный Комитетом по стандартам С, никогда не был языком низкого уровня в отсутствие гарантий, обеспечиваемых реализацией, которые выходят за рамки мандатов Стандарта.

ответил supercat 2 J000000Monday18 2018, 02:31:23

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132