PHPはC言語に似たインタプリタ


2016.11.21更新

PHPはC言語ではないんですが割と互換性があってC言語からの移植が楽です。
PHPはC言語風に記述すればC言語そっくりです。
逆に言えばC言語風に記述しなければあまり似てないんですけどね。
PerlよりPHPのほうがC言語に近いです。
PHPには、printf()、strstr()、strcmp()、strlen()、fopen()、fgets()などのC言語の互換関数があって移植性も高いです。
変数の先頭に$を付けるというダサい仕様がPHPの難点ですが。
あまりC言語に似ていないPerlでさえもprintf()関数はあります。
printfは、C/C++の他にも、PHP、Perl、Ruby、Java、Go言語、Objective-C、D言語にも標準でありますのでいろんな言語で使えるというお得で便利な関数です。
C++ではcoutではなくprintfを使ったほうがJava、PHP、Perlなどの他の言語への移植が楽です。
C#はprintfがないという仲間外れ的な孤立感があります。
マイクロソフト製品以外のプログラミング言語に移植して欲しくないということなのでしょうか?
主流の言語は大概はC言語を真似ているので、ぱっと見C言語とよく似ています。
以下、C言語で書いた簡単なプログラムをC++、PHP、Java、C#、Perlに移植してみました。
各言語のソースを見るとだいたい似通っていることが分かると思います。
C言語の知識は各言語に(ある程度)通用します。
C言語/C++のソースはどのコンパイラでもコンパイルできると思いますがC++ Builderのbcc32でコンパイルしました。


C言語ソースコード(C++としてもコンパイル可)
/* コメント C言語/C++のTEST プログラムです。 */ #include <stdio.h> #include <string.h> int main(void) { char s[100]; int i; strcpy(s,"TEST"); if(strstr(s,"E")){ printf("文字列sは、Eの文字を含んでいます。\n"); } else{ printf("文字列sは、Eの文字を含んでいません。\n"); } if(strcmp(s,"TEST")== NULL){ printf("文字列sは、文字列\"TEST\"と一致します。\n"); } else{ printf("文字列sは、文字列\"TEST\"と一致しません。\n"); } printf("%sの文字数は%d文字です。\n",s,strlen(s)); for(i=0;i<3;i++){ printf("i=%d\n",i); } return 0; }


C++ソースコード(std::string + std::cout)
//コメント C++のTEST プログラムです。 #include <iostream> #include <string> using namespace std; int main() { string s; s = "TEST"; if(s.find("E") != string::npos){ cout << "文字列sは、Eの文字を含んでいます。\n"; } else{ cout << "文字列sは、Eの文字を含んでいません。\n"; } if(s == "TEST"){ cout << "文字列sは、文字列\"TEST\"と一致します。\n"; } else{ cout << "文字列sは、文字列\"TEST\"と一致しません。\n"; } cout << s << "の文字数は" << s.length() << "文字です。\n"; for(int i=0;i<3;i++){ cout << "i=" << i << "\n"; } return 0; }


PHPソースコード
<?php /* コメント PHPのTEST プログラムです。 */ $s = "TEST"; if(strstr($s,"E")){ printf("文字列sは、Eの文字を含んでいます。\n"); } else{ printf("文字列sは、Eの文字を含んでいません。\n"); } if(strcmp($s,"TEST")== NULL){ printf("文字列sは、文字列\"TEST\"と一致します。\n"); } else{ printf("文字列sは、文字列\"TEST\"と一致しません。\n"); } printf("%sの文字数は%d文字です。\n",$s,strlen($s)); for($i=0;$i<3;$i++){ printf("i=%d\n",$i); } ?>


Javaソースコード
/* コメント Java(ファイル名test.java)のTEST プログラムです。 */ import static java.lang.System.out; public class test{ public static void main(String argv[]) { String s; int i; s = "TEST"; if(s.indexOf("E") >= 0){ out.printf("文字列sは、Eの文字を含んでいます。\n"); } else{ out.printf("文字列sは、Eの文字を含んでいません。\n"); } if(s.compareTo("TEST")== 0){ out.printf("文字列sは、文字列\"TEST\"と一致します。\n"); } else{ out.printf("文字列sは、文字列\"TEST\"と一致しません。\n"); } out.printf("%sの文字数は%d文字です。\n",s,s.length()); for(i=0;i<3;i++){ out.printf("i=%d\n",i); } } }


C#ソースコード
/* コメント C#(ファイル名test.cs)のTEST プログラムです。 */ using System; public class test{ public static void Main(string[] argv) { string s; int i; s = "TEST"; if(s.IndexOf("E") >= 0){ Console.Write("文字列sは、Eの文字を含んでいます。\n"); } else{ Console.Write("文字列sは、Eの文字を含んでいません。\n"); } if(s.CompareTo("TEST")== 0){ Console.Write("文字列sは、文字列\"TEST\"と一致します。\n"); } else{ Console.Write("文字列sは、文字列\"TEST\"と一致しません。\n"); } Console.Write("{0}の文字数は{1}文字です。\n",s,s.Length); for(i=0;i<3;i++){ Console.Write("i={0}\n",i); } } }


Perlソースコード
#コメント PerlのTEST プログラムです。 $s = "TEST"; if(index($s,"E") >= 0){ printf("文字列sは、Eの文字を含んでいます。\n"); } else{ printf("文字列sは、Eの文字を含んでいません。\n"); } if($s eq "TEST"){ printf("文字列sは、文字列\"TEST\"と一致します。\n"); } else{ printf("文字列sは、文字列\"TEST\"と一致しません。\n"); } printf("%sの文字数は%d文字です。\n",$s,length($s)); for($i=0;$i<3;$i++){ printf("i=%d\n",$i); }


C言語の話


あーすブラウザ
オンライン鍋田辞書
鍋田辞書トップ