Pull to refresh

Comments 23

После переезда на гитхаб, значимые релизы дополняются архивами с готовыми исполняемыми файлами: github.com/0x7CFE/llst/releases
Smalltalk — второй после Python язык который разнес вдребезги мое С++ ООП-мышление.
Я ковырял GNU Smalltalk, но мне он что-то не очень, попробую ваш =)
Насколько я помню, GNU Smalltalk ориентируется на файлы, а образ живет там только в момент исполнения. Поэтому там нет первоначального «интерактива». Поправьте меня, если я ошибаюсь.

Если вы хотите серьезно влезть в это дело, то после ознакомления и освоения лучше взять Pharo. По крайней мере до тех пор, пока llst не обзаведется нормальным интерфейсом :)
Спасибо:)
Но серьёзно не хочу =) Но люблю все идеальное и красивое (тавтология получилась).
Просто по-моему Smalltalk — это наикрасивейшая реализация ООП.
начинающим Pharo лучше не брать — от его интерфейса крышу сносит напрочь. :)
Ну что поделать, если ничего другого нет :)
А расскажите подробнее, как именно? Python vs C++ & Smalltack vs both
Ну тут нечего рассказывать:

в универе учили С++ и C#… в конце 5-го курса возникло странное чувство изучить еще что-то, не помню как, но взгляд упал на Python… И тут я понял… Интроспекция (ПОЛНАЯ), Метаклассы, полная свобода действий, методы __new__, __init__, просветление, серебряная пуля. После начал углубляться, нашел, что «Сначала был Smalltalk». Поразила простота, и пришло понимание (уже в который раз), что все гениальное — просто. И действительно: увеличение множества синтаксических конструкций НЕ (!!!) влияет на выразительную мощь (expressive power). Далее пошел еще дальше в сторону уменьшения этих конструкций и… привет ФП, но это уже другая история.

А если коротко, то до изучения Python/Smalltalk я просто не подозревал, что есть настолько кардинально отличающиеся [от С++] вещи.
Ого. Как эмоционально. История одного откровения :) А где вы учились? У нас вот первые семестры в группах преподают на C++/C#/Java (на чём-то одном чаще всего, но некоторым группам удается и парочку языков зацепить за первые 2-3 семестра), в 4-ом дают Haskell, ну а потом — разброд по кафедрам, проектам, своим, студенческим… Там зоопарк: те же, + до кучи F#, OCaml, JavaScript, PHP, Ruby, Python, Perl (проектов на нём нет :) Зато есть спецкурсы чисто по языку). У нас — это прогерские направления мат-меха СПбГУ.
Но вообще говоря, языки с динамической типизацией у нас не очень любят, и довольно обосновано. Главное — это крайне низкие потенциальные возможности статического анализа кода, слабая поддержка IDE… Вообще слабая инструментальная поддержка. А это значит, что если у вас есть 1'000'000 строк кода на Python, и вам нужно что-то с ними сделать — лучше сразу пойти удавиться. Так что, видимо, в суровой промышленности место только языкам со статической типизацией, и новые, современные статические языки часто идут по пути обогащения системы типов, в том числе улучшаются алгоритмы автоматического вывода типов, что чисто внешне подобный код по «шумности» приближает к коду на популярных динамических языках. Вы пробовали Scala? В последних версиях как раз ребята занялись вопросами рефлексии. А не следите за тем, что делает команда Kotlin? Интересные вещи, ИМХО.
Я учился в КПИ на прикладной математике (ИПСА), наверное по-этому было маленькое разнообразие программирования. Но я сейчас наверстываю. Тоже статической типизацией интересуюсь, но чистым ФП (не гибридным).
Там тоже, кстати, понятие рефлексии есть, но она доступна только на этапе компиляции, но компиляция там ооочень насыщенная :-D
GNU Smalltalk это совсем не в ту степь, это скорее такой скриптовый язык со Smalltalk-подобным синтаксисом.
Начать лучше всего, как тут рекомендуют, с полноценных сред Squeak или Pharo. К обеим же прилагаются неплохие вводные книги Squeak by Example и Pharo by Example соответственно.
Вот, по-моему, чем отличаются разные версии синтаксисов SmallTalk'а — это синтаксисом описания классов. Было бы интересно увидеть описание именно этого синтаксиса. А то вот смотрю в исходник образа по ссылке из статьи и, например, не понимаю, что значит RAWCLASS.
Плюс, я так понимаю, в языке всё же есть примитивы, то есть, методы не написанные на самом языке. Что в LittleSmallTalke'е является примитивами?
И ещё, я когда читал про SmallTalk встречал упоминания о том, что там можно даже как-то идти по программе в обратную сторону. Но я так и не понял, как… В общем, было бы интересно описание работы VM при исполнении кода: как хранится контекст исполнения, можно ли в LST сделать call-with-current-continuation, например?
А то вот смотрю в исходник образа по ссылке из статьи и, например, не понимаю, что значит RAWCLASS.
Тут надо сказать оидн момент. То что вы видите в imageSource.st, RAWCLASS, CLASS, METHOD — это НЕ синтаксис Smalltalk. К Smalltalk-у там относится только то, что записано между «METHOD» и «!».

Данный файл представляет собой скрипт для программы imageBuilder, идущей в комплекте с оригинальными исходниками, который создает первичный образ. Поскольку Smalltalk написан «сам на себе», то компилятор тоже лежит в образе. Но как-то же первый раз надо бутстрапнуться? Для этого и используется этот самый imageBuilder. По идее, его надо использовать только раз, а при наличии файла образа и вообще не надо. После этого все осуществляется внутри образа.

Так вот, при построении образа необходимо сделать некоторые хитрости, которые не описываются в рамках языка. Например тот факт, что Class является подклассом MetaClass, а MetaClass является подклассом Class.

Плюс, когда вы посылаете сообщение классу для создания своего потомка, выполняется следующий код:
METHOD Class
subclass: nm variables: v classVariables: cv | meta |
    meta <- Class new name: ('Meta' + nm asString) asSymbol
        parent: self class
        variables: cv.
    globals at: nm put: ( meta new name: nm
        parent: self
        variables: v ).
    ^ 'subclass created: ' + nm printString
!

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

Плюс, я так понимаю, в языке всё же есть примитивы, то есть, методы не написанные на самом языке. Что в LittleSmallTalke'е является примитивами?
Теперь о примитивах. Нет, методов, не написанных на Smalltallk здесь нет. Вообще. Но есть методы, которые вызывают примитив. Это такая штука в угловых скобках и с номером. Вот например, методы, реализующие доступ к содержимому массива:

METHOD Array
at: index
    <24 self index>.
    (self includesKey: index) ifFalse: [ self badIndex: index ].
    self primitiveFailed
!
METHOD Array
at: index ifAbsent: exceptionBlock
    <24 self index>.
    exceptionBlock value
!

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

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

В плане синтаксиса от Smalltalk-80 отличие только в том, что последний использует := как оператор связывания. А в llst <-. Ну и плюс в llst нет poolDictionaries, хотя от них и в «большом» стараются избавиться.

…было бы интересно описание работы VM при исполнении кода: как хранится контекст исполнения, можно ли в LST сделать call-with-current-continuation, например?
Да, разумеется. Все это будет описано позже. Continuation можно сделать, поскольку все выполнение завязано на объекты контекста которые в общем случае можно тасовать как угодно. Жестко заданного традиционного call stack там нет, поэтому это все возможно.
Спасибо! Буду ждать следующих статей.
В некоторых реализациях есть поддержка вызовов C функций напрямую из shared lib/dll.
Достаточно иметь shared lib в путях и знать сигнатуру функции.
Я бы, кстати, очень хотел это в Java.
Достаточно для этого привинтить libFFI. У меня было это в планах, но поскольку сейчас все силы брошены на LLVM, то это выглядит довольно бессмысленно ибо последний тоже имеет интеграцию с FFI и предоставляет подобный функционал.
Да, интересующемуся Smalltalk'ом народу интересно (мне кажется) было бы под Windows ознакомится с красивейшим (в плане GUI) смоллтоком Dolphin Smalltalk , меня в своё время поразила например, поддержка «безразмерной» арифметики из коробки, ну например 3000 factorial можно посчитать без проблем и вывести результат… Причём не надо самому заботится о размерности, что-то декларировать, Смоллток всё сделает сам, и выдаст результат как BigInteger с нужного размера буфером.

Встроенная в него справка и учебник может дать первое представление о возможностях Смоллтока (правда на английском).
Я описывал его в первой статье, но он к сожалению подходит только для первого знакомства. Или извольте платить денежку.
Он поддерживает SessionManager current deployTo: 'файл образа.img', что позволяет создавать даже рабочие «приложения», (но не екзешники, это верно), убрано относительно платной версии пара инструментов (по мелочам), браузер системных COM объектов (что не критично), в общем не так много убрано для изучения.

Работа с COM/ActiveX там тоже потрясает… Вызов методов COM «на лету»… Ну что-то типа такого (пример подключения к базе 1С бухгалтерии):

app := (IDispatch createObject: 'V82.COMConnector') connect: 'Srvr="someServer"; Ref="1C_DB"; Usr="Администратор"; Pwd="блаблабла"'.

nDict := (app getProperty: 'Справочники') getProperty: 'Номенклатура'.

(nDict invoke: 'НайтиПоКоду' with: 'УТ000012964') getProperty: 'Наименование'.

И вся эта красота может быть исполнена прям построчно — поставить курсор в конец строки кода, и нажать Ctrl+D :)
Спасибо, я знаю что такое Dolphin и прошарил его документацию и community версию вдоль и поперек. Меня напрягает то, что они черезчур перестарались с обрезанием. Nag screen который нельзя убрать, отключен пользовательский интерфейс IDEA, System Browser тоже был бы очень кстати. Потом, насколько я помню там не было нормальных средств рисования форм и их layout-а (якори, «резиновые» сплиттеры и прочее).

А основная проблема в том, что я всегда хотел нормальный кроссплатформенный Smalltalk, но с толковым интерфейсом (как у Dolphin-а). Возможности ActiveX меня не интересуют, ибо винды у меня нет уже лет 10.
В статье отдельно стоит подчеркнуть, что 3 + 2 * 4 даст результат 20, а не 11. Т.к. это является посылкой сообщений, и она выполняется строго слева направо.
Да, я об этом написал, только потом потерял при верстке кусков. Надо восстановить.
Sign up to leave a comment.

Articles