【半跑题】【求扫盲】能写独立程序的语言是多数还是少数?
mathematica吧
全部回复
仅看楼主
吧务
level 15
xzcyr 楼主
如题,这是一个求扫盲帖,下面的提问用语可能会很不准确……我一直在潜意识里觉得“不能编写独立的程序/不能编写脱离Mathematica运行的程序”是Mathematica的缺点之一,毕竟,自己过去接触的程序语言们好像都是可以做到这点的。可就在刚才我突然产生了一个念头:不能写“独立”的程序会不会其实是编程语言的一种常态?
仔细想想,我所接触的所谓“可以编写独立程序”的语言,其实也就是本科时代的VB与近几年零星接触的C和fortran罢了。其他语言怎么样呢?Maple不可以;MATLAB,见过这么吼的,没见过实际成功的;Julia,应该是不行的;Java,我好像已经接触了不止一个需要同时安装Java虚拟机(是叫这个吗)的软件了;Perl,谁来告诉我LaTeX包Latexdiff为什么一定要装了Perl才能运行?Python,好像见过由它编写的独立程序,但是需要同时装Python的我也见过(程序员水平不行?)……回头想想,即使是我脑海中可以编写独立程序的C和VB……谁来给我讲讲在安各种程序时一并装上的这一大堆东西到底是啥?:
于是,能编写“独立”程序的语言该不会其实并不多?
2016年06月04日 11点06分 1
level 1
这个问题没有那么重要,能快速解决手里的问题才是。
一般解释型的编程语言(又称脚本语言)的程序都需要一个运行库,可以认为不是独立的,如Python、Perl、Ruby、Lua、Lisp、MATLAB、Maple、Mathematica等。但是你可以将运行库和程序捆在一起发布,这样看起来是独立的,只是包会比较大(几MB至几十MB不等)。Java和C#类似,它们不是纯解释型的,而是边编译边执行,但对库的依赖比较严重,分别需要JRE和.NET Framework支持,也可认为不是独立的。
编译型的编程语言可以认为是独立的,如C、C++、Delphi、Rust等。它们实际仍是需要运行库的,只是多了一种选择,你可以将库静态链接到程序中,这样程序会一定程度变大,但不会大太多(一般多一两百KB,比脚本语言中整个运行库打包小多了,后者至少要几MB),这样的程序只会依赖很少的系统库,如kernel32.dll、user32.dll、gdi32.dll,在每个Windows系统中都有,不需要和程序捆在一起发布,因此这样的程序可以认为是独立的。
如果静态链接多出来的那一两百KB是一个问题,可以用动态链接,此时产生的程序仍是单个EXE,但是需要msvcrt.dll,或者msvcr10.dll(视编译器版本不同会有不同依赖),就需要装你提到的那些Visual C++ Redistributable(或其他编程语言中的等价物,如VB的msvbvm.dll),否则会在开始运行EXE时报错。还有但是,那就是如果你的系统已经装过不少软件,那么这些Visual C++ Redistributable极有可能已经装上,此时这个EXE也能直接运行,只是换台没装对应Visual C++ Redistributable的系统就不行了。
我是在“钢铁是怎样炼成的”看到了楼主的贴子,用你的图片正录入《暴风雨的儿女》(https://tieba.baidu.com/p/4590303916),点你的动态,看到了这个贴子,所以来回复一下,我是程序猿[吐舌]
2016年06月04日 12点06分 3
哦~哦,没想到这么短时间内就出现了一个这么详尽的回答,钢吧那边也是,这可真是双重惊喜啊。
2016年06月04日 12点06分
level 8
@xzcyr 前某吧吧主好 [吐舌],头像一直这个 windows 画图的没有变呐。。
你说的独立运行大概就是编译成 x86 或其他机器汇编码在机器上直接运行吧。
程序语言是独立于编译器实现的。一些人组织起来给一个程序语言定义一个标准,描述语言的语法,语义等。然后每个编译器就是对这个语言的一种实现。
像 C,fortran 这样的就有很多种编译器,这些编译一般会说自己支持 C 的哪个版本的标准。没有被标准描述的行为定义取决于编译器的实现。
直接翻译成机器码一般都是为了效率考虑。
现在 CPU 跑得快了,很多语言就开始用虚拟机了。这样更容易移植到不同的平台,也容易做一些运行时的优化,安全检查等。只要一个编译器把高级语言编译成平台无关的,在虚拟机上跑的汇编,再实现不同平台上的虚拟机即可。虚拟机把虚拟机上的汇编翻译成机器指令执行。
能否独立运行取决实现的,像 Python 也有 Cython 这样的先编译成 C 再用 C 编译器翻译成机器码。
像 Mathematica 这样的 knowledge-based 的语言,显然很多很多东西在后面放着,(额,要是把 mathematica 程序依赖的库提出来,应该也能独立运行。Matlab 就能导出 C/C++ 代码。。
(我只是过来下个盗版。。
2016年06月08日 04点06分 4
呀咧呀咧,那边的人来到这里的一天还真的来了啊。然后,Mathematica其实也可以导出C代码。
2016年07月02日 05点07分
吧务
level 11
比如matlab是可以打包成exe发布的 但是使用它还需要一个1G左右的运行时
我看到python也可以打包成exe.那它也需要额外安装运行时吗?
2016年06月09日 13点06分 5
……这么说来Matlab编的exe其实是和Mathematica的.cdf一个级别的玩意儿?
2016年07月02日 05点07分
@xzcyr 可以这样说
2016年07月02日 07点07分
12.3.1最新版的mma可以编译独立的了吗?
2021年09月18日 06点09分
没看懂,"1G左右的运行时"是什么?
2016年06月09日 15点06分
level 11
马克,要是mma可以直接转成C语言计算就好了[泪]
2016年06月09日 15点06分 6
level 1
真要说完全独立不依赖其他的,那就只有一种:机器码,即0和1
其他语言都是至少需要一个编译器或者解释器的。
解释型语言永远不可能独立运行,必须依赖解释器的存在。
编译型语言看情况,有些语言是不完全编译(如java),有些是完全编译。
编程语言其实都是高层的应用(相对于底层的硬件和指令来说),与我们平时用的各种软件是同一个层级的应用。机器只能读机器码,只有那些可以生成机器码的语言才可以被开发成独立存在的工具的
2016年07月03日 10点07分 7
level 1
楼主想说的可能是指解释型语言和编译型语言的问题吧?
解释性语言又叫脚本语言,属于动态语言(比如HTML,ASP,PHP,Python,Matlab,Mathematica等,当然Java也可以认为是这种,不过它更像是解释型和编译型的中间体),脱离了解释器就没法运行(解释器本身就是将脚本语言编译成为机器语言来运行的)。
因此只要你学过编译原理,自己也可以写一个解释器,写一种自己定义各种语法规则的语言。至于用什么语言来写,当然是编译型的了。
你所谓的独立运行指的是编译好了的,脱离某个平台或者解释器的,这就是编译语言所做到的。脚本语言不需要编译,输入一句运行一句(因此只会在运行时报错,而不会出现编译前就报错)。编译型语言直接会编译成目标代码然后连接各种库,得到最终的可执行EXE二进制程序(这里指的是Windows平台下),当然如果要修改代码就要重新编译。
至于链接的动态和静态链接库,看程序本身是否引用到相关库函数(外部库,自己可下载),操作系统自带自带的库涉及到控件或者外观显示以及特殊的内部处理有关的东西,如果是简单工程基本上不会用到。
另外,同一个语言类型的源代码(比如c语言)在不同平台运行结果可能略微不同,甚至有些会报错(跟操作系统有关)。
2016年07月06日 11点07分 8
所以说,脚本语言是最多的。
2016年07月06日 11点07分
level 7
简而言之, 任何程序(不管是编译型还是解释型)都需要运行时(Runtime)
Windows下面的exe无非是把Windows整个操作系统作为运行时, 也就以为它可以"独立运行", 这也是为什么Windows的程序在Mac下跑不了, 但是可以用Wine提供一个相对简陋的运行时; Windows 7的程序需要用兼容模式可以勉强跑在Windows 98上面.
至于解释型语言, 那更简单了, 解释器(Python)就是"独立程序", 我们认为的Python程序不过是它的文档而已, 这就和PhotoShop vs .png, Word vs .doc的关系是一样的, 不过习惯称呼.png叫图片, .doc叫文档, .py叫程序而已.
2017年03月10日 03点03分 10
level 9
虽然挖坟,但还是想说matlab的代码生成是真的香。基本算生产力级别的
2021年09月18日 14点09分 11
再强调一遍,吧里对挖坟没限制,有价值的主题就应该不断讨论下去。还有,涉及软件比较请尽量具体。
2021年10月02日 03点10分
@xzcyr 工业场景例如汽车上很多都是在matlab和simulink上开发直接生成符合工业标准代码直接使用的。你要例子可以去看官网的。代码生成包括PC(win/mac/linux)平台,嵌入式平台,FPGA,SoC,GPU等等,并且还有polyspace这种专门的静态分析工具。
2021年10月03日 22点10分
@xzcyr 具体的例子可以去官网上用户案例里看,那都是已经实践的工业案例。能在帖子里发出来的顶多是玩具案例,根本不足以表现威力
2021年10月03日 22点10分
level 4
一行代码只要调用mma函数,就已经属于'不独立'了,跨linux,win平台语言,是import sys实现的
2021年10月04日 21点10分 12
level 9
我来展示一下用matlab写独立运行的程序吧。
一个简单的图像识别程序(googlenet)
通过Matlab Coder工具箱生成的源代码,一共有300多个文件,需要用编译器编译如VS,mingw等。
编译完成以后有94个文件。
其中可执行文件只有第一个,不依赖matlab runtime,但需要一些动态库文件,大部分都是windows自带的,没有自带的可以放在应用程序目录即可,一般都很小。
编译后的大小为:
尝试运行一下:
这里的输入输出我在matlab里面已经写好了的,生成的源代码编译后会自动输出
源代码需要更改的地方:main.cpp
因为matlab只支持函数的生成,所以我要在main.cpp中写如何调用函数。我在matlab中写的函数是输入文件名即可,所以我在c++中也只需要输入文件名,很简单:
如果需要和mma的代码生成对比(基本没有)的话,我可以开一个单独的贴对比。
matlab 源代码:
2021年10月05日 08点10分 13
1