[Из песочницы] Язык программирования SPL — пример решения задачи
Комментарии (37)
11 июня 2017 в 15:06 (комментарий был изменён)
0↑
↓
Пример это отлично, вот только я об этом языке первый раз услышал. Ты бы хоть ссылку вставил на описание.11 июня 2017 в 15:06
+1↑
↓
Пользы от статьи мало. Обычно, языки программирования решают множество задач. Причём, одни подходят лучше для определённых типов задач, а другие — хуже. Так что, в итоге, автор говорит: «Есть язык, он работает — дальше ищите сами».
11 июня 2017 в 15:38 (комментарий был изменён)
–1↑
↓
Спасибо за публикацию статьи и комментарии!Очень сложно в одной статье описать целый язык. Даже если вкратце пробежаться по синтаксису, возможностям и особенностям, то получится очень большой текст, фактически — перепечатка документации по языку. Вряд ли подобные портянки представляют большой интерес.
Поэтому я решил познакомить читателей с языком SPL не на теоретическом материале, а разобрав небольшой конкретный пример. Это и достаточно сжато, и при этом вполне информативно, чтобы понять, с чем имеем дело.
Если читателям интересно, я могу в серии публикаций подробно раскрыть тему и осветить различные особенности и возможности языка SPL, затронув и особенности синтаксиса, и особенности практического применения.
Нужно отметить, что язык SPL сейчас находится в стадии активного развития. И основное его назначение — быть полезным в области повседневного программирования. Это — язык для хобби, для обучения программированию, для того, чтобы любитель сразу получил результат без необходимости предварительного длительного изучения языка и различных API.
Ссылка на подробное описание языка SPL: http://kibernetik.pro/blog/
11 июня 2017 в 16:07
0↑
↓
быть полезным в области повседневного программирования
Тут нужно пояснение, что такое область повседневного программирования. Т.к. лично для меня, область повседневного программирования- это разработка сервисов (микросервисов). Соответственно приходится работать с PostgreSQL, Elasticsearch, JSON и т.д.
11 июня 2017 в 18:40
–1↑
↓
Спасибо за публикацию статьи
А вы не обделены скромностью.
11 июня 2017 в 18:57
+1↑
↓
Я поблагодарил редакторов сайта за то, что они опубликовали статью. А вы о чем?11 июня 2017 в 18:59
–1↑
↓
Пардон, я не увидел флажок «из песочницы». Приношу извинения, я был не прав.
11 июня 2017 в 15:52
+1↑
↓
Имя немножко перегружено:SPL — The SPL Programming Language
Shakespeare Programming Language (SPL)
Streams Processing Language (SPL)
Search Processing Language
SPL (Simple Programming Language)
Systems Programming Language, SPL
Samsung Printer Language (SPL)Дальше я устал линковать, и это были только языки — есть же еще Standard PHP Library, и т.д.
В общем, название слегка занято. Очевидные проблемы с гуглежом.
11 июня 2017 в 16:27
0↑
↓
Да, вы правы. Но, например, тут Wikipedia эта аббревиатура свободна.11 июня 2017 в 16:32 (комментарий был изменён)
0↑
↓
Это еще раз доказывает, что Википедия не может быть самостоятельным надежным источником информации.Впрочем, там сверху так и написано:
The aim of this list of programming languages is to include all notable programming languages in existence, both those in current use and historical ones, in alphabetical order, except for dialects of BASIC, esoteric programming languages, and markup languages.
Т.е. малозначительные и эзотерические (например, Shakespeare Programming Language) языки там не упоминаются.12 июня 2017 в 00:39 (комментарий был изменён)
0↑
↓
Как и в рувики, в общем.Список в Википедии это не «список вообще всего, что существует». Это список того, что рассматривается в авторитетных источниках. Причём, если не ошибаюсь, требуется рассмотрение в совокупности.
11 июня 2017 в 16:03
0↑
↓
Эту задачу можно решить почти на любом языке. Какие области применения, чем он лучше существующих аналогов, да хотя бы того же Python?
11 июня 2017 в 16:21
0↑
↓
Любую задачу можно решить почти на любом языке. Если вы хотите сравнения, то пожалуйста: пример кода на SPL приведен. Вы можете составить код аналогичной программы на другом языке, который вы знаете и считаете подходящим. У вас получится написать более простой код? Будет ли ваш код так же прост и понятен новичку в программировании? Вот мы и посмотрим, лучше ли SPL существующих аналогов или нет.11 июня 2017 в 18:43
0↑
↓
Код на любом языке программирования, включая ассемблер и APL, будет проще и понятнее, чем «SPL».
11 июня 2017 в 19:09
0↑
↓
Ну это вы зря. За исключением »>>» все в примере вполне прозрачно, так что даже было непонятно, зачем там строчку за строчкой все разжевывать. По понятности и компактности он явно даст фору многим языкам, не только ассемблеру.Но не всем, есть и другие легко читаемые и компактные языки, так что тема не раскрыта — кому и нафига этот SPL нужен?
11 июня 2017 в 19:17
0↑
↓
Назначение SPL — язык для любителей программировать в качестве хобби. Максимально просто и эффективно решать повседневные задачи, учиться программировать.
11 июня 2017 в 19:08
0↑
↓
Как минимум, реализация циклов не особо интуитивна «для новичка».
Неясно, почему пространство стандартных функция выражается через `#.*` (это, скорее, просто условное «соглашение», но в большинстве языков это даёт основание полагать, что `#` — это объект, но при этом, судя по коду, объектов в языке нет).
Неявное создание переменных (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()
11 июня 2017 в 19:26
0↑
↓
Спасибо за пример на Питоне. Вот и хорошая возможность сравнить два языка — сколько функций используется, насколько читаем и понятен код.
В SPL »#» является системной группой, которой принадлежат все библиотечные функции. Это сделано для того, чтобы разделить пространство имен функций пользователя и системных функций.11 июня 2017 в 21:37
0↑
↓
Но сравнивать язык по конкретному примеру довольно некорректно. Я, например, не вижу реализации модулей, а без них единственное представление программы — это сплошная простыня текста. Не говоря уже о написании библиотек.
К тому же, вы утверждаете, что в языке нет ключевых слов, что далеко не так. «Слова» в вашем случае — это просто неочевидные закорючки вместо латиницы. Это сложно назвать преимуществом, потому что для новичка помимо того, чтобы разбираться, с, собственно, программированием как таковым, придётся ещё и в справку по языку постоянно лезть.
Я считаю, что синтаксис далёк от лаконичного и лично у меня вызывает странные ощущения.
> i, 1..10 ? i%2 = 0 #.output(i) . <
как минимум, точка — не самый лучший терминатор, потому что её банально можно не увидеть. И соотносить начало и конец блока визуально неудобно.
Если сделать тоже самое на питоне (да и на любых других популярных языках), то происходящее легко поймёт человек, вообще не знакомый с программированием.
for i in range(1,10): if i%2 == 0: print(i)
11 июня 2017 в 21:55
0↑
↓
«Закорючки» — это не слова. Точно такие же закорючки есть и в Питоне. Но помимо закорючек в Питоне есть еще и обязательные английские слова, а SPL ограничивается только закорючками.
Если вы приводите пример лаконичности, то вместо частного случая было бы интересно посмотреть на две команды внутри FOR и две команды внутри IF. Подозреваю, что код сразу распухнет из-за необходимости добавить так вами нелюбимые закорючки, а в SPL — нет.
11 июня 2017 в 22:11
0↑
↓
Другими словами, #. — это огромное пространство имён, состоящее из функций самого разнообразного назначения, что можно сравнить с огромным числом стандартных функций PHP. Думается, что такой дизайн языка не очень удачен для пользователя.
11 июня 2017 в 22:29
0↑
↓
Верно. Но в SPL есть возможность перегруппировать функции «под себя», причем даже дав им более удобные названия.
Например, изначально есть функция вывода текста #.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
То есть весь парк библиотечных функций можно кастомизировать на свой вкус, если есть такая потребность.
11 июня 2017 в 22:37
0↑
↓
Это просто присвоение ссылок, или в вашем языке функции являются сущностями первого порядка?
11 июня 2017 в 19:26
0↑
↓
Пока писал решение на PHP и говорил, что идеальным в этом плане есть Python — вы написали решение. Спасибо!
11 июня 2017 в 19:25 (комментарий был изменён)
0↑
↓
Ну вот код на PHP, у которого не лучший имидж, но он прост (я пытался сохранить логику вашего кода, поэтому немного не по PSR-1 и PSR-2, извините). На том же Python можно сделать еще лаконичнее (вообще считаю Python чуть ли не идеальным для вхождения новичкам).
Но даже изучив 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; }
11 июня 2017 в 19:32
0↑
↓
Спасибо за пример на PHP. Он позволяет тем, кто не знаком ни с PHP, ни с SPL, оценить возможности и сравнить простоту кода PHP и SPL.
Назначение SPL — хобби и повседневное программирование. Особенность SPL — простота при высоком функционале. Надеюсь в будущем, при обзоре графики и других возможностей, которые я туда добавлю, вы тоже поделитесь своим опытом, чтобы можно было на прмерах посравнивать SPL и PHP.11 июня 2017 в 19:34
+2↑
↓
Напишите лучше статью о том, что за язык, как пришла в голову идея, ваш ли это язык; ссылка на документацию, планы на развитие, в каких сферах удобно применять, скорость работы.
Ну и главное — это компилятор/интерпретатор, на чем написан и т.д.11 июня 2017 в 22:13
0↑
↓
Спасибо за совет! Если читателям это интересно, то конечно.
11 июня 2017 в 22:05
0↑
↓
То есть у вас будет эдакий классический Бейсик или Паскаль, в котором «из коробки» были графические функции?
11 июня 2017 в 22:10
0↑
↓
Да, совршенно верно.
11 июня 2017 в 22:40
0↑
↓
Чем-то похож на современный js.
Попробовал сделать на js (который изучаю). Не уверен, что самый короткий вариант, но работает)const fs = require('fs'); let total=0; const words = fs.readFileSync('./hamlet.txt', 'utf8'). split(/["'\s\n\r\t.,;!?\-\][)(]+/). map((item) => item.toLowerCase()). reduce((r, item) => { r[item] = (r[item] === undefined) ? 1 : r[item] + 1; total++; return r; }, {}); console.log(`${total} слов; ${Object.keys(words).length} уникальных слов`); Object.keys(words). sort((a, b) => words[b] - words[a]). reduce((r, item, i) => { r.push(`${i+1} : ${item} = ${words[item]}`); return r; }, []). forEach((item, i) => { if (i < 10) console.log(item); });
11 июня 2017 в 22:41
0↑
↓
Спасибо за пример!11 июня 2017 в 23:47
0↑
↓
мда, в конце перемудрил… достаточно без reduce
Object.keys(words). sort((a, b) => words[b] - words[a]). forEach((item, i) => { if (i < 10) console.log(`${i+1} : ${item} = ${words[item]}`); });
11 июня 2017 в 23:37
0↑
↓
Ruby:
text = File.read('hamlet.txt') words = text .split(/\W/) .reject(&:empty?) .map(&:downcase) dict = words.each_with_object(Hash.new(0)) do |word, dict| dict[word] += 1 end top = dict .sort_by(&:last) .reverse puts "#{words.size} слов; #{dict.size} уникальных слов" for i in 0..9 do puts "#{i+1} : #{top[i][0]} = #{top[i][1]}" end
11 июня 2017 в 23:46
0↑
↓
Спасибо за пример!
11 июня 2017 в 23:39
+1↑
↓
О, очередной язык программирования на Хабре! Налицо проблема с позиционированием. Вы говорите, что язык хорош для «обучения программированию». Это очень громкое и спорное утверждение, и вот почему:Во-первых, новичку нет смысла вкладываться в язык без развитой экосистемы. На других языках можно с самого начала применить знания — написать рабочую утилиту или сайт. А с вашим языком можно только обучиться сферическому программированию в вакууме, после чего придется все равно учить какую-то другую технологию и пользоваться ей.
Во-вторых, новички делают ошибки. Поэтому пригодный для обучения язык должен быть максимально явным и недвусмысленным. В таком случае большинство допущенных ошибок будут по части синтаксиса, а их легко исправить. Совсем другое дело — ошибки логические, когда программа компилируется и работает, но выдает некорректный результат, потому что пользователь имел в виду одно, а компилятор предположил другое. Как пример — C# или Python в этой области хороши, а Perl — абсолютно непригоден. Я не очень глубоко вдавался в устройство вашего языка, но типизация похоже динамическая (строгая или нет?), и вместе с возможностью вернуть несколько объектов из функции за раз это выглядит довольно опасно. Если ошибся — расскажите, пожалуйста, как обстоят дела.
В-третьих, ваш язык прививает плохой тон программирования. Все функции в глобальной области видимости (да еще с нечитаемым названием), сортировка in-place, отсутствие поддержки функционального программирования — это сомнительные дизайн-решения для 2017 года. Для неокрепших умов новичков это еще хуже, чем BASIC по словам Эдсгера Дейкстры.
В-четвертых, без открытого исходного кода шанс вызвать хоть какой-то интерес стремятся к нулю.
Если бы статья называлась «как я написал язык программирования для самого себя», было бы другое дело. Но для обучения оно точно не годится.
12 июня 2017 в 00:26
0↑
↓
Статья называется «решение конкретной задачи». Статья с названием «Как я написал язык для самого себя» еще будет.
Целое поколение программистов вышло из знатоков языка BASIC, так что слова Дейкстры характеризуют не столько этих программистов, сколько самого Дейкстру.
Не буду здесь в комментарии вдаваться в подробности, поскольку хотелось бы это раскрыть подробно в отдельной статье, но SPL предполагается в том числе и как язык разработки для публикации самостоятельных приложений в Microsoft Store. Хотя это, конечно, не особенность самого языка, а его конкретной реализации.
Основное назначение SPL — повседневное программирование, хобби, обучение программированию. Не буду спорить с вами, удобен SPL для изучения программирования или нет. Мое дело предложить то, что я считаю удобным. Сможете написать программу еще более понятную и простую, чем в этой статье — и поговорим с вами об удобстве на конкретном предложенном вами примере. Пока из приведенных выше примеров я вижу, что SPL выглядит в сравнении с другими языками вполне достойно.
Ну и самое важное. Нужно различать профессиональное программирование и программирование в качестве хобби. Это тема еще одной статьи — как современные профессиональные языки убили программирование в качестве хобби. SPL еще более прост, чем BASIC. И при этом в своем развитом варианте вполне будет удовлетворять общим потребностям программирования для любителей.