Slăbirea limbilor prin reducerea zahărului

POSTURI ANTERIOARE

reducerea

Slăbirea limbilor prin reducerea zahărului

Postat pe 08 ianuarie 2016.

JavaScript este un limbaj nebunesc. Este definit de 250 de pagini de proză engleză și chiar părțile limbii care ar trebui să fie simple, cum ar fi adăugarea și domeniul variabil, sunt foarte complicate. Am arătat înainte cum să abordăm această problemă folosind λs5, care este un exemplu al ceea ce se numește o semantică testată.

Puteți citi despre λs5 la linkul de mai sus. Dar ideea de bază este că λs5 are două părți:

  • Un limbaj de bază mic care surprinde părțile esențiale ale JavaScript, fără toate punctele sale slabe și
  • O funcție de desugaring care traduce limba completă până la acest nucleu mic.

(În mod obișnuit, acest limbaj de bază îl numim λs5, chiar dacă din punct de vedere tehnic este doar o parte din ceea ce alcătuiește λs5.)

Aceste două componente împreună ne oferă o implementare a JavaScript-ului: pentru a rula un program, îl desucrați la λs5 și apoi rulați acel program. Și cu această implementare, putem rula suita de testare a conformității JavaScript pentru a verifica dacă λs5 este corectă: de aceea se numește semantică testată. Și iată, λs5 trece porțiunea relevantă din suita de conformitate test262.

Problema

Totuși, fiecare postare de blog are nevoie de o problemă. Problema cu λs5 constă în deshidratare. Tocmai am afirmat că JavaScript este complicat, în timp ce limbajul de bază pentru λs5 este simplu. Acest lucru înseamnă că complicațiile JavaScript trebuie tratate nu în limbajul de bază, ci în deshidratare. Luați un exemplu ilustrativ. Iată câteva linii inocente de JavaScript:

Aceste linii de cuplu descarcă în următorul cod λs5:

Este cam mult. Este greu de citit și este greu de prelucrat de instrumente. Dar mai mult la obiect, λs5 este menit să fie folosit de cercetători, iar această umflare a codului a împiedicat cercetătorii care încearcă să o adopte. Vă puteți imagina că, dacă încercați să scrieți un instrument care funcționează peste cod λs5, și există o eroare în instrumentul dvs. și trebuie să-l depanați și trebuie să ștergeți atât de mult cod doar pentru cel mai simplu dintre exemple, este un pic de coșmar.

Soluția obișnuită

Deci, există prea mult cod. Din fericire există soluții bine cunoscute pentru această problemă. Am implementat o serie de tehnici standard de optimizare a compilatorului pentru a micșora codul λs5 generat, păstrând în același timp semantica acestuia. Iată o listă plictisitoare a optimizărilor de conservare a semanticii pe care le-am folosit:

  • Eliminarea codului mort
  • Pliere constantă
  • Propogare constantă
  • Propagarea aliasului
  • Conversia misiunii
  • Inlinierea funcției
  • Introduceți tipul și eliminați controalele statice
  • Curățați legăturile de mediu neutilizate

Cele mai multe dintre acestea sunt optimizări standard ale manualelor; deși ultimele două sunt specifice lui λs5. Oricum, am făcut toate acestea și am primit ... 5-10% contracție de cod.

Soluția extraordinară

Asta este: 5-10%.