LINUX.ORG.RU

[ненависть,термины] Почему некоторые считают С/С++ языками низкого уровня?


0

1

Собственно сабж.

В википедии вроде ясно сказано что есть что. Мне не понятно, откуда пошла эта мода называть плюсы языком низкого уровня.

http://ru.wikipedia.org/wiki/%D0%9D%D0%B8%D0%B7%D0%BA%D0%BE%D1%83%D1%80%D0%BE...

http://ru.wikipedia.org/wiki/%D0%AF%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B...

Ответ на: комментарий от ratatosk

А твоё предложение --- это пойти в прокуренный грязный клуб и провести там всю ночь, с целью ещё раз убедиться, что ска-панк полное гавно? Спасибо обойдусь. Лучше я пошлю тебя pcl читать.

ugoday ★★★★★
()
Ответ на: комментарий от ratatosk

> возражая, что выделения-удаления - едуиственная забота C++-программиста.

а этого никто и не утверждал. У С+-программиста много других забот по обхождению С++-граблей, подставлению С++-костылей и охлаждению С++-гемороев.

ugoday ★★★★★
()
Ответ на: комментарий от ugoday

А твоё предложение --- это пойти в прокуренный грязный клуб и провести там всю ночь, с целью ещё раз убедиться, что ска-панк полное гавно? Спасибо обойдусь. Лучше я пошлю тебя pcl читать.

Посылай читать pcl того, кто несет охинею про cl, не зная его. Как ты про плюсы.

п.с. Спасибо, читал уже :)

ratatosk
()
Ответ на: комментарий от ugoday

и после этого ты не считаешь С++ низкоуровневым?

Да до фени мне эти уровни. Ясное дело - лисп более высокоуровневый - что с того?

Посмотри (там не очень накурено) парсер полиномов на C++, там используется Boost.Spirit - DSEL для построения рекурсивных нисходящих парсеров:

http://boost-spirit.com/repository/applications/polynomial.cpp

Это же никак не ассемблер, если уж на то пошло. Практически EBNF в коде.

ratatosk
()
Ответ на: комментарий от ratatosk

> Да до фени мне эти уровни.

Ну, это как бы является темой обсуждения.

Посмотри (там не очень накурено) парсер полиномов на C++

Неплохо. Очень, очень неплохо. Вот только язык темплейтов отличается от остального языка С++, что весьма его ограничивает. Сравни, нампример с лисповыми макросами, когда в любом (defmacro ...) мы может употребить любую лисповую конструкцию, использовать произвольную функцию.

P.S. А можешь представить решение практикумов из pcl на С++? Чисто сравнить на глаз простоту, читаемость и скорость результата на этих двух языках.

ugoday ★★★★★
()

основная проблема не в этом

а в том, что необразованные люди думают, что низкоуровневость как возможность самому указать низкоуровневые детали противоречит высокоуровневости как возможности эти детали не указывать и не знать, предоставив это компилятору

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

впрочем, многоуровневовость можно сделать еще лучше, чем в с++

www_linux_org_ru ★★★★★
()

Я думаю, что язык C++ потому следует считать низкоуровневым, что вякая программа на языке C является и программой на C++. В этом случае C++ настолько же «низкоуровнев», насколько и C.

Конечно, в нем есть средства высокиху уровней — абстракции данных и операций: классы, шаблоны, лямбды (в бусте).

annoynimous ★★★★★
()
Ответ на: комментарий от ugoday

Вот только язык темплейтов отличается от остального языка С++, что весьма его ограничивает.

Ясное дело, до макросов (или до template haskell) тут как до Китая. Да и если посмотреть, как этот Spirit реализован... Сейчас это еще куда ни шло - для DSEL c перегрузкой операторов есть Boost.Proto которая позволяет строить AST из выражений во время компиляции, и т.д., сильно облегчая работу, а так это - сущий ад. Но пользоваться, тем не менее удобно. Еще как пример можно посмотреть на Boost.MSM - генератор конечных автоматов, где UML Statechart записывается довольно-таки красивым DSEL.

P.S. А можешь представить решение практикумов из pcl на С++? Чисто сравнить на глаз простоту, читаемость и скорость результата на этих двух языках.

Извини, не могу похвастаться, что написание программ на плюсах доставляет столько удовольствия, что я буду заниматься им в свободное время :)

Скажи конкретный практикум - может чего похожее найду.

ratatosk
()
Ответ на: комментарий от annoynimous

всякая программа на языке C является и программой на C++

4.2

jtootf ★★★★★
()
Ответ на: комментарий от annoynimous

> программа на языке C является и программой на C++

очередной «перл» от модератора - где их только находят

anonymous
()
Ответ на: комментарий от anonymous

А что не так? Разве C++ декларировался как supersede C? Приведите примеры, когда это не так что ли, образуйте модератора.

annoynimous ★★★★★
()
Ответ на: комментарий от ugoday

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

annoynimous ★★★★★
()
Ответ на: комментарий от k_andy

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

annoynimous ★★★★★
()
Ответ на: комментарий от annoynimous

Я говорд о том, что каждый язык провоцирует писать в своём определённом стиле. И С-стиль разительно отличается от С++-стиля.

А так --- можно и фортран подмножеством лиспа обозвать, есть же и такие компиляторы.

ugoday ★★★★★
()
Ответ на: комментарий от ugoday

> Я говорд о том, что каждый язык провоцирует писать в своём определённом стиле. И С-стиль разительно отличается от С++-стиля.

Я с этим согласен.

annoynimous ★★★★★
()
Ответ на: комментарий от annoynimous

> Приведите примеры, когда это не так что ли

как самый простой пример:

char* p = 1;

это знает каждый, кто хоть поверхностно владеет С и С++

anonymous
()
Ответ на: комментарий от anonymous

это знает каждый, кто хоть поверхностно владеет С и С++

Ну что ж, проверяем:

$ gcc -c -Wall -pedantic -Werror 1.c
cc1: warnings being treated as errors
1.c: In function ‘main’:
1.c:3: error: initialization makes pointer from integer without a cast
1.c:3: error: unused variable ‘p’

$ cat 1.c
int main(void)
{
  char* p = 1;
  return 0;
}

Теперь давай скажи, что настоящие пацаны никогда не пользуются предупреждениями компилятора. А также не забудь привесть use case твоего фрагмента.

annoynimous ★★★★★
()
Ответ на: комментарий от annoynimous

> настоящие пацаны никогда не пользуются предупреждениями компилятора

настоящие пацаны компилируют не только gcc, а стандарт не запрещает такое присваивание

А также не забудь привесть use case твоего фрагмента.


специально для одаренных - это может быть присваивание между указателями с разными типами

anonymous
()
Ответ на: комментарий от anonymous

> настоящие пацаны компилируют не только gcc, а стандарт не запрещает такое присваивание

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

специально для одаренных - это может быть присваивание между указателями с разными типами

Давай, врубай заднего. В _твоем_ примере перехода нет. Что касается переходов между типами, то хороший разработчик не поленится написать приведение в явном виде. И откомментировать, если это важно. А плохой... видимо, будет ссылаться на стандарты.

Кроме того, аноним, уж больно сильно стараешься казаться умным. Перестань уже.

annoynimous ★★★★★
()
Ответ на: комментарий от annoynimous

> а хороший компилятор должен предупреждать об «опасных» конструкциях языка.

разницу между языком и «опасными» конструкциями в упор не видишь?

В _твоем_ примере перехода нет


ну не тупи - я показал, что указателю можно присвоить значение, которое в С++ не прокатит, то что у тебя одна извилина и делать выводы ты не умеешь - это твоя проблема

anonymous
()
Ответ на: комментарий от annoynimous

потому-что глупости пишешь - серьезно, терпеливо и вежливо разъяснять человеку, что варнинги в gcc не влияют на стандарт языка, это бесполезное дело

anonymous
()
Ответ на: комментарий от annoynimous

> Давай, врубай заднего. В _твоем_ примере перехода нет.

При чём здесь это? Ты попросил пример — анонимус привёл его. Пусть и не сразу.

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

Ага, щаз!! Разбежался уже. С какого перепугу мне писать приведения в коде типа такого?

int* array = malloc(sizeof(int) * COUNT);

k_andy ★★★
()
Ответ на: комментарий от anonymous

> потому-что глупости пишешь - серьезно, терпеливо и вежливо разъяснять человеку, что варнинги в gcc не влияют на стандарт языка

Я благодарен на самом деле, и даже признаю, что моя позиция проигрышная. Но если уж придираться к словам, то единого «стандарта языка С» не существует, есть «стандарты языка C89, C99, ...», гнушные расширения к нему и т.п. И везде получаются нюансы, вроде разрешен ли символ «//» в качестве комментария и проч. Так что если рассматривать разность языков C и C++ сквозь столь сильную лупу, становится видна и неоднородность самого С.

annoynimous ★★★★★
()

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

pathfinder ★★★★
() автор топика
Ответ на: комментарий от jtootf

мне непонятно лишь одно - почему этого нельзя было сделать заранее?

Заранее перед чем? О том, что 'new', 'template' и прочее в C++ работать не будут — это можно понять не заглядывая в стандарт. Тем более, что проблема решается dangling исходного кода, что есть тривиальная задача. Семантические различия, вроде обязательного приведения и так были частью правил «хорошего тона» и лично я им всегда следовал. О том, что высказал провокационное заявление — так это не я первый:

Б. Страуструп

Тем не менее, хорошие программы на языке С по сути являются программами на С++. Например, все программы из классического описания С [8] являются программами на С++.

(цитата по http://lib.ru/CPPHB/cpptut.txt)

annoynimous ★★★★★
()

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

Zhbert ★★★★★
()
Ответ на: комментарий от pathfinder

>На ассемблере давно уже никто не пишет,

Как это не пишет? Я, например, недавно писал (в не игрушечном и не учебном проекте).

dmitry_vk ★★★
()
Ответ на: комментарий от pathfinder

>На ассемблере давно уже никто не пишет, по этой причине никто не имеет дело с настоящим «низким уровнем».

Интересно, на чем я тогда под контроллеры пишу... Ну кроме С51 =)

Zhbert ★★★★★
()
Ответ на: комментарий от pathfinder

> На ассемблере давно уже никто не пишет

а мужики то и не знают wasm.ru

ACR
()

Низкие или высокие это смотря относительно какого уровня. Относительно ассемблера - высокие, относительно лиспа низкие. На лоре за нуль взят лисп и соответственно практически все другие языки низкоуровневые.

Booster ★★
()
Ответ на: комментарий от Booster

Относительно явы тоже низкий уровень получается, однако.

dave ★★★★★
()

>Почему некоторые считают С/С++ языками низкого уровня?

Потому что единой классификации «уровня языка» нет и понятие это субъективно, ситуативно и релятивно.

// Ваш К.О.

KRoN73 ★★★★★
()

Ц никак нельзя отнести исключительно.к высокому уровню.

drSchur ★★★
()
Ответ на: комментарий от vurdalak

Вот когда я создаю переменную, не думая о том, какой тип ей указать - это упрощение написания кода.

4.2

hint: см понятие «строгой динамической типизации» (например в haskell-е реализовано).

Если на C++ это перенести, это нечто вида:


template <typename R, typename A, typename B, typename C>
R func(const A &a, const B &b, const C &c)
{
....
}

далее может быть вызвано абсолютно без указания типов R, A, B, C, если эти типы однозначно выводятся из аргументов:

int a = func(1,2,"строка");

Естественно, все операции запрошенные в func должны поддерживаться типами / классами R, A, B, C

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

В C++0x пошли дальше, там переиначили слово auto, теперь можно будет писать:

for (auto i = vect.begin(); i != vect.end(); i ++)
{
 /// some stuff with vector
}

опять-же, это _строгая_, но динамическая типизация, т.к. тип переменной auto мы не задаем, его вычисляет компилятор сам.

hydraulicbrakefluid
()
Ответ на: комментарий от vurdalak

C/C++ - самый низкоуровневый из языков высокого уровня. Так нормально?


тоже так считаю.

Boy_from_Jungle ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.