Det har gjorts flera ansträngningar för att få statiska typslut till objektorienterade dynamiska språk som Ruby, Python och Perl. Enligt vår erfarenhet är dock sådana typer av slutledningssystem extremt svåra att utveckla, eftersom dynamiska språk vanligtvis är komplexa, dåligt specificerade och innehåller funktioner, såsom utvärdering och reflektion, som är svåra att analysera. I det här dokumentet introducerar vi begränsningsbaserade dynamiska typslutsatser, en teknik som leder till statiska typer baserade på dynamiska programutföranden. I vårt tillvägagångssätt sveper vi in varje run-time-värde för att associera det med en typvariabel, och omslaget skapar begränsningar för denna typvariabel när det inlindade värdet används. Denna teknik undviker många av de ofta alltför konservativa approximationer av statiska verktyg, eftersom begränsningar genereras baserat på hur värden används under faktiska programkörningar. Att använda omslag är också lätt att implementera, eftersom vi bara behöver skriva en begränsningsupplösningsalgoritm och en omvandling för att introducera omslag. Det bästa är att vi kan äta vår kaka också: vår algoritm kommer att dra slutsatser ljudtyper så länge den observerar varje väg genom varje metod kropp-notera att antalet sådana vägar kan vara dramatiskt mindre än antalet vägar genom programmet som helhet. Vi har utvecklat Rubydust, en implementering av vår algoritm för Ruby. Rubydust utnyttjar Rubys dynamiska funktioner för att implementera wrappers som språkbibliotek. Vi tillämpade Rubydust på ett antal små program och fann att det var både lätt att använda och användbart: Rubydust upptäckte 1 riktigt typfel, och alla andra inferredtyper var korrekta och läsbara.
Slutligen, RubyDust REF implementerar typ inference för Ruby på körtid.
Dynamic inference of static types for ruby
{'venue': "POPL '11", 'journal': None, 'mag_field_of_study': ['Computer Science']}