Programmering

Introduksjon til skripting i Java, del 1

Utdrag fra Skripting i Java: språk, rammeverk og mønstre.

Av Dejan Bosanac

Publisert av Addison Wesley Professional

ISBN-10: 0-321-32193-6

ISBN-13: 978-0-321-32193-0

Inntil nylig var bare hardcore begeistret for skripting på Java-plattformen, men det var før Sun økte JREs støtte til dynamisk typede språk som Python, Ruby og JavaScript. I dette todelte utdraget fra den kommende Scripting in Java: Languages, Frameworks, and Patterns (Addison Wesley Professional, august 2007) begrenser Dejan Bosanac seg til det som skiller de fleste skriptspråk fra et programmeringsspråk som Java, og forklarer deretter hvorfor scripting er et tidsverdig tillegg til Java-programmeringsferdighetene dine.

Introduksjon til skripting i Java: språk, rammeverk og mønstre

Hovedtemaet i denne boken er synergien mellom skriptteknologier og Java-plattformen. Jeg beskriver prosjekter Java-utviklere kan bruke til å skape et kraftigere utviklingsmiljø, og noen av metodene som gjør skripting nyttig.

Før jeg begynner å diskutere anvendelsen av skripting i Java-verdenen, oppsummerer jeg noe av teorien bak skripting generelt og bruken av den i informasjonsteknologisk infrastruktur. Dette er temaet i de to første kapitlene i boken, og det gir oss et bedre perspektiv på skriptteknologi, samt hvordan denne teknologien kan være nyttig innenfor Java-plattformen.

For å begynne med må vi definere hva skriptspråk er og beskrive egenskapene deres. Egenskapene deres avgjør i stor grad rollene de kan (bør) brukes i. I dette kapittelet forklarer jeg hva begrepet er skriptspråk betyr og diskutere deres grunnleggende egenskaper.

På slutten av dette kapittelet diskuterer jeg forskjellene mellom skript og systemprogrammeringsspråk og hvordan disse forskjellene gjør dem egnet for visse roller i utviklingen.

Bakgrunn

Definisjonen av et skriptspråk er uklar og noen ganger inkonsekvent med hvordan skriptspråk brukes i den virkelige verden, så det er lurt å oppsummere noen av de grunnleggende konseptene om programmering og databehandling generelt. Dette sammendraget gir et grunnlag som er nødvendig for å definere skriptspråk og diskutere deres egenskaper.

La oss starte fra begynnelsen. Prosessorer utfører maskininstruksjoner, som opererer på data enten i prosessorregistrene eller i eksternt minne. Enkelt sagt består en maskininstruksjon av en sekvens med binære sifre (0s og 1s) og er spesifikk for den bestemte prosessoren den kjører på. Maskininstruksjoner består av operasjonskode fortelle prosessoren hvilken operasjon den skal utføre, og operander som representerer dataene som operasjonen skal utføres på.

Tenk for eksempel på den enkle operasjonen med å legge til en verdi i et register til verdien i et annet. La oss nå forestille oss en enkel prosessor med et 8-biters instruksjonssett, der de første 5 bitene representerer operasjonskoden (for eksempel 00111 for registerverditilsetning), og registerene adresseres av et 3-bits mønster. Vi kan skrive dette enkle eksemplet som følger:

00111 001 010

I dette eksemplet brukte jeg 001 og 010 til å adressere register nummer én og to (henholdsvis R1 og R2) til prosessoren.

Denne grunnleggende databehandlingsmetoden har vært kjent i flere tiår, og jeg er sikker på at du er kjent med den. Ulike typer prosessorer har forskjellige strategier for hvordan instruksjonssettene deres skal se ut (RISC eller CISC-arkitektur), men fra programvareutviklerens synspunkt er det eneste viktige faktum at prosessoren bare kan utføre binære instruksjoner. Uansett hvilket programmeringsspråk som brukes, er den resulterende applikasjonen en sekvens av maskininstruksjoner utført av prosessoren.

Det som har endret seg over tid er hvordan folk lager rekkefølgen maskininstruksjonene utføres i. Denne ordnede sekvensen av maskininstruksjoner kalles a dataprogram. Etter hvert som maskinvaren blir mer overkommelig og kraftigere, øker brukernes forventninger. Hele formålet med programvareutvikling som vitenskapsdisiplin er å tilby mekanismer som gjør det mulig for utviklere å lage mer komplekse applikasjoner med samme (eller enda mindre) innsats som før.

En spesifikk prosessorens instruksjonssett kalles dets maskinspråk. Maskinspråk er klassifisert som første generasjons programmeringsspråk. Programmer skrevet på denne måten er vanligvis veldig raske fordi de er optimalisert for den spesifikke prosessorens arkitektur. Men til tross for denne fordelen er det vanskelig (om ikke umulig) for mennesker å skrive store og sikre applikasjoner på maskinspråk fordi mennesker ikke er flinke til å håndtere store sekvenser på 0 og 1.

I et forsøk på å løse dette problemet begynte utviklere å lage symboler for visse binære mønstre, og med dette, monteringsspråk ble introdusert. Monteringsspråk er andregenerasjons programmeringsspråk. Instruksjonene i monteringsspråk er bare ett nivå over maskininstruksjonene, ved at de erstatter binære sifre med lett å huske nøkkelord som ADD, SUB og så videre. Som sådan kan du omskrive det forrige enkle instruksjonseksemplet på monteringsspråk som følger:

LEGG TIL R1, R2

I dette eksemplet representerer ADD-nøkkelordet operasjonskoden for instruksjonen, og R1 og R2 definerer registerene som er involvert i operasjonen. Selv om du bare observerer dette enkle eksemplet, er det åpenbart monteringsspråk som gjorde det lettere for mennesker å lese programmer og dermed muliggjorde opprettelse av mer komplekse applikasjoner.

Selv om de er mer menneskelige, utvider ikke andregenerasjons språk på noen måte prosessorens evner.

Tast inn språk på høyt nivå, som lar utviklere uttrykke seg i semantiske former på høyere nivå. Som du kanskje har gjettet, blir disse språkene referert til som tredje generasjons programmeringsspråk. Språk på høyt nivå gir forskjellige kraftige sløyfer, datastrukturer, objekter og så videre, noe som gjør det mye enklere å lage mange applikasjoner med dem.

Over tid ble et mangfoldig utvalg av programmeringsspråk på høyt nivå introdusert, og egenskapene deres varierte mye. Noen av disse egenskapene kategoriserer programmeringsspråk som skriptspråk (eller dynamiske) språk, som vi ser i de kommende avsnittene.

Det er også en forskjell i hvordan programmeringsspråk kjøres på vertsmaskinen. Som oftest, kompilatorer oversette språkkonstruksjoner på høyt nivå til maskininstruksjoner som ligger i minnet. Selv om programmer skrevet på denne måten i utgangspunktet var litt mindre effektive enn programmer skrevet på monteringsspråk på grunn av tidlige kompilators manglende evne til å bruke systemressurser effektivt, ettersom tiden gikk kompilatorer og maskiner forbedret, noe som gjør systemprogrammeringsspråk bedre enn monteringsspråk. Etter hvert ble språk på høyt nivå populære i et bredt spekter av utviklingsområder, fra forretningsapplikasjoner og spill til kommunikasjonsprogramvare og operativsystemimplementeringer.

Men det er en annen måte å transformere semantiske konstruksjoner på høyt nivå til maskininstruksjoner, og det er å tolke dem slik de blir utført. På denne måten ligger applikasjonene dine i skript, i sin opprinnelige form, og konstruksjonene blir transformert i løpet av et program som kalles et tolk. I utgangspunktet utfører du tolken som leser uttalelsene til søknaden din og deretter utfører dem. Kalt skripting eller dynamiske språk, tilbyr slike språk et enda høyere abstraksjonsnivå enn det som tilbys av systemprogrammeringsspråk, og vi diskuterer dem i detalj senere i dette kapittelet.

Språk med disse egenskapene passer naturlig for visse oppgaver, for eksempel prosessautomatisering, systemadministrasjon og liming av eksisterende programvarekomponenter; kort sagt, hvor som helst de strenge syntaksen og begrensningene som ble introdusert av systemprogrammeringsspråk, kom i veien mellom utviklere og deres jobber. En beskrivelse av de vanlige rollene som skriptspråk er i fokus i kapittel 2, "Egnede applikasjoner for skriptspråk."

Men hva har alt dette å gjøre med deg som Java-utvikler? For å svare på dette spørsmålet, la oss først oppsummere historien til Java-plattformen. Etter hvert som plattformene ble mer varierte, ble det stadig vanskeligere for utviklere å skrive programvare som kan kjøres på de fleste tilgjengelige systemer. Dette er da Sun utviklet Java, som tilbyr "skriv en gang, kjør hvor som helst" enkelhet.

Hovedideen bak Java-plattformen var å implementere en virtuell prosessor som en programvarekomponent, kalt a virtuell maskin. Når vi har en slik virtuell maskin, kan vi skrive og kompilere koden for den prosessoren, i stedet for den spesifikke maskinvareplattformen eller operativsystemet. Resultatet av denne samleprosessen kalles bytekode, og den representerer praktisk talt maskinkoden til den målrettede virtuelle maskinen. Når applikasjonen kjøres, startes den virtuelle maskinen og bytekoden tolkes. Det er åpenbart at et program utviklet på denne måten kan kjøres på hvilken som helst plattform med en passende virtuell maskin installert. Denne tilnærmingen til programvareutvikling fant mange interessante bruksområder.

Hovedmotivasjonen for oppfinnelsen av Java-plattformen var å skape et miljø for utvikling av enkel, bærbar, nettverksbevisst klientprogramvare. Men mest på grunn av ytelsesstraffer introdusert av den virtuelle maskinen, er Java nå best egnet innen utvikling av serverprogramvare. Det er tydelig når PC-er øker i hastighet, og flere skrivebordsprogrammer skrives i Java. Denne trenden fortsetter bare.

En av de grunnleggende kravene til et skriptspråk er å ha en tolk eller en slags virtuell maskin. Java-plattformen kommer med Java Virtual Machine (JVM), som gjør det mulig å være vert for forskjellige skriptspråk. Det er en økende interesse for dette området i dag i Java-samfunnet. Det er få prosjekter som prøver å gi Java-utviklere samme kraftutviklere som tradisjonelle skriptspråk har. Det er også en måte å utføre eksisterende applikasjon skrevet på et dynamisk språk som Python inne i JVM og integrere det med et annet Java-program eller en modul.

Dette er hva vi diskuterer i denne boka. Vi tar en skripttilnærming til programmering, mens vi diskuterer alle styrker og svakheter ved denne tilnærmingen, hvordan man best bruker skript i en applikasjonsarkitektur, og hvilke verktøy som er tilgjengelige i dag i JVM.

$config[zx-auto] not found$config[zx-overlay] not found