Статический тип, выведенный в Ruby, что я могу сделать? - PullRequest
0 голосов
/ 03 июня 2018

У меня есть школьный проект, целью которого является статический ввод кода на Ruby.Итак, мой ввод - это просто .rb файл, и я должен быть в состоянии набрать каждую переменную, которая назначена в программе.

Сейчас я планирую сделать следующее::

  • получить AST файла с библиотекой Parser
  • поместить каждый тип узлов в объекты контейнера
  • реализовать шаблон посетителя для рекурсивного прохождения через программу
  • попытаться сделать что-то оттуда (я думал о том, чтобы как-то создать таблицу возможных типов ввода и вывода из методов ядра)

Я принимаю только некоторые базовые Ruby в качестве ввода (=нет вызова во внешнюю библиотеку, только ядро ​​ruby ​​+ методы, определенные в файле)

Мой вопрос: что вы думаете о моем подходе?Есть ли какие-нибудь драгоценные камни / существующие программы, которые могли бы мне помочь?

1 Ответ

0 голосов
/ 04 июня 2018

Ваш подход технически правильный, но звучит очень странно, как вы это выразили.Это:

Сейчас я планирую сделать следующее:

  • получить AST файла с библиотекой Parser
  • поставить каждый видузлы в объектах-контейнерах
  • реализуют шаблон посетителя для рекурсивного прохождения программы
  • пытаются что-то из этого вывести (я думал о том, чтобы как-то создать таблицу возможных типов ввода и вывода из ядраметоды)

звучит немного похоже на то, как вы хотели отправиться на Марс, вот так:

Сейчас я планирую сделать следующее:

  • достать карандаш
  • достать лист бумаги
  • достать письменный стол
  • сесть за стол и использовать мою ручку и бумагу для дизайнасистема космического запуска и посадка на Марс

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

Самая продвинутая работаЯ знаю, что логический вывод типов для Ruby был Diamondback Ruby (DRuby) (не путать со стандартной библиотекой Distributed Ruby aka dRb / dRuby).Тем не менее, Diamondback Ruby теперь заброшен, так как авторы отказались от логического вывода типов для Ruby.

Один из главных исследователей Diamondback Ruby сейчас работает над новым проектом под названием RDL .Основные различия между Diamondback Ruby и RDL:

  • RDL выполняет динамическую проверку, а не статическую проверку
  • RDL полагается на явные аннотации, а не на неявный вывод

Крутой - еще один аналогичный проект.Он также опирается на динамическую проверку и аннотации и, кроме того, фактически не стремится к корректности типов.

Вывод типа Ruby для IDEA является полным- подумайте о том, как JetBrains планирует подходить к выводу типов для Ruby в их IDEA / RubyMine IDE.В этом используется вывод типа, но он использует динамический вывод типа, а не статический.

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

Проверка типов RubyСводка новостей в блоге Роберта Мосольго - хороший обзор современного состояния типизации Ruby.

...