GVKun编程网logo

#! 脚本解释器(如何不加node 直接执行js文件)(#脚本解释器是什么)

18

在本文中,我们将带你了解#!脚本解释器在这篇文章中,我们将为您详细介绍#!脚本解释器的方方面面,并解答如何不加node直接执行js文件常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的、and

在本文中,我们将带你了解#! 脚本解释器在这篇文章中,我们将为您详细介绍#! 脚本解释器的方方面面,并解答如何不加node 直接执行js文件常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的<编译原理 - 函数绘图语言解释器(3)解释器 - python>、android 手机端直接执行jar包、C++脚本解释器-Cint介绍、Ch/CINT — C/C++语言脚本解释器

本文目录一览:

#! 脚本解释器(如何不加node 直接执行js文件)(#脚本解释器是什么)

#! 脚本解释器(如何不加node 直接执行js文件)(#脚本解释器是什么)

内容来源:https://blog.csdn.net/liukai6/article/details/80071916

#!是特殊的表示符,其后面跟的是解释此脚本的脚本解释器shell的路径。

 

在Linux系统下,我们可以把JS文件当作shell脚本来运行,从而达到上述目的,具体步骤如下:

在shell脚本中,可以通过#!注释来指定当前脚本使用的解析器。所以我们首先在node-echo.js文件顶部增加以下一行注释,表明当前脚本使用NodeJS解析。

#! /usr/bin/env node

 console.log(''hello word'')

NodeJS会忽略掉位于JS模块首行的#!注释,不必担心这行注释是非法语句。

然后,我们使用以下命令赋予node-echo.js文件执行权限。

$ chmod +x /home/user/bin/node-echo.js

最后,我们在PATH环境变量中指定的某个目录下,例如在/usr/local/bin下边创建一个软链文件,文件名与我们希望使用的终端命令同名,命令如下:

$ sudo ln -s /home/user/bin/node-echo.js /usr/local/bin/node-echo

 

 

 

 

应该知道的:

    GNU/Linux操作系统中的/bin/sh本是bash (Bourne-Again Shell) 的符号链接,
    但鉴于bash过于复杂,有人把bash从NetBSD移植到Linux并更名为dash (Debian Almquist Shell),
    并建议将/bin/sh指向它,以获得更快的脚本执行速度。Dash Shell 比Bash Shell小的多,符合POSIX标准
    Ubuntu继承了Debian,所以从Ubuntu 6.10开始默认是Dash Shell。

    总结: #!/bin/sh是#!/bin/bash的缩减版。

 

python: 两种写法的区别

  这个在unix类的操作系统才有意义。
  #!/usr/bin/python是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python解释器;
  #!/usr/bin/env python这种用法是为了防止操作系统用户没有将python装在默认的/usr/bin路径里。当系统看到这一行的时候,首先会到env设置里查找python的安装路径,再调用对应路径下的解释器程序完成操作。

<编译原理 - 函数绘图语言解释器(3)解释器 - python>

<编译原理 - 函数绘图语言解释器(3)解释器 - python>

<编译原理 - 函数绘图语言解释器(3)解释器 - python>

  • <编译原理 - 函数绘图语言解释器(1)词法分析器 - python>

  • <编译原理 - 函数绘图语言解释器(2)语法分析器 - python>

背景

  • 编译原理上机实现一个对函数绘图语言的解释器 - 用除 C 外的不同种语言实现

  • 设计思路:

    • 将语法分析器并入绘图功能

    • 继承语法分析器覆盖重写

  • 用 Pycharm 写了一个.py 文件:

    • semanticfunc.py

    • 输入流是语法分析器得到的语法树,输出流是绘制的图像

    • 测试文本序列:

//----------------测试程序1:分别测试------------------------
ORIGIN IS (100,300);                        // Sets the offset of the origin
ROT IS 0;                                   // Set rotation Angle.
SCALE IS (1,1);                             // Set the abscissa and ordinate scale.
FOR T FROM 0 TO 200 STEP 1 DRAW (T,0);      // The trajectory of the x-coordinate.
FOR T FROM 0 TO 150 STEP 1 DRAW (0,-T);     // The trajectory of the y-coordinate.
FOR T FROM 0 TO 120 STEP 1 DRAW (T,-T);     // The trajectory of the function f[t]=t.
FOR T FROM 0 TO 2*PI STEP PI/50 DRAW(COS(T),SIN(T));
//---------测试程序2----------
ORIGIN IS (20, 200);
ROT IS 0;
SCALE IS (40, 40);
FOR T FROM 0 TO 2*PI STEP PI/50 DRAW (T, -SIN(T));
ORIGIN IS (20, 240);
FOR T FROM 0 TO 2*PI STEP PI/50 DRAW (T, -SIN(T));
ORIGIN IS (20, 280);
FOR T FROM 0 TO 2*PI STEP PI/50 DRAW (T, -SIN(T));
//-----------------测试程序3--------------
ORIGIN IS (380, 240);
SCALE IS (80, 80/3);
ROT IS PI/2+0*PI/3 ;
FOR T FROM -PI TO PI STEP PI/50 DRAW (COS(T), SIN(T));
ROT IS PI/2+2*PI/3;
FOR T FROM -PI TO PI STEP PI/50 DRAW (COS(T), SIN(T));
ROT IS PI/2-2*PI/3;
FOR T FROM -PI TO PI STEP PI/50 DRAW (COS(T), SIN(T));
//-------------------测试程序4-------------
ORIGIN IS(580, 240);
SCALE IS (80, 80);
ROT IS 0;
FOR T FROM 0 TO 2*PI STEP PI/50 DRAW(COS(T),SIN(T));
FOR T FROM 0 TO PI*20 STEP PI/50 DRAW((1-1/(10/7))*COS(T)+1/(10/7)*COS(-T*((10/7)-1)),(1-1/(10/7))*SIN(T)+1/(10/7)*SIN(-T*((10/7)-1)));
//-------------------测试程序5------------
//------------ 函数复杂度图形:-----------
ROT IS 0;	-- 不旋转
ORIGIN IS (50, 400);	-- 设置新原点(距系统默认原点的偏移量)
SCALE IS (2,1);	-- 设置比例
FOR T FROM 0 TO 300 STEP 1 DRAW (T,0);	-- 横坐标
FOR T FROM 0 TO 300 STEP 1 DRAW (0,-T);	-- 纵坐标
SCALE IS (2,1);	-- 设置比例
FOR T FROM 0 TO 300 STEP 1 DRAW (T,-T);	-- 函数F(T)=T的轨迹
SCALE IS (2,0.1);	-- 设置比例
FOR T FROM 0 TO 55 STEP 1 DRAW (T,-T*T);	-- 函数F(T)=T*T的轨迹
SCALE IS (10,5);	-- 设置比例
FOR T FROM 0 TO 60 STEP 1 DRAW (T,-SQRT(T));	-- 函数F(T)=SQRT(T)的轨迹
SCALE IS (20,0.1);	-- 设置比例
FOR T FROM 0 TO 8 STEP 0.1 DRAW (T,-EXP(T));	-- 函数F(T)=EXP(T)的轨迹
SCALE IS (2,20);	-- 设置比例
FOR T FROM 0 TO 300 STEP 1 DRAW (T,-LN(T));	-- 函数F(T)=LN(T)的轨迹

Step 1 :semanticfunc.py - 继承语法分析器并入绘制功能

#!/usr/bin/env python
# encoding: utf-8
	''''''
@author: 黄龙士
@license: (C) Copyright 2019-2021,China.
@contact: iym070010@163.com
@software: xxxxxxx
@file: semanticfunc.py.py
@time: 2019/11/30 10:47
@desc:
	''''''

import parserfunc as pf
import scannerclass as sc
import numpy as np
import turtle
import sys
import matplotlib
import matplotlib.pyplot as plt

class semantic(pf.Parsef):
    def initPaint(self):    # 初始化画布
        self.fig = plt.figure()
        self.ax = self.fig.add_subplot(111)

    def Errmsg(self):   #出错处理
        sys.exit(1)

    def CalcCoord(self,x,y):    # 计算点坐标   即比例旋转平移变换 x,y都是二元组
        x = x * self.Scale_x
        y = y * self.Scale_y     ## 进行比例变换
        tmp_x = x * np.cos(self.Rot_angle) + y * np.sin(self.Rot_angle)
        y = y * np.cos(self.Rot_angle) - x * np.sin(self.Rot_angle)
        x= tmp_x        ## 旋转变换
        x = x + self.Origin_x
        y = y + self.Origin_y   ## 进行平移变换
        return x,y


    def DrawLoop(self):
        x,y = self.CalcCoord(self.x_ptr,self.y_ptr)
        self.ax.scatter(x,y)


    def Statement(self):    ## 重写statement ,让每次ForStatement执行完毕后画图
        self.enter("Statement")
        if self.token.type == sc.Token_Type.ORIGIN:
            self.OriginStatement()
        elif self.token.type == sc.Token_Type.SCALE:
            self.ScaleStatement()
        elif self.token.type == sc.Token_Type.ROT:
            self.RotStatement()
        elif self.token.type == sc.Token_Type.FOR:
            self.ForStatement()
            self.DrawLoop()
        # elif self.token.type == sc.Token_Type.CONST_ID or self.token.type == sc.Token_Type.L_BRACKET or \
        #     self.Expression()
        else:   self.SyntaxError(2)
        self.back("Statement")

    # 绘图语言解释器入口(与主程序的外部接口)
    def Parser(self):  # 语法分析器的入口
        self.enter("Parser")
        if (self.scanner.fp == None):  # 初始化词法分析器
            print("Open Source File Error !\n")
        else:
            self.FetchToken()  # 获取第一个记号
            self.Program()  # 递归下降分析
            plt.show()
            self.scanner.CloseScanner()  # 关闭词法分析器
            self.back("Parser")

Step 2 :semanticmain.py - 解释器主函数入口

#!/usr/bin/env python
# encoding: utf-8
''''''
@author: 黄龙士
@license: (C) Copyright 2019-2021,China.
@contact: iym070010@163.com
@software: xxxxxxx
@file: parsermain.py
@time: 2019/11/26 22:31
@desc:
''''''

import scannerfunc as sf
# import parserfunc as pf
import semanticfunc as paint
import os

file_name = ''test.txt''
scanner = sf.scanner(file_name)
semantic = paint.semantic(scanner)
semantic.initPaint()
semantic.Parser()
# parser = pf.Parsef(scanner)
# parser.Parser()

# os.system("pause")

实现结果

  • 对于测试程序(1):

  • 对于测试程序(2):

  • 对于测试程序(3):

  • 对于测试程序(4):

  • 对于测试程序(5):

android 手机端直接执行jar包

android 手机端直接执行jar包

 

 

1.将项目导出为jar包

2.使用dx命令将jar转为dex文件(android下执行文件为dex)

 

3.将生成的dex文件加入到jar包中(直接用压缩软件拖进去)

 

4.将jar包导入到/data下

 

5.切换为su用户,执行

 

 

摘自android应用安全防护和逆向分析

 

C++脚本解释器-Cint介绍

C++脚本解释器-Cint介绍

准备工作

  1. msys和mingw, Cint使用Unix系的编译风格,configure和make需要GNU的Shell。在Windows下,可以使用msys(主页: www.mingw.org, 个人认为,作为C++编程人员,msys应该是必备的)。
  2. VC,这是费话,呵呵,我用的是VC2005 Express。当然,如果你用的是其它编译器也行。
  3. 安装好msys后,在msys\bin里建一个文本文件:cygpath, 里面的内容为:
    #!/bin/sh
    # A simple cygpath replacement

    until [ -z "$1" ]
    do
    if [ "${1:0:1}" != "-" ]; then
    echo $1 | sed -e ''s/\\/\//g'' -e ''s/^\([a-zA-Z]\):/\/\1/g''
    fi
    shift
    done
    CInt的make文件里使用了cygpath命令,这个命令是把Windows风格的路径改成Unix风格。由于msys两种风格都能支持,所以就没有 提供这个命令,只能自己写一个凑数啦。

开始编译

  1. 进入VC命令行环境
  2. 在VC命令行环境下执行msys.bat进入msys,这样进入的msys才能正确调用VC编译器。
  3. 输入./configure --arch=msvc8,后面的msvc8根据你的编译器决定,可选的有:linux linuxicc macgcc djgpp cygwin mingw mwerks hpux aix msvc7 msvc8 solaris solarisgcc
  4. 很快执行后会生成一个叫makefile.conf的文本文件,如果愿意,可以把makefile.conf里的编译选项-MD 改成-MT。
  5. 输入make编译,最终生成libcint.dll、libcint.lib、cint.exe、makecint.exe四个 东东,以及脚本专用头文 件。
  6. 到这里,我们Cint的编译工作已经完成。

编译脚本预编译库

现在我们已经可以用Cint编写可解析C++语言的程序了,当然里面用到的函数都得自己写。另外,Cint已经提供了一部分库代码,只 要编译好这些代码并把相应的 DLL放到Include目录里就可以在脚本中当作普通头文件来用了。

Cint所有库代码都在lib目录里,这里以win32api为例,这个库提供了一小部分WinAPI函数供脚本使用

还是在msys中

  1. 首先把\include\windows.h和\include\winsock.h改名,比如改成_windows.h和 _winsock.h。这是为 了防止编译时引用错头文件(现在要的是VC自带的windows.h)
  2. 进入lib\win32api
  3. 输入makecint -mk Makewin -dl win32api.dll -h +P cintwin.h -P winfunc.h -cint -Z0, 生成一个名为Makewin文件
  4. 修改Makewin。(唉,都是Unix和Win不同造成的)
    # CINT := $(shell whereis cint.exe)
    # 改成
    # CINT := 绝对路径cint.exe,比如我的CINT := D:\Code\libs\cint-5.16.19\cint.exe

    # LIBS := -LIBPATH:$(CINTSYSDIRW) $(subst @imp@,cint,lib@imp@.lib) kernel32.lib user32.lib gdi32.lib comdlg32.lib advapi32.lib
    # 改成
    # LIBS := $(CINTSYSDIRW)$(subst @imp@,cint,lib@imp@.lib) kernel32.lib user32.lib gdi32.lib comdlg32.lib advapi32.lib

    # CINTSYSDIRW := $(shell cygpath -m $(CINTSYSDIRU) )
    # 改成
    # CINTSYSDIRW := $(CINTSYSDIRU)
  5. 如果愿意,可以把-MD选项改成-MT
  6. 搞定后输入 make -f Makewin
  7. 如果没出错,会生成一个win32api.dll文件,把它复制到\include里
  8. 最后别忘了把之前改名的\include\windows.h和\include\winsock.h改回来
  9. 为了验证是否正确编译,可以用VC打开\demo\Win32App\graph01目录下的项目文件编译试试。(注意要修改一 下项目的路径设置)

Ch/CINT — C/C++语言脚本解释器

Ch/CINT — C/C++语言脚本解释器

1.CH
Ch是一个跨平台的C/C++脚本解释器,它支持ISO的C语言标准(C90/C99)和C++类库,附带了8000多个函数库并支持众多的工业标准,支 持POSIX, socket/Winsock, X11/Motif, OpenGL, ODBC, C LAPACK, GTK+, Win32, XML, 和CGI等等。Ch具有MATLAB的高级数值计算和绘图的功能,且具有良好的交互性,在C/C++语言编程学 习方面尤为好用(试试就知道了)。Ch也是一个可嵌入的脚本引擎,可以无缝地嵌入到已编译的程序中。

Ch5.5以前的版本是完全免费的(我有收藏,哦,5.5版对应的IDE是ChSciTE :http://chscite.sourceforge.net/), 最新版本是Ch6.1,分为学生版(免费,建议下载),标准版(免费)和专业版,评估版(查看版本差别请点这里)。 官方网站:http://www.softintegration.com/

利用Ch,C/C++程序无需编译就可以直接在多平台上运行。它实现了一种语言、到处运行的解决方案(One Language for All?),下面是从命令行运行CH时的截图。



2.CINT
http://root.cern.ch/drupal/content/cint

这个软件一直没有用过,不知哪位网友可以推荐一些实用方法,O(∩_∩)O哈哈~

关于#! 脚本解释器如何不加node 直接执行js文件的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于<编译原理 - 函数绘图语言解释器(3)解释器 - python>、android 手机端直接执行jar包、C++脚本解释器-Cint介绍、Ch/CINT — C/C++语言脚本解释器的相关信息,请在本站寻找。

本文标签: