Болталка PascalABC.NET

В PascalABC никак, а в PascalABC.Net используя .Net:

##

procedure p1;
begin
  var c := 0;
  
  System.Threading.Thread.Create(()->
  while true do
  begin
    Console.SetCursorPosition(0,0);
    Console.CursorVisible := false;
    Writeln(c);
    Sleep(16);
  end).Start;
  
  while true do
  begin
    Sleep(100); // типа работа
    c += 1;
  end;
  
end;
p1;

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

Конечно, лямбды это чистый синтаксический сахар. Но как бы вы сделали это во FreePascal, создавая новую пользовательскую структуру на как минимум 20 строк, или добавив 1 строчку глобального состояния в программу? Устаревшие стили часто провоцируют плохие привычки. То же самое, но более спорно, с описанием свалки переменных в начале программы.

А это уже низкоуровневая возможность, которая имеет смысл только в соответственно низкоуровневых языках, так же как и прямое управление указателями. PascalABC.Net таковым не является.

И, кстати, немного оффтоп, но до того как вы упомянули - использование такой фичи я видел только в одной игре в стиле ретро, где основная механика - написание ботов на ассемблеро-подобном языке. В современных кодах, ни на C++, ни на ассемблере, на практике я такого не встречал.

Я так подозреваю, это потому что если нужен запуск одного и того же участка кода несколько параллельных раз - надо использовать или что то типа omp (его современный аналог под .Net - System.Threading.Tasks.Parallel), или сразу идти на GPU. Во всех остальных случаях - лучше начать пустую копию процесса, передав задание или через аргументы коммандной строки, или через пайпы. И всё это доступно через .Net .

Если вы не знали что фичи вроде лямбд присутствуют во многих современных языках - вы сильно отстали от жизни. А именно на такие фичи делается упор в данном языке.

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

Обучение на старых диалектах паскаля приводит к зазубривание бойлерплейта вроде сортировки массивов, вместо того чтоб один раз разобраться и далее использовать 1 строчку - массив.Sort;, сосредотачиваясь на более сложных конструкциях.

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

1 лайк

[quote=“RAlex, post:174, topic:2751”] Вы предлагаете всем школьникам таким же образом поступать?[/quote]

Ну, каких-то особых препятствий я к этому не вижу. Хотя можно конечно и PascalABC взять или Dev-Pascal, если именно для паскаля. Я думаю, что учителя не должны навязывать использование какой-то конкретной среды, а напротив, объяснить, что результат работы компилятора не зависит от того, в каком текстовом редакторе написан код и что если код писать правильно, то он скомпилируется хоть GNU Pascal, хоть FPC, хоть ABC, но между ними есть различия и несовместимости. Ну и показывать конструкции которые есть во всех трёх или хотя бы в двух, а какие-то, которые есть только в каком-то одном из них — оставить для самостоятельного изучения по желанию.

А причем тут многопоточность? Зачем она начинающим? Покажите в ФГОС по информатике место, где идет речь об изучении многопоточности.

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

И в Справке есть информация по этому поводу. Я ожидал, что оно должно отыскаться по ключевому слову Thread, а почему-то не нашлось. А можно пример кода, где оно бы использовалось?

Расскажите нам, тут присутствующим, как Вы будете в FPC работать с LINQ, с регулярными выражениями, с обобщенными контейнерными классами типа List, Stack, Queue, Dictionary?

По-моему LINQ ни нафиг не нужен в паскале. Для этого C# есть. Никто же не запрещает разделить проект на модули. написанные на разных языках? Списки делаются вот так:

type
	pListNode = ^ListNode;
	ListNode = record
		n: Integer;
		p: pListNode;
	end;

Другие структуры данных — аналогично. На мой взгляд, гораздо полезнее самому создать нужные структуры данных, что бы понимать, как они работают, чем использовать готовые из .NET. Конечно, готовые, скорее всего, будут работать быстрее, но цель-то понимание сути, а не быстродействие. Для регулярных выражений ничто не помешает подключить библиотеку pcre, или написать самому с нуля их парсер, что бы разобраться как они работают. Но все эти штуки в любом случае выходят далеко за рамки школьной программы.

[quote=“RAlex, post:174, topic:2751”] И подумайте на досуге, как “синтаксический сахар” позволил в программе дважды описать переменную, да еще и разного типа:[/quote]

Хороший пример того, как делать не надо. Если для блока кода нужны локальные переменные — следует вынести его в отдельную функцию/процедуру, а не лепить в одну кучу.

Ну и по поводу “только в pABC”. Как насчет, к примеру, С++ ?

Речь шла о паскале, кажется.

1 лайк

Нет, не делаются. Надо хотя бы классы вместо указателей использовать, потому что если заменить integer и string в этом примере - появятся утечки памяти и падения с ошибками доступа к памяти. Ибо нефиг мешать указатели с высокоуровневым языком, не понимая что делаете.

Надо, однозначно! Один раз создать, а потом использовать готовые.

Речь шла о том что современные языкИ это не языкИ а не язык.

3 лайка

Скачаете по ссылке программу и увидите что дата её сборки 5 июля.

Если вы не знали, есть такой язык, как Oxygene.

а в PascalABC.Net используя .Net: System.Threading.Thread.Create

Если пишешь на паскале, то надо писать на паскале, а если пишешь на C#, то надо писать на C#. А писать на C# на паскале — это как-то странно. Я бы так делать не стал.

Но как бы вы сделали это во FreePascal, создавая новую пользовательскую структуру на как минимум 20 строк, или добавив 1 строчку глобального состояния в программу?

А тут уже зависит от конкретного кода. Если по смыслу, он весь в принципе многопоточный, то глобальными переменными. То что их по возможности лучше избегать — это да, но не нужно это возводить в абсолют. Если например у меня в целом весь код однопоточный, а какая-то конкретно функция требует дофига вычислений и я хочу её распараллелить, то создал бы структуру данных в качестве локальной переменной этой функции и передал через BeginThread указатель на неё. Но насчёт 20 строк вы преувеличиваете. Строк пять объявление структурного типа.

А это уже низкоуровневая возможность, которая имеет смысл только в соответственно низкоуровневых языках, так же как и прямое управление указателями. PascalABC.Net таковым не является.

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

Если вы не знали что фичи вроде лямбд присутствуют во многих современных языках - вы сильно отстали от жизни.

Ну да, в Scheme, Haskell, OCaml, APL, J и тд Есть такое общее правило хорошего дизайна: программа должна делать только что-то одно, но делать это хорошо. Так же и языки. Если взять Pascal — это язык процедурного императивного программирования, значит именно в таком стиле и надо на нём писать. А если целью стоит изучение и применение функционального программирования, то и язык надо взять соответствующий, где функциональная парадигма во главе угла.

А если писать на паскале в функциональном стиле, а на Scheme в императивном — то и получится у нас что-то вроде стихотворения Чуковского «Путаница»:

Замяукали котята:
"Надоело нам мяукать!
Мы хотим, как поросята,
     Хрюкать!"

А за ними и утята:
"Не желаем больше крякать!
Мы хотим, как лягушата,
     Квакать!"
...

Обучение на старых диалектах паскаля приводит к зазубривание бойлерплейта вроде сортировки массивов, вместо того чтоб один раз разобраться и далее использовать 1 строчку - массив.Sort; , сосредотачиваясь на более сложных конструкциях.

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

То есть надо не учить использовать готовую сортировку, а учить запихать свою сортировку в модуль и подключать по мере надобности, как и другие штуки.

1 лайк

Надо хотя бы классы вместо указателей использовать, потому что если заменить integer и string в этом примере - появятся утечки памяти и падения с ошибками доступа к памяти.

С чего бы вдруг? Просто память освобождать надо. new и dispose вам на что даны?

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

Если pABCn криво работает с указателями — зачем их добавили? Чтоб было? А если нормально, то никаких проблем не будет.

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

Надо, однозначно! Один раз создать, а потом использовать готовые.

Ну да, только и использовать свои же, а не .NET-овские. Почему нет?

1 лайк

Просто понимать что такое сборщик мусора надо.

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

И - остановитесь на секунду и поймите, что использовать PascalABC.Net наряду со старыми паскалями придумали тут вы. Хотя сам факт что он сидит поверх платформы .Net - делает его языком из абсолютно другой вселенной.

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

2 лайка

Просто понимать что такое сборщик мусора надо.

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

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

Тогда почему бы не применить Free Pascal? Он не имеет проблем с указателями, компилирует в нативный код, что улучшает производительность и не имеет возможностей, вредных для понимания императивно-процедурной парадигмы программирования, таких как наличие методов у атомарных типов, упомянутая сборка мусора и так далее. Если же вы считаете нужным преподавать ещё и функциональное программирование, то можно взять Scheme. На её основе в MIT разработана мощная методика преподавания программирования.

что использовать PascalABC.Net наряду со старыми паскалями придумали тут вы. Хотя сам факт что он сидит поверх платформы .Net - делает его языком из абсолютно другой вселенной.

Ну ладно фиг с ними, с указателями и многопоточностью. Что мешает взять и просто добавить в pABCnet все основные штуки, которые есть в free pascal, что бы улучшить его совместимость с кодом в классическом паскалевском стиле, плюс добавить флажок в опциях компилятора, аналогичный ключу -pedantic в GCC, который позволяет отключить все расширения pABC и отказаться компилировать код, который использует несовместимые расширения?

Тогда бы например школьник мог делать задания по информатике дома в PascalABC.net, а потом принести программы в школу и быть уверенным, что они скомпилируются у учителя на Free Pascal, и наоборот. если в школе стоит ABC, то ученик мог бы дома пользоваться FPC, а потом быть уверенным, что это будет работать и в ABC, если не использует многопоточности, указателей и подобного. которое в школе всё равно не изучают

1 лайк

Возьмите и добавьте, это опенсорс-проект.

Возьмите и добавьте, это опенсорс-проект.

У меня нет прав на коммиты в публичный репозиторий. А если я добавлю это в свой форк, то ситуацию с несовместимостью это не исправит.

Кроме того, я вообще не имею опыта в программировании под .NET и не хочу в нём копаться.

PabcN я собираюсь использовать только в той части, которая совместима с нормальным паскалем, поскольку я считаю, что писать код, работающий только с одним компилятором — это дурной тон и в общем случае признак крайне низкой квалификации программиста. Это примерно как на C консольные программы писать, так что собираются только в Microsoft Visual Studio 2020. Собственно для этого мне PabcN и нужен, что бы не завязывать свой код на фичи, уникальные для Free Pascal.

Понятно, вопросы школьной информатики рассматривать бесполезно. Думать Вы можете все, что угодно, а реальность такова, что учитель обязан использовать то ПО, которое стоит на компьютерах в классе. Почему FPC в школах надо “днем с огнем искать” - это не мне вопрос, тем более это не моя забота. Чем раньше этот сорняк на ниве обучения окончательно выкорчуют, тем лучше будет. Школа языкам программирования не учит, у нее другая задача - учить составлять алгоритмы и записывать их неким удобным для записи и понимания образом. В свое время Н.Вирт для целей обучения алгоритмам специально разработал язык, который назвал Паскаль. Напоминаю, что реализация появилась намного позднее языка, а до тех пор Н.Вирт использовал Паскаль именно для публикации алгоритмов, как прежде Algol-60. Подобным образам и PascalАВС.NЕТ создавался в первую очередь как язык, позволяющий сделать обучение более комфортным. Попутно были достигнуты и иные цели. И глупо было бы при этом давать какое-то его убогое подмножество. Собственно, об этом сто раз уже писалось, чего повторяться.

Т.е. если в Алгол-60 или Fortran-II добавить какую-то отсутвовавшую в них возможность, они перестанут быть устаревшими?

После установки системы PascalАВС.NЕТ появляется папка с примерами, посмотрите по пути \Samples\NETLibraries\System.Parallel

Это по-Вашему. Но есть и другие мнения. В частности, те из школьников, что в этом году сдавали ЕГЭ, как и учителя - те, что познакомились с LINQ в один голос пишут восторженные отзывы. LINQ - современная технология и говорить, что она не нужна - по меньшей мере, недальновидность. Снимок Это пост выпускника, у которого в школе информатики вообще не было. Выучился сам на PascalАВС.NЕТ за полгода. Естественно, это не один отзыв.

Да, лет двадцать лет назад они примерно так и делались. Но, к примеру, в .NET такой код писать - это как на минном поле. Вам уже пытались объяснить, но либо Вы не понимаете, как в .NET работает сборщик мусора, либо “Ваньку валяете”.

Да, но только однократно. Создавать структуры данных и писать методы/процедуры для манипулирования этими структурами для каждой задачи - бред горячечного больного. Отсюда необходимость иметь стандартные библиотеки. Научившись работать с ними в одном .NET-языке, можно затем использовать полученные умения в других, например в C#.

Если о Паскале - это вообще не довод. В язык добавили новую возможность - и Вы критикуете его за то, что она новая и в старых диалектах ее нет?

В качестве примера. Вот задание из демоверсии к ЕГЭ-2021: Снимок А вот возможное решение, которое школьник напишет за минуту и не думая:

## uses School;
(49bi ** 7 + 7bi ** 21 - 7).ToBase(7).CountOf('6').Print // 13 - ответ

Очень жду от Вас решение на FPC и примерное количество времени, которое уйдет на написание и отладку…

1 лайк

Совет: просто забудьте про PascalАВС.NЕТ. Скажите вслух 256 раз: “нет его, нет!”. А потом сожгите над системным блоком своего компьютера конcкий волос. И спокойно продолжайте писать на FPC.

В качестве примера. Вот задание из демоверсии к ЕГЭ-2021: Очень жду от Вас решение на FPC и примерное количество времени, которое уйдет на написание и отладку…

Для начала, давайте определимся. Мне нужно максимально быстро получить ответ? Я сделаю это так:

$ bc <<< 'obase=7;49^7+7^21-7' | tr -cd '6' | wc -c
13

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

Или мне нужно решить эту задачу именно как задачу? В таком случае я буду использовать мозги, а не компьютер. Для начала, замечаем что числа в основании степеней — это 7 и 49, то есть степени семёрки и пользуясь этим, переводим: 7^14+7^21-7 = [1 (7 нулей) 1 (14 нулей)] - 10 (в семеричной системе). Далее, мысленно вычитаем в столбик и замечаем, что каждый из четырнадцати нулей превратится в 6, кроме последнего, а значит шестёрок будет 13.

вот возможное решение, которое школьник напишет за минуту и не думая:

На экзамене школьник вообще-то должен именно думать. То есть решить эту задачу он должен без компьютера (или с компьютером, но только в качестве средством показа текста задания).

Это как на контрольной в третьем классе с заданиями на действия в столбик разрешить брать с собой калькулятор. Школьник-то может быть решит за минуту все задания, не думая, но то, ради чего собственно и проводилась контрольная: оценить, освоил ли он собственно действия в столбик — не получится.

Цель этой задачи какая — выяснить, понимает ли школьник смысл позиционных систем счисления. При использовании готового метода ToBase(7) или obase=7 — эта цель достигнута не будет.

Что интересно, если школьник осилит это решить на нормальном паскале или любом другом языке, не используя библиотечные функции для перевода между систем счисления — то вот это как раз докажет, что он системы счисления понимает. Только вот в этом случае гораздо быстрее и проще решить эту задачу не в лоб, а чуток подумав.

В язык добавили новую возможность - и Вы критикуете его за то, что она новая и в старых диалектах ее нет?

Для обучения информатике избыток возможностей вреден, а не полезен, что вы, кстати, удачно доказали примером из ЕГЭ.

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

Нужно сохранить свою имплементацию этих структур данных в модуль и использовать именно свой модуль в каждой программе. Естественно, писать каждый раз заново — это неправильно.

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

Повод научиться подключать библиотеки, написанные на одном языке к программам на другом языке. Это общее умение гораздо нужнее частного знания библиотеки .NET, которое совершенно бесполезно при программировании на других языках, типа например Scheme или Haskell.

Но, к примеру, в .NET такой код писать - это как на минном поле.

Ну в таком случае, .NET плохо подходит для изучения программирования.

но либо Вы не понимаете, как в .NET работает сборщик мусора

Я выше открытым текстом писал, что на .NET я не писал и не собираюсь. И как разботает сборщик мусора я не понимаю. Всё что я про него знаю я прочитал в странице справки pABCn на тему указателей. А единственное что там написано, это что он автоматически освобождает память, если на неё нет активных указателей.

Т.е. если в Алгол-60 или Fortran-II добавить какую-то отсутвовавшую в них возможность, они перестанут быть устаревшими?

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

те, что познакомились с LINQ в один голос пишут восторженные отзывы. LINQ - современная технология и говорить, что она не нужна

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

1 лайк

Не пойдет. Вы - на месте школьника, изучавшего только FPC. И все. Принимается только работающий код на FPC. Остальное - болтовня.

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

1 лайк

Возможно, в “вашем любимом Паскале” LINQ иметь и не нужно. Потому что упомянутый Паскаль сегодня фактически мертв, ведь для обучения он малопригоден, являясь балластом при изучении современных концепций и технологий, а в “промышленном программировании” Паскаль практически не используется. Но вот отсылать с LINQ к функциональным языкам не стоило бы: с ним можно работать и в языках с более привычными парадигмами. Даже к С++ написаны библиотеки для реализации LINQ.

Да, с этим никто и не спорит. Кроме, видимо, ФИПИ и МинОбра. Потому что задачи из ЕГЭ думать как раз и не заставляют. Они заставляют или использовать один из готовых шаблонов для решения класса конкретных задач, или использовать брутфорс на компьютере. В любом случае, если школьник получает возможность свое решение проверить - это отлично, а не должно подвергаться гонениям.

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

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

Давайте в обсуждении считать PascalABC.NET не версией Паскаля, а новым языком. Это на самом деле так. И так нам будет проще всё это обсуждать.

Вы будете учить школьников старому паскалю и указателям (если вы конечно учите школьников), мы будем учить их по-новому. Все будут счастливы. И профессия программиста не пострадает, поскольку любой вменяемый программист понимает, что если это - новый язык, то его надо вначале изучить. Ну или не изучать и не писать на нем.

4 лайка

И где такие учителя? А кто тогда проверяет работы ОГЭ и ЕГЭ на разных языках? И как они такие закостенелые перешли массово на Python, а не PascalABC.NET не смотря на ваши потуги (ведь это проще)?

Большинство так и сделало. А жаль…

Уже никто не проверяет.

Как по мне, не жалко терять ЦА, которая ни во что ставит достоинства твоего продукта, а переубеждение гиков почти всегда напрасная потеря времени. Касательно школьников — тут информационный барьер, почти никто не знает на что на самом деле способен PascalABC.NET.

ОГЭ проверяют…

Теперь учителя вздохнут и начнут углубляться в дебри языка который преподают…

Без справки так и не узнают…

А книги устаревают.

1 лайк