LINUX.ORG.RU
ФорумTalks

Аду считали раздутой... А не слишком ли раздулись потомки C?


0

0

Когда-то был ANSI C 89 и Ада-83. И при сравнении их друг с другом Аду ругали за то, что она очень большая, раздутая, и что зря туда включено столько всего.
Но постепенно стала вырисовываться интересная тенденция.
Что было в Аде и не было в С?
- пакеты. В C++ теперь их функции разбиты между классами и
пространствами имён. Да и .h в #include исчезло не с проста.
- generics. Теперь в С++ есть шаблоны.
- исключения. Теперь они есть в С++.
- перегрузка функций. Теперь она есть в С++.
- access-типы. Теперь в C++ говорят о smart pointers.
- особый статус переменной цикла: for I in range ... - I существует
только внутри for. Теперь в С++ принято for (int i...
- диапазоны. В Аде было:
my_array: array (0 .. 4) of integer := (1, 2, 3, 4, 5);
for x in my_array'range loop
...
end loop;
В C++0x планируется:
int my_array[5] = {1, 2, 3, 4, 5};
for(int &x : my_array)
{
...
}
- поддержка многопоточности. Она уже назрела в C++0x.
- проверка выхода за границы массивов. Об этом наконец-то подумали в C#.

Теперь про большой размер Ады пишут как про старый миф: "Ада - слишком большой и сложный язык, для того чтобы использовать его в
небольшом проекте" -> "Объем и сложность всех современных индустриальных языков практически одинаковы, и чтобы убедиться в этом, достаточно просто сравнить объем их описаний. Этот миф восходит к началу 80-х годов, когда Аду сопоставляли с Паскалем, Фортраном 77 или Бейсиком." (Язык Ада - двадцать лет спустя. Сергей Рыбин, Василий Фофанов).

Помните, какой толщины K&R? А теперь сравните с толщиной книги Страуструпа по С++. K&R писали, что С сам по себе - небольшой язык, и программист может быть уверен, что знает его весь. А теперь? И оно всё растёт, растёт и растёт... Взгляните ради интереса на http://en.wikipedia.org/wiki/C%2B%2B0x. И все книжки по С++ в магазине пугают своей толщиной.

Короче, вывод: а не пора ли пообрезать С++ раза в 3? А то будет таким толстым, что в дверь не пролезет.

P.S. Примеры с небольшими изменениями взяты из Википедии.
P.P.S. Как всё-таки интересно наблюдать за развитием языков и взаимными передираниями. Не только С брал то, что уже было в Аде (я не утверждаю, что дралось именно с Ады, конечно). Ада тоже со слюнями зависти смотрела на развитие С. И сравнительно недавно передрала STL.
А сколько ещё C, имхо, предстоит перенять... Например, есть такие чудесные и ещё не содранные вещи, как "named parameter notation"; строгая типизация; массивы, начинающиеся не с нуля, красивый выход из глубоко вложенных циклов, в конце концов:
my_loop1: while not end_of_file(file_handle) loop
my_loop2: for i in buffer'range loop
...
exit my_loop1 when buffer(i) = PERCENT;
end loop my_loop2;
end loop my_loop1;

выдыхай бобер, Си++ не нужен )

phasma ★☆
()

Ну C++ вроде и сейчас не считается образцом лаконичности.

Legioner ★★★★★
()

Вас под страхом четвертования заставляют пользоваться с++? Оригинальный Си никуда не делся.. а если нужно ООП, то есть Vala, Objective-C...

mono ★★★★★
()

Мне из очень поверхностного взгляда на аду не понравился слишком многословный синтаксис. В том же С++ первичных сущностей поменьше.

Legioner ★★★★★
()

>Короче, вывод: а не пора ли пообрезать С++ раза в 3?

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

ничего урезать не надо.

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

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

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

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

сейчас уже реализовывать научились.

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

>возможность его реализовать

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

zort
()

Раздулся всего 1 потомок Си - Си++. Всякие там Objective C и Cyclone довольно компактны.

Кстати, Си значительно старше Ады.

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

>Я слышал, что одной из бед тогдашней Ады было то, что для неё никто не мог сделать компилятор без багов.

с плюсами та же фигня

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

ну эта волосатая гадина выкидыша дала. В маках нах никакой си с крестиками не юзается, а Objective C.

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

>не заставляй меня браться за кулек, Vala это не йазык, а .

http://live.gnome.org/Vala

Vala is a new programming language that aims to bring modern programming language features to GNOME developers without imposing any additional runtime requirements and without using a different ABI compared to applications and libraries written in C.

Уткнись...

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

> кому лучше верить?

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

> разработчикам языка или анонимусу с лора?

Разработчикам языка верить не стоит совсем - они пристрастны по определению. ЛОРовскому анонимусу можно верить больше - ему-то пох.

Ну а можно еще поизучать современные языки (понятно, что всякие там Явы, Си# и Питоны с Рубями к ним не относятся?) и сравнить.

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

/* Basic Vala Sample Code */
using GLib;

public class Sample : Object {
        public Sample () {
        }

        public void run () {
                int[] a = new int[10];
                for(int i = 0; i < 20; i++){
                a[i]= 1;
                }
        }

        static int main (string[] args) {
                var sample = new Sample ();
                sample.run ();
                return 0;
        }
}


это разумеется падает. Как перехватить в valа некорректный memory ассеss ?

zort
()

Vala немало чего safe и да, это язык. Юзаем гугл и мозг.

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

> это разумеется падает. Как перехватить в valа некорректный memory ассеss ?

Пока что - никак. В будущем - одной опцией компилятора.

ShprotX
()

Почему я не вижу geek'а в треде? Тут же так славно кормлят

anonymous
()

Весь вопрос в том, что считать раздутостью? Количество насыпанного синтаксического сахара или объем обязательной части стандарта? (В который, допустим, входит и стандартная библиотека. Кроме того есть еще такой зверь как регулярность, ИМХО, намного важнее, чем раздутость.

Циклы - зло. Функции, как объекты первого класса рулят. А дальше оператор функциональной композиции и map с filter. Кстати говоря, даже не обязательно их делать "по настоящему" объектами первого класса, в эрланге, например, они нифига не первого, зато есть оператор fun. Равно как не обязательно делать map c filter функциями, хватит с нас и ключевых слов.

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

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

Macil ★★★★★
()

Читал как-то одну статью, похожую на шутку (видимо, так и есть), автора, который был специалистом в Ada. В этой статье говорилось, что язык Ada была специально создан в USa, чтобы русские принялись ее копировать, а не стали бы копировать другие высокопроизводительные эффективные средства. Тема такая, что хоть США были впереди планеты всей по железу, но русские обладали гораздо лучшей школой программирования, что нивелировало разницу в железе. Блин, надо найти.

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

> Циклы - зло.
Это почему? Как вы иначе умножите матрицу на скаляр?
> Функции, как объекты первого класса рулят. А дальше оператор
> функциональной композиции и map с filter.
Поподробнее, пожалуйста. Имхо многие вроде меня не совсем восприняли эту фразу.
> Паттерн матчинг, это тоже очень хорошая вещь. Очень сильно упрощает
> работу со структурами...
Опять же, для меня pattern matching - это когда "абвг" соответствует "?бв*". Что вы имете ввиду?
> А уж разбивка функций на клозы
А это что за штука? Ссылки на какое-нибудь описание и примеры - в студию!

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

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

zort
()

лаконичность нужна? if use forth then

:)

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

>> Циклы - зло.
>Это почему? Как вы иначе умножите матрицу на скаляр?

Перегрузит операторы. Чем в цикле матрицы множить, проще написать A * B. Где А матрица, В вектор. Удобно, кстати, только есть некоторый головняк.

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

>Как вы иначе умножите матрицу на скаляр?

Мапы и ещё раз мапы. map - оператор как минимум из лиспа и перла, принимает параметрами массив и функцию. Смысл - вызвать функцию для каждого элемента массива. Код с мапами получается элегантнее и понятнее, нежели циклы. Вообще идея уничтожить циклы достаточно интересна...

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

циклы не нужны только для чисто-функционального языка, не допускающего деструктивных действий. Для прочих языков цикл, нередко проще и лаконичнее функциональных конструкций. Опять же зависит от конкретного кода.

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

>идея уничтожить циклы достаточно интересна...

книжку Кормена для начала перепиши, чтоб без циклов, и с тем же или лучшим O :(

умник хренов....

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

>Перегрузит операторы.

А в методе-перегрузчике чем умножать будем? :)

Кстати, как map'ами перемножить две матрицы?

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

> http://home.pipeline.com/~hbaker1/sigplannotices/gigo-1997-04.html

Интересно. В то же время, обидно, что все принципиально новые академические разработки (такие, как Singularity и C#), призванные соперничать со связкой C/C++ + Windows/Unix, ведутся на Западе, а у нас, действительно, имеет место только копирование.

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

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

Функция map делает следущее: первым параметром принимает другую функцию, (ее с большой натяжкой можно назвать инвариантом цикла) и вторым параметром некий составной объект (список, массив, итератор, и т.д.), и пропускает все элементы через функцию в первом параметре. Возвращает новый составной объект с новыми значениями.

Например псевдокод на питоне:

l = []
for v in obj:
....l.append(f(v))
return l

и есть функция map.

filter, очень похожа, только первый параметр - предикат. Возвращает новый список из элементов, для которых значение предиката - истина.

А матрицы на скаляр или разновидности циклов while(predicat) через рекурсию.

>Опять же, для меня pattern matching - это когда "абвг" соответствует "?бв*". Что вы имете ввиду?

Сложно объяснить в нескольких словах. В эрланге есть такая функция file:copy. Может возвращать кортеж {ok,BytesCopied} или {error,Reason}. Можно написать следующее любопытное выражение:

{ok,BytesCopied} = file:copy(PathA,PathB).

Если функция успешно отработала, то мы получим переменную BytesCopied. А если неуспешно, то исключение. Т.е. аналог assert. Это и есть паттерн матчинг. Более жизненный пример:

[A,B,C|Rest] = [1,2,3,4,5,6,7,8].

Заполучили четыре переменных: А=1,B=2,C=3,Rest=[4,5,6,7,8]. И это только самые простые и понятные примеры, восприятие которых возможно без погружения в синтаксис эрланга.

Это же можно делать и на Haskell'e и OCaml'e.

>А это что за штука? Ссылки на какое-нибудь описание и примеры - в студию!

Из мануала по эрлангу:

fac(1) ->
....1;
fac(N) ->
...N * fac(N - 1).

Т.е. когда мы вызываем fac, через механизмы паттерн матчинга выбирается нужный клоз. Более реальный пример:

handle_request("GET",["user",P1,P2],Parameters) ->
....обрабатываем метод GET для url .../user/.../...;
handle_request("GET",["user",P1],Parameters) ->
....%Устанавливаем дефолтное значение параметра P2
....handle_request("GET",["user",P1,"Default"],Parameters);
handle_request("GET",Url,Parameters) ->
....некий дефолтный обработчик;
handle_request(_,Url,Parameters) ->
....Обработчик если метод не GET.

Это еще не все. Если Parameters - структура, то мы с использованием некоторого количества синтаксического сахара можем ее разбить на нужные нам переменные в объявлении клоза. Вот такие дела.

ЗЫ: Да, я в курсе что fac не хвостово-рекурсивна!

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

>Для прочих языков цикл, нередко проще и лаконичнее функциональных конструкций.

Инертность мышления, не более того! Уж где, где а в вычислительной математике (это к вопросу "матрица на скаляр") рекурсия полноправно используется, а для всего остального map и filter хватит за глаза. Проверено неоднократно.

Есть такая книжка "Дискретная математика для программистов", так там аффтар примеры некоторых алгоритмов приводит на неком искусственном диалекте паскаля. Смешно смотреть на его потуги приспособить данный язык к материалу приведенному в книге. Даже оператор yield пришлось выдумывать...

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

>В то же время, обидно, что все принципиально новые академические разработки (такие, как Singularity и C#), призванные соперничать со связкой C/C++ + Windows/Unix, ведутся на Западе, а у нас, действительно, имеет место только копирование.

Исключения были тем не менее. Например, Рефал тов. Турчина:

http://ru.wikipedia.org/wiki/РЕФАЛ

Zubok ★★★★★
()

Ты, едучи в своей машине (к примеру) всегда и при любых условиях включаешь дворники, промыв лобового стекла, кондифионер, обогрев боковых стекол, аварийку, противотуманные фары, опускаешь все стекла, открываешь люк, стараешься на шоссе обязательно погазовать на всех передачах (и как же без задней!) поочередно тормозя то ручным, то педальным тормозом - и ещё жалуешься, что такая "избыточная функциональность" тебе мешает?!

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

Удачи тебе в обрезании =)

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

> Проблема не в машине, которая может, а в том, кто не понимает, что совсем необязательно этим всем одновременно пользоваться, чтобы с комфортом доехать допункта назначения.

Подписываюсь обеими руками.

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

> Сложно объяснить в нескольких словах (...) И это только самые простые и понятные примеры, восприятие которых возможно без погружения в синтаксис эрланга.

= автор не понимает о чём пишет (и следовательно не может этого обьяснить). Задолбали фэнбои ФП :-/

> pattern matching - это когда "абвг" соответствует "?бв*"

Вот он имеет в виду то же самое, только "регексп" может совпадать и со значением, и со структурой.

E.g., /^abc.({,7})/ можно раскрыть в нечто типа

if(a[0..2] == 'abc' && length(a) < 10) then $1 = a[3..-1];

то [A,B,C|Rest] даст грубо говоря

if(typeof($_) == list && length($_) > 3) then A = $_[0], B = $_[1], C = $_[2], Rest = $_[3..-1];

что именно можно узнать о типе, что означает "=", неявные эффекты и т.д. зависит от языка. Сравнение к.п. выглядит как оператор типа if или case, отдельно они ходить не могут (=не являются обьектами первого класса), по крайней мере я такого не видел. Кроме того, паттерны по структуре гораздо проще регекспов — ни разу не видел там *, + etc., хотя м.б. просто не лез так далеко.

Такие штуковины бывают весьма удобными и красивыми.

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

> Ты, едучи в своей машине (к примеру) всегда и при любых условиях
> включаешь дворники, промыв лобового стекла, кондифионер, обогрев
> боковых стекол, аварийку, противотуманные фары, опускаешь все
> стекла, открываешь люк, стараешься на шоссе обязательно погазовать
> на всех передачах (и как же без задней!) поочередно тормозя то
> ручным, то педальным тормозом - и ещё жалуешься, что такая
> "избыточная функциональность" тебе мешает?!

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

Хм... Иванов И.И., Сидоров С.С. Введение в язык []C{_@%/*}. В 4-х томах. Т. 1. - М., издательство ХХХ, 2030 г. - 1563 с.


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

Это, еще раз повторю, - не проблема машины, и аналогия с ковшами, гусеницами тут неуместна, т.к. небольшая и быстрая программка на с++/whatever и через 10 лет останется небольшой и быстрой. Не надо путать функциональность с обременением. И то, что вас пугают толстые книги по языкам программирования и вы из них не можете выделить лишь самое необходимое для решения вашей задачи и вовремя остановиться, чтобы не впитывать ненужное - ваши личные проблемы, методички вроде "С# за 21 день" создавались как раз для вас.

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

>автор не понимает о чём пишет (и следовательно не может этого обьяснить). Задолбали фэнбои ФП :-/

Классическая вилка: напишешь мало, скажут аффтар не может этого объяснить. Напишешь много - скажут ниасилил... Да и если честно - влом, ибо в мануалах и так написано. Кроме того, приводить длинные заковыристые листинги, без 100% уверенности, что читатель знает этот язык - моветон.

>Задолбали фэнбои ФП :-/
>if(typeof($_) == list && length($_) > 3) then A = $_[0], B = $_[1], C = $_[2], Rest = $_[3..-1];

Задолбали фанаты перла :)

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

> Классическая вилка: напишешь мало, скажут аффтар не может этого объяснить.

Там не мало. Там одного "погружения в синтаксис Эрланга" хватает выше крыши.

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

Я об этом же. При минимальном желании увидеть суть, а не форму, это обьясняется _на_пальцах_.

> Задолбали фанаты перла :)

Дык, говорим регекспы, подразумеваем perl, и наоборот ;-)

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

> Не надо путать функциональность с обременением.
Грань между ними расплывчатая, и богатая функциональность часто означает обременённость.

> небольшая и быстрая программка на с++/whatever и через 10 лет
> останется небольшой и быстрой
Имхо есть скомпиллировать одну и ту же программу на современной системе и системе 15-летней давности - требования к ОЗУ получатся очень разными. Ведь окажется, что за этот срок до безобразия разраслись библиотеки, набирающие всё большую функциональность, но совсем не обременённость :-)

sergey_feo
() автор топика

Учись отличать глистов от потомков

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

> ЗЫ: Да, я в курсе что fac не хвостово-рекурсивна!

Да кстати сколько не перечитываю мануал, каждый раз удивляюсь, зачем туда засунули пример нераскрывающий мощи ФП.

Что бы нубы наблюдали как erlang жрет память при больших значениях N?

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

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