Здравствуйте, prVovik, Вы писали:
V>Здравствуйте, Nick_, Вы писали:
N_>>Все просто. Популярность завоевал не Си, а UNIX. Если бы UNIX был написан на другом языке, то сейчас был бы популярен другой язык. V>Ну дак почему же UNIX не был написан на паскале?
А Windows, между прочим — была!!!!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Sinclair, Вы писали:
S>Собственно, это-то и не нравится у Вирта. От него откровений ждали, а он "=" критикует. Ну не смешно ли?
Это все потому. что он — преподаватель. А Керниган и Ричи с Томсоном — профессиональные прогроаммисты. которые (скорее всего) преподаванием занимались ОЧЕНЬ МАЛО
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>Керниган написал об этом статью "Почему паскаль не является моим любимым языком". Но от себя добавлю — все же в свое время главной целью паскаля было обучение. И демонстрация того, что язык может быть простой, и транслятор с него может быть простой.
Простота хуже воровства (С)
На самом деле это конечно шутка, но предел упрощению тоже должен быть.
И кстати говоря, упорный борец за простоту и понятность Вирт придумал такую замечательную вещь, как with. И не стыдно ему было других критиковать после этого?
А ты не сталкивался, когда какой-нибудь GTK с гномом чуть в версиях разошлись и у пары функций изменился набор параметров. А голый С это дело не проверяет, и всё падает в рантайме. Зашибись, как некоряво
Д>На самом деле это конечно шутка, но предел упрощению тоже должен быть. Д>И кстати говоря, упорный борец за простоту и понятность Вирт придумал такую замечательную вещь, как with. И не стыдно ему было других критиковать после этого?
Да вы что! Это же замечательная вещь. Можно работать с неименованной переменной без копирования в локальную переменную. Это и быстро (х.з. сможет компилятор ли соптимизировать лишее копирование), и красиво — не загромождаем код лишними переменными.
with conn.execute('select * from table') do
while not eof do
begin
next;
end
А если функция должна вернуть большой объём данных? На С++ нужно объявлять переменную (которая либо останется неинициализированной, либо вызовется как правило не нужны в данном месте конструктор), потом передавать её по ссылке.
(Кстати, по смыслу это очень близко к инструкции goto) Компилятор замучается бегать по всем файлам проекта и искать где же определена эта функция (причем ему еще надо убедиться в том что эта функция определена не более одного раза). А в модульных языках программирования компилятор с самого начала знает из какого модуля какая функция вызывается и не тратит время на ее поиск.
MODULE MyModule;
IMPORT L := StdLog;
BEGIN
L.String("Привет!"); (* Компилятору сразу видно что вызывается процедура String() из модуля L := StdLog *)
END MyModule.
Здравствуйте, LaptevVV, Вы писали:
LVV>Керниган написал об этом статью "Почему паскаль не является моим любимым языком".
Той статьей он выставил себя на посмешище. Дело в том, что в то время когда он писал эту статью Виртом уже был создан язык Модула, в котором были исправлены недочеты старого Паскаля. То есть Керниган малость запоздал со своей критикой. С тем же успехом Керниган мог бы написать статью о своей нелюбви к любому другому устаревшему языку, например, к Алголу. В своей статье Керниган ни разу не упомянул о языке Модула (с чем интересно это связано?), неужели он не знал о Модуле? Ай-ай-ай, как нехорошо получилось. В научном мире это равноценно что сесть в лужу.
Здравствуйте, vdimas, Вы писали:
K_O>>Е-мое, "и эти люди запрещают мне ковыряться в носу?!" K_O>>И это все ради того, чтобы вместо Add писать +, опускать индексы у массивов и не писать явно оператор цикла?!
V>Есть такое правило проектирования — интерфейс важнее реализации. V>Реализация однократна, а интерфейс может быть использован несчетное количество раз.
Иди ты! А я ж и не знал! Но, мил человек, есть и еще одно правило: интерфейс должен быть недвусмысленным и самодостаточным.
Сие означает, что, глядя на интерфейс, я должен абсолютно четко представлять, что и как данная функция делает; если она использует в интерфейсе структуры данных — то для чего они нужны и как внутри используются. И чтобы при этом никаких side-эффектов не было.
Что в реализации — меня не волнует, но для того чтобы понять как пользоваться интерфейсом я не должен читать исходники реализации.
И коль уж воскресили древнюю тему, то повторюсь: мне не нравится, что в вышеприведенном примере операции над элементами массива выглядят точно также как и над одиночными переменными. Более того, то выражение, выглядящее как обычное математическое выражение над несколькими переменными на самом деле мало того, что работает с эелементами массивов, так еще и внутри себя содержит цикл.
СГ>(Кстати, по смыслу это очень близко к инструкции goto) Компилятор замучается бегать по всем файлам проекта и искать где же определена эта функция (причем ему еще надо убедиться в том что эта функция определена не более одного раза).
Сергей, это вы что-то преувеличили... Компилятору в данном случае нет необходимости искать определение этой функции, ему вообще ничего не надо искать. Функция объявлена, сигнатура известна, компилятор просто вставит в объектный модуль ссылку на эту сигнатуру, а искать её будет уже компоновщик (линкер). И, кстати, поскольку компоновщику нет нужды делать синтаксический анализ, поскольку компоновщик получает уже готовые сигнатуры "на блюдечке", то связывание функций не будет трудоёмким.
Так что, извините, никак не могу согласиться с вами в этом вопросе.
Здравствуйте, LaptevVV, Вы писали:
S>>Собственно, это-то и не нравится у Вирта. От него откровений ждали, а он "=" критикует. Ну не смешно ли? LVV>Это все потому. что он — преподаватель. А Керниган и Ричи с Томсоном — профессиональные прогроаммисты. которые (скорее всего) преподаванием занимались ОЧЕНЬ МАЛО
Так получилось что я тоже немного попредовал... дык вот с = у людей ВОБЩЕ НИКАКИХ ПРОБЛЕМ НЕ ВОЗНИКЛО. Тоесть абсолютно никаких. Все это надуманый бред!
А приципился Вирт к этому по тому что не может придумать нормальных аргументов проив С/С++. Теоретик блин. И еще других учить пытается.
ЗЫ Прочитай "Эффективное программирование на С++" Кёниг и Му... Оказывается и С++ можно преподовать не сложнее паскаля. Ну и кому после этого нужен Вирт со своими выкидонами?
... << RSDN@Home 1.1.4 rev. 185 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Sinclair, Вы писали:
S>Ну, на самом деле это не все. Паскаль — неизмеримо круче плюсов потому, что S> S> := гораздо понятнее, чем = S> ^. гораздо понятнее, чем -> S> строковые константы ограничиваются одинарными, а не двойными кавычками (в ДВА раза меньше штрихов!) S> в If можно писать на одну пару скобок меньше S>S>Хотя, конечно, главное — все-таки то, что преподавание языка, где присваивание выполняется при помощи "=" означает выставить себя посмешищем. S>З.Ы. В самом популярном языке программирования для персоналок вообще оператор присваивания не отличается от оператора сравнения на равенство. Что не мешает миллионам людей осваивать его безо всяких Виртов.
Вы под словом Паскаль понимаете тот язык программирования который был сразу после Алгола. С тех пор много воды утекло. Вот некоторая часть дерева эволюции оберонов:
Звездочкой отмечен тот Паскаль о котором говорите Вы.
Ну а теперь развеем Ваше невежество.
1) S> ^. гораздо понятнее, чем ->
В оберонах обращение к полям записей через указатель на запись не требует указывания знака "^" можно просто писать p.x := 0; а не p^.x := 0;
2) S> строковые константы ограничиваются одинарными, а не двойными кавычками (в ДВА раза меньше штрихов!)
Да будет Вам известно, в оберонах строковые константы ограничиваются именно двойными кавычками!
VAR str: ARRAY 80 OF CHAR;
BEGIN
str := "Привет!";
3) S> в If можно писать на одну пару скобок меньше
Да будет Вам известно, что в оберонах используется конструкция IF ... THEN ... END — с явным END в конце (без BEGIN). Такая конструкция, в отличие от конструкции if then begin end или аналогичной ей if(){ } лишена неоднозначности возникающей при нескольких вложенных друг в друга if-ов и else.
Все структурные операторы оберона лишены каких бы то ни было неоднозначностей:
IF . THEN ............................ END
IF . THEN ...ELSE ... ELSIF . THEN ... END
WHILE . DO ........................... END
LOOP ................................. END
REPEAT ............................. UNTIL
FOR . TO . DO ........................ END
FOR . TO . BY . DO ................... END
CASE . OF v1: ... | v2: ..... ELSE ... END
WITH v: T1 DO ... | v: T2.... ELSE ....END
4) S> := гораздо понятнее, чем =
Оператор "=" обозначает математическую операцию сравнения, если x = y, то y = x.
Кстати, для выхода из процедуры в оберонах используется инструкция RETURN.
Так что, вынужден констатировать, что Вы равно как и, в свое время, Керниган со своей статьей о нелюбви к Паскалю, сели в лужу — проявили свое невежество и некомпетентность в том вопросе о котором ведете речь.
Здравствуйте, LaptevVV, Вы писали:
LVV>>>Уже оказал. Не было б паскаля — сидели бы мы сейчас на Алголе-68!
Д>>а как же K&R?
LVV>Транслятор С писали профессиональные программисты-системщики, а транслятор с паскаля написал СТУДЕНТ!
Валерий Викторович, есть предложение: давайте отличать дизайн языка и его реализацию. Дизайн был сделан учёным, а первая реализация студентом (я не знаю достоверно, но думаю, что в этом вопросе вы знаете наверняка и не буду спорить). Но ведь первая реализация (компилятора) языка носила исключительно демонстрационный характер, а все современные компиляторы Паскаля, как я понимаю, тоже сделаны профессионалами, разве нет?
Кроме того, вопрос Дарнея касался немного другого. Если я его правильно понял, он засомневался, что в отсутствие Паскаля мы работали на Алголе-68 и предположил, что мы все работали бы на С (С++).
LVV>Под руководством Вирта (и уверяю, вирт не написал ни строчки — сам такой руководитель, знаю).
А оно вам нужно, писать эти строчки? У вас, как я понимаю, другая задача. И (моё личное имхо), таких хороших преподавателей как вы, вообще ещё поискать нужно. Сам факт вашего постоянного участия в RSDN вызывает уважение.
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Поскольку шаблонов в обычном Обероне нет, то писанины будет больше. Надо будет расписать отдельно для 2D и отдельно для 3D. СГ>
Очень просто. Получается что для вполне реальной задачи старый добрый С++ подошел очень хорошо: все строго типизированно, лаконично, кратко, ясно и понятно. А в модном обероне мне пришлось бы заюзать копи-псате и потом еще два раза отлаживать два разных класса. Между прочим недецких по обьему кода. А на плюсах получилось это делается по принципу выстрелил и забыл
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, Сергей Губанов, Вы писали:
WH> Попробуй человеку который не умеет программировать объяснить что такое указатель. Поверь мне ты офигеешь. А ведь что может быть проще указателя? Уж не EBNF ли?
На самом деле объяснить просто. Что такое домашний адрес человек знает. Если домашний адрес записать на бумажке, то эта бумажка и будет указателем . Если память описывать как многоквартирный дом, то аналогии совсем прямые возникают.
Здравствуйте, Дарней, Вы писали:
Д>На самом деле это конечно шутка, но предел упрощению тоже должен быть. Д>И кстати говоря, упорный борец за простоту и понятность Вирт придумал такую замечательную вещь, как with. И не стыдно ему было других критиковать после этого?
А Вы хоть знаете что такое оператор WITH? Или это Вы взяли with из того паскаля, который был сразу после Алгола?
На всякий случай напишу что такое оператор WITH. В оберонах WITH — это оператор конкретизации типа.
TYPE
Base = EXTENSIBLE RECORD
...
END;
T1 = RECORD (Base)
...
END;
T2 = RECORD (Base)
...
END;
PROCEDURE MyProc(VAR x: Base);
BEGIN
WITH x: T1 DO S1 | x: T2 DO S2 ELSE S3 END
END MyProc;
S1 — последовательность действий при которых x имеет тип T1
S2 — последовательность действий при которых x имеет тип T2
S3 — последовательность действий при которых динамический тип x не установлен.
Смысл: Если динамический тип полиморфной переменной x оказался T1, то выполняется S1 внутри которой x рассматривается как переменная типа T1; в противном случае если динамический тип полиморфной переменной x оказался T2, то выполняется S2 внутри которой x рассматривается как переменная типа T2; в противном случае выполняется S3.
TYPE
Base = EXTENSIBLE RECORD END;
T1 = RECORD (Base)
Str: ARRAY 80 OF CHAR;
END;
T2 = RECORD (Base)
Value: INTEGER;
END;
PROCEDURE MyProc(VAR x: Base);
BEGIN
WITH x: T1 DO StdLog.String(x.Str) | x: T2 DO StdLog.Int(x.Value) ELSE StdLog.String("Не известный тип!") END
END MyProc;
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, Дарней, Вы писали:
Д>>На самом деле это конечно шутка, но предел упрощению тоже должен быть. Д>>И кстати говоря, упорный борец за простоту и понятность Вирт придумал такую замечательную вещь, как with. И не стыдно ему было других критиковать после этого?
СГ>А Вы хоть знаете что такое оператор WITH? Или это Вы взяли with из того паскаля, который был сразу после Алгола?
<skipped/>
Ну прикольное ключ. слово (разве это оператор???), но ты давай нормальный пример, где бы оно было полезно, логично и "делало" бы полиморфизм.
Тогда можешь заслужить аплодисменты, а так пока — пустой трёп, извиняюсь за выражения...