注意:标题是故意挑衅的(让你点击它并想要关闭投票的问题),我不想看起来全神贯注.
我一直在阅读和听到越来越多关于PyPy的内容.这就像一个线性图.
为什么PyPy如此特别?据我所知,用语言本身编写的动态语言的实现并不是那么罕见,或者我没有得到什么?
有些人甚至称PyPy为"未来"[python],或者在此实现中看到某种深层潜力.这究竟是什么意思?
我想知道是否有一种编程语言可编译为机器代码/二进制文件(不是字节码然后由VM执行,在考虑打字时完全不同),它具有动态和/或弱类型,例如:
想一下编译语言,其中:
问题:
我认为一种动态但强大的类型化编译语言真的能感觉到,但它有可能吗?
我只是想知道它是否100%可能,如果我的语言是turing-complete,写一个打印出来的程序(当然不使用文件读取功能)
因此,如果语言只有真正必要的东西,以使其完成(我会证明通过将Brainf*ck代码翻译成它),如输出,变量,条件和gotos(地狱是的,得到的),我可以尝试在里面写一个quine?
我也问这个问题,因为我不确定quin是否直接符合图灵定律,即图灵机能够完成任何计算任务.我只是想知道,所以我不会尝试多年而不知道这可能是不可能的.
我是Win32 API的新手,许多新类型开始让我感到困惑.
一些函数将1-2 ints
和3 UINTS
作为参数.
然后,还有其他类型:
DWORD LPCWSTR LPBOOL
Run Code Online (Sandbox Code Playgroud)
这个是痛苦的: WCHAR*
我不得不遍历它并将每个字符push_back到std :: string,因为没有其他方法可以将它转换为一个.可怕.
WCHAR
?为什么重新发明轮子?他们本来可以用char*
,或者?在我的实验性编程语言的解释器中,我有一个符号表.每个符号由一个名称和一个值组成(值可以是:例如:string,int,function等类型).
首先,我用一个向量表示该表,并通过符号迭代检查给定的符号名称是否合适.
然后,我使用地图,在我的情况下map<string,symbol>
,总是比迭代迭代矢量更好,但是:
解释这部分有点难,但我会试试.
如果在我的语言的程序中第一次检索变量,当然必须找到它在符号表中的位置(现在使用向量).如果我每次执行该行时都会迭代向量(想想一个循环),那么它将非常慢(因为它目前是,几乎和microsoft的批处理一样慢).
所以我可以使用地图来检索变量: SymbolTable[ myVar.Name ]
但想想以下内容:如果第一次找到仍使用向量的变量,我可以将它的精确整数位置存储在向量中.这意味着:下次需要它时,我的解释器知道它已被"缓存"并且不会在符号表中搜索它,而是执行类似的操作SymbolTable.at( myVar.CachedPosition )
.
现在我的(相当难的?)问题:
我应该使用向量作为符号表,同时缓存向量中变量的位置吗?
我应该使用地图吗?为什么?[]运算符的速度有多快?
我应该使用完全不同的东西吗?
我想用我刚刚创建的编程语言构建一个Brainfuck(该死的名字)解释器,以证明它是图灵完整性.
现在,到目前为止一切都很清楚(<>+-,.
) - 除了一件事:循环([]
).我假设你从这里知道(极其困难的)BF语法:
伪代码怎么样?当解释器到达循环开头([
)或循环结束(]
)时,我该怎么办?
检查循环是否应该继续或停止不是问题(current cell==0
),但是:
由于循环可以嵌套,我想我不能只使用包含当前循环起始位置的变量.
我已经看到用各种语言实现的非常小的BF解释器,我想知道他们是如何设法让循环工作却无法解决的.
为了给函数提供修改向量的选项,我不能这样做
curr = myvec.at( i );
doThis( curr );
doThat( curr );
doStuffWith( curr );
Run Code Online (Sandbox Code Playgroud)
但我必须这样做:
doThis( myvec.at( i ) );
doThat( myvec.at( i ) );
doStuffWith( myvec.at( i ) );
Run Code Online (Sandbox Code Playgroud)
(正如我的另一个问题的答案所指出的那样)
myvec.at()
那时我打算打个电话.与使用变量存储结果的第一个示例相比,它有多快?
我有不同的选择吗?我可以以某种方式使用指针吗?
当它变得严重时,myvec.at()
每秒会有数千个呼叫.所以每个小表现都很重要.
"介绍"
我对C++比较陌生.我完成了所有基本的工作,并设法为我的编程语言构建了2-3个简单的解释器.
给出的第一件事让我头疼:用C++实现我语言的类型系统
想一想:Ruby,Python,PHP和Co.有很多内置类型,显然是用C实现的.所以我第一次尝试的是让我的语言中有三种可能的类型:Int,字符串和零.
我想出了这个:
enum ValueType
{
Int, String, Nil
};
class Value
{
public:
ValueType type;
int intVal;
string stringVal;
};
Run Code Online (Sandbox Code Playgroud)
是的,哇,我知道.由于必须一直调用字符串分配器,所以传递这个类非常慢.
下次我尝试过类似的东西:
enum ValueType
{
Int, String, Nil
};
extern string stringTable[255];
class Value
{
public:
ValueType type;
int index;
};
Run Code Online (Sandbox Code Playgroud)
我会存储所有字符串stringTable
并将其位置写入index
.如果类型Value
是Int
,我只是存储在整数index
,它不会在所有使用一个int索引来访问另一个INT意义,还是?
无论如何,上面也让我头疼.过了一段时间,从这里的表中访问字符串,在那里引用它并在那里复制它变得越来越多 - 我失去了控制.我不得不放下翻译稿.
现在:好的,所以C和C++是静态类型的.
上面提到的语言的主要实现如何处理程序中的不同类型(fixnums,bignums,nums,strings,arrays,resources,...)?
我应该怎么做以获得许多不同类型的最大速度?
解决方案与上面的简化版本相比如何?
请看一下这个例子:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class mySubContainer
{
public:
string val;
};
class myMainContainer
{
public:
mySubContainer sub;
};
void doSomethingWith( myMainContainer &container )
{
container.sub.val = "I was modified";
}
int main( )
{
vector<myMainContainer> vec;
/**
* Add test data
*/
myMainContainer tempInst;
tempInst.sub.val = "foo";
vec.push_back( tempInst );
tempInst.sub.val = "bar";
vec.push_back( tempInst );
// 1000 lines of random code here
int i;
int size = vec.size( );
myMainContainer current;
for( i …
Run Code Online (Sandbox Code Playgroud)