Всегда это сколько лет назад? У нас на первом курсе (98 год) заставляли в Паскаль. На втором был C. Но я и на первом курсе игнорировал Паскаль и на некоторых предметах сдавал код на C. Интересно кстати как сейчас учат.
а с ассемблером вы не пробовали сравнивать? два разных фактически противоположных архетипа относительно современных языков вообще-то, вместе со смолтолком и ML будет покрыто все разнообразие предков
два разных фактически противоположных архетипа относительно современных языков
Два идентичных языка с немного отличающимся синтаксисом. Ручное управление памятью, стандартные конструкции циклов и примитивная система базовых типов.
Вы будете смеяться, но для обучения по барабану на null-terminated/length-prefixed — и там, и там время на разъяснение особенностей для работы со строками в целях обучения минимально.
Указатели и их арифметика — это да, проблема, но вполне решаемая, даже в каком-то смысле интересная, но вот то, что для Pascal нет никакой надежды на будущее — это точно.
null-terminated сразу же вызывает вопрос - а как оно должно работать, если в переменную засосать произвольный бинарный файл, где в данных обязательно попадётся этот самый null?
в поцкале никогда не было ручного управления памятью, в этом его «фишка», как и в наличии возможности управлять памятью (т.е. выкручивать всякие фокусы с доступами и оптимизациями) сила си
синтаксис абсолютно разный, строгий бюрократический порядок объявления паскаля прямо противопоставлен относительной свободе Си
в поцкале никогда не было ручного управления памятью, в этом его «фишка»
Ещё как было. Подробностей не помню, но помню, что я делал аналоги malloc/free ещё на Turbo Pascal 1 под Robotron 1715 (CP/M). И структуру файловой системы на нём же методом тыка анализировал, т.е. там и низкоуровневый доступ к диску был (хотя убей бог не помню даже примерно, как он выглядел).
возможно сборщика там не было когда-то, хотя думаю, что давно уже сделали, но вам ведь не приходилось вычислять адреса в памяти исходя из занимаемого данными объема, вполне вероятно еще и что ваши упражнения были т.н. «динамическим выделением памяти»
Как только дело доходит до работы с системными функциями то там все равно появляются нуль-терминированые строки. Ну и всяческие PChar практически во всех диалектах были
null-terminated сразу же вызывает вопрос - а как оно должно работать, если в переменную засосать произвольный бинарный файл, где в данных обязательно попадётся этот самый null?
Вы «произвольный бинарный файл» обрабатываете как строку вызывая например strlen? Если да, то вы точно ЧДНТ.
Там был New и Dispose (аналог malloc и free). Это вполне себе ручное управление памятью. Ни умных указателей, ни тем более сборщика мусора там не было. Были чуть более удобные строки, которые выделялись на стеке (аналог char s[256] на Си), однако ценой невозможности обработки строк длиннее 255 символов и перерасхода памяти при обработке коротких строк. Всё что не выделялось на стеке управлялось настолько же вручную, насколько же и в Си.
Кстати, в том Turbo Pascal, который я знаю, был ещё тип PChar, который представлял те самые null-terminated строки снимая ограничение на 255 символов. И имеющий все те же неудобства работы как и в сишные строки.
У паскаля более многословный синтаксис, поэтому хоть технически он и позволял кастовать указатели в числа и тоже выполнять адресную арифметику, но это было ужасно многословно и поэтому программист, действительно, избегал бы сомнительных операций чисто из-за этого. А Си очень лаконичный и там странные штуки можно написать очень легко.
Ограничение в 255 символов. Что сильно осложняло использование String за пределами учебных примеров (для обучения алгоритмам «255 символов хватит всем», действительно, но почти любой серьёзный проект сталкивается с длинными строками). И поэтому изобрели PChar, который был той самой сишной строкой.
То есть правильнее сказать, что в Pascal был специальный строковый тип для выполнения лабораторных. Вне школы/универа разница с Си стиралась.
И структуру файловой системы на нём же методом тыка анализировал, т.е. там и низкоуровневый доступ к диску был (хотя убей бог не помню даже примерно, как он выглядел).
Ну наверное в каждом языке есть приколы которые можно эксплуатировать, у нас от ударения зависит смысл слов порой типа «трусы»,«трусы»,«жаркое»,«жаркое».
«Трусы и трусы плюс жаркое жаркое» можно менять порядок слов меняя лишь ударение сохраняя смысл. В голову не приходит пример когда нужно сделать всё наоборот. Опять же на слух если не быстро все эти «ма» отличаются это как сухо ответить «да», вопросительную интонацию задать «Даааа?» С иронией сказать «ДаааАААаааа». С сарказмом выраженным «Дооааа, конеееечно» вот как все эти 4 формы одного и тоже звучат по разному и имеют (в нашем случае) разный смысл произношения с одинаковым смыслом слова также и у них, не так же, а принцип такой же. Корейский вот наоборот с виду простой как палка, реально там родов нет, он,она,оно отсутствует вообще, спряжений нету еду, едешь,едет ничего нету, есть просто ехать, но всё ломается на дедедедедедедедедеед, они везде декают и от этого дэдэдэдэдэдэ зависит контекстный смысол который без трёх литров не понять никак. Так и получается инстранцы офигевают от того как мы можем на лету! Выстраивать фразы вида «Я открывала эту маленькую коробочку,коробочек,коробушку, а внутрях замечательная кошечка побегала и прибежала прямиком мне в рученьки» а мы офигиваем от мамамамммаммамамаамадэдэдэдэдэдэдэдэ :D