Récemment j'ai dû examiner un certain code de Javascript sur un du système d'exploitation final de Microsoft Vista utilisant la ligne de commande. C'est quelque chose que j'ai fait avant sur des plates-formes de Linux utilisant une coquille de Javascript mais n'avait jamais fait sur une plate-forme de Microsoft. Pour ceux qui ne sont pas au courant d'une coquille de Javascript, c'est une ligne de commande interface à un moteur de Javascript. Semblable au python ou au rubis, la coquille de Javascript a le mode de fonctionnement deux. Vous pouvez l'employer comme coquille interactive, laquelle vous introduisez au clavier le code de Javascript à un message de sollicitation et obtenez des résultats instantanés, ou vous pouvez appeler un programme de Javascript.
La manière dont la plus facile de je sais pour établir une coquille de Javascript est de télécharger et construit le moteur de Javascript de SpiderMonkey qui vient avec un Javascript Shell. SpiderMonkey est l'un de deux moteurs de Javascript que le projet de logiciel de Mozilla soutient. Il est employé dans le navigateur de Firefox et ailleurs. L'autre moteur de Javascript est rhinocéros. Le rhinocéros est écrit utilisant la langue de Java tandis que SpiderMonkey est une exécution pure de langage C qui se conforme ECMA-262 à l'édition 3. incluse dans SpiderMonkey est une coquille de Javascript. Le code source pour les deux moteurs de Javascript est facilement disponible sur le site Web de Mozilla.
Pour Microsoft Vista j'ai eu un choix de l'un ou l'autre bâtiment Windows indigène exécutable qui pourrait être accédé par l'intermédiaire du message de sollicitation de commande de Vista (semblable au vieux message de sollicitation de DOS) ou, parce que Vista final vient avec le sous-système pour les applications basées sur Unix (SUA), d'une coquille qui était accessible par l'intermédiaire d'un plus familier Unix-comme l'environnement. Choix I à aller l'itinéraire de SUA.
Beaucoup de personnes sont ignorantes de l'offre du SUA de Microsoft. Fondamentalement c'est un sous-système POSIX-conforme complet pour les logiciels d'exploitation NT-basés par Windows. Pour leurs propres raisons, Microsoft limite l'availablity de SUA à certains produits tels que l'entreprise de Vista et les éditions et le serveur finaux 2008 de Windows. Il vient avec des centaines d'utilités comprenant la collection de compilateur de GNU, la coquille de Korn, et les en-têtes et les bibliothèques de développement. Voyez ici pour de plus amples informations.
SUA est un sous-système qui fonctionne à la façon des indigènes sur le grain de Windows. ce qui a été orginally développé par Softway Systems. Le nom original pour le produit était OpenNT mais cela plus tard a été changé en Interix. Interix et la majeure partie de l'équipe de développement ont été acquis par Microsoft en 1999 et le produit a été retitré des services pour Unix (SFU) en 2005. Avec le dégagement de Microsft Vista, il a été intégré dans le du système d'exploitation comme composant installable séparé et a été retitré sous-système pour des applications basées sur Unix. Il y a une communauté d'utilisateur active autour de SUA qui est accueilli par Interop Systems et commandité par Microsoft.
C'est le fichier makefile que j'ai entaillé ensemble pour établir les js statiques exécutables du SpiderMonkey 1.8 source pour l'usage avec Microsoft Vista SUA.
JSVERSION = js-1.8.0
CC = gcc
OS_ARCH := $(subst /,_,$(shell uname -s | sed /\ /s//_/))
OS_RELEASE := $(shell uname -r)
OS_CONFIG := $(OS_ARCH)$(OS_RELEASE)
OBJDIR = ./$(OS_CONFIG)
DEFINES = -DXP_UNIX -DPOSIX_SOURCE -DHAVE_LOCALTIME_R
LIBDIR := lib
INCLUDES += -I$(OBJDIR)
RANLIB = ranlib
LDFLAGS = -lm
OPTIMIZER =
INTERP_OPTIMIZER =
CFLAGS = $(OPTIMIZER) $(DEFINES) $(INCLUDES)
INTERP_CFLAGS = $(INTERP_OPTIMIZER) $(DEFINES) $(INCLUDES)
PREDIRS += editline
DEFINES += -DEDITLINE
JS_CFILES = jsapi.c jsarena.c jsarray.c jsatom.c jsbool.c jscntxt.c jsdate.c \
jsdbgapi.c jsdhash.c jsdtoa.c jsemit.c jsexn.c jsfun.c jsgc.c jshash.c \
jsinterp.c jsinvoke.c jsiter.c jslock.c jslog2.c jslong.c jsmath.c \
jsnum.c jsobj.c jsopcode.c jsparse.c jsprf.c jsregexp.c jsscan.c \
jsscope.c jsscript.c jsstr.c jsutil.c jsxdrapi.c jsxml.c prmjtime.c
JS_HFILES = jsarray.h jsatom.h jsbool.h jsconfig.h jscntxt.h jsdate.h \
jsemit.h jsexn.h jsfun.h jsgc.h jsinterp.h jsiter.h jslibmath.h \
jslock.h jsmath.h jsnum.h jsobj.h jsopcode.h jsparse.h jsarena.h \
jsclist.h jsdhash.h jsdtoa.h jshash.h jslong.h jstypes.h jsprvtd.h \
jspubtd.h jsregexp.h jsscan.h jsscope.h jsscript.h jsstr.h jsutil.h \
jsxdrapi.h jsxml.h
API_HFILES = jsapi.h jsdbgapi.h
OTHER_HFILES = jsbit.h jscompat.h jscpucfg.h jsotypes.h jsstddef.h jsopcode.tbl \
jsproto.tbl js.msg jsshell.msg jskeyword.tbl prmjtime.h resource.h
ifdef JS_HAS_FILE_OBJECT
JS_CFILES += jsfile.c
JS_HFILES += jsfile.h
endif
LIB_CFILES = $(JS_CFILES)
PROG_CFILES = js.c
LIB_OBJS = $(addprefix $(OBJDIR)/, $(LIB_CFILES:.c=.o))
PROG_OBJS = $(addprefix $(OBJDIR)/, $(PROG_CFILES:.c=.o))
CFILES = $(LIB_CFILES) $(PROG_CFILES)
OBJS = $(LIB_OBJS) $(PROG_OBJS)
LIBRARY = $(OBJDIR)/libjs.a
PROGRAM = $(OBJDIR)/js
TARGETS = $(PROGRAM)
EDIT_LIBRARY = $(OBJDIR)/libedit.a
EDIT_DIR = ./editline
EDIT_CFILES = $(EDIT_DIR)/editline.c $(EDIT_DIR)/sysunix.c
EDIT_OBJS = $(OBJDIR)/editline.o $(OBJDIR)/sysunix.o
EDIT_CFLAGS = -DANSI_ARROWS -DHAVE_TCGETATTR -DHIDE -DUSE_DIRENT -DSYS_UNIX \
-DHAVE_STDLIB -DUNIQUE_HISTORY $(DEFINES) -I$(EDIT_DIR)
define MAKE_OBJDIR
if test ! -d $(@D); then rm -rf $(@D); mkdir -p $(@D); fi
endef
all:
$(MAKE) $(TARGETS)
$(PROGRAM): $(PROG_OBJS) $(LIBRARY) $(EDIT_LIBRARY)
$(CC) -o $@ $(CFLAGS) $(PROG_OBJS) $(LIBRARY) $(EDIT_LIBRARY) $(LDFLAGS)
$(OBJDIR)/%.o: %.c %.h
@$(MAKE_OBJDIR)
$(CC) -o $@ -c $(CFLAGS) $*.c
$(OBJDIR)/editline.o: $(EDIT_DIR)/editline.c $(EDIT_DIR)/editline.h
@$(MAKE_OBJDIR)
$(CC) -o $@ -c $(EDIT_CFLAGS) $(EDIT_DIR)/editline.c
$(OBJDIR)/sysunix.o: $(EDIT_DIR)/sysunix.c $(EDIT_DIR)/editline.h
@$(MAKE_OBJDIR)
$(CC) -o $@ -c $(EDIT_CFLAGS) $(EDIT_DIR)/sysunix.c
$(OBJDIR)/%.o: %.c
@$(MAKE_OBJDIR)
$(CC) -o $(OBJDIR)/jscpucfg jscpucfg.c
$(OBJDIR)/jscpucfg > $(OBJDIR)/jsautocfg.h
$(CC) -o $(OBJDIR)/jskwgen jskwgen.c
$(OBJDIR)/jskwgen $(OBJDIR)/jsautokw.h
$(CC) -o $@ -c $(CFLAGS) $*.c
$(OBJDIR)/jsinterp.o: jsinterp.c jsinterp.h
@$(MAKE_OBJDIR)
$(CC) -o $@ -c $(INTERP_CFLAGS) jsinterp.c
$(EDIT_LIBRARY): $(EDIT_OBJS)
$(AR) rv $@ $?
$(RANLIB) $@
$(LIBRARY): $(LIB_OBJS)
$(AR) rv $@ $?
$(RANLIB) $@
clean:
rm -rf $(OBJS)
clobber:
rm -rf $(OBJDIR)
tarball:
mkdir -p ./$(JSVERSION)/editline
cp *.[ch] ./$(JSVERSION)
cp *.tbl ./$(JSVERSION)
cp *.js ./$(JSVERSION)
cp *.msg ./$(JSVERSION)
cp Makefile ./$(JSVERSION)
cp README ./$(JSVERSION)
cp editline/*.[ch] ./$(JSVERSION)/editline
cp editline/README ./$(JSVERSION)/editline
cp editline/editline.3 ./$(JSVERSION)/editline
tar cvf $(JSVERSION).tar ./$(JSVERSION)
gzip $(JSVERSION).tar
rm -rf ./$(JSVERSION)
Note que vous devez employer GCC 4.2 au lieu de GCC 3.2 autrement vous obtiendrez un symbole non défini de _JS_DHashTableOperate dû à un bogue de GCC d'obsure. Cependant avec GCC 4.2, vous verrez qu'un grand nombre d'avertissements de compilateur concernant l'alignement est plus grand que le fichier objet d'exécution maximum. Heureusement vous pouvez sans risque les ignorer. D'ailleurs, je choisis de construire un exécutable statique parce que la construction des bibliothèques partagées sur SUA utilisant le GCC est quelque peu problématique.
Une fois que vous avez la construction un exécutable, un smoketest simple est d'employer l'exécutable pour exécuter le manuscrit de Javascript de prefect.js qui est inclus avec le code source de SpiderMonkey. Vous devriez obtenir le rendement semblable à ce qui suit :
$ ./Interix6.0/js perfect.js A number is 'perfect' if it is equal to the sum of its divisors (excluding itself). The perfect numbers up to 500 are: 6 = 1 + 2 + 3 28 = 1 + 2 + 4 + 7 + 14 496 = 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248 That's all. $
Bien, ceci devrait être assez pour te permettre d'établir votre propre coquille de Javascript sur le sous-système de Microsoft pour des applications basées sur Unix. Bonne chance !

























