可以在C中默认通过指针传递

时间:2018-02-08 21:35:24

标签: c pointers compiler-construction

C是一种古老的语言。例如,你知道使用它没有问题吗?运算符而不是 - >运算符指针和 - >由于遗留原因而维护? see here

研究几个C代码,可以注意到大多数时间结构是使用指针而不是值传递的。数组也通过指针传递。

是否可以更改语法以默认将结构作为指针传递?例如,请考虑以下示例:

struct Point {
    float x;
    float y;
};

struct Line {
    Point! p0; // ! means that we want a value, not a pointer
    Point! p1;
};

struct Line2 {
    Point p0; // would be the same as Point*
    Point p1;

}

void foobar(Line line) { // would mean Line* line
    ...
}

void foobaz(Line! line) { // would mean Line line
    ...
}

我们不考虑可读性,例如,有些人认为 - >明确指出这是一个指针。这不是重点。

以下是一个问题:使用此类语法可能会出现哪些问题或可能出现的问题?例如:'使用这样的语法,就不可能做到这一点或那个'

Java实际上与此提议类似:一切都是引擎盖下的指针。区别在于Java具有垃圾收集器,并且对象总是在堆中分配(对象本身,而不是“指针”),而在C中,结构可以在堆栈中分配(尽管我看到在堆中分配的大部分时间) 。

如果有人想知道我为什么这么问,那是因为我正在为低级开发创建一种编程语言,我想优化常见情况的语法。虽然我喜欢C语言本身,但我不得不使用头文件(例如,在两个地方更新函数签名),缺乏对函数重载的支持(我不喜欢编写int_list_add,float_list_add)和类似。

感谢所有已经回复的人,但我并不是要修改C.这是对我语言的研究,我没有其他人可以使用。

我的语言是针对低级开发尝试尽可能使用高级内容,如OO内容,高级函数,闭包等。使用类似于C的存储模型(类似,不相等),它不会是带有收集器的收集器。

语言将像C一样有指针:你可以得到一些变量的地址,参考指针。

如果提出我问的问题非常重要,那么请转到我的语言语法,顺便说一下,它与C完全不同,这是我不想创建C克隆的证据。< / p>

record Point:
    x : float
    y : float

record Line:
    p0 : Point!
    p1 : Point!

record Line2:
    p0 : Point
    p1 : Point


function foobar : void
    @line : Line

function foobaz : void
    @line : Line!

正如我所说,我想为常见情况选择语言的语法。因此,如果我几乎一直都要通过指针,我不想再次使用*,一次又一次。唯一的问题(这与我的编程技巧无关,但是哲学问题)是我看不到明确指定指针可能引起的问题。

1 个答案:

答案 0 :(得分:6)

您可以更改C的语法和semantics(实际上比语法更重要),但不应再调用该语言C.

C是标准语言;首先阅读C11上的wikipage和n1570草案(或者从ISO或您的国家标准机构购买相应的纸张)

我不是律师,我不知道ISO是否以及如何合法地保护标准。 (但是,请确保如果你打电话给你的东西C,人们肯定会嘲笑你)。

  

例如:'使用这样的语法,就不可能做到这一点或那个'

不可能(您的语言和C语言都是Turing-complete)。有些事情可能会变得更加不方便。

顺便说一下,你没有准确地描述你在想什么(例子不是描述编程语言,而是你没有解释语义方面)。所以我们不能评论它。

阅读几种编程语言规范,不仅包括n1570,还包括n3337(接近C ++ 11规范),当然还有R5RS(一些简短的,写得很好的,一些Scheme方言的规范)

最后,请确保 实施您的编程语言(并以与C不同的名称命名)。我建议将其作为一些free software(例如,在github上)和bootstrap编译器实现。

因此,请尝试指定您的语言以及指定C或C ++或Scheme。然后实施。你可能需要几十年的工作,而你肯定需要几年时间。

首先阅读Dragon BookSICP&amp; Lisp In Small Pieces。另请阅读Denotational Semantics

考虑在GCCJITLLVM等图书馆或compiling it to C等图书馆的帮助下实施您的语言。然后你将有一个“概念验证”实现。玩得开心。

通过实现您的语言,您将发现其语义陷阱。 (我喜欢这样做。)

另请参阅其他语言,例如AdaGoOcamlRustModulaCyclone,{{3} },C ++(也许你正在重新发明它的引用,或者它的智能指针),Scheme ....

阅读Scott的Common Lisp书。