Judoskrift

Judoskrift
Paradigm processuell , objektorienterad , scripting
Designad av James Jianbo Huang
Utvecklare James Jianbo Huang
Dök först upp november 2001
Stabil frisättning
v0.9 / november 2005
Maskinskrivningsdisciplin dynamisk , statisk , stark
Plattform JVM
Licens LGPL
Hemsida judoscript.com
Influerad av
SQR , Perl , JavaScript , Java

Judoscript är ett allmänt programmeringsspråk designat främst för skriptuppgifter Java-plattformen . Det skapades och utvecklades av James Jianbo Huang ( förenklad kinesiska : 黄剑波 ; traditionell kinesiska : 黃劍波 ; pinyin : Huáng Jiànbō ), med start i slutet av 2001. Judoscript var ett av de första så kallade Java-skriptspråken; men dess mest slående egenskaper är dess djärva stödfilosofi och praxis för flera domäner.

I slutet av 2005 har Judoscript slutfört alla angivna applikationsfunktioner. Situationen med Java-skriptspråk förändrades snabbt när JavaSoft meddelade att de skulle skapa sina egna 2003. Judoscripts utveckling stoppades när JavaSofts eget Groovy -språk var nära att släppas.

Historia

Huang har arbetat på en kommersiell rapportförfattare, SQR , som används flitigt i PeopleSoft . Tekniskt sett är SQR ett arkiskt, allmänt skriptspråk med inbäddad SQL och rapporteringsdirektiv för att producera teckenbaserade rapporter och datamanipulation. Skrivet i C, porteras det till nästan alla varianter av större operativsystem och fungerar med alla större RDBMS -databaser. Med tillkomsten av Java och JDBC insåg Huang snabbt att en enda version av sådan programvara skulle eliminera hela uppsättningen av olika SQR-portar. Detta var fröet till Judoscript-idén .

Redan i slutet av 1990-talet var inbäddad SQL ingen ny idé; till exempel, Oracles Pro *C gjorde just det. Anmärkningsvärt är att inbäddad SQL verkligen är en domänspecifik ( RDBMS ) funktion inbyggd i ett allmänt språk. Reguljära uttryck i Perl är ett annat bra exempel, inom området texthantering. Visionen om Judoscript började ta form, att vara ett allmänt skriptspråk med deklarativ uttrycksförmåga för många populära programmeringsdomäner på ett sammanhängande sätt . Vid millennieskiftet började Internet genomsyra våra liv, och ett växande antal nyckelteknologier blev allmänt antagna, därför var det inte så svårt att välja specifika domäner att stödja i Judoscript. På ett sätt kom denna vision till vid rätt tidpunkt. De domänspecifika funktionerna som förkroppsligades under Judoscripts livstid inkluderade JDBC-skript, SAX -stil SGML och XML-programmering, WSDL-skript, Ant-skript, enhetligt filsystem och arkivskript, Microsoft COM -skript, körning av inbyggda OS- körbara filer, skicka e-post, HTTP och SCP-skript, och sist men inte minst, Java-skript. Hade Judoscript fortsatt att växa skulle det förutsägbart innehålla mer och mer domänspecifikt stöd i takt med att nya teknologier blir vanliga, såsom NoSQL , AI , etc.

Eftersom Judoscript är ett JVM-baserat skriptspråk, har Judoscript Java-skript som en förstklassig medborgare. Judoscript har banat väg för inbyggt Ant- stöd, vilket gör att användare kan utnyttja den stora poolen av verktyg i Ants ekosystem. Med inbyggda skriptfunktioner med Java, Ant, WSDL, HTTP och Microsofts COM kan Judoscript-användare enkelt använda resurser från heterogena källor. Grundspråket för Judoscript är mycket JavaScript plus statisk klassdeklaration. Liksom alla skriptspråk har Judoscript olika syntaktiska sockerarter , flerradiga strängliteraler, XML och reguljära uttrycksliteraler, ett mångsidigt utskriftsutlåtande, etc. Men även om dessa aspekter dominerar designen av de flesta andra språk, är generell programmerbarhet mindre betydelsefull när man pratar. punkt jämfört med språkets nyckel, unika egenskaper.

Den initiala utsikten för Judoscript kristalliserade och utvecklingen började i slutet av 2001; den första versionen släpptes i november. Judoscript blev ett av de första skriptspråken för allmänna ändamål som designats specifikt för användning med Java-plattformen, tillsammans med Rhino , BeanShell , Jython och några andra.

2004 närmade sig Judoscript version 0.9. Utvecklingen fortsatte under 2005, där de flesta av de sista funktionerna implementerades. En nyckelfunktion som saknas är genereringen av Java-bytekod antingen offline eller vid körning, vilket ansågs vara nödvändigt för att ett sådant språk skulle nå version 1.0. För den här delen har Huang uppfunnit ett Java-makroassembleringsspråk, Jamaica. Men detta arbete för Judoscript uppnåddes aldrig.

I JavaOne 2003, i juni, tillkännagav JavaSoft sin avsikt att skapa ett helägt skriptspråk för Java-plattformen. Detta monopolska drag har kvävt livet för de flesta av sina konkurrenter. Resultatet blev Groovy-språket, vars namn tydligen är en fonetisk morphing från "jruby", med sin första version släppt 2007. Dess inbyggda Ant-stöd är misstänkt kopplat till Judoscripts Ant-skriptfunktion, kronologiskt sett . När Groovy var på väg att släppas loss har Judoscript tappat drivkraften att gå framåt. I slutet av 2005, efter bara fyra år, stoppades Judoscripts utveckling.

Ändå har Judoscript förblivit kärt för språkdesigners och aficionados, och tar en plats i programmeringsspråkets historia, eftersom det är det första och möjligen enda allmänna språket med så många inbyggda domänspecifika funktioner. Anledningen till detta kommer att fördjupas längre fram.

Språkdesign

Judoskriptspråkets design blandar två distinkta smaker. Först och främst är det ett allmänt skriptspråk som alla moderna programmeringsspråk, som använder dynamisk typning och punktnotation för att komma åt objektmedlemmar. Den stöder både procedurmässiga och objektorienterade paradigm och har statisk klassdeklaration och arv. Olika syntaktiska sockerarter och ett mångsidigt tryckuttryck kännetecknar dess skriptspråkskaraktär.

Judoscript är fullt kapabel att skripta Java-resurser. Dess statiska skrivfunktion introducerades främst för att anropa överbelastade Java-metoder.

Den andra smaken, som distanserar Judoscript från resten av publiken, är dess förkroppsligande av ett antal inhemska domänspecifika uttalanden, som var och en har ett mycket annorlunda utseende. Vissa returnerar ett värde, andra inte. De flesta av dessa specialsatser kan användas som vanliga uttalanden var som helst i programmet.

Uttryck kan bäddas in i domänspecifika uttalanden där det är lämpligt. Uttryck kan också bäddas in i textliga bokstaver som strängar och XML-värden, vilket effektivt gör dem till textmallar.

Språkegenskaper I: ett kraftfullt skriptspråk

Basspråket

Judoscript-basspråket är nästan identiskt med JavaScript för variabla och konstanta deklarationer, flödeskontrollsatser och punktnotation för åtkomst till objektmedlemmar. Förutom de två kommentarerna i C++-stil har den en tredje form, /? ?/ , användbar för att inaktivera en bit kod. Funktionsparametrar kan ha standardvärden, och anrop kan ta namngivna parametervärden. Liksom i JavaScript är funktioner också objekt och kan skickas som värden. Dynamisk programmering är tillgänglig via kommandona eval och evalExternal .

Objektorienterad programmering

Till skillnad från JavaScript deklareras användardefinierade klasser statiskt, men datamedlemmarna är dynamiska. Multipelarv stöds och programmerare bör hantera potentiella diamantarvsproblem. Klassinstanser kan överföras till en annan typ.

 

   
        
      
  
       
       
 class  Node  {  constructor  {  assert  (  namn  !=  null  );  // föreskriver att 'namn' måste vara initialiserade  barn  =  [];  }  funktion  addChild  barn  {  barn  .  add  (  barn  );  }  function  toString  {  return  name  ;  }  } 

Kodorganisation

Judoscript har ett !include- direktiv för att inkludera andra scriptlets. Detta är den enda mekanismen för att dela kod skriven i Judoscript.

Bristen på stöd för Java-liknande paket eller modul på andra språk är avsiktlig, för att motverka att skapa bibliotek skrivna i Judoscript. Återanvändbara bibliotek uppmuntras att skrivas i Java och låta Judoscript (eller andra Java-skriptspråk) använda.

Språkfunktioner II: Javascripting

Javascripting är en förstklassig medborgare i Judoscript. Här listas några av de viktigaste Java-skriptfunktionerna. Se dokumentationen för att se alla användningsområden och exempel.

Skriptning av Java-objekt

   
      
   
    
     
  
    
       


   
              
              
        
  a  =  nytt  java  ::  java  .  util  .  HashMap  ;  a  .  put  (  '  datum  '  ,  Datum  (  2001  ,  1  ,  1  ));  a  .  put  (  '  heltal  '  ,  1  );  a  .  put  (  '  dubbel  '  ,  10.01  );  a  .  put  (  '  sträng  '  ,  '  Hej  ,  värld  !  '  );  a  .  put  (  '  Dimension  '  ,  new  java  ::  java  .  awt  .  Dimension  (  10  ,  20  ));  för  k  i  a  .  keys  ()  {  println  k  :  >  10  ,  '  =  '  ,  a  .  (  k  );  }  rekvisita  =  new  java  ::  Egenskaper  (  a  .  b  .  c  .  d  .  e  .  f  .  g  =  '  a  thru  g  '  ,  h  .  i  .  j  .  k  .  l  .  m  .  n  =  '  h  thru  n  '  );  println  rekvisita  ; 

Aliasing Java statiska metoder

Möjligheten att alias Java statiska metoder som Judoscript-funktioner är en viktig mekanism, ansvarig för många inbyggda funktioner.

   
    
     

  
  
 funktionsprop  för  java  ::  System  .  _  getProperty  ();  funktion  nu  för  java  ::  System  .  currentTimeMillis  ();  funktion  rt  för  java  ::  Runtime  .  getRuntime  ();  println  nu  (),  nl  ;  println  prop  (  'java.class.path'  ),  nl  ;  rt  ().  gc  (); 

Använda Java-klasser som värden

Java-klasser är också objektvärden och kan tilldelas variabler eller konstanter.

   
         
        
        
        


   
    
     
 const  #  Typer  =  java  ::  java  .  sql  .  Typer  ;  fields  =  [  'BIT'  ,  'TINYINT'  ,  'SMALLINT'  ,  'INTEGER'  ,  'BIGINT'  ,  'FLOAT'  ,  'REAL'  ,  'DOUBLE'  ,  '  NUMERIC' , '  DECIMAL '   ,  'CHAR'  ,  'VARCHAR'  ,  'LONGVARCHAR'  ,  'DATE'  ,  'TIME'  ,  'TIMESTAMP'  ,  'BINARY'  ,  'VARBINARY'  ,  'LONGVARBINARY'  ,  'NULL'  ,  'OTHER'  ,  'JAVA_OBJECT'  ,  'DISTINCT'  ,  'STRUCT'  ,  ' ARRAY'  ,  'BLOB'  ,  'CLOB'  ,  'REF'  ];  println  'JDBC-typer i Java'  ,  sysProperty  (  'java.version'  ),  ':'  ;  för  fld  i  fält  {  println  fld  :<  13  ,  ': '  ,  #  Typer .  (  fld  );  } 

Utöka Java-klasser och implementera Java-gränssnitt

Det är möjligt att definiera Judoscript-klasser som utökar Java-klasser eller implementerar Java-gränssnitt.

   

  
         

  
    
      
          
     
  

  
    
      
          
     
  
 class  MyHashMap  utökar  java  ::  HashMap  {  // Testa åsidosätta en befintlig metod  int  hashCode (  )  {  return  super  .  hashCode  ()  ^  1  ;  }  // En ny metod.  String  []  getKeys  ()  {  arr  =  []  ;  för  x  i  denna  {  arr  .  lägg till  (  x  );  }  retur  arr  .  toStringArray  ();  }  // En ny metod.  Objekt  []  getValues  ​​()  {  arr  =  []  ;  för  x  i  värden  ()  {  arr  .  lägg till  (  x  );  }  retur  arr  .  toObjectArray  ();  }  } 

Anonyma Java-gränssnittsadaptrar kan skapas och användas.

 
 

   

    
         0 
  

 importera  java.awt.Frame  ;  importera  java.awt.event.*  ;  f  =  new  java  ::  Frame  ;  f  .  addWindowListener  (  ny  java  ::  WindowListener  {  void  windowClosing  (  WindowEvent  e  )  {  exit  ;  }  }  );  f  .  setVisible  (  sant  ); 

Språkfunktioner III: särskilda domänstöd

Denna del av språket är det som gör Judoscript unikt. Varje större domänstöd kommer att beröras kort, vanligtvis med exempel.

JDBC-skript

JDBC-skript är ett centralt inslag i Judoscript, såväl som en nyckelmotivation för själva språket. Det gör databasoperationer intuitiva och bekväma.

Nedan är ett exempel som ansluter till databasen och kör några SQL-satser.

    
  
     

 
           
                         
                          
                               
                                

      
      

    
       0

  
 db  ::  anslut  till  'jdbc:oracle:thin:@dbsvr:1521:dbname'  ,  'user'  ,  'pass'  ;  if  tableExists  (  'EMP'  )  {  db  ::  sql  :  DROP  TABLE  emp  ;  }  db  ::  sql  {  CREATE  TABLE  emp  (  emp_no  INTEGER  PRIMARY  KEY  ,  first_name  VARCHAR  (  100  ),  //  First  Name  last_name  VARCHAR  (  100  ),  //  Efternamn  födelsedatum  DATUM  ,  -- Födelsedatum  lön  NUMMER  )  ;  -- Lön  SKAPA  INDEX  emp_fname  ON  emp  (  first_name  );  CREATE  INDEX  emp_lname  ON  emp  (  efternamn  );  INSERT  INTO  emp  (  emp_no  ,  first_name  ,  last_name  ,  birth_date  ,  salary  )  VALUES  (  100  ,  'Jim'  ,  'Malone'  ,  to_date  (  '1-3-1954'  ,  'dd-mm-åååå'  ),  86500  .  );  }  println  'db::sql resultat: '  ,  $  _  ;  koppla ur  (); 

Att använda lagrade procedurer är genom db:any- satsen.

 
    
       
           
          
   
      
         
          
    
        
     
  
 db  ::  någon  [[  *  CREATE  PROCEDURE  test_proc  (  param_io  IN  OUT  NUMBER  ,  param_i  IN  VARCHAR  ,  param_o  OUT  VARCHAR  )  AS  BEGIN  param_o  :  =  param_i  ;  OM  param_io  INTE  ÄR  NULL  param_io  :  =  param_io  +  1  ;  ELSE  param_io  :  =  -  1000  ;  SLUT  OM  ;  SLUT  ;  *  ]]; 

Den mer intressanta användningen är de parametriserade frågorna och uppdateringarna. Frågor och uppdateringar kan köras direkt eller förberedda.

 
           
                 


    
        
                          0
                           
                     
                      
 db  ::  prepare  ins  :  INSERT  INTO  emp  (  emp_nr  ,  förnamn  ,  efternamn  ,  födelsedatum  ,  lön  )  VÄRDEN  (  :  empNo  ,:  förnamn  ,:  efternamn  ,:  födelsedatum  ,:  lön  )  ;  _  _  _  _  för  rad  i  rader  {  db  ::  sql  ins  med  @  empNo  :  Heltal  =  id  ++  ,  @  förnamn  =  rad  [  ],  @  efternamn  =  rad  [  1  ],  @  födelsedatum  :  Datum  =  rad  [  2  ],  @  lön  :  Antal  =  rad  [  3  ];  } 

Nedan är ett frågeexempel.

 
       
   


  
        
  
      
           
            
                
          
 db  ::  fråga  qry  :  SELECT  emp_nr  ,  first_name  ,  last_name  ,  birth_date  ,  lön  FROM  emp  ;  println  'ID Förnamn Efternamn Lön Födelsedatum' ,  nl  ,  '  --- ---------- -------------------------- ----------'  ;  medan  qry  .  nästa  ()  {  println  qry  [  1  ].  int  ()  :  <  5  ,  qry  .  förnamn  :  <  12  ,  fråga  .  efternamn  :  <  12  ,  qry  .  lön  :  *  7  .  1  ,  ''  ,  qry  .  födelsedatum  .  fmtDate  (  'åååå-MM-dd')  ;  } 

SGML och XML dokumentbehandling

SGML är det generiska hypertextformatet som inkluderar HTML och XML. Det finns två API:er för bearbetning av XML-dokument: Simple API för XML (eller SAX) och Document Object Model (eller DOM). SAX-bearbetning skannar hela texten som en ström och aktiverar händelser för varje påträffad tagg eller textsegment. Judoscript har ett sött litet uttalande som använder den här funktionen effektivt för XML- och SGML-data.

Nästa exempel visar essensen av HTML-skrapning. Med detta är det inte långt ifrån verkligheten att skriva en sökrobot!

 gör 'http://www.judoscript.org' som sgml {  <  a  >  : if $_.href != null { println 'Hittade en hyperlänk:', $_.href; }   <  p  >  : println 'Hittade en stycketagg.'; TEXT: println 'Hittade lite text:', $_.length();  }  

Följande exempel behandlar XML-data som läggs till i slutet av skriptet.


 
  
  
  
  
   
   
 
  
  
  
  
  
   
   
 
 gör $$local som xml {  <  bok  >  : println ($_.hardcover=='true')?"Hard":"Soft", '-cover Book ------------';  <  datum  >  TEXT: println ' Datum: ', $_, ' (', $_.type, ')';  <  title  >  TEXT: println ' Titel: ', $_;  <  författare  >  TEXT: println 'Författare:', $_;  <  isbn  >  TEXT: println ' ISBN: ', $_; } EndScript ------------------------------------------------ -------   <  boklista  >  <  bok  >  <  titel  >  UNIX i ett nötskal  </  title  >  <  författare  >  Daniel Gilly  </  författare  >  <  utgivare  >  O  &apos;  Reilly  &amp;  Associates, Inc.  </  publisher  >  <  isbn  >  1-56592-001-5  </  isbn  >  <  date  type  =  "first edition"  >  1986-12  </  date  >  <  date  type  =  "andra upplagan"  >  1992-06  </  date  >  </  book  >  <  book  Hardcover  =  "true"  >  <  title  >  Avancerad programmering i UNIX-miljön  </  title  >  <  författare  >  Richard Stevens  </  author  >  <  publisher  >  Addison-Wesley  </  publisher  >  <  isbn  >  0-201-56317-7  </  isbn  >  <  date  type  =  "copyright"  >  1993  </  date  >  <  date  type  =  "twelfth printing"  >  1996-12  </  date  >  </  book  >  </  booklist  > 

Judoscript stöder även DOM- och XSLT-behandling av XML-dokument.

Apache Ant-skript

Apache Ant har varit byggsystemet för Java under en lång tid; företag och utvecklare har skapat många tillägg som kallas Task s, på Ant-språket, och Ant-ekosystemet blir en skattkammare av alla typer av verktyg, antingen allmänna eller proprietära. Judoscript har inkluderat en mekanism för att direkt anropa alla Ant-uppgifter. Nedan följer ett exempel.

  a = 'myror'; anttask::   <  echo  message  =  "Hej, ${a}!"  />  anttask::  <  echo  >  Hej, mer ${a}!  </  echo  > 

Det finns sätt att köra inbyggda körbara filer i Judoscript, men du kan också ta till Ant-skript, som visas nedan.

    
   
 src = '.'; anttask::   <  exec  dir  =  "${src}"  körbar  =  "cmd.exe"  os  =  "Windows 2000"  output  =  "dir.txt"  >  <  arg  line  =  "/c dir"  />  </  exec  > 

Unifierat filsystem och arkivskript

Filmanipulation är en av de vanligaste uppgifterna för informationsarbetare. Judoscript strävar efter att ge en konsekvent upplevelse av att hantera filer i både filsystem och arkiv som ZIP-filer och TAR-bollar.

Följande exempel inspekterar filer i ett ZIP-arkiv.

listFiles '*' i 'awebapp.zip' dirOnly; för x i $_ { // få status för varje kataloglista Filer '*.java, *.jj' i x rekursiv storlek compressedSize; println $_[0]:>8, ' ', $_[1]:>8, ' ', x; }

Nästa exempel kopierar filer till ett ZIP-arkiv. Genom att ändra uttrycken något kan du kopiera filer till en annan plats i filsystemet.

kopiera '*.java, *.properties' i 'C:/temp/classes/' rekursivt till 'judo.jar' butiksmanifest [[* Manifest-Version: 1.0 Main-Class: judo Skapad av: James Jianbo Huang ( c) 2001-(* #år *) *]] ;

Ett annat exempel för ZIP med finare kontroll.

zf = createZip('~/archives/work-'+Date().fmtDate('ååååMMdd')+'.zip'); kopiera '*' i 'c:/judo/src/' förutom '*/alfa*, */beta*, */save/*' rekursivt noHidden eko till zf under 'src/'; kopiera '*' i 'c:/judo/docs/' förutom '*/alfa*, */beta*, */save/*' rekursivt noHidden echo till zf under 'docs/'; kopiera '*' i 'c:/judo/examples/' förutom '*/alfa*, */beta*, */save/*' rekursivt noHidden echo till zf under 'examples/'; zf.close();

Och du kan kopiera internetresurser till filsystem eller arkiv, som visas nedan.

tar = createTar('yahoo_comp.tar.gz'); zip = createZip('yahoo_comp.zip'); urls = [ 'http://dir.yahoo.com/Computers_and_Internet/index.html', 'http://dir.yahoo.com/Computers_and_Internet/Internet/index.html', 'http://dir.yahoo. com/Computers_and_Internet/Internet/WAIS/index.html' ]; for u in urls { copy u into tar keepDirs; kopiera dig till zip keepDirs; } tar.close(); zip.close();

SOAP webbtjänst skript

På Judoscripts tid var SOAP- webbtjänsten branschstandarden för fjärranrop innan RESTful API dök upp. Judoscript gör det enkelt att konsumera SOAP-webbtjänster.

svc = wsdl::'http://coldrooster.com/dhtmldude/mathservice.asmx?WSDL'; println '3 + 2 = ', svc.Add(3, 2); println '3 - 2 = ', svc.Subtract(3, 2); println '3 * 2 = ', svc.Multiply(3, 2); println '3 / 2 = ', svc.Divide(3, 2);

Andra applikationsfunktioner

Judoscript har alla typer av programmeringsgodis för att täcka de flesta av de dagliga uppgifterna för informationsarbetare, som att köra OS-inbyggda körbara filer, skicka e-post, köra schemalagda jobb, komma åt internetresurser via HTTP, SSH, SCP, starta din egen HTTP-server, etc.

Microsoft COM-skriptmöjligheten öppnar dörren till Microsoft Office-dokumenten och använder deras DOM för att komma åt och manipulera data däri, och integrera med andra datalager och källor.

Genomförande

Judoscriptspråkets grammatik och dess parser görs med JavaCC- verktyget. Många komplicerade domänspecifika uttalanden utgör ett eget underspråk som motiverar en inbäddad underparser. Andra sådana uttalanden och vissa syntaktiska sockerarter kräver inhemska metoder i JavaCC- grammatikfilen. På grund av dessa komplexiteter producerar parsern direkt den interna representationen av programmet, lätt körbar av språkmotorn.

Det finns många stödjande bibliotek inkluderade i språkkörningstiden; vissa är från tredje part, andra utvecklas internt.

Se även

externa länkar