65.9K
CodeProject 正在变化。 阅读更多。
Home

一种新的 Web 编程语言

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.60/5 (9投票s)

2014年10月8日

CPOL

8分钟阅读

viewsIcon

21008

我们今天用于网页设计的编程语言是否真的足够适应我们的需求?

引言

有许多不同的编程语言被用于Web开发。本文旨在展示P* (P-star) 与其他广泛用于此目的的语言之间的区别。

目录

设计师 VS 极客

本质上,Web开发就是根据存储在某处的数据和用户输入来动态生成HTML标记。

一个网页可以分为两部分:代码部分,负责处理数据库和用户输入;以及HTML部分,负责设计。

有时,一个人可能会同时负责编码和HTML设计,这种人会适应将这两者混合在一起。然而,对于更大、更复杂的网页,我们需要专业的极客来编码,需要有艺术细胞的人来设计。

由于设计师不太懂编程,他们往往会搞乱极客们写的复杂代码。这个问题迫使我们将HTML与程序代码分开,解决方法是在HTML代码中只保留非常简单的代码(循环、条件和变量),这样设计师可以不费什么力气就看懂。数据库处理和用户输入处理则被单独保存,置于设计师接触不到的地方,并在这里为设计师准备好稍后使用的变量。

这种技术被称为模板化,不同的语言有不同的处理方式。

我应该使用什么模板引擎?

在维基百科上,有一个包含近百种模板引擎的列表,涵盖了许多不同的语言。这表明模板化确实有实际需求。这也告诉我们,这些语言本身并不原生实现模板化;模板引擎通常是一个外部模块。

用于Web开发的语言通常没有任何特殊功能来处理Web设计中这个重要的部分,开发者只能自己想办法解决。Java、Perl和C#是众所周知的通用语言,它们也被用来生成动态HTML标记。

还必须提到广泛使用的语言PHP。它与其他语言的不同之处在于,它几乎只用于Web设计,但在语言内部除了能嵌入HTML代码外,没有任何与Web设计相关的功能支持。PHP提供的只是一大堆庞大而混乱的内置函数,其确切数量无从统计。一些估计称大约有4500个函数

使用HTML模板的程序示例

缺乏语言内的模板处理是P*最初被创建的原因,P*原生支持模板化,它是该语言语法的一部分。

HTML_TEMPLATE document {
    <!DOCTYPE HTML>
    <html>
    <head>
    <title>{@title}</title>
    </head>
    <body>
    </body>
    </html>
}

SCENE main {
    string title = "P* Web Programming Language test page";

    #CONTENT_TYPE text/html;
    #HTML_TEMPLATE document;
}

预处理SQL语句

样板代码是指为了让程序正常工作而必须在程序中重复多次的相同代码副本。这包括检查库函数的返回值并打印错误消息,或者在程序顶部包含模块和头文件等。

Java中的MySQL预处理语句

你将遇到的最耗时的复制粘贴编辑之一就是创建预处理语句。下面是一个Java语言的例子。注意,PreparedStatement这个词被使用了七次,而且你必须为每个变量处理这个对象的setStringsetInt成员方法。

Class.forName("com.mysql.jdbc.Driver");
connect = DriverManager.getConnection("jdbc:mysql:///animal_kingdom?" + "user=dog&password=i_hate_cats");

// It is extremely boring work to set all this fields
preparedStatement = connect.prepareStatement("INSERT INTO animal_kingdom.persons VALUES (?,?,?,?,?)");
preparedStatement.setString(1, "Jo");
preparedStatement.setString(2, "Lene");
preparedStatement.setString(3, "jolene@hotmail.com");

// Sometimes we need to store strange properties of a person
preparedStatement.setInt(4, 135);
preparedStatement.setInt(5, 4);
preparedStatement.executeUpdate();            

你开始纳闷,为什么非要告诉Java "Jo" 是一个string类型。你还得手动计算所有问号的数量,并按正确的顺序设置变量。当然,当你还要处理查询中的列名,并且有20个不同类型的列需要插入时,这项工作就变得“非常有趣”了。

P*的作者,在本文中也被称为“某人”,曾被迫编写一个包装类,只为了跟踪列名、值和问号。我们不想花时间做这些,我们想创建网页!让我们来点更实在的。

P*中的MySQL预处理语句

接下来是P*中的相同示例,我们先指定变量而不是内联,就像你通常会做的那样。

string name = "Jo";
string surname = "Lene";
string email = "jolene@hotmail.com";
int weight = 135;   /* In kilograms */
int width = 4;      /* In feet */

SQL sql {
    INSERT INTO animal_kingdom.persons VALUES (
        {@name}, {@surname}, {@email}, {@weight}, {@width}
    )
}

MYSQL mysql->connect("localhost", "dog", "i_hate_cats");
mysql->select_db("animal_kingdom");

MYSQL_STMT stmt = mysql->new_statement();
stmt->prepare(sql);
stmt->execute();            

对此示例的常见反应

  • 等等……你说你不会内联变量,但你这么做了?
  • 你这个白痴!!!这是 SQL -- 注 -- 入 -- 攻 -- 击 -- !!!!

这种指定预处理语句的方式是P*的魔法。我们通常不会,也不应该将变量放在SQL字符串内。然而,因为我们很懒(并且为了避免第一个例子中那种可怕且容易出错的代码),我们可能会忍不住这样做。使用P*,你可以将变量放在SQL字符串内,而它们并不会被拼接进去。

整个SQL对象是一个由字符串和值指针组成的链条,P*会为你做那些脏活,将每个变量以正确的类型传递给MySQL。这些变量在传递给MySQL之前会被替换成问号,使其看起来像Java的例子一样。

人类语言与计算机语言

不同的编程语言基本上是我们与计算机对话、告诉它们做什么的不同方式。人类语言是人类彼此交谈的不同方法。人类语言和计算机语言当然在很多方面有所不同。

一个显著的区别是,人类语言比计算机语言动态得多。可能没有一个人知道任何一种语言的所有单词,这些单词通常有数万个之多。人们只知道日常生活中需要用到的词汇。

医生可能比普通人知道更多的医学词汇。当医生可以用一个词来描述一种状况时,普通人可能需要用很多词来做同样的事情。因此,在谈论医学时,医生的语言更有效率。

这同样适用于编程语言。你通常希望你使用的编程语言有特殊的词汇来帮助你加快编码速度,并使你的程序更容易阅读和维护。用于Web开发的语言应该提供专门针对你正在解决的任务的词汇和工具。

P*通过为SQL查询和HTML模板提供特殊语法,在幕后为你做那些繁琐的工作,试图让你能更容易地与计算机谈论Web设计。

参考手册中阅读更多关于P* SQL语法的信息。

源代码组织

当你开始一个新项目时,你需要把你的代码组织在某个地方,也就是存放程序代码的不同文件。对于应用程序项目,常用的一些工具有CMake、Autotools和Visual Studio。

在Web项目中,文件通常放在Web服务器的根目录下。Web服务器在那里找到它们,并调用适当的编译器来执行代码。

一些实现有更复杂的解决方案,比如JSP(Java Server Pages)。在这里,你通常需要预编译类并将它们放在特殊的目录中,以便Java引擎找到。JSP环境的配置有些复杂,除了实际的语言之外,还有很多新的术语需要学习。

P*不能被预编译,你只需使用#INCLUDE编译指示来加载其他文件。所有内容在首次运行时或文件被修改时都会自动编译。这使得开发变得非常容易。

如果你已经了解其他语言,如Java、C、C++、PHP或Perl,学习P*也很容易。配置Web服务器以执行P*非常简单,因为P*本身不需要任何配置。

P*程序通常既可以在Web服务器内部运行,也可以在外部使用命令行版本运行。这对于在编写代码时检查语法错误很有用。你还可以通过设置CGI环境变量来模拟用户输入。

P* 快吗?

如果速度是你唯一关心的问题,你应该用C语言编写你的网页,并将其编译为Web服务器模块。然而,速度不仅在于让程序运行得快,还在于写得快。P*的重点在于后者。

P*的内部是用C++编写的,它比它的父辈C语言稍慢一些。只有关键部分进行了优化,比如向Web服务器的文本输出。P*还在内部缓存程序,这样脚本只需解析一次。

P*中的算术运算,如加减法,比其他语言慢。但是,只有当你让一个循环运行十亿次时才会注意到这一点,在这种情况下,P*会比PHP和Perl慢几秒钟。

P*引擎不基于任何现有技术,它是完全从头编写的。P*与其他语言唯一的共同点是类C的语法。

接下来做什么?

P*正处于非常早期的开发阶段,但它可以在Linux上独立运行或作为Apache模块运行。有一个Windows版本可用,但很少更新。

主页:p-star.org

所有内容都在GitHub上!

GitHub: github.com/P-star/P-star/

© . All rights reserved.