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 på 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 . få ( 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 DÅ 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 ' Reilly & 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
- Lista över Java-skriptspråk
- JavaCC
- Bean Scripting Framework
- Apache Ant
- JSR223
- noshörning
- BeanShell
- Häftig
- SQR
- 4GL