在本文中,我们将带你了解#!脚本解释器在这篇文章中,我们将为您详细介绍#!脚本解释器的方方面面,并解答如何不加node直接执行js文件常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的、and
在本文中,我们将带你了解#! 脚本解释器在这篇文章中,我们将为您详细介绍#! 脚本解释器的方方面面,并解答如何不加node 直接执行js文件常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的<编译原理 - 函数绘图语言解释器(3)解释器 - python>、android 手机端直接执行jar包、C++脚本解释器-Cint介绍、Ch/CINT — C/C++语言脚本解释器。
本文目录一览:- #! 脚本解释器(如何不加node 直接执行js文件)(#脚本解释器是什么)
- <编译原理 - 函数绘图语言解释器(3)解释器 - python>
- android 手机端直接执行jar包
- C++脚本解释器-Cint介绍
- Ch/CINT — C/C++语言脚本解释器
#! 脚本解释器(如何不加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>
-
<编译原理 - 函数绘图语言解释器(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包
1.将项目导出为jar包
2.使用dx命令将jar转为dex文件(android下执行文件为dex)
3.将生成的dex文件加入到jar包中(直接用压缩软件拖进去)
4.将jar包导入到/data下
5.切换为su用户,执行
摘自android应用安全防护和逆向分析
C++脚本解释器-Cint介绍
准备工作
- msys和mingw, Cint使用Unix系的编译风格,configure和make需要GNU的Shell。在Windows下,可以使用msys(主页: www.mingw.org, 个人认为,作为C++编程人员,msys应该是必备的)。
- VC,这是费话,呵呵,我用的是VC2005 Express。当然,如果你用的是其它编译器也行。
- 安装好msys后,在msys\bin里建一个文本文件:cygpath, 里面的内容为:
#!/bin/sh
CInt的make文件里使用了cygpath命令,这个命令是把Windows风格的路径改成Unix风格。由于msys两种风格都能支持,所以就没有 提供这个命令,只能自己写一个凑数啦。
# 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
开始编译
- 进入VC命令行环境
- 在VC命令行环境下执行msys.bat进入msys,这样进入的msys才能正确调用VC编译器。
- 输入./configure --arch=msvc8,后面的msvc8根据你的编译器决定,可选的有:linux linuxicc macgcc djgpp cygwin mingw mwerks hpux aix msvc7 msvc8 solaris solarisgcc
- 很快执行后会生成一个叫makefile.conf的文本文件,如果愿意,可以把makefile.conf里的编译选项-MD 改成-MT。
- 输入make编译,最终生成libcint.dll、libcint.lib、cint.exe、makecint.exe四个 东东,以及脚本专用头文 件。
- 到这里,我们Cint的编译工作已经完成。
编译脚本预编译库
现在我们已经可以用Cint编写可解析C++语言的程序了,当然里面用到的函数都得自己写。另外,Cint已经提供了一部分库代码,只 要编译好这些代码并把相应的 DLL放到Include目录里就可以在脚本中当作普通头文件来用了。
Cint所有库代码都在lib目录里,这里以win32api为例,这个库提供了一小部分WinAPI函数供脚本使用
还是在msys中
- 首先把\include\windows.h和\include\winsock.h改名,比如改成_windows.h和 _winsock.h。这是为 了防止编译时引用错头文件(现在要的是VC自带的windows.h)
- 进入lib\win32api
- 输入makecint -mk Makewin -dl win32api.dll -h +P cintwin.h -P winfunc.h -cint -Z0, 生成一个名为Makewin文件
- 修改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) - 如果愿意,可以把-MD选项改成-MT
- 搞定后输入 make -f Makewin
- 如果没出错,会生成一个win32api.dll文件,把它复制到\include里
- 最后别忘了把之前改名的\include\windows.h和\include\winsock.h改回来
- 为了验证是否正确编译,可以用VC打开\demo\Win32App\graph01目录下的项目文件编译试试。(注意要修改一 下项目的路径设置)
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++语言脚本解释器的相关信息,请在本站寻找。
本文标签: