类似CoffeeScript的C/C++语言
CoffeeScript-like language for C/C++
我一直在寻找一种语言,它提供与Coffeescript相同的功能,但适用于C/C++。我指的是一种将代码转换为C,但可读的语言,就像CoffeeScript转换为Javascript一样,可读。
我认为这是可能的,甚至是可取的(在编写Node.js本机模块时,我不情愿地使用C++),但比使用JavaScript等高级语言更具挑战性。
你想要的是一种在不牺牲性能或灵活性的情况下提供语法糖的语言。一些语法糖(比如,语法空白或Ruby风格的def/end
块,而不是大括号)添加起来很简单。但是,添加任何更高级的东西,都会遇到两个主要障碍:静态类型和垃圾收集。
例如,假设您想要添加隐式返回。这似乎是一个小功能,但仔细想想:为了使该功能有用,当最后一个表达式的值与函数的返回类型不匹配时,您至少必须抛出编译时错误。这意味着您的编译器需要检查类似的行
a->b
并弄清楚它是什么类型。原则上这是可能的,但这比CoffeeScript编译器要多得多。
或者说你添加了列表综合。这意味着您正在分配一个在编译时长度未知的数组,这意味着您以后需要自己解除分配它。所以句法糖实际上可能会伤害你。如果编译器为您添加malloc
,则"如果您malloc
,则您free
"规则不起作用,除非它能找出将free
放在哪里(同样,这通常是可能的,但需要大量工作)。
所以,虽然我很想有人给C++CoffeeScript处理,但我不希望它很快发生——如果有的话。我认为世界最终更有可能转向D或Go这样的系统级编程。
我认为OOC可能是最接近C的Coffeescrapt。它是一种编程语言,具有许多动态语言(对象、第一类函数、干净语法)的功能,可以直接编译到C99中。
http://ooc-lang.org/
您可能想知道的Jacindas列表中缺少一项:Vala/Genie是一个以C为目标的编译器,由Gnome编写的GObject库实现对象。Vala是类似C#的语法,Genie是类似Python的语法,但对于其他语法,它们是相同的系统。它的创建实际上是因为裸露的C+GObject对Gnome的人来说太痛苦了。Vala基于引用计数或所有权跟踪进行对象和自动内存管理,以及在类似C#的语言中所期望的许多其他功能。
至于类似CoffeeScript的属性,我刚刚看到有一个实验功能可以禁用生成的代码对GObject的依赖性,所以它只生成普通的C,没有任何运行时依赖性。这样做会禁用许多更高级的OO功能,但它仍然为您提供了更好的语法、基本的对象系统和(半)自动内存管理。
我不知道输出的可读性有多强,但如果你用一台漂亮的打印机打印,它可能非常接近你想要的。
SugarCpp是一种可以编译到C++11的语言。这应该是你想要的。参观https://github.com/curimit/SugarCpp了解更多详细信息。
具体针对Python,看看这个问题:将Python程序转换为C/C++代码?
他们提到了Shed-Skin,它将采用纯python的一个子集,并转换为独立的C++代码。
Cython通常用于创建Python扩展模块,但如果嵌入了Python解释器,则可以创建独立程序。不过,这听起来不像你想要的。
Cython基于Pyrex,它们在许多方面都是兼容的。
对于您提到的其他一些语言,似乎也有类似的项目:Ruby和PHP。Java的Toba(虽然不再维护),Algol的Marst,BASIC的BCX,COB2C,Pascal的PtoC,我可能应该在这变成"从Foo到C/C++的转换器列表"之前停止
希望能有所帮助!
看看这个全新的项目:https://bixense.com/coffeepp/
咖啡++
Coffee++是一种可以编译成C++的小语言。它被创建为具有类似于C++的CoffeeScript的东西。目前Coffee++处于alpha状态,根本无法使用或最终使用。查看Github上的源代码以参与其中。
Coffee++的黄金法则是:;它只是C++";。代码一对一编译成等价的C++,并且没有运行库。您可以从Coffee++无缝地使用任何现有的C++库(反之亦然)。
概述:
源文件Test.cf++
include iostream
int main():
age := 5
dog := Dog(age)
if age != 7:
dog.bark()
class Dog:
public Dog(int age):
this->age := age
public void bark():
std::cout << "Woof!n"
private int age
};
编译的Test.hpp
#pragma once
int main();
class Dog {
public:
Dog();
void bark();
private:
int age;
};
编译的Test.cpp
#include "test.hpp"
#include <iostream>
int main() {
auto age = 5;
auto dog = Dog(age);
if (age != 7) {
dog.bark();
}
}
Dog::Dog(int age) : age(age) {
}
void Dog::bark() {
std::cout << "Woof!n";
}
既然已经提到了vala和genie,我将推出BaCon(Basic Converter),供那些回忆起每月打印出版物中手工编码程序,但想将其与现代GUI一起使用的人使用。
Must run on each Unix/Linux/BSD platform, including MacOSX
Converted sourcecode must be compilable with GCC
Must resemble genuine BASIC with implicit variable delarations
Spoken language constructs are preferred
网站http://www.basic-converter.org/有很多例子(有些主题对"BASIC"来说相当复杂),几乎每个开源IDE都有插件,或者你可以使用BACON IDE。
好吧,这不是你想要的,但..:http://www.campbell.nu/oscar/cython/index.html-这个cython/cellc是我在1999/2000年左右编码的C/C++的一个重要的空间(蟒蛇)转译器,它与七年后到来的cython项目无关。
坦率地说,我是用Perl写的,它是启发式的,使用正则表达式。我把它用于Gameboy Color游戏的整个项目(常规ansi C)。但我不会相信它……这就是为什么我也四处寻找,而不是使用那个尘土飞扬的老家伙;)
后续行动:我一直在研究Onyx(https://github.com/ozra/onyx-lang)经过一年多的时间,终于意识到要做的显而易见的事情是重写它,将其编译为C++,而不是LLVM-IR。重新定位的想法是全新的,所以重写仍然是蒸汽。但是你的输入会在RFC中得到很好的利用,如果你喜欢这种语言的想法,那就是你塑造它的机会
- 不同语言中相同代码的不同行为
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- r语言 - C++ 类型为"const std ::?
- 通用C++/Python 多语言的存在
- 为什么我的 EnumWindowProc 不能用 C 语言编译?
- 了解算法的性能差异(如果以不同的编程语言实现)
- Rextester 语言编译C++问题
- 如何将多种语言设置放在单个 .clang 格式文件中
- 不同语言中的模运算符差异
- 刚接触C++,难以理解语言的细微差别
- 为什么开发人员将C / C ++用于嵌入式系统,而不是像Python这样的高级语言与C相比?
- 我们可以用 C 语言嵌套 #define 和 #if 吗?
- 我的C++语言蛮力算法有问题
- 如何删除已输入的书以及如何使标题,语言和名称在上面放置空格不会出错?
- 为什么编程语言被编译为汇编程序而不是二进制?
- QDirIterator语言 - No hasNext not FilePath reaction
- "C.UTF-8" C++ Windows 上的语言环境?
- 了解 cin.fail() 和 cin.clear语言 - Vector 追加程序
- '_HAS_CXX17'宏是否可用于自定义项目标头以启用C++17 语言集功能?
- 有没有办法为macOS上的C++程序指定自定义语言环境目录