来造个php代码生成器吧,实在太难写了

2011-03-12 09:12:20 +08:00
 aligo
我不是一个职业程序猿,觉得php实在太难写了,但同时php的性能还是可以的,而且最主要的是使用广泛
之前帮sai姐姐写了一个算法,最近刨出来用scala和ruby重写了,可是她要我一定用php,坚决不在服务器上装jvm
我看过(包括写过)一些php,它们其实不是代码而是密码,但是大多数情况下php就算不是最好的选择,也是唯一的选择
这里应该有不少人对php是处于爱恨交织态度,所以既然逃不开在生产环境使用php,那么至少开发过程中可以不用写它吧
于是我想了想,不如来做一个php代码生成器吧,以下是我结合使用php经历的构想,欢迎各位提意见:

* 语法简化
* 告别<?php ?>,纯净php代码,反正大家都会用模版,内嵌html是个糟糕的做法。php6也有此改进
* 每一行末的;完全是必要的
* 变量名的$号完全是没有必要,只要全局常量全大写,就不会混淆
* 类名大驼峰,方法名小驼峰,为了一些语法糖不会混淆,这个必须强制

* 类
* 为了纯洁的oop,放弃static,改为类的伴生对象
* 为了纯洁的oop,例如str_replace(...),改为str.replace(...),在字符串对象上调用方法。php6或者7也将如此
* 类的访问控制如public private protected,应该像时髦的语言那样,尽可能少写。即默认public,一个private可以连续修饰好几个方法
* 为了更好的oop,添加mixin功能。php6或者7也将如此
* 基于上两条,同时提供更加细致的访问控制,可以用来专门指定对某个类及其后代的访问权限
* 调用方法中的->改为.或空格,括号不是必须的
* (2012)push->arr,如此实现从右到左调用方法,把2012插入数组arr后端,省略括号后为2012 push->arr

* 方法
* function -> def
* 不变性原则,绝对不能传递引用
* 无上限参数列表用*更直观,而不是在方法中func_get_args()
* 可以有多个返回值


* 静态类型
我目测写php的时候一般至少有20%的单元测试代码不干别的,专门测试类型是否正确
同上,还有更多(有时候是80%了)的phpdoc注释不干别的,专门标示方法参数的类型和返回值的类型
所以静态类型虽然看上去很难用,但是有助于减少体力劳动,所以:
* 语法:str1: String = "hello",用java们的空格方法显然太难看
* 声明时,方法的输入输出一定要显式指定类型,但对于lamdba可选,因为它们大概不需要被单元测试和生成文档
* 字面量和new方法创建对象,除非特例,否则显然不必要专门指定类型
* SQL类型:我用php时,如要长距离传递SQL语句,会定义SQL类,然后执行SQL方法判断输入的类,一定得是SQL类才行。SQL类无法和字符串拼接,然后用bindParam输入参数,防止SQL注入和人为疏忽的SQL注入
* 数组的成员类型要相同,即一个成员的key是数字那么该数组成员所有key都应该是数字,字符串"1"什么的是非法的
* 隐式转换,有静态类型必然还要有它

* 函数式编程
虽然5.3开始支持了lamdba等,但是并不好用
* 语法:{(arg1, arg2) ...},而不是function(arg1,arg2){...}
* {(arg) ...}("foobar")的就地调用,结合前面的调用方法,("foobar"){(arg) ...}也可以,而且更美观
* 结合纯洁的oop,arr.each{}用以代替foreach和变态for等循环语法,同时arr还应该有map和reduce/collect/folding等方法
* 其他一些函数式方法似乎不是很必要

* 其他
* 让定义数组方法更像json些,用:而不是=>,用花括号而不是圆括号,array开头不是必须的

以上基本是我目前的想法,非常不完整,大家有兴趣可以一起做这个东西,当然一切都是可以讨论的,目前我也只是设想阶段
如果各位在哪里见过类似的东西,那就不需要重复发明轮子了XD
11612 次点击
所在节点    PHP
52 条回复
kayue
2011-03-12 09:30:29 +08:00
從不用 template engine
levn
2011-03-12 09:39:52 +08:00
看来发明一种方言是纠结的程序员的必然道路啊…… ==
vayn
2011-03-12 10:28:14 +08:00
第一眼看到这个题目想起 HipHop,但是仔细一想楼主其实是为了自己偷懒……比如 str_replace 改为 str.replace,问题是 PHP 根本就没有字串对象,这样改与其说是为了 OOP 不如说是为了满足自己的 OOP 心理,而且发明一种新的语言不是又要增加学习成本= =

当然如果单纯为了自己方便,想怎样都可以啦,很好奇这个东东真正实现出来会是什么样子。

另外我想知道伴生对象是什么……
aligo
2011-03-12 10:41:00 +08:00
@vayn 就是受到hiphop的启发,它刚出来那会我很有兴致地玩过了
代码生成器当然也肯定就是为了偷懒而存在的,例如在接下来的php版本里肯定会变成str.replace之类的,只是我等不及了而已

伴生对象类似于javascript中对象定义方法,一经声明就已经存在,伴生对象特殊之处在于:
1、和类名同名,而且是大驼峰,永远不会和纯小写的对象变量混淆
2、单例或者说静态,至于是不是实例化是无关紧要的问题了
3、结合1和2,它对与他同名的类有平等互访权,所以可以用来做工厂方法

例如:
object User{
def getById(id){
...
new User(data)
}
}
class User(data){
def getName(){
data[name]
}
}
aligo
2011-03-12 10:44:57 +08:00
使用起来:
var user = User.getById(2012)
echo user.getName //其实这是多余的,完全可以用getter嘛- -
或者更酷的链式方法:
echo User.getById(2012).getName
aligo
2011-03-12 10:52:35 +08:00
最主要的:
可以在object User中定义
...
protected def makeBaby(user_a,user_b){
...
new User(data)
}
在class User中
def makeLoveWith(user_b){
if (...) {User.makeBaby(this,user_b)}
}
使用上
baby = user1 makeLoveWith user2 || null //语法糖
这样外部是访问不到User的makeBaby方法,避免感应受孕之类的情况发生
vayn
2011-03-12 10:59:36 +08:00
@aligo 我搜了一下,伴生对象看起来像是把静态成员和非静态成员分开,但是可以互访。我对 scala 也没概念,体会不到这样有什么好处。我喜欢关于“方法”和“函数式编程”的想法,PHP 在这方面还不够激进,按照楼主的想法来实现应该会很爽。不过“静态类型”对于一门弱类型语言来说是不是太过分了……
aligo
2011-03-12 11:08:28 +08:00
@vayn 没错,把逻辑代码分开,例如工厂方法之类显然不应该和类实例方法在一起
静态类型的话其实只是伪静态,因为最后生成的php依然肯定是动态的,而这里指静态只是代码生成器运行时候进行的检验
好处是在某些地方强调类型,可以避免很多不必要的错误,甚至安全问题,同时也可以少写很多注释和单元测试
因为php经常需要从url接收信息,并且通过SQL操作数据库,如果实现伪静态类型至少避免很多低级疏忽
reorx
2011-03-12 11:14:17 +08:00
前提是选择一个与你的要求具有类似语法及表现形式的语言,然后基于这个语言做和PHP核心集成的framework。

以前看到过类似的东西,希望对你有所启发:http://www.csh.rit.edu/~jon/projects/pip/

这会有事,先mark,回头再想想~
rechtar
2011-03-12 11:14:23 +08:00
我也一直觉得PHP的语法很丑很蛋疼 = =
但是喂,这个想法更蛋疼一层啊!……

题目写的太谦虚了。完全就是设计一门新的语言 + 写一个以PHP为目标的编译器了
aligo
2011-03-12 11:20:14 +08:00
@reorx 和那个有点不一样,并不是让php和其他语言一起工作

就像@rechtar 说的一样,一门新语言,然后还有一个以php为目标的代码生成器
vayn
2011-03-12 11:23:28 +08:00
@aligo 牺牲灵活性来获得更高的安全吗,值得权衡一下。

其实这样折腾一圈下来怎么都感觉有点别扭,不如直接用其他语言算了=。= 当然楼主是有特殊情况
CupTools
2011-03-12 11:27:16 +08:00
一句话,不用PHP拉到。

PHP的存在肯定有他自己的意义。如果你觉得PHP不爽,请慢走,PHP不是唯一的一种编程语言,你在YY也没用,PHP的基本语法是不会变的。
aligo
2011-03-12 11:27:29 +08:00
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
用php的人还是很多很多很多的,不过似乎比以前少了一点,被c#超过了
然后静态类型不会带来什么灵活性问题吧,只是写代码的在某些地方多了声明类型的步骤,但同时与之相关的文档和测试工作可以省下更多
cellsea
2011-03-12 11:31:03 +08:00
LZ,你可以去看看ActionScript 3, 真的,已经几乎实现了你的想法。。。。。
reorx
2011-03-12 11:32:34 +08:00
@aligo 之前也是这样想的,所以觉得使用已有的语言可能是更好的选择,毕竟是对PHP的语言规范不满么。如果发明新的语言,成本过高不说,也仅仅只是基于PHP语法的变种(似乎本质还是PHP),那么还不如直接改进PHP本身。再如果,这种新的语言,他的解释内核没有别的功能,只是生成对应的PHP代码,那么其实它不能被称作语言,而应该只是一种规范,就像json那样,最终的成果会是format + encoder&decoder。

另外看你的设想,似乎有jQuery的影子诶……
aligo
2011-03-12 11:37:19 +08:00
@CupTools 这不是我一个人就能决定的事情
另外php的语言在不断改变中,从php4到php5就变了不少,接下来也还会接着变的
不过就现阶段考虑,我只能想到代码生成器这种土办法,我绝对不是在yy,例如java上的velocity就是把类似php的东西生成java代码
aligo
2011-03-12 11:42:10 +08:00
对头,不是一种新的语言,最后生成的还是php代码,所以实施起来比较简单
这个初步设想的话,当然是山寨了各种语言的长处和各种实践经验,一切以好用方便为宗旨
我是真打算做这个东西,因为php实在太难写了
不知道有没有人想要一起来,让我自己做我很容易一条路走到黑然后坑掉
vayn
2011-03-12 11:51:02 +08:00
@aligo 我倒是很想陪你一起玩,只是不知道要怎么做呀
CupTools
2011-03-12 11:52:29 +08:00
@aligo 一种语言不会因为你而改变,你要自己去适应。你觉得Java爽,那就JVM自己爽呗。假若一定要PHP,而你觉得PHP实在太恶心,让别人帮你恶心吧,免得苦了你自己

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/9646

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX