什么是 codebender?它解决了什么问题?
云端软件即服务 (SaaS) 开发使得只需阅读一些教程并开始编写代码就能轻松进行开发,而物理计算却远远落后。这在一定程度上是由于硬件设计难度较大,但像 Arduino 这样的平台已使这种情况成为过去。无需从数千种元件中寻找合适的元件,并尝试将它们连接起来而不烧坏任何元件,现在有大量电路设计可以很好地协同工作。
不过,我们还有很长的路要走。
不幸的是,大多数工具仍然停留在 90 年代。新用户必须安装不直观的应用程序或各种命令行工具和特定于平台的程序。codebender 正是在这里发挥作用。它是一个嵌入式开发平台,重点关注 Arduino,并且完全基于 Web,因此您无需安装、管理和更新任何内容。从本质上讲,我们将物理编程和物理世界带到了云端。
嵌入式软件开发人员的新开发工具
如我所述,我们首先完全基于云。这从本质上开始于将您的代码存储在云端,我们还存储各种设置、库和硬件配置。我们也在努力存储其他信息,例如电路原理图和最终产品的图像。因此,无需将所有这些资源分散在各个地方,您的项目的每个部分都捆绑在一起。
当与我们的协作和社交工具结合使用时,这一点变得更有意义。如果您想构建一些已经存在的成果,则无需重新发明轮子。您只需克隆现有的项目,即可获得代码、原理图、说明以及您可能需要的任何其他内容。
在编码方面,我们提供了语法高亮显示、缩进、自动格式化,以及即将推出的代码补全功能。由于您难免会犯错误,因此我们还提供了一个最先进的编译输出,让您能够更快、更轻松地识别问题。
我们的下一步计划当然包括某种版本控制,以及与 GitHub、Dropbox 等工具的集成。未来,我们计划添加更多协作工具,以促进用户之间知识和想法的交流。例如,团队项目和项目讨论。
最终目标是让人们能够构建更多东西
我们的目标是推广创客和黑客文化,并让越来越多的人将世界视为可以被黑客攻击、修改和改造的事物。我们坚信开源理念,并主张构建/开发而非无休止地消费。重要的是让人们意识到他们能够与周围环境互动并改善日常生活(或者仅仅构建很酷的东西),而无需成为专业的软件/硬件工程师,我们希望 codebender 能帮助他们做到这一点。这就是我们每天早上起床(并熬夜到第二天早上)的原因。
我们还认为,codebender 是经验丰富的开发者工具包中的一款宝贵工具,也是新手的友好场所,不会吓跑他们,而是引导他们进入激动人心的物理黑客世界。从这个意义上说,我们希望 codebender 发展成为一个社区驱动的知识和想法交流中心,创客、开发者/工程师、教师和艺术家等不同受众积极参与其中,在我们看来,这将是嵌入式设备编程的未来。
我们的开源项目
过去,我们个人和团队都发布了许多开源项目。就 codebender 而言,我们正在努力将整个系统设计为多个独立的子系统。因此,我们发布了 云编译器、云上传器(允许您通过网络远程编程嵌入式设备(目前仅限 TFTP,但很快将支持其他协议))、设备固件(引导加载程序),它为 Arduino 添加了远程网络编程支持、浏览器插件(允许您的浏览器与可编程 USB 设备通信),以及 网站 本身的代码。所有这些都是开源的。
想要更好地了解这些项目的用途以及它们如何协同工作?请观看此简短的屏幕录像
codebender 教程,由 codebender 发布在 Vimeo 上。
我们还使用许多其他开源项目,并回馈社区
在前端,我们使用 jQuery(久负盛名的 JavaScript 库)、Twitter 的 Bootstrap(用于华丽的 UI 元素)、Ace 编辑器(一款很棒的纯 HTML5 编辑器)以及 beautify.js(用于代码自动格式化)。
在后端,我们使用 Symfony 2 构建网站,并分别在 MySQL 和 MongoDB 上存储用户信息和项目。至于编译器,我们使用 gcc-avr(GCC 移植到 Atmel 的 AVR 架构版本)来构建二进制文件,但我们使用最先进的 Clang C/C++ 编译器执行高级语法分析。Clang 非常棒,因为它提供了非常棒的错误输出。以下是一个很好的例子(准备好听我赞美 Clang 的话吧)
#include
int myfunc(float first, float second)
{
return 0;
}
int main(void)
{
int variable1, variable2;
if(variable1 = variablr2)
{
printf("hello guys")
}
myfunc(variable1);
myfunc((float) variable1,);
myfunc((float) variable1, &variable2);
}
让我们解释一下这些错误。首先,我们在第 11 行有一个拼写错误(“variablr2” 而不是 “variable2”)。接下来,我们在第 14 行忘记添加臭名昭著的分号。最后,在第 15-17 行,我们以 3 种错误的方式调用了 myfunc()。
以下是 gcc 对此的说明
test.c: In function ‘main’:
test.c:11: error: ‘variablr2’ undeclared (first use in this function)
test.c:11: error: (Each undeclared identifier is reported only once
test.c:11: error: for each function it appears in.)
test.c:14: error: expected ‘;’ before ‘}’ token
test.c:15: error: too few arguments to function ‘myfunc’
test.c:16: error: expected expression before ‘)’ token
test.c:17: error: incompatible type for argument 2 of ‘myfunc’
相当不错,对吧?它找到了所有错误,并且在某些情况下非常有用。例如,我们可以推断出第 11 行的错误是拼写错误,我们知道第 14 行的错误是忘记了分号(除了它实际上在第 13 行),第 15 行和第 17 行的错误确实给了我们一些提示。第 15 行的错误报告略逊一筹,因为有两个闭合括号,但这是由于强制转换造成的,并且很快就能找出问题所在(大多数情况下)。
让我们看看 clang 对此的说明
if(variable1 = variablr2)
^~~~~~~~~
variable2
test.c:10:17: note: 'variable2' declared here
int variable1, variable2;
^
test.c:11:15: warning: using the result of an assignment as a condition without parentheses [-Wparentheses]
if(variable1 = variablr2)
~~~~~~~~~~^~~~~~~~~~~
test.c:11:15: note: place parentheses around the assignment to silence this warning
if(variable1 = variablr2)
^
( )
test.c:11:15: note: use '==' to turn this assignment into an equality comparison
if(variable1 = variablr2)
^
==
test.c:13:23: error: expected ';' after expression
printf("hello guys")
^
;
test.c:15:18: error: too few arguments to function call, expected 2, have 1
myfunc(variable1);
~~~~~~ ^
test.c:16:27: error: expected expression
myfunc((float) variable1,);
^
test.c:17:28: error: passing 'int *' to parameter of incompatible type 'float'
myfunc((float) variable1, &variable2);
^~~~~~~~~~
test.c:3:31: note: passing argument to parameter 'second' here
int myfunc(float first, float second)
^
1 warning and 5 errors generated.
这确实更详细,但也更有帮助。首先,Clang 识别到我们有一个名称非常相似的变量,并建议使用它。不仅如此,它还假设这就是我们最初的意思,并继续执行。从 gcc 中获得 100 个错误并修复第一个错误后所有错误都消失的情况并不少见。Clang 的假设在这方面有很大帮助,但需要一个很大的例子才能说明这一点。
接下来,我们有一个警告。新手和经验丰富的开发人员都会犯的一个最常见的错误是在赋值运算符和相等运算符之间混淆(“=” 而不是 “==”)。你可能没有注意到,是吗?我猜是 :) 因此,如果您在 if() 语句中赋值,Clang 会发出警告。别担心,如果您确实需要赋值,您可以将其包装在另一个括号中(这对您的代码没有任何影响),或者您可以完全禁用这些警告。
它还会为您提供有关第 13 行遗漏的分号的更精确的报告,但这只是一项小的改进。真正的乐趣从第 15-17 行开始。第 15 行的错误报告要好得多,因为它告诉我们需要多少个参数。第 16 行或多或少相同,但第 17 行是一个很好的改进。它不仅说明了错误的本质,还提供了我们传递的参数类型、预期类型以及函数的原型!这就是人们喜欢的东西!
用户至上
如果我想以某种东西结束,那就是它。您知道“顾客永远是对的”这句格言,但它远不止于此。在这个时代,真正重要的是用户。如果您构建某些东西,请确保使用它的人(例如,在库的情况下,其他开发者)喜欢它,并弄清楚他们需要什么。我总是说,如果您要制作某些东西,请制作人们渴望每天使用的东西。而不是他们出于必要才使用的东西。
关于 tzikis
我是一名希腊帕特雷大学计算机工程与信息科学系的大学生。当我不用学习的时候(也就是一直都在),我喜欢开发 FOSS 项目并推广开源硬件和软件运动。我还担任计算机技术研究所和“狄奥弗拉斯图斯”出版社的研究员,以及 P-Space(我们帕特雷当地的黑客空间)的联合创始人、当地帕特雷 LUG 的组织者,最近还担任 codebender 的首席开发者,codebender 是一个面向创客的基于 Web 的 IDE 和协作平台。
2 条评论