質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

9609閲覧

PHP の内部構造(Zend Engine)について教えてください。

7968

総合スコア253

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

11グッド

10クリップ

投稿2016/11/14 08:20

編集2016/11/15 00:57

11

10

PHPの変数や関数、クラス等を書籍等を見ながら勉強してる入門者です。

PHPがはじめての言語なので、PHPの内部構造(C言語)は読めません(・ω・`;)

変数や関数など記述したコードがPHPの内部でどのような流れで処理されているのか理解したく、調べております。

PHP7で内部構造が変わっていることは承知しております。

PHP7については情報少ないので、PHP5の内部構造を調べております。

コンパイラやzval構造体、ハッシュテーブルなど一部にフォーカスして説明した記事は結構ありましたが、全体を示す図がなかなか見つからず、2日ぐらいググって下記の図を見つけました。

イメージ説明

引用:Quick tour of PHP from inside

LexerやParser、OPcode、zval、HashTablesなど単体を説明した記事はありましたので、それぞれがどのような役割をしているのかは何となく理解しております。

ただ、上図で言うところの「Zend Virtual Machine」と「Zend Engine Core」の結びつきがわからず一連の処理が理解できておりません。

直接的な回答ではなくても、参考になるサイトや書籍など何でもいいので情報を頂けると嬉しいです。

#【質問1】Zval や HashTables などはどの段階で作成されるのですか?

PHP5ならLexerで字句解析をし、Parserで構文解析をして、OPcodeを作成して実行しているかと存じます。

この一連の流れの中で、Zval や HashTables などが作成されると思うのですが、Parserで構文解析したときに作成されるのでしょうか?

それとも別の段階で作成されるのでしょうか。

#【質問2】シンボルテーブルはスコープごとに作成されるのですか?

シンボルテーブルを表した下図だとglobalとfunctionとシンボルテーブルが別々です。

イメージ説明

引用:php-secrets-forum7.

シンボルテーブルはスコープごとに作成されるということでしょうか?

#【質問2がYesだった場合】属するシンボルテーブル名を確認する方法はありますか?

仮にスコープごとにシンボルテーブルが作られる場合、複数のシンボルテーブルがあるかと存じます。

シンボルテーブルを区別するために名前のようなものが付与されるかと存じます。

そのシンボルテーブルの名前を確認する方法はありますでしょうか?

xdebug_debug_zval() だとzvalの中身はわかりますが、属しているシンボルテーブルの名前は表示されません。

シンボルテーブルの名前をダンプする方法があれば、教えてください。

#【質問3】function stack とはなんですか?

シンボルテーブルを表した図にはfunction stackとあります。
これは何を表してるのでしょうか?

ご存知の方いれば、何卒ご教示くださいm(__)m

参考・閲読

下記には目を通しましたが、難して理解できていないところも多々あります^^;

蛇足

質問の中にある書いてある通り、全体図を探すのに結構な時間を費やしました。
php, zval, zend, lexer, parser, vm, opcode, hashtable, symboltable あたりのワードでひたすらググってましたが英語や中国語のヒットします。
日本語しか読めないので、進化したGoogle翻訳をフル活用して調べてましたが、なかなか全体図を説明・記載したものを探せませんでした。
最終的にグーグルの画像検索で見つけました。
私のようにググり力が乏しい方はいないかもしれませんが、同じように困ってる方がいれば画像検索も試してみてください。
以上、蛇足です。

hihats, yosida001, mhashi, LLman, 223horn, 5o5o_wagon, afroscript, yodel, Powerweb, ikuwow, 他1名👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

date

2016/11/14 11:56

正直に言いますと、プログラムは書けるけどここまで裏でどう動いているのかわかる人がはたしているのだろうか
ikedas

2016/11/14 12:41

クリップしました。で、図の出所を明記してくださいませんか (挙げておられるリンク先のどれかにあるのかもしれませんが)。
7968

2016/11/14 13:29

出所が分かり難く申し訳ございません。図の下に引用元のリンクを追記しました。
himakuma

2016/11/15 00:52

タグにC言語を追加した方が良いと思います。「Zend Engine」はPHPのオブジェクト指向を実装したC言語のフレームワークです。PHPを扱っている多くの人はその中身を知らないと思います。C言語を扱っている人のほうが知っているかも??
7968

2016/11/15 00:58

ご助言ありがとうございます。早速C言語のタグを追加しました。
7968

2016/11/15 07:26 編集

こちらの質問は「質問2がYesだった場合」と「画像引用元」と「蛇足」の追記しか行っていないかと存じます。ちなみにオペコードに関する質問は別にしております。この質問に対して内容の改変と削除はないかと存じますが、こちらの不手際で削除などあった場合は、大変申し訳ございません。
guest

回答1

0

ベストアンサー

こんにちは。

【質問1】Zval や HashTables などはどの段階で作成されるのですか?

変数値や即値に対応するzvalやHashTableがいつ生成されるかということであれば、PHPプログラムコンパイル時に静的に確定できる値はopcode生成フェーズで、PHPプログラム実行時に動的に作られる値はopcode実行フェーズで生成されます。

上の図の「Zend VM Executor」が実行フェーズを担当する機能です。

【質問2】シンボルテーブルはスコープごとに作成されるのですか?

はい。

この図で表現しているのは、グローバルスコープと関数スコープとで異なるシンボルテーブル(=変数テーブル)を利用しているよね、という内容になるかと思います。

php

1<?php 2function do_something($s) 3{ 4 $s = 'was'; 5 return $s; 6} 7 8$a = 'this is'; 9$b = do_something($a);

上記プログラムにおいて、関数スコープでは$sにアクセスできるけれども$aにはアクセスできない、グローバルスコープでは$sにアクセスできないけれども$aにはアクセスできる、というのは普段のコーディングで体験していることだと思います。

【質問2がYesだった場合】属するシンボルテーブル名を確認する方法はありますか?

PHPの標準関数では不可能なように思います。

自分でextensionを書くなり、気になる箇所にデバッグコードを仕込んでPHPをビルドし直すなり、などすれば可能だと思います。

【質問3】function stack とはなんですか?

スタックというのは後入れ先出し(LIFO)のデータ構造です。

関数の呼び出しはスタック構造で管理されていて、関数内で関数を呼び出すと順にスタックに積まれていきます。

PHPがはじめての言語なので、PHPの内部構造(C言語)は読めません(・ω・`;)

とのことですが、現在の興味を深めていきたいのであればC言語レイヤで試行錯誤していかないと効率が悪すぎるように思います。

わからないなりにソースコードに目を通しても良いと思います(重要な情報がコメントとして書かれていたりします)し、もしくはPHPにデバッグコードを埋めて実行してみるだけでも全然違うと思いますよ。

では、頑張って下さい!

投稿2016/11/15 06:05

編集2016/11/15 06:22
hnw_

総合スコア51

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

7968

2016/11/15 06:37

おお!まさか、参考として拝見していた hnw さんから回答をいただけるとは、めっちゃテンションあがりました٩( 'ω' )و 各質問に対してわかりやすい回答、アドバイスありがとうございます。 PHPの内部構造(C言語)も読めるように精進します。 お陰様で理解が進みました。 お忙しい中、回答ありがとうございましたm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問