Комментарии 72
Пользы от статьи мало. Обычно, языки программирования решают множество задач. Причём, одни подходят лучше для определённых типов задач, а другие — хуже. Так что, в итоге, автор говорит: "Есть язык, он работает — дальше ищите сами".
Очень сложно в одной статье описать целый язык. Даже если вкратце пробежаться по синтаксису, возможностям и особенностям, то получится очень большой текст, фактически — перепечатка документации по языку. Вряд ли подобные портянки представляют большой интерес.
Поэтому я решил познакомить читателей с языком SPL не на теоретическом материале, а разобрав небольшой конкретный пример. Это и достаточно сжато, и при этом вполне информативно, чтобы понять, с чем имеем дело.
Если читателям интересно, я могу в серии публикаций подробно раскрыть тему и осветить различные особенности и возможности языка SPL, затронув и особенности синтаксиса, и особенности практического применения.
Нужно отметить, что язык SPL сейчас находится в стадии активного развития. И основное его назначение — быть полезным в области повседневного программирования. Это — язык для хобби, для обучения программированию, для того, чтобы любитель сразу получил результат без необходимости предварительного длительного изучения языка и различных API.
Ссылка на подробное описание языка SPL: http://kibernetik.pro/blog/
быть полезным в области повседневного программирования
Тут нужно пояснение, что такое область повседневного программирования. Т.к. лично для меня, область повседневного программирования- это разработка сервисов(микросервисов). Соответственно приходится работать с PostgreSQL, Elasticsearch, JSON и т.д.
Спасибо за публикацию статьи
А вы не обделены скромностью.
Очень сложно в одной статье описать целый язык. Даже если вкратце пробежаться по синтаксису, возможностям и особенностям, то получится очень большой текст, фактически — перепечатка документации по языку.
Познакомьтесь со статьями на википедии про Lisp, Smalltalk, Scheme, Python, Ruby… Список можно продолжать, пока языки не закончатся… APL, K. J…
Ни одна из этих статей не являются документацией по языку, но дают хорошее представление (и не только)
Эту задачу можно решить почти на любом языке. Какие области применения, чем он лучше существующих аналогов, да хотя бы того же Python?
Код на любом языке программирования, включая ассемблер и APL, будет проще и понятнее, чем "SPL".
Но не всем, есть и другие легко читаемые и компактные языки, так что тема не раскрыта — кому и нафига этот SPL нужен?
Неясно, почему пространство стандартных функция выражается через `#.*` (это, скорее, просто условное «соглашение», но в большинстве языков это даёт основание полагать, что `#` — это объект, но при этом, судя по коду, объектов в языке нет).
Неявное создание переменных (dict при итерации цикла) — тоже не самая понятная вещь.
Сходу можно привести такую наивную реализацию на питоне:
import re
from urllib.request import urlopen
with urlopen('http://erdani.com/tdpl/hamlet.txt') as r:
text = r.read().decode()
words = re.split('\W', text)
words = filter(None, words)
words = [s.upper() for s in words]
freq = dict()
for s in words:
freq[s] = freq[s] + 1 if s in d else 1
top = sorted(freq.items(), key=lambda x: x[1], reverse=True)
for i in range(10):
print('{}: {} = {}'.format(i, *top[i]))
Кроме того, в стандартной библиотеке для этого уже даже реализован метод и получение словаря можно уложить в пару строк (не в угоду читабельности, конечно):
from collections import Counter
words = [s.upper() for s in filter(None, re.split('\W', text))]
Counter(words).most_common()
Возможно, не совсем честно использовать regex, поэтому можно сделать разделение лишь средствами языка, например, так:
sep = '''
.,;!?-()'"[]
'''.strip()
words = ''.join([s if s not in sep else ' ' for s in text]).split()
В SPL "#" является системной группой, которой принадлежат все библиотечные функции. Это сделано для того, чтобы разделить пространство имен функций пользователя и системных функций.
Но сравнивать язык по конкретному примеру довольно некорректно. Я, например, не вижу реализации модулей, а без них единственное представление программы — это сплошная простыня текста. Не говоря уже о написании библиотек.
К тому же, вы утверждаете, что в языке нет ключевых слов, что далеко не так. "Слова" в вашем случае — это просто неочевидные закорючки вместо латиницы. Это сложно назвать преимуществом, потому что для новичка помимо того, чтобы разбираться, с, собственно, программированием как таковым, придётся ещё и в справку по языку постоянно лезть.
Я считаю, что синтаксис далёк от лаконичного и лично у меня вызывает странные ощущения.
> i, 1..10
? i%2 = 0
#.output(i)
.
<
как минимум, точка — не самый лучший терминатор, потому что её банально можно не увидеть. И соотносить начало и конец блока визуально неудобно.
Если сделать тоже самое на питоне (да и на любых других популярных языках), то происходящее легко поймёт человек, вообще не знакомый с программированием.
for i in range(1,10):
if i%2 == 0:
print(i)
Если вы приводите пример лаконичности, то вместо частного случая было бы интересно посмотреть на две команды внутри FOR и две команды внутри IF. Подозреваю, что код сразу распухнет из-за необходимости добавить так вами нелюбимые закорючки, а в SPL — нет.
for i in range(1,100):
if i%2 == 0:
print(i)
print(i%11)
if i%3 == 0:
print(i)
print(i%7)
Вам так много вопросов задают зачем этот язык нужен чтоб понять для себя надо ли тратить время на его изучение и какие от этого выгоды можно получить.
Так как учить всё подряд не возможно, я предпочитаю изучать только наиболее перспективные технологии. А здесь пока не ясно в каких ситуациях знание SPL даст какие то преимущества.
Если вы скажете, что это все не так, что таких людей, интересующихся прогаммированием нет, или что таким людям не проблема освоить, скажем, Питон и начать на нем писать программы для своих домашних нужд — то это не так. Такие люди есть, и им освоить современный язык программирования со всеми его API — большая проблема. Образовалась пропасть между «просто людьми» и программированием именно по причине сложности современных языков. Считайте меня популяризатором программирования как ХОББИ, и SPL — мой инструмент, который я делаю для таких людей. Так что бессмысленно спрашивать меня зачем нужен SPL если есть этот язык и вот этот язык, потому что если вам в голову приходит такой вопрос, то значит, что он вам, скорее всего, просто не нужен.
Конечно я немного лукавлю. Я сам, будучи профессиональным программистом, периодически пользуюсь собственными инструментами, которые делаю для «не профессионалов», чтобы быстро и просто решить какую-нибудь мелкую задачу — проверить алгоритм, сделать сетевое приложение чтобы обработать какой-нибудь сайт или набросать мини-игру, потому что это просто интересно. Но это — не самое главное. Главное — тот позитив, который я получаю от пользователей не-программистов, пришедших к программированию благодаря моему софту. SPL — не первый мой язык программирования, и я знаю о чем пишу. Но это — моя последняя разработка на данный момент, и в нем будет реализован весь мой опыт решения таких задач.
Если вы скажете, что это все не так, [...] что таким людям не проблема освоить, скажем, Питон и начать на нем писать программы для своих домашних нужд — то это не так.
Судя по вашему предположению выше, что в Python есть операторные скобки («закорючки»), с этим языком вы знакомы чуть более, чем никак. Это несколько лишает убедительности процитированное утверждение.
Такие люди есть, и им освоить современный язык программирования со всеми его API — большая проблема.
Вы хотите сказать, что вот такой код:
v(x,y)<=x(y)
#.output(v(#.sqrt,4))
свободен от этого недостатка?
На возможное возражение, что начинающим необязательно пользоваться всеми возможностями языка, замечу, что ровно то же самое можно сказать и о любом «современном языке программирования», в частности, о Питоне.
Если желаете возразить, предлагаю действовать конструктивно: найдите конкретные фичи Python, которые, по вашему мнению, представляют проблему для освоения непрограммистами, и покажите, какую альтернативу вы предлагаете в своем языке.
Если будете приводить в пример такую фичу вашего языка, как небуквенные ключевые слова, то объясните, какую проблему пользователя она решает.
Как я понимаю, вы хотели, чтобы при использовании кириллицы для именования переменных и функций не приходилось переключать раскладку клавиатуры. Но ведь знаки ">", "<", да и "#" всё равно требуют её переключения. Есть ли другие резоны?
Кстати, по поводу синтаксиса SPL. Он не призван «решать» никакие проблемы. Он максимально просто формирует структуру кода, которая одновременно достаточно ясна и функциональна.
Кстати, по поводу синтаксиса SPL. Он не призван «решать» никакие проблемы.
Тогда к чему вы говорили вот это:
Задача SPL — [...] дать не-программисту простой и доступный инструмент. [...] Такие люди [непрограммисты, интересующиеся програмированием] есть, и им освоить современный язык программирования со всеми его API — большая проблема.
Сформулирую свой вопрос по-другому: каким образом использование небуквенных ключевых слов вместо буквенных решает задачу дать непрограммисту простой и доступный инструмент? (Удобство в переключении клавиатурной раскладки, как мы видим, не может служить аргументом).
Он максимально просто формирует структуру кода, которая одновременно достаточно ясна и функциональна.
Допустим. Но в чем преимущество вашего языка перед другими, также просто формирующими ясную и функциональную структуру кода? В каких конкретных его особенностях?
Представьте, например, что я такой вот непрограммист и выбираю себе язык для хобби. Я смотрю на Python и смотрю на ваш язык. Оба максимально просто формируют структуру кода, оба ясны и функциональны. Что может побудить меня предпочесть ваш язык?
Пока что, как я уже сказал, я вижу у вас лишь один аргумент, и он слабый. Вместо if, for, return и т.д., которые надо вводить в латинской раскладке, предлагается писать ?, >, <= и т.д., половина из которых тоже требует латинской раскладки.
К слову, «закорючка» в Python только одна: двоеточие. Ни операторных скобок, ни признаков конца блока (как ваши точка и знак «меньше») в нем нет.
Нет-нет-нет. Если вы не программист — любая экзотика исключается сразу. Только язык, по которому есть, кого спрашивать.
Например, изначально есть функция вывода текста #.output, графическая функция #.drawline и математическая #.sin. Можно, например, сделать такое переназначение:
g.line = #.drawline
math.sin = #.sin
o.p = #.output
таким образом автоматически создав пространства имен «g», «math» и «o», и пользование такими «кастомными» функциями будет выглядеть так:
g.line(100,100)
y=math.sin(x)
o.p(«Hello»)
Можно просто перевести библиотечные функции в общее пространство имен, например:
output = #.output
То есть весь парк библиотечных функций можно кастомизировать на свой вкус, если есть такая потребность.
В SPL функции первого порядка. То есть эта программа:
f()<=#.output
f()(«Text»)
напечатает «Text». В ней в первой строке функция F возвращает в качестве своего результата системную функцию #.OUTPUT, которая во второй строке будучи вызвана как результат работы функции F, напечатает «Text».
Или например эта программа напечатает число 2:
v(x,y)<=x(y)
#.output(v(#.sqrt,4))
здесь функция V принимает два параметра X и Y, а возвращает результат выполнения первого параметра X со вторым параметром Y в качестве параметра. Во второй строке функция V вызывается с системной функцией #.SQRT в качестве первого параметра и числом 4 в качестве второго параметра. В итоге печатается число 2 как результат #.sqrt(4)
Но даже изучив PHP человек будет знаком с семейством С-подобных языков и сможет, например, со временем изучить C, C++, Python, Java. Поэтому я повторю вопрос — какая сфера применения этого языка — серверная разработка, веб, десктоп? В чем преимущества по сравнению с существующими языками?
$text = file_get_contents('hamlet.txt');
$words = preg_split('/[\s.,;!?()\[\]\'-]+/', $text);
$dict = array();
$total = 0;
foreach ($words as $word)
{
if (empty($word)) continue;
$key = strtolower($word);
$dict[$key] = isset($dict[$key]) ? $dict[$key] + 1 : 1;
$total += 1;
}
natsort($dict);
$dict = array_reverse($dict);
echo $total, ' слов; ', sizeof($dict), " уникальных слов\n";
$limit = 1;
foreach ($dict as $key => $count) {
echo $limit, ' : ', $key, ' = ', $count."\n";
$limit++;
if ($limit == 10) break;
}
Назначение SPL — хобби и повседневное программирование. Особенность SPL — простота при высоком функционале. Надеюсь в будущем, при обзоре графики и других возможностей, которые я туда добавлю, вы тоже поделитесь своим опытом, чтобы можно было на прмерах посравнивать SPL и PHP.
Ну и главное — это компилятор/интерпретатор, на чем написан и т.д.
Во-первых, новичку нет смысла вкладываться в язык без развитой экосистемы. На других языках можно с самого начала применить знания — написать рабочую утилиту или сайт. А с вашим языком можно только обучиться сферическому программированию в вакууме, после чего придется все равно учить какую-то другую технологию и пользоваться ей.
Во-вторых, новички делают ошибки. Поэтому пригодный для обучения язык должен быть максимально явным и недвусмысленным. В таком случае большинство допущенных ошибок будут по части синтаксиса, а их легко исправить. Совсем другое дело — ошибки логические, когда программа компилируется и работает, но выдает некорректный результат, потому что пользователь имел в виду одно, а компилятор предположил другое. Как пример — C# или Python в этой области хороши, а Perl — абсолютно непригоден. Я не очень глубоко вдавался в устройство вашего языка, но типизация похоже динамическая (строгая или нет?), и вместе с возможностью вернуть несколько объектов из функции за раз это выглядит довольно опасно. Если ошибся — расскажите, пожалуйста, как обстоят дела.
В-третьих, ваш язык прививает плохой тон программирования. Все функции в глобальной области видимости (да еще с нечитаемым названием), сортировка in-place, отсутствие поддержки функционального программирования — это сомнительные дизайн-решения для 2017 года. Для неокрепших умов новичков это еще хуже, чем BASIC по словам Эдсгера Дейкстры.
В-четвертых, без открытого исходного кода шанс вызвать хоть какой-то интерес стремятся к нулю.
Если бы статья называлась «как я написал язык программирования для самого себя», было бы другое дело. Но для обучения оно точно не годится.
Целое поколение программистов вышло из знатоков языка BASIC, так что слова Дейкстры характеризуют не столько этих программистов, сколько самого Дейкстру.
Не буду здесь в комментарии вдаваться в подробности, поскольку хотелось бы это раскрыть подробно в отдельной статье, но SPL предполагается в том числе и как язык разработки для публикации самостоятельных приложений в Microsoft Store. Хотя это, конечно, не особенность самого языка, а его конкретной реализации.
Основное назначение SPL — повседневное программирование, хобби, обучение программированию. Не буду спорить с вами, удобен SPL для изучения программирования или нет. Мое дело предложить то, что я считаю удобным. Сможете написать программу еще более понятную и простую, чем в этой статье — и поговорим с вами об удобстве на конкретном предложенном вами примере. Пока из приведенных выше примеров я вижу, что SPL выглядит в сравнении с другими языками вполне достойно.
Ну и самое важное. Нужно различать профессиональное программирование и программирование в качестве хобби. Это тема еще одной статьи — как современные профессиональные языки убили программирование в качестве хобби. SPL еще более прост, чем BASIC. И при этом в своем развитом варианте вполне будет удовлетворять общим потребностям программирования для любителей.
Целое поколение программистов вышло из знатоков языка BASICПри должной упорности можно написать что-то потрясающее вопреки объективно плохому инструменту. На хабре для этого есть целый хаб — «ненормальное программирование». Вот мой любимый пример — мультиплеерные крестики-нолики на .bat-файлах.
поговорим с вами об удобстве на конкретном предложенном вами примереРазумеется, я не могу предложить вам пример, который понравится вам больше, чем собственное детище — потому что удобство это дело вкуса. Но раз вы пишете приложения под Microsoft Store, наверняка знакомы с LINQ. На нем задача решается, на мой взгляд, очень просто:
var file = File.ReadAllText("hamlet.txt");
var words = Regex.Split(file, @"[\s.,;!?()\[\]\'-]+");
var uniqueWords = words.Select(x => x.ToLowerInvariant())
.GroupBy(x => x)
.ToDictionary(x => x.Key, x => x.Count());
var topTen = uniqueWords.OrderByDescending(x => x.Value)
.Take(10);
современные профессиональные языки убили программирование в качестве хоббиЭкак вы лихо одной фразой перечеркнули существование code golf, ICFP, IOCCC, Advent of Code, вообще всех хакатонов и еще много чего. Пишите статью, почитаю, даже интересно стало.
Мысль по существу: если разделить глобальное пространство имен
#
на несколько отдельных по смыслу, например math
, gfx
, string
— уже станет сильно легче жить.math.sqr = #.sqrt
gfx.line = #.drawline
print = #.output
$x
math.
и ему подскажется только список математических функций — это гораздо удобнее, чем искать нужное из списка вообще всех функций.> i, 1..10
key = dict[i]
#.output(i, " : ", key, " = ", dict[key])
<
К словарю можно обратиться по индексу и по ключу? А если ключ — число?
Если ключом является число, то его конечно нужно подавать в текстовом виде.
Памяти в случае массива выделяется по его максимальным индексам. В случае словаря — по необходимости. Промежуточных пустых значений нет — отсутствие величины это именно ее полное отсутствие. Попытка использовать отсутствующее значение приводит к ошибке выполнения.
Чем принципиально отличается
int[] m = int[1000]
от
m[1000]=0
что аж прямо «жесть»?
И какие могут быть проблемы со словарями?
В любом случае тот функционал автоматического выделения, который есть сейчас, останется.
List
и Dictionary
из C#.Мне вообще не нравится идея смешивать разные структуры данных в одну. В PHP «массивом» назвали смесь разреженного списка со словарём, а с учетом нестрогой типизации ключей в нем вообще творится магия.
Язык программирования SPL — пример решения задачи