LINUX.ORG.RU

ЛОР, помоги выбрать ЯП для обучения

 , , , ,


1

3

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

Вот к каким мыслям я пришёл:

Язык должен наиболее чисто демонстрировать самые основы написания кода.

Не Си и не современные коммерческие языки (Java, C#, Go). Си, хотя примитивный в основе, усложнён из-за окружения, в котором используется. Современные коммерческие языки были созданы для решения проблем индустрии. Проблема общая: я хочу преподавать материал по мере нарастания сложности. Если в языке неизбежно приходится использовать классы или printf, то это затруднит объяснение (не хотелось бы слишком часто говорить «потом узнаешь для чего это нужно»), напугает студента (ему придётся писать код, используя возможности, которые он плохо понимает), создаст неправильное восприятие основ (как будто printf — это какая-то важная часть компьютера или ОС).

В целом, я хочу постепенно наращивать сложность и, если задачу можно решить более простым методом, то выбрать этот метод.

Языки, между которыми я выбираю: Pascal и Python.

Pascal устарел и денег не принесёт (обидно), но это и не является основной целью. Целью является программирование, а не современное окружение.

В частности, я не собираюсь задрачивать студента на Delphi или любой «продвинутый» диалект языка. Это противоречит цели. Я рассчитываю на то, что после должной тренировки “bare bones” нужно перейти на современный язык и это будет легко.

Важно упомянуть, что спека языка Oberon (Виртовский язык, тот же Паскаль, только упрощённый и доработанный) составляет 17 страниц.

Питон мне сложнее оценить, потому что я избегал работы с ним.

Если ограничиться императивным подмножеством, без ассоциативных массивов, классов и мета-классов, list comprehensions, HOF, исключений, то выглядит как альтернатива Паскалю. Хотя меня беспокоит динамическая типизация. Типы — очень важная вещь, хотелось бы чтобы язык помог это донести, а не быть типа «ну да, это важно, но ты забей».

Это все мои мысли.

Что касается практики, то я имел несчастье наблюдать как человек впервые знакомился с программированием, изучая Java на javarush. На это было больно смотреть.

Edit: дальнейшие пояснения по теме:

  • Подробнее про то, почему я считаю, что изучение основ и Паскаль хорошо сочетаются: 1
  • Почему не Си и не ассемблер: 1 2
  • Почему Паскаль: 1 2
  • Почему не Питон: 1
  • Целевая аудитория: 1
  • Почему такая размытая аудитория: 1 2
  • Про важность иерархии: 1


Последнее исправление: kaldeon (всего исправлений: 10)
Ответ на: комментарий от ugoday

Вот это — едниственно полезное свойство.

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

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

watchcat382
()

Как я пропустил этот тред?

студенты

Если правда студенты, то наваливать базу с поправкой на их профиль/специальность/направление. Если всё таки школьники — паскаль.

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

Dispetcher14 ★★★★★
()
Последнее исправление: Dispetcher14 (всего исправлений: 1)
Ответ на: комментарий от Nervous

Но зачем

Вот и я не понимаю зачем так писать,смешивая в одной переменной данные разных типов.

есть же union types. string | number и все дела. Конечно, в рантайме придётся проверки делать

А если для обозначения «безНДС» использовать число -1 то и проверок типа в рантайме можно избежать.

watchcat382
()

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

с python в этом плане сложнее: язык менее стабильный и более сложный, слишком быстро меняется, информации много, но наполовину устаревшей, сред разработки много и слишком они разные, у ученика может быть информационный шторм

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

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

так что pascal все же более строг и академичен, более полезен на начальных этапах

но pascal менее полезен в практическом плане: это уже практически мертвый язык, на нем можно обучить основам, но далее он будет бесполезен, на нем ничего полезного не написать так что рассматривать его можно только как трехколесный велосипед: он нужен только чтобы поставить учеников на ноги, дать понимание самых базовых вещей, далее его нужно обязательно сменить на один из современных востребованных языков, тут и можно переключиться на python

так что в моем понимании обучение может быть выстроено примерно так:

  • рассказываем о компьютерах: функциональные блоки, назначение, примерный принцип работы, и взаимодействие с остальными блоками
  • рассказываем о софте: классификация, признаки, назначение - прошивки, операционные системы, прикладной и системный софт, серверный софт, как взаимодействуют друг с другом разные уровни
  • рассказываем о принципах кодирования информации: системы счисления, логические операции, и как оно выглядит логически, в записи и на схемах, и в двоичном виде. Можно тут же провести параллель с логическими элементами и показать их основные виды
  • рассказываем об основах алгоритмов: сравнения, циклы, ветвления, переходы, переменные, функции, графическое представление алгоритмов
  • рассказываем о базовых алгоритмах: последовательности и факториалы, сортировки, бинарный поиск, и т.п. что можно объяснить на пальцах, показать как работает на доске, и промоделировать в уме или в тетрадке

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

далее можно переходить ближе к компьютерам:

  • рассказываем о классификации и разнообразии языков, о микропрограммах, бинарниках, ассемблере, о компиляторах и трансляторах, о жизненном треке языков (история, как развивались, что из них уже умерло, что еще живо), о востребованности и сферах применения. Неплохо тут также обрисовать какие из сфер на рынке есть сейчас: системщики, железячники, военка и космос, прикладной софт, финансы, стартапы, сайтики и вебсервисы, и т.п.
  • рассказываем о переменных подробнее: о типах и их представлении в памяти, об ограничениях и особенностях основных типов, об особенностях представления отрицательных чисел, о синтаксисе объявления
  • рассказываем о базовом синтаксисе pascal: блоки, переменные, логические операции и сравнения, циклы, функции, базовые библиотечные функции - математика, ввод/вывод на консоль
  • рассказываем об основах работы в среде разработки или о консольных командах на сборку бинарника и запуск программы
  • рассказываем о базовой отладке программы: основные ошибки и исключения, что с этим делать, как можно проверить что происходит в конкретной части кода, основы логирования
  • собственно практика с программами уровня hello world, набить руку с написанием и запуском кода
  • практика с ранее усвоенной теорией: повторение ранее разобранных базовых алгоритмов, но уже с переводом из алгоритма в код, запуском и отладкой

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

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

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

ну а отсюда уже можно перейти и к браузерам, основам http и html это уже более чем приличный уровень для основ: веб-сервис, отрисовка и обработка простейших веб-форм, простейшие апи, это уже то, что каждый может на практике использовать для себя

дальше уже каждый сам будет углубляться в нужную ему сторону: кто-то ограничится скриптами для практических задач, кто-то пойдет в веб или другие сферы, кто-то в другие языки, и в каждом из направлений уже свои стеки и наборы технологий, рассматривать их в рамках базового обучения особо смысла нет, даже на уровне css/js

ddf
()
Последнее исправление: ddf (всего исправлений: 2)
Ответ на: комментарий от ugoday

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

Надо правильно выбирать окружение. В том числе виртуальное. Поэтому мы - тут,а не в богопротивном инстаграме каком-нибудь.

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

watchcat382
()
Ответ на: комментарий от ugoday

Вы неявно предполагаете, что войны начинаются по прихоти, проснулся король с перепою,

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

watchcat382
()
Ответ на: комментарий от alysnix

в си++ вы просто пишете тип с рантайм проверкой присваивания в него. в плюсах более общее решение, чем в аде

В плюсах решение может быть и более общее,но проверки надо руками писать. А в Аде уже готовый механизм проверок есть,у него неплохие настройки проверок по умолчанию,ну и плюс свои конечно указать можно. Допустимый диапазон универсального целого типа проверяется «сам по себе»,а если надо свой ограниченный диапазон - то его указываем явно у создаваемого производного типа. К достоинствам можно отнести также и отсутствия навязывания «объектов» для этого(и вообще на каждом шагу).

watchcat382
()
Ответ на: комментарий от watchcat382

а если надо набор диапазонов? или диапазон наоборот? то есть значения не могут в него попадать.

вот потому плюсовое решение полное, а адское - нет.

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

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

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 2)
Ответ на: комментарий от ugoday

Вы употребляете какое-то свое значение слова «криминал».

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

Вспоминаем правило: «перемножаем характеристики, если где-то ноль, то общий результат ноль».

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

Технари не виноваты, что выросли такими.

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

Между рабом-горшечником и рабом-математиком нет никакой сущностной разницы.

Да. Зато есть разница между рабом и свободным человеком. И вроде как достаточно долгое время был тренд на стремление к свободе. В моем представлении о нормальном обществе ни горшечник ни математик не должны быть рабами. Но сейчас наметилось движение в обратную сторону.

watchcat382
()
Ответ на: комментарий от splinter

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

kaldeon
() автор топика
Ответ на: комментарий от watchcat382

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

И как быть если эти «древнейшие» законы писались первейшими мошенниками? То есть самими «преступниками»…

necromant ★★
()
Ответ на: комментарий от watchcat382

И к 60м годам у них получилось.

Чтобы не уходить в оффтопик, только скажу что с этим утверждением легко поспорить.

kaldeon
() автор топика
Ответ на: комментарий от alysnix

а если надо набор диапазонов? или диапазон наоборот?

Лично мне такое не требовалось поэтому я не разбирался как это сделать. Если можно сделать тип,способный содержать и число и строку то не вижу почему было бы невозможно объявить такой же тип но способный содержать числа с разными диапазонами. Но сам не пробовал. Тем более что писал я на Ada83,а сейчас есть и Ada95 в которой я хотябы более-менее знаю что добавлено,и есть Ada2012,нововведения которой я не знаю вообще. И если по Ada83 есть хорошие учебники то по Ada2012 видел только справочники,для изучения куда менее подходящие.

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

А уж какие трюки позволяет выделывать ассемблер… Чем более высокий уровень абстракции в языке тем больше ограничений налагается. В С++ можно «наворотить» много,но воротить придется самому вручную. На Аде возможностей наворачивания вероятно поменьше(не уверен!), зато есть много готового что работает по умолчанию и не требует специального внимания и ручного написания.

в плюсах вы можете иметь его собственную реализацию. и не одну

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

watchcat382
()
Ответ на: комментарий от necromant

И как быть если эти «древнейшие» законы писались первейшими мошенниками?

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

watchcat382
()
Ответ на: комментарий от kaldeon

с этим утверждением легко поспорить

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

watchcat382
()
Ответ на: комментарий от ddf

python в этом плане чуть хуже: прощает ошибки, …, приводит к непонятным ситуациям, ошибки проявляются не сразу, а позже, их сложнее выявить, легко упустить, и сложно разобраться что конкретно не так, половина ошибок вообще будет скрыта, не вызовет исключений, но приведет к некорректной работе, что очень не очевидно даже для опытных, а для начинающих это вообще тихий ужас

Ого. А можно парочку примеров? Особенно про непонятные ситуации, отложенные и скрытые ошибки.

так что в моем понимании обучение может быть выстроено примерно так: …

Довольно много вводной. Как по мне, что-то из этого обязательно начать до программирования: упрощённая модель компьютера, бинарные числа и логика, графическое представление алгоритмов.

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

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

Факториалы, сортировки и бинарный поиск неизбежно нужно объяснять на пальцах, но было бы круто побыстрее (возможно, не моментально) закрепить их на практике.

далее можно переходить ближе к компьютерам: …

Бинарники, ассемблер, трансляцию можно объяснить после написания helloworld.pas. Будет наглядная демонстрация, что ученики обычно любят, а не сухая абстракция «перевод исходного кода (чем бы он ни был) в более дружелюбный для машины формат (как бы он не выглядел)».

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

О переменных и типах, опять же, было бы круто рассказать, когда есть возможность демонстрации, то есть работа с языком. В Систематическом программировании Вирт сперва вводит ученика в язык, затем в типы данных. В Алгоритмах и структурах данных (более продвинутый уровень) он также начинает с типов и сразу демонстрирует их на языке.

В целом, я считаю, что Паскаль — вполне дружелюбный язык, чтобы поскорее, пусть не с самого начала, им сопровождать теорию и заменить «объяснения на пальцах» и блок-схемы. Я бы точно не выбрал для этой задачи Си, но Паскаль как будто создан для этого.

Спасибо за ответ, вы угадали что я хотел услышать.

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

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

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

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

Хороший аргумент против тех, кто говорит что нужно сразу начинать с JavaScript.

с python уже можно уйти в практические задачи: …

Если честно, я пока что неточно представляю что лучше делать на данном этапе.

Наверное, здесь уже размывается важность выбора языка для демонстрации работы с ОС (это включает в себя работу с файлами, аргументами командной строки и сетью). Хотя на Си было бы легче показать.

kaldeon
() автор топика
Последнее исправление: kaldeon (всего исправлений: 7)

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

ovax ★★★
()
Ответ на: комментарий от ugoday

X X поправ

«закон» архимеда троичен

сократ угадал?

проективная геометрия это многобожие ибо бесконечно много бесконечно удалённых точек

qulinxao3 ★★
()
Ответ на: комментарий от watchcat382

знаменитая трудность нотаций требующих явное указание типа - это метапредположение что область под которую нотируется трасса уже достаточно исследованна что бы не задаватся вопросами теплорода и различения астро(логии номии и прочь)

микроскоп гвозди

qulinxao3 ★★
()
Ответ на: комментарий от kaldeon

как Гагарин бога в небе не увидел так (в 1961) drug были зогбанены самой ООН

qulinxao3 ★★
()
Ответ на: комментарий от watchcat382

ну вы же разложенного Фурье обязанны помнить!

общая сумма восходящая то (в данном случае)

то что вами замеченные гармоники ща с отрицательной производной - ну смените объём среза чО

общее положение человеков и человейников лучшее и лучшее

qulinxao3 ★★
()
Ответ на: комментарий от kaldeon

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

бин деревья и из-за рекурентной своей природы «кажутся» простыми - там же куча проблем с той же балансировкой при их практическом использовании

у вирта в варианте модулы алгоритмя и программы В+(али*)воплощенны

вообще у вирта по сути была издана ровно 1 книга и 1 язык - а в дальнем он их уточнял (by stepwise refinement Ж))

qulinxao3 ★★
()
Ответ на: комментарий от ugoday

сори за русска языка

муравьи реализуют муравьиный алгоритм без того понимания о котором вы

и да не все следующие муравьи

как и не все муравьи следующие

снова сори за

qulinxao3 ★★
()
Ответ на: комментарий от kaldeon

касательно существованияVsне_сущестования ассоциативного селектора

языки где либо нет жёского различения кода данных (лиспы в их поверхностном виде) либо где есть перегрузка индексирования либо где обращение к индексу намеренно(!sic) выглядит как обращение к функции - легче позволяют продемонстировать что подсистема может быть балансированным сочетанием структуры данных и алгоритма(ов) над ней

сокрытие и прочая архитектура

да теже @cache которая замещает в пупоне алго памятью по мере разогрева

qulinxao3 ★★
()
Ответ на: комментарий от watchcat382

зачем так писать,смешивая в одной переменной данные разных типов

Можно разделить на две — естьНДС? и ставкаНДС. Но я уже слышу возмущённые вопли байтолюбов.

А если для обозначения «безНДС» использовать число -1, то и проверок типа в рантайме можно избежать.

Всё равно придётся делать проверку, только не на тип, а на значение. Не будешь же ты подставлять -1 в формулу расчёта.

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 2)
Ответ на: комментарий от Nervous

ха ха ха

формула та реагирующая на -1 возвратом -1 эт же +3 команды железки

ибо матан Heisenberg

мода на типы(в явном виде) в информатике(сs по заморскому) как раз таки началась и усилилась по мере увеличения среди программистов доли не_stem

ибо код это данные и данные это код ( а хрень это когда неразличимо)

qulinxao3 ★★
()
Последнее исправление: qulinxao3 (всего исправлений: 1)
Ответ на: комментарий от watchcat382

А если для обозначения «безНДС» использовать число -1 то и проверок типа в рантайме можно избежать.

Из недавнего: https://habr.com/ru/articles/855882/ - в коде SQLite, одного из наиболее полно покрытых тестами проектов, забыли добавить проверку на специальные значения, типы подобные «string | number» позволили бы выявить проблему во время компиляции

No ★★
()
Ответ на: комментарий от kaldeon

А можно парочку примеров? Особенно про непонятные ситуации, отложенные и скрытые ошибки.

Простейший пример:

if True:
    a = 1
    print(a)
else:
    print(a)

Он запускается и работает. Но до тех пор, пока мы в основной ветке. Если перейдём в ветку else то будет ошибка «NameError: name ‘a’ is not defined».

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

Kogrom
()
Ответ на: комментарий от watchcat382

Они не «не равны»,они не могут сравниваться,это некорректная операция.

Union и variant record в Аде нельзя сравнивать? Там это некорректная операция?

Также как теплое с мягким. Или значение тока с значением напряжения,хотя и то и другое - числа.

Здесь мы сравниваем ставку НДС со ставкой НДС. Они могут быть равны или не равны.

monk ★★★★★
()
Ответ на: комментарий от watchcat382

А если для обозначения «безНДС» использовать число -1 то и проверок типа в рантайме можно избежать.

Тогда если забудешь проверить на БезНДС перед вычислением НДС, получишь не ошибку умножения суммы на строку, а отрицательный НДС безо всякой ошибки. Отлично увеличил надёжность.

monk ★★★★★
()
Ответ на: комментарий от alysnix

в js, питонах, лиспах и проч. все переменные ваще указатели на обьект на куче

С чего это? Если посмотреть что-то типа

(defun f (x)
  (let ((y (+ x 1))
        (z (* x 2)))
    (dotimes (n 5) 
      (setf y (+ y 2))
      (setf z (- z 2)))
    (+ x y z)))
* (disassemble 'f)
; disassembly for F
; Size: 170 bytes. Origin: #xB800BB9C80                       ; F
; C80:       488955F8         MOV [RBP-8], RDX
; C84:       BF02000000       MOV EDI, 2
; C89:       FF142538050050   CALL [#x50000538]               ; #xB800000E30: GENERIC-+
; C90:       4C8BCA           MOV R9, RDX
; C93:       4C894DF0         MOV [RBP-16], R9
; C97:       488B55F8         MOV RDX, [RBP-8]
; C9B:       BF04000000       MOV EDI, 4
; CA0:       FF142548050050   CALL [#x50000548]               ; #xB800000F10: GENERIC-*
; CA7:       4C8BC2           MOV R8, RDX
; CAA:       4C8B4DF0         MOV R9, [RBP-16]
; CAE:       31DB             XOR EBX, EBX
; CB0:       EB4E             JMP L1
; CB2:       0F1F8000000000   NOP
; CB9:       0F1F8000000000   NOP
; CC0: L0:   48895DE0         MOV [RBP-32], RBX
; CC4:       4C8945F0         MOV [RBP-16], R8
; CC8:       BF04000000       MOV EDI, 4
; CCD:       498BD1           MOV RDX, R9
; CD0:       FF142538050050   CALL [#x50000538]               ; #xB800000E30: GENERIC-+
; CD7:       4C8B45F0         MOV R8, [RBP-16]
; CDB:       4C8BCA           MOV R9, RDX
; CDE:       4C894DE8         MOV [RBP-24], R9
; CE2:       BF04000000       MOV EDI, 4
; CE7:       498BD0           MOV RDX, R8
; CEA:       FF142540050050   CALL [#x50000540]               ; #xB800000EA0: GENERIC--
; CF1:       488B5DE0         MOV RBX, [RBP-32]
; CF5:       4C8B4DE8         MOV R9, [RBP-24]
; CF9:       4C8BC2           MOV R8, RDX
; CFC:       4883C302         ADD RBX, 2
; D00: L1:   83FB0A           CMP EBX, 10
; D03:       7CBB             JL L0
; D05:       4C8945F0         MOV [RBP-16], R8
; D09:       488B55F8         MOV RDX, [RBP-8]
; D0D:       498BF9           MOV RDI, R9
; D10:       FF142538050050   CALL [#x50000538]               ; #xB800000E30: GENERIC-+
; D17:       4C8B45F0         MOV R8, [RBP-16]
; D1B:       498BF8           MOV RDI, R8
; D1E:       FF142538050050   CALL [#x50000538]               ; #xB800000E30: GENERIC-+
; D25:       C9               LEAVE
; D26:       F8               CLC
; D27:       C3               RET
; D28:       CC0F             INT3 15                         ; Invalid argument count trap

то видно, что y и z на стеке. Или, в Ваших терминах, «непосредственно хранят значение по своему адресу».

monk ★★★★★
()
Ответ на: комментарий от watchcat382

только наблюдал за процессом доработки и эксплуатации. Тогда это был мрак и ужас.

А здесь обратная ситуация с Фортом. Если Форт не прощает ошибок и требует держать в голове состояние стека на протяжении описания слова, то это заставляет писать короткие понятные слова.

Если 1С гарантирует отсутствие неопределённого поведения, позволяет во время отладки выполнить любую функцию и типовые приёмы программирования исключают зависание, то программисты пишут функции на полторы тысячи строк и отдают пользователям без тестирования. Ведь даже если у пользователя произойдёт ошибка, его данные не испортятся.

monk ★★★★★
()
Ответ на: комментарий от monk

это тривиальные численные типы. инты и флоаты. их сишечка вообще в регистрах держит.

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

alysnix ★★★
()
Ответ на: комментарий от alysnix

это тривиальные численные типы. инты и флоаты. их сишечка вообще в регистрах держит.

А что ещё надо? Структуры и массивы?

Вот это всё будет на стеке:

(let* ((list (list 1 2 3))
       (nested (cons (list 1 2) (list* 3 4 (list 5))))
       (vector (make-array 3 :element-type 'single-float))
       (thing (make-thing :obj list
                          :next (make-thing :obj (make-array 3))))
       (closure (let ((y ...)) (lambda () y))))
  (declare (dynamic-extent list nested vector thing closure))
  ...)
monk ★★★★★
()
Ответ на: комментарий от monk

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

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

alysnix ★★★
()
Ответ на: комментарий от alysnix

у языков с динамическим типом тип во время компиляции неизвестен и на стеке быть не может.

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

monk ★★★★★
()
Ответ на: комментарий от monk

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

то есть плюсы дают раз в 100 более производительный код(как минимум на вашем примере). вот живите теперь с этим.

alysnix ★★★
()
Ответ на: комментарий от monk

У любого значения в динамическом языке тип известен.

нате вам

тут тип неизвестен и что такое + - непонятно.

fun add( v, vv) { return v + vv;  }

add(100,200)
add("abc", "bcd")
alysnix ★★★
()
Ответ на: комментарий от alysnix

то есть плюсы дают раз в 100 более производительный код(как минимум на вашем примере). вот живите теперь с этим.

Я не спорю. Компилятор Си/Си++ сейчас наиболее вылизан из всех.

gcc оформил в две команды ассемблера

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

* (f 123456789123456789123456789)
493827156493827156493827157

?

monk ★★★★★
()
Ответ на: комментарий от alysnix

тут тип неизвестен и что такое + - непонятно.

Так тут значения являются аргументами, а не определяются внутри функции.

monk ★★★★★
()
Ответ на: комментарий от monk
fun add( v, vv) { 
  /// vvv  -  на стеке не разместить, если не генерить варианты add для разных типов.
  vvv = v + vv;
  return vvv;
}

add(100,200)
add("abc", "bcd")
alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от monk

о чем и речь. статическая типизация это не просто ошибки проверять. это еще и генерировать максимально(по сути) эффективный код.

alysnix ★★★
()
Ответ на: комментарий от alysnix

о чем и речь. статическая типизация это не просто ошибки проверять. это еще и генерировать максимально(по сути) эффективный код.

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

auto fun(auto v, auto vv) 
{
  auto vvv = v + vv;
  return vvv;
}
monk ★★★★★
()
Ответ на: комментарий от alysnix

Как вообще в JS или Python тело вызываемой функции может быть недоступно, если она не часть языка?

monk ★★★★★
()
Ответ на: комментарий от monk

В Си++ ведь работает. И необходимость доступности тела никому не мешает.

в c++ такие функции оформляются как шаблоны, и их тело должно быть доступно в точке применения. это не регулярные функции.

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

опять же для всего этого нужен этап компиляции, а не сразу интерпретации, ну или компиляции при загрузке.

alysnix ★★★
()
Ограничение на отправку комментариев: