Основные функции для базового языка? DSL предложения?


9

Я наконец начал понимать сложность создания интерпретатора и компилятора. Я построил несколько версий TinyBasic, 1964 (Dartmouth) Basic и свои собственные расширения на этих языках, прежде чем перейти к этой точке. Самый последний проект, который я называю Open Source Basic ... потому что я не мог придумать никаких других возможностей языка, которые интересовали бы людей. Чтобы иметь возможность открыть источник языка и понять, как выполняются некоторые сложные вещи (как выполняется сканирование, анализ, интерпретация и компиляция)

Open Source Basic сначала интерпретируется на основе стекового языка. Этот основанный на стеке язык затем интерпретируется и выполняется немедленно или превращается в исполняемый файл CLR.

Все мои вопросы сводятся к следующему:

  • Каковы основные особенности / конструкции языка на основе Basic? У меня уже есть эти основные конструкции: присваивания, выражения, переменные, некоторые функции (Random, ToUpper, ToLower), циклы (для и до / во время / до), If (блочные и однострочные), другие решения, консольный ввод (ввод ) и вывод (Печать), и подпрограммы (пока без параметров).
  • Когда я «закончу», добавив базовые конструкции на мой язык - как мне перейти? В какие домены? Другими словами, в каком направлении следует выбрать базовый язык с открытым исходным кодом, когда все общие конструкции работают?

Спасибо за ваше время,

Доминик


3
Я всегда хотел язык, который имел встроенную, поддерживаемую синтаксисом функциональность AOP.
FrustratedWithFormsDesigner

@Dominick: Как насчет функциональности LINQ?
Хищник

@ Разочарованный ... АОП - Аспектно-ориентированное программирование? Не могли бы вы привести пример?
Доминик

5
Вы не должны начинать изобретать предметно-ориентированный язык из базовых императивных функций. Сначала формализуйте свой домен, включите эти знания в язык и только потом добавляйте базовые функции, если они вообще необходимы. Вероятно, вы даже получите идеальный DSL, который не является полным по Тьюрингу, и это одно из лучших свойств DSL.
SK-logic

1
Неужели «goto» является обязательной особенностью любого бейсика?
Перри

Ответы:


1

Мой опыт работы с ранним BASIC на Commodore [Vic-20, C-64] дал мне впечатление, что номера строк были основной «особенностью» BASIC. Кажется, что они больше не используются в современных реализациях, что для меня является чем-то вроде ущерба, так как мой основной взгляд на BASIC - это язык обучения, с которого можно перейти на что-то другое.


1

Определенно благородное начинание, но я думаю, что у вас поменялись приоритеты.

Ваша первая проблема должна касаться проблем «домена», на которые ориентирован ваш язык. Вот почему он называется «Язык, специфичный для предметной области». DSL допустим только тогда, когда он маленький, простой и очень узко сфокусированный для решения определенного набора проблем, таких как нож сквозь масло.

После того как вы определили домен и то, как ваш язык будет работать в домене, вы можете установить конкретные конструкции или функции.

Наконец, может быть полезно подумать, нужен ли вам внутренний или внешний DSL .


0

Я разрабатывал язык сценариев для приложения CAE / FEA, и некоторые функции, которые я нашел полезными для конечных пользователей: Локальные и глобальные переменные Матрицы с динамическим размещением и расширением Функции с аргументами и передачей по ссылкам структур (пользовательских типов) Наряду с функции, которые вы упомянули сами, должны составить довольно мощный язык для начала. Затем вы будете разрабатывать в соответствии с запросом пользователя.


Это интересный и очень специфичный для предметной области язык (компьютерная инженерия / анализ методом конечных элементов). Я понимаю, почему вам нужны матрицы. Все ваши предложения довольно хорошие, и я буду помнить их. Спасибо.
Доминик

0

Есть несколько функций, которые можно добавить или расширить, если они уже существуют, но ...

... Базовые языки программирования очень похожи на языки сценариев, и функцией, которую многие пропустили или включили позже, было пространство имен или модули.

C, C ++, PHP, Visual Basic, запускались без модулей / пространств имен и были добавлены позже.

Следующими могут быть подпрограммы (процедуры или функции, которые не возвращают значение) и функции (подпрограммы, которые возвращают специальное значение).


0

понять, как выполняются некоторые сложные вещи (как выполняется сканирование, анализ, интерпретация и компиляция)

На сайте Stack Overflow есть хороший вопрос о ресурсах для понимания компиляторов. Вы также можете взглянуть на мою страницу класса Компиляторы .

Когда я «закончу», добавив базовые конструкции на мой язык - как мне перейти?

Учитывая функции, которые вы уже создали, я предлагаю добавить три типа данных: int, string, boolean. Вам нужно будет сделать три вещи, каждая из которых немного сложнее предыдущей:

  1. Измените грамматику, чтобы вы могли анализировать эти ключевые слова. Тестовое задание.
  2. Создайте (или добавьте в свою существующую) таблицу символов, чтобы вы могли включить тип данных вместе с именем переменной и другими свойствами. Затем сделайте переключатель отладки, чтобы вы могли проверить это и увидеть таблицу символов.
  3. Проверьте совместимость типов перед генерацией кода в MsIL или во время интерпретации. Проверяйте как ошибки, так и ошибки в каждом режиме выполнения для всех типов.

Если все пойдет хорошо, я предлагаю поработать над областью действия (локальной в подпрограммах и глобальной). Дайте мне знать, если вам нужен совет по этому поводу.

Удачи. И наслаждаться!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.