Pull to refresh

Comments 113

С любезного разрешения Mr Richard Eng я начинаю серию переводов его эссе по языку Smalltalk и OO программированию.
Оригинал:
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 его факториал, после чего распечатать его.»
Это описание логики выполнения smalltalk на естественном языке. А вот описание того, что мы хотим сделать выглядело бы как «распечатать факториал числа 7», то есть
print factorial 7

— и вот это было бы действительно похоже на естественный язык. ( Почти валидный haskell, кстати)
UFO just landed and posted this here
Это естественный язык в польской нотации получается. Число > в стек; факториал (над результатом в стеке) > в стек; распечатать (число из стека).
На чём ни пиши — всё у людей FORTH получается. :)
Ну, если заглянуть во «внутренности» Java, то да… :))
7 factorial printNl. вполне читается как «спросить у числа 7 его факториал, после чего распечатать его.»

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

«Семерки факториал распечатать» — обычный Йода-язык в сравнении с «распечатать факториал семерки».
«распечатать факториал семерки»

А кому Вы это говорите?

Смололк как раз и отличается тем, что Вы всегда КОМУ-ТО что то говорите. Как в обычной беседе.
А по вашему получается Вы в воздух (наверное отдавая команду господу богу) заявляете — «Эй кто ни будь а ну ка быстро распечатать факториал семерки». В реальной жизни такое бывает?
Кому-кому, компьютеру. В каком-либо C# вначале еще стояло бы «Console», то получилось бы консоли. Что-то вроде «Консоль, распечатай факториал семерки»
Эх жертвы функционального программирования))))

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

По Вашему получается Вы в разговоре говорите: "" Э господь (Console) подними Васе руку".

В смолтолке мы просто Васе говорим — «Подыми руку». Если Вася это умеет — он это сделает. Если не умеет — выдаст сообщение «Не понимаю» (Don't understand). И тут в отличии от других языков мы можем остановится, научить Васю это делать (реализовать метод), после чего Вася подымет руку и выполнение программы ПРОДОЛЖИТСЯ с этой точки.
С каких пор C# — ФП?
Не, я говорю (обращаясь к компьютеру) «Вкрути лампочку». Ну или к консоли, если это C#, потому что хочу, чтобы это сделала консоль.
А вы говорите «Вася, вкрути лампочку», хотя Вася — не электрик, а кот.
Я не понимаю, почему print — метод числа. Я его могу хотеть распечатать в консоль, в веб-сервер, на принтер, все это print и все это необходимо учить делать число? Где логика?
Ну С изначально был функциональным а потом к нему прикрутили (и достаточно криво) ООП.
Не, я говорю (обращаясь к компьютеру) «Вкрути лампочку». Ну или к консоли,

А с чего Вы взяли что компьютер (консоль) должен уметь вкручивать лампочку. Это должен уметь электрик Вася. А кот Вася просто промяукает что он этого делать не умеет. И тут уже ваш выбор, научить кота вворачивать лампочки, или просто научить кота не падать от такой просьбы а мяукать — «Вызовите электрика!»

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


1. Вы понимаете, что C и C# — два совершенно разных языка?
2. Язык С никогда не был функциональным. Он процедурный. Это две совершенно разных парадигмы
3. С с ООП — это третий язык, С++, хотя и не настолько отличающийся от оригинала, как C#

А с чего Вы взяли что компьютер (консоль) должен уметь вкручивать лампочку

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

Аналогично числа. Они не должны писаться сами. Их должно писать то, что мы хотим, чтобы их писало. Консоль, или принтер.

Нет я хочу что бы лампочки вкручивал электрик Вася. Я его этому учу, и его же об этом прощу, а не посредника по имени Console.

Так же и число, зачем мне нужен какой то посредник если я могу научить число само печататься например в поток, который я уже направлю куда нужно. Зачем плодить бесполезные сущности.
UFO just landed and posted this here
То же вариант)))) Сейчас мода на умные лампочки. Вас же не смущает когда лампочку (саму лампочку а не диммер в стене) с помощью смартфона просят установить определённую яркость или включится в определённое время. Как видите смолтолк опередил время)))
UFO just landed and posted this here
И ещё раз: вот в JavaScript тоже легко можно заставить цифру печатать саму себя, но этим никто не пользуется, и такой код совершенно справедливо завернёт любой грамотный тимлид.

Меня наверное спасает отсутствие у меня тимлида (я за него). Я там внизу уже писал что я не профессиональный программист, и потому могу просто забить на многие правила которые придуманы неизвестно кем и неизвестно почему. Я инженер и в основном пользуюсь инженерным правилом — «задача должна быть выполнена наиболее ОПТИМАЛЬНЫМ способом», и если какие то патерны программирования не соответствуют этому принципу — то эти патерны не используются. Конечно я понимаю что сейчас прилетит много тухлых помидоров, но такой подход позволяет мне достаточно эффективно реализовывать свой проект. Я не считаю правильным тупо следовать каким то правилам описанным в умных книгах, если они мешают мне работать. Эти правила написанны конкретными людьми с конкретными мозгами, и для конкретого контекста. У других людей мозги работают по другому, и контекст другой, почему же все считают что если великий как его там написал что надо делать так, то не смей делать по другому. Своя то голова должна работать. И если тимлид закостенел на учебниках, то гнать его надо. (сейчас пойдут комменты что гать надо меня, но меня гнать некому, я сам себе начальник, а полтора десятков тысяч пользователей моей программы устраивают результаты моей работы ).
Раньше всё больше бисер экономили, а теперь вот и до тухлых помидоров добрались… мда…
друзья, так увлекательно следить за вашей беседой) Так кто, в итоге вкрутил лампочку?
Сама вкрутилась)))) Сошлись на этом. (её долго били, мучали пока научилась)
Сколько нужно программистов на Smalltalk, чтобы вкрутить лампочку?
А ответить на вопрос «зачем электрик?»))
UFO just landed and posted this here
UFO just landed and posted this here
Ну почти правильно всё рассказали. За одним исключением. Если какие то правила мне помогают и полезны они применяются. Если нарушение каких то правил может повредить ОПТИМАЛЬНОМУ решению задачи — то их приходится выполнять. Повторюсь, голова то должна работать.
Задача — добраться от пункта А в пункт B оптимальным способом. Нарушение правил ПДД влечёт за собой задержку на объяснение с инспектором. Значит правила соблюдаем. Я не профессиональный водитель, значит можно забить на правило дальнобойщиков поссать на колесо. Тем более завгара (тимлида) которому это правило рассказали великие гуру — дальнобойщики у меня нет. И никто не сможет меня остановить (зарезать мой код) если я поеду без соблюдения этого правила.
UFO just landed and posted this here
А вот в нахождении способа оптимальной достижения цели и состоит работа разработчика. Необходимо найти баланс между обязательными правилами, рекомендациями и даже возможно костылями и стоимостью результата, а так же временем реализации. Можно годами реализовывать проект вылизывая его в соответствии со всеми патернами, обкладывать его тестами на 100%, убирать всю сильную связанность, создавать кучу прокси объектов, наблюдателей и т.д. Но Ваш проект никогда никто не увидит, и значит это будет бесполезно потраченное время
Все верно, но вы путаете субъективное и объективное. «поссать на колесо» — это субъективное правило, «не ездить на красный» — объективное, помогает избежать аварий. Способы разбиения на блоки, деление зон ответственности некоторых сущностей в программировании — тоже объективны. Здесь не имеет значения, какой гуру или «гуру» высказал мысль; имеет значение объективный фактор связности. Грубо говоря, сколько вам нужно будет точек в коде изменить для того, чтобы перенаправить вывод не в одно место, а в другое. В третье, в четвертое. А потом — в одно из них по выбору, и так далее.
Ну давайте рассмотрим фактор сильной связности. У меня в проекте есть такой объект — блок. Внутри блока есть коллекция объектов- входы и коллекция выходов. Эти объекты знают о блоке (том объекте в котором они находятся). Да это грубое нарушение правил. Но такое нарушение очень облегчает мне жизнь, при этом не приносит никаких проблем. Более того — есть объекты «соединение» которое знает о входах- выходах с которыми оно соединенно, и входа выхода знают о соединениях с которыми они соединенны. Это же вообще ужось, любой тимлид с учебником меня просто расстреляет за первым углом))).
Но что предлагается взамен?
Система сообщений. То есть при изменении обекта он должен слать сообщения всем подписанным на них объектам.
Минуточку… а что токое список подписчиков? Это коллекция находящаяся в объекте, где находятся ссылки на все объекты которые подписаны на сообщения. То есть когда я кладу ссылку на родительский объект в переменную объекта — это плохо, а когда великий гуру то же самое реализует и называет это системой сообщений — это гуд.И где тут объективность и субъективность. И почему я должен доверять этим гуру, которые имеют одни правила для себя и другие для остальных?
UFO just landed and posted this here
Эти объекты знают о блоке (том объекте в котором они находятся). Да это грубое нарушение правил.

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

Это нормально. Вы искажаете «это плохо» в своем сообщении.

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

Вы судите по тому, как напел Рабинович, это скучно.
UFO just landed and posted this here
UFO just landed and posted this here
Судя по некорректному использованию термина и контексту, вы парой сообщений выше хотели, видимо, сказать «эх вы, жертвы императивного программирования».
UFO just landed and posted this here
Простите, но это вполне используемая, скажем так, парадигма — что-то вроде .toNumber или .toString для числа. И то же самое — почему объект «число» должен уметь конвертироваться в строку, ведь логичнее было бы иметь черный ящик-функцию для этого?
UFO just landed and posted this here
Возьми 7, передай функции факториала, а то, что получится, передай функции печати…
Как я уже писал:
Вы ведь понимаете, что из-за неправильного порядка оригинальных слов вам приходится вставлять другие слова (костыли), чтобы сделать этот порядок осмысленным.

И там всех этих слов (возьми, передай, то что получится) — нету.

А вот в варианте «print factorial 7» — они и не нужны — так как порядок естественный.
UFO just landed and posted this here
Что-то автор слегка тролльнул, выглядит очень похоже на естественный язык, в котором пишут справа налево. Или может имеется в виду, что иврит — самый естесвенный язык, а остальные — так себе.


Как раз абсолютно нормальный язык. Переведём: (7 factorial printNl ) «Семёрка, отдай ка факториал, и распечатай его»
С тех пор как в смолтолке (где то с 80-тых годов) было объявлено что Всё — обекты и каждый из них можно научить чему угодно. Например печатать факториал. Так и семёрка является полноправным объектом, и её то же можно этому научить. В смолтолке НЕТ примитивов, и любой объект можно научить (реализовав соответствующий метод) всему чему надо.
Надеюсь Вас не огорошит такое известие что и nil является объектом, и его так же можно научить например рисоваться цветочком на канве. И потом сказать ему

nil paintAsFlowerTo:aCanvas
Ну мы ведь не про Смолток, а про то, что оно вроде как читается как человеческий язык и про ваше «Вы в воздух заявляете». Вот почему для вас заявлять семерке, чтобы она что-то там распечатала — кажется нормальным с точки зрения человеческого языка?
Ну почему бы и нет если семёрка УМЕЕТ это делать. Причём обратите внимание что распечататься то мы просим не семёрку, а факториал. Семерку Мы просим отдать нам факториал
7 factorial 

а потом полученный фактрориал просим напечататься (если точнее отдать строку отображающую его)
7 factorial printNl


Но семерка то же умеет печататься

7 printString


И это нормально, так же как сказать
"Петя беги".

В С бы это звучало

бег(Петя);


Как то не нормально, правда
Да при чем тут Петя? Вы говорите "Цифры, пишитесь!". Это очень глупо, что цифры умеют сами писаться. Как я уже спросил, а вы проигнорировали — куда именно писаться? В консоль, в диалоговое окно, или на принтер? И это все ответственность цифр, знать куда писаться?

Бег — некорректный пример. Потому что Петя может сам побежать, а цифры сами написаться не могут. Именно потому на smalltalk «petya run» читалось бы естественно, а «number print» читается глупо.
Вы говорите «Цифры, пишитесь!». Это очень глупо, что цифры умеют сами писаться.
Глупо или нет — это дозволенное в языке обращение к цифрам, как к объектам
Вы как-то ворвались в середину ветки даже не постаравшись понять суть разговора.
Могу ещё раз повториться, жертвы функционального программирования которым всю жизнь твердили — есть крутые сущности — классы и есть бесправные примитивы, которым ничего не позволено.
Чем семёрка хуже Пети. Она не имеет права научится печататься? Если её научить — она и побежит. Это всё вопросы абстракции и необходимости. В смолтолке очень умные цифры (да и вообще все), их можно чему угодно научить. Да и вообще там демократия и все равны (ну чем не мечта)))). Там нет неравноправия и разделения на главных (классы) и второстепенных (примитивы).
UFO just landed and posted this here
Бардак в голове у человека. Я уже акцентировал на этой ошибке, но он не читатель, а писатель
Ну замените семёрку на строку. Легче стало? Строку я могу напечатать в консоль, послать в принтер, завернуть в POST-запрос и отправить куда-нибудь через интернет, засунуть в синтезатор голоса и озвучить через динамик, использовать в качестве параметра при вызове какой-нибудь программы (в общем случае написанной неизвестно на каком языке и требующей ещё неизвестно каких ключей). И что, бедной строке во всём этом разбираться? Или мне имплементировать отдельно «Строку, умеющую звучать», «Строку, умеющую печататься», «Строку, умеющую превращаться в последовательность битов ASCII», «Строку, нарисованную тонкой кистью» и «Строку, принадлежащую Императору»?
Сообщение «printString» означает «напечатай строку» и просто возвращает объект строки, описывающий получателя сообщения. Вывод куда-либо (консоль) не предполагается.

Но printNl, в принципе, выглядит не понятно. В смолтолках такого сообщения и нет.
Судя по синтаксису в примере был использован GNU Smalltalk, а в нём не образ, а обычный консольный интерпретатор. В классических версиях Smalltalk вывод куда-либо осуществляется с помощью объектов специального назначения. Например, вывод в 'консоль', называемую Transcript, при помощи:

Transcript show: (7 factorial asString), cr.  
Ну или если установлен пакет OUT то вывод в Transcript вообще простой.
7 factorial out
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
Никто ничего не упускает. И никто не критикует СТ. Просто он не похож на естественный язык. Это не плохо. Просто это факт. В естественном языке не надо разбивать на два сообщения, потому что они посылаются разным объектам.

Ну и, как я уже неоднократно замечал, «распечайтася» не имеет никакого смысла как «лампочка, вкрутись», «суп, сварись», «дичь — убейся», "ведра — сходите за водой".
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
Деревянные контроллеры, прибитые к полу
Спасибо! Мне очень хотелось сохранить каламбур, и на мой взгляд получилось неплохо. :3 Ежели предложите лучший вариант — буду рад.
«Smalltalk сделал «утиную типизацию» расхожим выражением (правда, расхаживает оно исключительно по программистам)».
все супер, но как черт бери на этом заработать? где найти, к примеру, хотя бы джуниорскую вакансию, с перспективой заменить старшего? и главный вопрос: зачем всё это, кроме расширения кругозора, сейчас? тем паче, наследников море, и так или иначе мы все работаем со смол парт оф смолтолк :)
это супер, и очень полезно, когда тебе 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? Как много новых проектов выходит в единицу времени? Это важно, т.к. если ты выходишь свежий из интитута, заниматься некромантией это одна их худших идей, которые могут прийти в голову.
если ты выходишь свежий из интитута, заниматься некромантией это одна их худших идей, которые могут прийти в голову

Напротив! В институте как раз и имеет смысл ознакомиться с различными парадигмами программирования (без углублённого изучения, просто ознакомиться). И не только для кругозора, но, и чтобы облегчить изучение новых языков, потому что тому кто знает несколько непохожих языков легче изучить новый язык, чем тому кто знает только один.

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

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


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

Речь о приоритетах. Можно учить все подряд, потому что интересно. А можно выборочно, так сказать 20% усилий дадут 80% результата.

Есть желание изучить что-то новое просто потому, что это интересно.
Речь в статье точно не о новом, а скорее об истории ЯП. Хотите новое — изучайте Ликвид Хаскель, Раст, Елм.
UFO just landed and posted this here
Среднестатистическому фронтендеру пригодится знание C?

Среднестатистическому — нет (хотя WebAssembly набирает обороты). А вот крутому — да. Чтоб он потом не писал очередной транспилер на ноде, заставляя тысячи других фронтэндеров покупать новые макбуки.

Например питерская фирма «Транзас» вроде ищет смолторкера
Как изучение Smalltalk может улучшить ваши навыки программиста

Да никак! Вот так начнешь тыкать в разные обскурные языки, а потом начинаешь что-нибудь писать, и думаешь: "во, это же один-в-один линейный тип, а тут мне лень думать — запущу запрос с backtrack как в Prolog, пусть сам разбирается; мда, а тут вообще самое оно будет всё это в STM обернуть, а тут красиво подходит shift/reset."


А потом вспоминаешь, что ты пишешь на Python, и ничего такого у тебя нет, и ты страдаешь, начинаешь пить, тебя выгоняют с работы, и ты сидишь под мостом и думаешь: "Зачем я эту статью на хабре читал? Сейчас бы сидел в офисе, писал бы на Питоне и не тужил."


Правдивая история.

UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
Вот другая правдивая история.
Я не профессиональный программист, образования не имею (я промышленный программист, и разработчик систем автоматизированного проектирования). Какое то время (очень давно) баловался дельфями. По ряду причин на моей работе был организован отдел прикладного программирования (производственная контора вообще никак не связанная с програмированием). Меня как единственного хоть немного разбирающегося в программировании отправили туда. В помощь наняли проффесионала пришедшего с проекта на смолтолке. В течении нескольких лет Мы практически вдвоём (помощники то приходили, то уходили) подняли проект САПР Cadel.(программа написана полностью на смолтолке)
По семейным обстоятельствам мне пришлось уехать из Питера, и что бы не потерять навыки я начал свой проект — FLProg. Я работаю над ним один, и на 100% уверен что мне не удалось добиться даже десятой доли того что я сделал ни на каком другом языке. В рамках проекта мне приходится работать на С и PHP. Поэтому я могу сравнивать. Например разработка через дебаг насколько я знаю невозможна больше ни на одном языке. Ну а возможности рефакторинга просто восхищают.
Ещё раз повторюсь, я не профессиональный программист, но смолтолк позволил мне написать программу на вполне проффесиональном уровне (по крайней мере по отзывам пользователей)
Например разработка через дебаг насколько я знаю невозможна больше ни на одном языке. Ну а возможности рефакторинга просто восхищают.

А давайте предметно, с примерами?

Ещё раз повторюсь, я не профессиональный программист, но смолтолк позволил мне написать программу на вполне проффесиональном уровне (по крайней мере по отзывам пользователей)

Профессиональный уровень — это не только понравилась ли она пользователю. Это и отказоустойчивость, и легкость развертывания, поддержки, изменения. В том числе — сторонними программистами.
К сожалению, это действительно стандартный этап в жизни программиста, когда он начитается и начнет загоняться пытаясь применить все свои знания там, где это не нужно (вспоминаем себя/знакомых, которые узнали про паттерны и начали сувать куда не надо). Обычно после этого из них выбивают дурь и они переходят в сеньоров.
UFO just landed and posted this here
Почему же, это все весьма стандартная проблема перехода с одного языка на другой, а в данном случае — использование конкретного языка после использования другого конкретного языка. Везде свои «best practices» и везде свои подходы к решению проблем. Где-то принято запариваться на счет выделенной памяти, считать, следить за утечками, где-то это просто не имеет смысла. Очень хорошо знать разные подходы и вовремя их применить, но, к сожалению, вовремя это делают лишь самые опытные разработчики.
Мне ужасно интересно, почему в прочих инженерных науках подобные проблемы распространены намного меньше? Видимо, в программной инженерии явно что-то неправильно. Возможно, одна из причин — слишком ранний старт у руля боевого сервера. Например, тридцатилетний авиационный инженер или физик-теоретик — ещё более чем начинающий, молодой и перспективный (за исключением небольшого числа гениев), а у многих программистов в 30 кризис идентичности и прочие проблемы, вроде сложности поиска работы из-за возраста. Во всяком случае, судя по жалобам на Хабре и других русскоязычных ресурсах.
Во-первых, в программировании можно достичь какой-то цели бОльшим количеством способов, чем в «физическом» инженерном деле. А во-вторых, там где в «железном» мире есть вариативность, встречается все то же самое — споры между новыми методами, «давайте поробуем» и «всегда делали так, будем делать так».
Например разработка через дебаг насколько я знаю невозможна больше ни на одном языке.

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


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

«Кипит наш разум возмущённый...» ©
:)
Smalltalk представил миру виртуальную машину (VM), которая позволяет программному обеспечению быть независимым от платформы. Это та же технология, которую поддерживает Java (JVM) и .NET, а также Android (Dalvik).


FORTH

Smalltalk был пионером JIT компиляции (just-in-time), методики резкого повышения производительности программного обеспечения байт-кодов, такого как Java.


FORTH

Ну, и так далее. "Тщательнее надо!" (М. Жванецкий) :)

В оригинале автору уже упрекнули в подобном, но он говорил вовсе не о том, что Smalltalk впервые создал все эти методы, а о том, что именно в нём они впервые нашли широкое промышленное применение.
А дальше мы упрёмся в понятия «широкое» и «промысленное». Одно время Форт применялся на всех компьютерах Apple, на всех серверах Sun и всех POWER-серверах IBM. Это — уже промышленное применение или ещё нет?
Думаю, да, уже.
Ещё можно вспомнить про его применение в космонавтике и промышленной автоматике — но надо ли?..

Э… Ну, что execute (выполняющий шитый код) можно считать виртуальной машиной — ладно (хотя я бы так не выразился).
А вот про JIT в forth лично я не слышал, и мне эта идея кажется странной. Понятно, что можно реализовать — но велика ли будет выгода?

Э… Ну, что execute (выполняющий шитый код) можно считать виртуальной машиной — ладно (хотя я бы так не выразился).
Имеются в виду разные вещи типа FCode. Но это всё — уже 70е, а O-код — это порождение 60х, так что Forth — тоже не «пионер».

А вот про JIT в forth лично я не слышал, и мне эта идея кажется странной.
Типичная программа содержит кучу вызовов очень «мелких» функций типа dup и swap. Их очень полезно вставить туда, где они вызываются, но использование байткода делает это весьма сложным…

Но тут FORTH — тоже явно не пионер, всякие LISP-системы делали это раньше.
Ну, что execute (выполняющий шитый код) можно считать виртуальной машиной — ладно (хотя я бы так не выразился).

А чем это «можно считать»? :)
Да, маленькая и компактная, но тем не менее…

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

Вы уже упомянули шитый код. Что это, если не JIT?
Так что реализация изначально является неотъемлемой часть. любой Форт-системы, а вовсе не «можно реализовать».
Нет, шитый код это не JIT. Совсем.

Где тут компиляция в машинный код во время исполнения? Нет самой основной части JIT — самого компилятора.
Вопрос трактовки терминологии, не более того.

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

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

JIT это весьма конкретный термин, а не «вопрос терминологии».

Ну, не такой уж и конкретный. Смотрим Wiki:
JIT-компиляция (англ. Just-in-time compilation, компиляция «на лету»), динамическая компиляция (англ. dynamic translation) — технология увеличения производительности программных систем, использующих байт-код, путём компиляции байт-кода в машинный код или в другой формат непосредственно во время работы программы.

Я здесь вижу описание работы Форт-системы в части обработки исходного кода программы и последующего выполнения. :)
Сразу скажу — я не спорю, поскольку не знаком с работой Форт-системы, мне интересно выяснить именно эту подробность.
Есть. :)
Исходный код компилируется в шитый код (или в машинный код целевой системы, в зависимости от реализации), а затем исполняется уже шитый (или машинный) код.

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

В JITе работа производится иначе — программа транслируется всегда в переносимый промежуточный код, который (результат трансляции) может исполняться виртуалками на разных платформах. А JIT на конкретной целевой платформе транслирует этот уже готовый промежуточный код (байт-код Java, например) в машинный по ходу работы виртуалки, «без отрыва от производства». Например, если видно, что вот этот участок — критичен по времени.

Ну, не такой уж и конкретный. Смотрим Wiki:

Там указана динамическая трансляция, как синоним. Куда конкретнее.
Так-то любой м. с микрокодом можно считать виртуальной машиной. Да хоть МИР (машина для инженерных расчетов) тоже по сути виртуалка.
А почему бы ТС (я помню что перевод) не посоветовать посвятить себя изучению древне-арамейского, латыни и вычислениям в римской системе счисления?
Итого
/сарказм
но сначала кто бы вспомнил, какой ценник IBM выставила на Visual Age Smalltalk, чтобы потом жаловаться на непопулярность
Пример с факториалом замечательно оттолкнет любого человека, знакомого с программированием, от Smalltalk. Мало того, что кода больше, чем в нормальном языке, так еще и код создает какую-то коллекцию (!). Если автор выбрал настолько убогий пример, чтобы продемонстрировать крутость языка, мне страшно представить, что там творится в обычном коде.
Sign up to leave a comment.

Articles