Как стать автором
Обновить
4
0
Станислав Михалкович @miksmiks

Преподаватель

Отправить сообщение

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

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

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

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

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

Это у вас плохие преподаватели были

Просто в качестве заданий надо придумывать не те алгоритмы, которые уже реализованы в стандартной библиотеке, а другие. Нужно проявлять творчество :) А так - баланс алгоритмов, стандартных функций и технологий - он как был так и остался.

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

Даа, кто говорит. Но олимпиадное программирование это как высокий спорт. Это малое направление для избранных.

Ну и в олимпиадеом программировании налево направо используются стандартные методы - всё что может ускорить процесс.

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

Ну нет, не надо. Это зависит от методики. Тем более, что во многих языках sort - внешняя функция.

Просто время игрушечных языков 50 летней давности ушло.

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

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

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

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

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

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

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

В непосредственном окружении - десятка два, которые учат именно школьников. Остальные - или в сети или же школьные учителя, с которыми мы контачим вживую.

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

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

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

По поводу методичек и Pascal собственно. Сейчас два года уже как Паскаль вымарывается из школьной программы, полностью или почти заменяясь Питоном. В новом ФГОС образца 2022 года на углубленном уровне Паскаль отсутствует. Всякий: Турбо, Delphi, PascalABC.NET. Там Python и C++. Все новые учебники уже полностью переписаны под Питон. А старыми нельзя будет пользоваться. Питон идет с 7 класса. Потом в 8, 9, 10 и 11. И начало выглядит так (учебник Босовой): ввод числа

a = input()
a = int(a)

а ввод двух чисел -

a,b = map(int, input().split())

И это на первых же занятиях. Так что пока мы с вами спорим синтаксический сахар пришел в виде тотального Питона.

По поводу того, что не нужно школьникам, - это ваше частное мнение. Я бы говорил конечно о методике если бы был преподаватель и использовал подобное мнение при сколько-нибудь массовом обучении. Тогда это была бы методика конкретного преподавателя. А так - мнение.

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

Ну сейчас, спустя много лет, я наблюдаю-таки развитие языка Delphi - и очень неплохое. Дженерики насколько я понимаю в стиле C++, вот внутриблочные или по-ихнему inline-описания завезли и даже описание переменной цикла for в заголовке.

А оконные приложения на нем по-прежнему делать очень удобно.

Язык для обучения здесь явно звучит в уничижительном смысле - в противовес чему-то великому, используемому в промышленном программировании. Не принимается - это не так. PascalABC.NET используется для обучения, но сфера его применения куда больше - думаю, проще почитать на сайте. По мощности он в чем-то опережает даже современный Delphi (в котором так и не появились лямбда-функции с автовыводом типа), а по производительности немного отстает от C#.

По поводу "притащили", которое тоже звучит как неприкрытая претензия. Давайте-ка перепишем код в чуть более читаемом виде

(0..1000).Where(x -> Valid(x)).First.Print

Это не "что-то, выглядящее как функциональщина", это цепочки методов, которые и являются одним из элементов функционального программирования, которое сегодня немного в разное время стало появляться в современных меинстрим языках: Java, Kotlin, Rust и даже в C++ 20 довернули-таки ranges. Замечу, что в этом все упомянутые языки похожи друг на друга и никто не обвиняет друг друга, чем же это отличается от кого-то. Эти средства сегодня должны быть почти в каждом современном языке.

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

Я заинтересовался вашей фразой про "неявно созданные классы" - какие классы вы тут имели в виду?

Даже не знаю, что ответить по поводу горизонтального двоеточия ..

Диапазоны - они настолько повсюду, что я задумался - как можно спутать a..b и a.b и утверждать, что первое плохо, а второе - самое оно. И в Pascal собственно оно встречается с 1970 года например в статических массивах: array [1..10] of real или литеральных множествах [1..5, 10].

Но на вкус и цвет как говорится ..

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

Тут раз пять встречаются диапазоны в виде горизонтального двоеточия. Горизонтальное двоеточие не гуглится - даже пытаться не стоит.

Ну это мир LINQ, а не мир Питона всё-таки.

Нет, память не отъедается - вот реализация:

function Cartesian<T>(Self: sequence of T; n: integer)
  : sequence of (T, T); extensionmethod;
begin
  foreach var x in Self do
    foreach var y in Self do
      yield (x, y)
end;

В каждый момент времени в памяти - один кортеж. Сокращение перебора y от 0 до x - это всего лишь в 2 раза. И можно ошибиться с этим условием и получить неправильный ответ - на ЕГЭ бы я не рисковал. Там будут похожие задачи, но другие.

Здесь тоже

(0..1000).Where(valid).First.Print

мы не перебираем до конца, а останавливаемся на первом найденном элементе - последовательности ленивы. И память расходуется только на один элемент при переборе.

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

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

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

Учителя не надо гнать из профессии - им и так несладко. Недавно был потрясен зарплатами - наши пошли помочь новой школе. Итог - 14200 на ставку, 3200 - доплата за степень, 3400 - доплата за 20 летний стаж. Без комментариев.

По поводу указателей - вопрос целесообразности. Нет школьных задач на указатели. А так - да - методику выработать можно. В PascalABC.NET вместо указателей ссылки, и там это тоже приходится объяснять. На коробках. В Питоне я знаю некоторые тоже объясняют, что имя переменной связывается со значением в момент выполнения - и это по-существу те же указатели, но в профиль.

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

Например, в учебнике Босовой 2022 года для 7 класса на втором (!) занятии в теме Программирование используется код

a,b = map(int, input.split())

Сразу после переменных и присваивания.

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

Что касается сравнения с приведением типов в JS или с использованием указателей в C, то в какой-то степени этот код менее сложный. Всё же приведение типов - это низкоуровневые вещи, а здесь - сверхвысокоуровневые.

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

Научить такому коду школьника - не такая уж сложная задача. Важен регулярный подход. Вы сами сказали, что Cartesian(2) - это красиво. Так и есть - он заменяет 2 вложенных цикла, превращая последовательность чисел 0..1000 (кстати, это просто последовательность если речь о терминах) в последовательность пар. После чего в этой последовательности пар All ищет все валидные, удовлетворяющие функции F. Тот же код можно написать вложенными циклами с логической переменной и break из двух циклов сразу :) Но сложнее. При правильном подходе современный школьник конечно напишет соответствующий код с циклами, но на ЕГЭ времени особо нет.

Строка же (0..1000).Where(valid).First.Print - это баловство, которое на Питоне понятнее написано циклом. Но и читается она неплохо: в последовательности от 0 до 1000 взять валидные, среди них - первый и - напечатать.

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

Пример не мой - я бы так не писал и не учил. Но так реально пишут на ЕГЭ, некоторые профессиональные преподаватели так учат писать школьников и авторы учебников так учат учителей. Так что это - данность - как бы она нам ни не нравилась.

Я привел этот пример, поскольку здесь упоминался Питон как язык, который выбирают за якобы самую краткую запись. Но нет.

Как говорил Линус Торвальдс: "Болтовня ничего не стоит, покажите мне код!"

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

Информация

В рейтинге
Не участвует
Откуда
Ростов-на-Дону, Ростовская обл., Россия
Зарегистрирован
Активность