Comments 113
Smalltalk made “duck typing” a household word (well, if your house has a programmer in it).
Перевод:
Smalltalk сделал «утиную типизацию» расхожим выражением (ну, если в вашем доме ещё ходит программист).
Жирный плюс за попытку сохранить каламбур, но все-таки если по вашему дому ходит какой-то там программист, то не забудьте его выгнать перед тем как приниматься за smalltalk.
7 factorial printNl.
Сообщение printNl отправляется в результат (являющийся объектом) отправки сообщения my_factorial числу 7. Всё это очень похоже на естественный язык!
Что-то автор слегка тролльнул, выглядит очень похоже на естественный язык, в котором пишут справа налево. Или может имеется в виду, что иврит — самый естесвенный язык, а остальные — так себе.
Есть много вещей, которые программа может делать с сообщением doesNotUnderstand:, включая расширение своей функциональности!
Не, подразумевается расширение функциональности сообщения (типа по дефолту там эксепшн, но можно переопределить и писать в лог, например ).
В целом, действительно интересно — спасибо за перевод и продолжайте, пожалуйста.
выглядит очень похоже на естественный язык, в котором пишут справа налево.
Ну почему? И пишем и читаем слева направо:
7 factorial printNl.
вполне читается как «спросить у числа 7 его факториал, после чего распечатать его.» print factorial 7
— и вот это было бы действительно похоже на естественный язык. ( Почти валидный haskell, кстати)
7 factorial printNl. вполне читается как «спросить у числа 7 его факториал, после чего распечатать его.»
Вы ведь понимаете, что из-за неправильного порядка оригинальных слов вам приходится вставлять другие слова (костыли), чтобы сделать этот порядок осмысленным.
«Семерки факториал распечатать» — обычный Йода-язык в сравнении с «распечатать факториал семерки».
«распечатать факториал семерки»
А кому Вы это говорите?
Смололк как раз и отличается тем, что Вы всегда КОМУ-ТО что то говорите. Как в обычной беседе.
А по вашему получается Вы в воздух (наверное отдавая команду господу богу) заявляете — «Эй кто ни будь а ну ка быстро распечатать факториал семерки». В реальной жизни такое бывает?
Мы же говорим о приближении к нормальному человеческому языку.
По Вашему получается Вы в разговоре говорите: "" Э господь (Console) подними Васе руку".
В смолтолке мы просто Васе говорим — «Подыми руку». Если Вася это умеет — он это сделает. Если не умеет — выдаст сообщение «Не понимаю» (Don't understand). И тут в отличии от других языков мы можем остановится, научить Васю это делать (реализовать метод), после чего Вася подымет руку и выполнение программы ПРОДОЛЖИТСЯ с этой точки.
Не, я говорю (обращаясь к компьютеру) «Вкрути лампочку». Ну или к консоли, если это C#, потому что хочу, чтобы это сделала консоль.
А вы говорите «Вася, вкрути лампочку», хотя Вася — не электрик, а кот.
Я не понимаю, почему print — метод числа. Я его могу хотеть распечатать в консоль, в веб-сервер, на принтер, все это print и все это необходимо учить делать число? Где логика?
Не, я говорю (обращаясь к компьютеру) «Вкрути лампочку». Ну или к консоли,
А с чего Вы взяли что компьютер (консоль) должен уметь вкручивать лампочку. Это должен уметь электрик Вася. А кот Вася просто промяукает что он этого делать не умеет. И тут уже ваш выбор, научить кота вворачивать лампочки, или просто научить кота не падать от такой просьбы а мяукать — «Вызовите электрика!»
Ну а при правильной архитектуре коту вообще никогда такая просьба прилетать не должна, ну а если прилетает — это бага в матрице.
Ну С изначально был функциональным а потом к нему прикрутили (и достаточно криво) ООП.
1. Вы понимаете, что C и C# — два совершенно разных языка?
2. Язык С никогда не был функциональным. Он процедурный. Это две совершенно разных парадигмы
3. С с ООП — это третий язык, С++, хотя и не настолько отличающийся от оригинала, как C#
А с чего Вы взяли что компьютер (консоль) должен уметь вкручивать лампочку
Вкручивать лампочку не должно уметь ни то не другое. Должен уметь электрик. А вы хотите, чтобы лампочка вкручивалась сама.
Аналогично числа. Они не должны писаться сами. Их должно писать то, что мы хотим, чтобы их писало. Консоль, или принтер.
Так же и число, зачем мне нужен какой то посредник если я могу научить число само печататься например в поток, который я уже направлю куда нужно. Зачем плодить бесполезные сущности.
И ещё раз: вот в JavaScript тоже легко можно заставить цифру печатать саму себя, но этим никто не пользуется, и такой код совершенно справедливо завернёт любой грамотный тимлид.
Меня наверное спасает отсутствие у меня тимлида (я за него). Я там внизу уже писал что я не профессиональный программист, и потому могу просто забить на многие правила которые придуманы неизвестно кем и неизвестно почему. Я инженер и в основном пользуюсь инженерным правилом — «задача должна быть выполнена наиболее ОПТИМАЛЬНЫМ способом», и если какие то патерны программирования не соответствуют этому принципу — то эти патерны не используются. Конечно я понимаю что сейчас прилетит много тухлых помидоров, но такой подход позволяет мне достаточно эффективно реализовывать свой проект. Я не считаю правильным тупо следовать каким то правилам описанным в умных книгах, если они мешают мне работать. Эти правила написанны конкретными людьми с конкретными мозгами, и для конкретого контекста. У других людей мозги работают по другому, и контекст другой, почему же все считают что если великий как его там написал что надо делать так, то не смей делать по другому. Своя то голова должна работать. И если тимлид закостенел на учебниках, то гнать его надо. (сейчас пойдут комменты что гать надо меня, но меня гнать некому, я сам себе начальник, а полтора десятков тысяч пользователей моей программы устраивают результаты моей работы ).
Задача — добраться от пункта А в пункт B оптимальным способом. Нарушение правил ПДД влечёт за собой задержку на объяснение с инспектором. Значит правила соблюдаем. Я не профессиональный водитель, значит можно забить на правило дальнобойщиков поссать на колесо. Тем более завгара (тимлида) которому это правило рассказали великие гуру — дальнобойщики у меня нет. И никто не сможет меня остановить (зарезать мой код) если я поеду без соблюдения этого правила.
Но что предлагается взамен?
Система сообщений. То есть при изменении обекта он должен слать сообщения всем подписанным на них объектам.
Минуточку… а что токое список подписчиков? Это коллекция находящаяся в объекте, где находятся ссылки на все объекты которые подписаны на сообщения. То есть когда я кладу ссылку на родительский объект в переменную объекта — это плохо, а когда великий гуру то же самое реализует и называет это системой сообщений — это гуд.И где тут объективность и субъективность. И почему я должен доверять этим гуру, которые имеют одни правила для себя и другие для остальных?
Эти объекты знают о блоке (том объекте в котором они находятся). Да это грубое нарушение правил.
То есть когда я кладу ссылку на родительский объект в переменную объекта — это плохо, а когда великий гуру то же самое реализует и называет это системой сообщений — это гуд
Это нормально. Вы искажаете «это плохо» в своем сообщении.
И почему я должен доверять этим гуру, которые имеют одни правила для себя и другие для остальных?
Вы судите по тому, как напел Рабинович, это скучно.
Вы ведь понимаете, что из-за неправильного порядка оригинальных слов вам приходится вставлять другие слова (костыли), чтобы сделать этот порядок осмысленным.
И там всех этих слов (возьми, передай, то что получится) — нету.
А вот в варианте «print factorial 7» — они и не нужны — так как порядок естественный.
Что-то автор слегка тролльнул, выглядит очень похоже на естественный язык, в котором пишут справа налево. Или может имеется в виду, что иврит — самый естесвенный язык, а остальные — так себе.
Как раз абсолютно нормальный язык. Переведём: (7 factorial printNl ) «Семёрка, отдай ка факториал, и распечатай его»
Надеюсь Вас не огорошит такое известие что и nil является объектом, и его так же можно научить например рисоваться цветочком на канве. И потом сказать ему
nil paintAsFlowerTo:aCanvas
7 factorial
а потом полученный фактрориал просим напечататься (если точнее отдать строку отображающую его)
7 factorial printNl
Но семерка то же умеет печататься
7 printString
И это нормально, так же как сказать
"Петя беги".
В С бы это звучало
бег(Петя);
Как то не нормально, правда
Бег — некорректный пример. Потому что Петя может сам побежать, а цифры сами написаться не могут. Именно потому на smalltalk «petya run» читалось бы естественно, а «number print» читается глупо.
Вы говорите «Цифры, пишитесь!». Это очень глупо, что цифры умеют сами писаться.Глупо или нет — это дозволенное в языке обращение к цифрам, как к объектам
Чем семёрка хуже Пети. Она не имеет права научится печататься? Если её научить — она и побежит. Это всё вопросы абстракции и необходимости. В смолтолке очень умные цифры (да и вообще все), их можно чему угодно научить. Да и вообще там демократия и все равны (ну чем не мечта)))). Там нет неравноправия и разделения на главных (классы) и второстепенных (примитивы).
Но printNl, в принципе, выглядит не понятно. В смолтолках такого сообщения и нет.
Transcript
, при помощи: Transcript show: (7 factorial asString), cr.
Ну и, как я уже неоднократно замечал, «распечайтася» не имеет никакого смысла как «лампочка, вкрутись», «суп, сварись», «дичь — убейся», "ведра — сходите за водой".
это супер, и очень полезно, когда тебе 18, но в 30 лучше уделить времени родным, право слово, и учить $ языки как я их называю. их много, выбор есть.
Расширение кругозора — более чем достаточная причина, боьшинство наследников реализуют или урезанную версию ООП, или вообще кривую. Конечно, в ральной жизни не всегда получается всё чисто и красиво, но именно поэтому нам и нужны референсные реализации. Своего рода маяки в сером океане. После изучения Objective-C я научился писать намного лучше на C++.
Рано вы себя хороните — в XXI веке 30 ещё начало жизни, средний возраст у аспирантов в Европе (к слову, средний возраст у студентов — 25). Ну и учиться нужно всю жизнь, за этим мы и живём, чтобы каждый день узнавать новое.
В науке и инженерии (а любой хороший программист — несоменно инженер) вы учитесь всё время, и всё время создаёте новое знание. Такие языки, как Lisp, Scheme, Ada, C и Smalltalk — нужны всем. В равной мере изучение основы теории чисел будет очень не лишне физику, ибо в конце концов он использует числа в вычислениях. Все специалисты по человеческим языкам учат латынь — ибо поняв его, намного легче изучать современные европейские языки.
Вообще говоря, начальную позицию найти очень сложно, но они и не нужны. Дело в том, что Smalltak редко бывает первым языком, профессионалу на одном языке легче перейти на другой, в конце концов язык — всего лишь язык, самое главное — алгоритмы, структуры данных и принципы разработки везде схожи, но самое главное, он настолько простой, что изучить его на хорошем уровне очень легко в короткие сроки.
Работа по нему есть — не очень много, но безработных спецов я ещё не видел. И платят очень хорошо.
Расширение кругозора — более чем достаточная причинаЭто универсальная отмазка, которая не работает для очень занятых людей, для которых время дороже денег.
Такие языки, как Lisp, Scheme, Ada, C и Smalltalk — нужны всем.Очень сильное утверждение. Не всем. Среднестатистическому фронтендеру пригодится знание C? Ох, вряд ли. Разумнее потратить это время на изучение очередного фреймворка, чтобы скакнуть в новую компанию с повышением зарплаты, компетенций и новыми задачами, или на написание своего. Нужен ли Lisp инженеру машинного обучения? Нет, не нужен. Гораздо разумнее потратить это время на новые статьи, ведь их выходит столько же сколько фреймворков JS если не больше или на Kaggle. Есть ли польза от Smalltalk для Linux kernel developer-а? Сомневаюсь. Им лучше потратить время на сборку ядра (шутка). Остатется не так много групп — бэкенд и прикладники.
Работа по нему есть — не очень много, но безработных спецов я ещё не видел. И платят очень хорошо.Не убедительно. Работа на Коболе тоже есть. И платят там реально очень хорошо. Какой средний возраст программистов на Smalltalk? Как много новых проектов выходит в единицу времени? Это важно, т.к. если ты выходишь свежий из интитута, заниматься некромантией это одна их худших идей, которые могут прийти в голову.
если ты выходишь свежий из интитута, заниматься некромантией это одна их худших идей, которые могут прийти в голову
Напротив! В институте как раз и имеет смысл ознакомиться с различными парадигмами программирования (без углублённого изучения, просто ознакомиться). И не только для кругозора, но, и чтобы облегчить изучение новых языков, потому что тому кто знает несколько непохожих языков легче изучить новый язык, чем тому кто знает только один.
Это универсальная отмазка, которая не работает для очень занятых людей, для которых время дороже денег.
Если человека ничего кроме его денег не интересует, то никто и не заставляет изучать что-то новое, отвлекающее от зарабатывания.
Просто бывают люди, для которых деньги — это не единственная цель. Есть желание изучить что-то новое просто потому, что это интересно.
Есть желание изучить что-то новое просто потому, что это интересно.Речь в статье точно не о новом, а скорее об истории ЯП. Хотите новое — изучайте Ликвид Хаскель, Раст, Елм.
Среднестатистическому фронтендеру пригодится знание C?
Среднестатистическому — нет (хотя WebAssembly набирает обороты). А вот крутому — да. Чтоб он потом не писал очередной транспилер на ноде, заставляя тысячи других фронтэндеров покупать новые макбуки.
Как изучение Smalltalk может улучшить ваши навыки программиста
Да никак! Вот так начнешь тыкать в разные обскурные языки, а потом начинаешь что-нибудь писать, и думаешь: "во, это же один-в-один линейный тип, а тут мне лень думать — запущу запрос с backtrack как в Prolog, пусть сам разбирается; мда, а тут вообще самое оно будет всё это в STM обернуть, а тут красиво подходит shift/reset."
А потом вспоминаешь, что ты пишешь на Python, и ничего такого у тебя нет, и ты страдаешь, начинаешь пить, тебя выгоняют с работы, и ты сидишь под мостом и думаешь: "Зачем я эту статью на хабре читал? Сейчас бы сидел в офисе, писал бы на Питоне и не тужил."
Правдивая история.
Я не профессиональный программист, образования не имею (я промышленный программист, и разработчик систем автоматизированного проектирования). Какое то время (очень давно) баловался дельфями. По ряду причин на моей работе был организован отдел прикладного программирования (производственная контора вообще никак не связанная с програмированием). Меня как единственного хоть немного разбирающегося в программировании отправили туда. В помощь наняли проффесионала пришедшего с проекта на смолтолке. В течении нескольких лет Мы практически вдвоём (помощники то приходили, то уходили) подняли проект САПР Cadel.(программа написана полностью на смолтолке)
По семейным обстоятельствам мне пришлось уехать из Питера, и что бы не потерять навыки я начал свой проект — FLProg. Я работаю над ним один, и на 100% уверен что мне не удалось добиться даже десятой доли того что я сделал ни на каком другом языке. В рамках проекта мне приходится работать на С и PHP. Поэтому я могу сравнивать. Например разработка через дебаг насколько я знаю невозможна больше ни на одном языке. Ну а возможности рефакторинга просто восхищают.
Ещё раз повторюсь, я не профессиональный программист, но смолтолк позволил мне написать программу на вполне проффесиональном уровне (по крайней мере по отзывам пользователей)
Например разработка через дебаг насколько я знаю невозможна больше ни на одном языке. Ну а возможности рефакторинга просто восхищают.
А давайте предметно, с примерами?
Ещё раз повторюсь, я не профессиональный программист, но смолтолк позволил мне написать программу на вполне проффесиональном уровне (по крайней мере по отзывам пользователей)
Профессиональный уровень — это не только понравилась ли она пользователю. Это и отказоустойчивость, и легкость развертывания, поддержки, изменения. В том числе — сторонними программистами.
Например разработка через дебаг насколько я знаю невозможна больше ни на одном языке.
Common lisp тоже позволяет писать в похожем стиле. В нем по крайней мере можно исправлять функции прямо в работающей программе. И интерактивный отладчик тоже хорош.
Выбор языка очень сильно зависит от обстоятельств. Кому-то в молодости подвернулся smalltalk, кому-то lisp, кому-то ещё какой-то другой язык. Потом с этим языком люди по жизни идут и используют, где это возможно. Причём каждый язык хорош по своему.
:)
Smalltalk представил миру виртуальную машину (VM), которая позволяет программному обеспечению быть независимым от платформы. Это та же технология, которую поддерживает Java (JVM) и .NET, а также Android (Dalvik).
FORTH
Smalltalk был пионером JIT компиляции (just-in-time), методики резкого повышения производительности программного обеспечения байт-кодов, такого как Java.
FORTH
Ну, и так далее. "Тщательнее надо!" (М. Жванецкий) :)
Э… Ну, что execute (выполняющий шитый код) можно считать виртуальной машиной — ладно (хотя я бы так не выразился).
А вот про JIT в forth лично я не слышал, и мне эта идея кажется странной. Понятно, что можно реализовать — но велика ли будет выгода?
Э… Ну, что execute (выполняющий шитый код) можно считать виртуальной машиной — ладно (хотя я бы так не выразился).Имеются в виду разные вещи типа FCode. Но это всё — уже 70е, а O-код — это порождение 60х, так что Forth — тоже не «пионер».
А вот про JIT в forth лично я не слышал, и мне эта идея кажется странной.Типичная программа содержит кучу вызовов очень «мелких» функций типа
dup
и swap
. Их очень полезно вставить туда, где они вызываются, но использование байткода делает это весьма сложным…Но тут FORTH — тоже явно не пионер, всякие LISP-системы делали это раньше.
Ну, что execute (выполняющий шитый код) можно считать виртуальной машиной — ладно (хотя я бы так не выразился).
А чем это «можно считать»? :)
Да, маленькая и компактная, но тем не менее…
А вот про JIT в forth лично я не слышал, и мне эта идея кажется странной. Понятно, что можно реализовать — но велика ли будет выгода?
Вы уже упомянули шитый код. Что это, если не JIT?
Так что реализация изначально является неотъемлемой часть. любой Форт-системы, а вовсе не «можно реализовать».
Где тут компиляция в машинный код во время исполнения? Нет самой основной части JIT — самого компилятора.
А «сам компилятор» — неотъемлемая часть любой Форт-системы.
Подождите, так есть JIT, т.е. компиляция на лету, по ходу исполнения, или нет?
Есть. :)
Исходный код компилируется в шитый код (или в машинный код целевой системы, в зависимости от реализации), а затем исполняется уже шитый (или машинный) код.
По крайней мере, это было так, когда я изучал и применял FORTH. Не думаю, что что-то принципиально изменилось.
JIT это весьма конкретный термин, а не «вопрос терминологии».
Ну, не такой уж и конкретный. Смотрим Wiki:
JIT-компиляция (англ. Just-in-time compilation, компиляция «на лету»), динамическая компиляция (англ. dynamic translation) — технология увеличения производительности программных систем, использующих байт-код, путём компиляции байт-кода в машинный код или в другой формат непосредственно во время работы программы.
Я здесь вижу описание работы Форт-системы в части обработки исходного кода программы и последующего выполнения. :)
Есть. :)
Исходный код компилируется в шитый код (или в машинный код целевой системы, в зависимости от реализации), а затем исполняется уже шитый (или машинный) код.
Эта компиляция выполняется до начала работы системы, верно? В итоге у нас есть последовательность вызовов подпрограмм. Все может быть в машинном коде, но это неважно.
В JITе работа производится иначе — программа транслируется всегда в переносимый промежуточный код, который (результат трансляции) может исполняться виртуалками на разных платформах. А JIT на конкретной целевой платформе транслирует этот уже готовый промежуточный код (байт-код Java, например) в машинный по ходу работы виртуалки, «без отрыва от производства». Например, если видно, что вот этот участок — критичен по времени.
Ну, не такой уж и конкретный. Смотрим Wiki:
Там указана динамическая трансляция, как синоним. Куда конкретнее.
но сначала кто бы вспомнил, какой ценник IBM выставила на Visual Age Smalltalk, чтобы потом жаловаться на непопулярность
Как изучение Smalltalk может улучшить ваши навыки программиста