Болталка PascalABC.NET

Возможно, Уссурийск настолько дальний край, что туда только голубиная почта добирается и поэтому они в развитии своем от всего мира настолько отстают. Или же, г-жа Горностаева с 90-х годов прошлого века сидит в модной ныне “самоизоляции”, от того и продолжает выпускать учебные пособия “про трубопаскакаль”. Самое печальное, что это для пособие педагогических вузов, т.е. будущих учителей и преподавателей информатики ведут у тому, что они придут в учебные заведения и будут там рассказывать про Turbo Pascal, умерший к тому времени “уж 20 лет как”. Т.е. их заведомо ставят в условия “учитель знает меньше ученика”. Печально, конечно. А еще - забавно, что авторы в список литературы включили и мое издание по PascalАВС.NЕТ, похоже, туда они даже не заглядывали, а упомянули для количества.

А еще эта дама в прошлом году выпустила брошюрку по алгоритмам, где на 64 страницах даны примеры и задания, предполагающие составление исключительно блок-схем. Пользоваться ей не советую, поскольку блок-схемы изобилуют нарушениями ГОСТ 19.701-90 (ИСО 5807-85) Единая система программной документации (ЕСПД). Схемы алгоритмов, программ, данных и систем. Обозначения условные и правила выполнения.

Как Моисей рекомендовал? 40 лет. По пустыне. И всё будет нормально!

Так уж дольше бродим…

Смотря откуда отсчитывать…

Да хоть откуда

Вы сами-то станете заниматься вызовами csc?

Если буду писать на C#, то да. На мой взгляд, использование нормального текстового редактора намного удобнее, чем тяжелой IDE на несколького гигабайт. А если вы про удобство нажать F9, что бы скомпилировать и запустить написанный код, то во всех нормальных текстовых редакторах можно настроить профили для разных языков, которые будут в том числе включать консольную команду для запуска компилятора. Просто настраиваете, что для файлов *.cs нужно использовать подсветку синтаксиса C# и команду csc для компиляции и всё. Хотя в большинстве редакторов это будет уже настроено сразу после установки.

оставлять создание проекта на другого человека

А нафига? Visual Studio не предназначено для написания небольших программ и ставить монстра на гигабайты, чтобы запустить програмку в полсотни-полтысячи строчек глупо. А текстовым редакторам проекты не нужны. Если ваша программа состоит из более чем одного файла, то просто добавьте обычный Makefile.

к слову, последняя версия PascalABC.NET вышла вчера

На главной странице последняя новость от 20.03.2021. посмотрите сами, если не верите.

Фрипаскаль — устаревший по своим возможностям древний диалект паскаля.

Каким это образом он древний, если новые релизы продолжают выходить, а многих его возможностей нет в pABC?

Например, как создать поток в pABC? В FPC для этого есть поддержка BeginThread, а в pABC этот код не скомпилировался, сказав что это неизвестная функция. После этого я ввёл слово Thread в официальную справку — там тоже ни одного вхождения. Посмотрел в книжку Осипова, прочитал всё содержание и оглавление — многопоточное программирование даже не упоминается.

Учитывая, что многопоточное программирование как никогда важно в эпоху многоядерных процессоров, если судить по этой фиче, то древним из этих двух окажется как раз PascalABC.net.

Впрочем многопоточность можно применить и используя обычные процессы вместо потоков, для многих задач они не хуже. Но как сделать fork(); из кода на pABC? в справке, опять же, про это ничего нет. В FPC для этого есть функция FpFork. Если что, уточняю, fork — это создание дочернего процесса с сохранением контекста, то есть, в отличии от обычного запуска исполнимого файла, исполнение и родителя и потомка продолжится с того же места с сохранением значений всех глобальных и локальных переменных и состояния стека вызова.

и совсем не изучаем возможности этого современного диалекта

Задача школьного обучения — дать начальные знания алгоритмизации и программирования как такового. Изучать возможности конкретных диалектов в школе не следует, поскольку это приводит к Vendor Lock-In. Если ученику хочется использовать какие-то несовместимые расширения FPC или pABC — пожалуйста, пусть использует, но изучает их самостоятельно. У школьника обязательно должна быть возможность писать программы дома, и что бы они потом запускались в школе и наоборот, включая как вероятность, что дома используется FPC, а в школе pABC, так и обратную.

А ситуация, когда ученику требуется ставить конкретную программу для выполнения школьных заданий и нельзя использовать аналогичную категорически недопустима! Может школьник дома работает под FreeBSD какой-нибудь, где mono нет, зато Free Pascal есть? Требовать от школьника ставить windows или linux на домашний компьютер для выполнения школьных заданий было бы категорически неправильно!

оставляя в них это чудище FreePascal.

Извините, но вы с Turbo Pascal не путаете? В fpc ничего особо чудовищного я пока что не нашел. Если вы нашли — поделитесь.

1 лайк

И какой категории пользователей Вы предлагаете набирать коды программ в текстовом редакторе? Авторам языка C# ? Кто это назубок знает все необходимые для работы библиотеки, свойства и методы? Ерунду пишете, право же…

Ну вот я пишу на паскале в текстовом редакторе, а компилирую через fpc из консоли. Что я делаю не так и чем в этом плане он принципиально отличается от C#?

Очень простым. Компилятор можно перевыпускать и для Algol-60. Но вот как-то не пользуются сейчас им. FPC устарел не как компилятор, а как язык: в нем невозможно писать программы, отвечающие современным технологиям программирования.

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

Пример:

Объявление локальных переменных как таковое — возможность. Есть и в FPC и в pABC. Объявление локальных переменных внутри begin/end блока — синтаксический сахар. Есть только в pABC.

Я, пока что, в деталях не изучал pABC, так что ни одного примера именно возможности, которая есть в нём, а в FPC нету не могу привести, а вот обратных — целая куча.

Вы предлагаете всем школьникам таким же образом поступать? Если да, то с Вами говорить дальше не о чем: либо Вы никогда не имели дело со школьным образованием, либо устраиваете троллинг.

А причем тут многопоточность? Зачем она начинающим? Покажите в ФГОС по информатике место, где идет речь об изучении многопоточности. А кроме того, если в той или иной книге, посвященной языку программирования, о чем-то не сказано, это вовсе не означает отсутствия каких-то возможностей в упомянутом языке. Многопоточность в PascalАВС.NЕТ поддерживается, поскольку в .NET имеются необходимые для этого средства. И в Справке есть информация по этому поводу.

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

Неужели синтаксический сахар? Неужели только в PascalАВС.NЕТ? Если Вы еще школьник, то можете продолжать так думать. Если хотя бы пару курсов вуза по IT-специальности отучились и продолжаете так думать - тогда, извините, я буду просто считать Вас “двоечником”, а на подобный контингент тратить силы и время я не желаю. В остальных случаях просто поверьте на слово, что это абсолютно не так, как Вы утверждаете. И подумайте на досуге, как “синтаксический сахар” позволил в программе дважды описать переменную, да еще и разного типа:

##
begin
  var k := 5;
  k.Print;
end;
begin
  var k := 4.8;
  k.Print
end

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

#include <iostream>
using namespace std;

int main() {
	{
		int k = 5;
		cout << k << endl;
	}
	{
		double k = 4.8;
		cout << k;
	}
	return 0;
}

В 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.