C - очень простой язык, под которым я подразумеваю, что он предлагает довольно минимальные абстракции по сравнению с голым металлом. Базовые типы поставляются с прикрепленной информацией типа no и даже struct
s получают только информацию о типе , которую вы передаете им.
Так в типичной реализации, когда компилятор видит
int x, y;
float z;
int x = foo(y,z);
x
, y
и z
, вероятно, представляют собой одно машинное слово, которое интерпретируется как целое число с дополнением 2s для x
и `y, а также как значение с плавающей запятой IEEE-754 для z, и ничего больше .
Компилятор делает что-то вроде
- передвигать указатель стека, чтобы освободить место для возвращаемого значения
push
y
и z
в стек (в каком порядке это зависит от реализации)
push
текущий stack pointer+two instructions
в качестве обратного адреса
branch
до точки входа foo
.
(Достойные чипы обеспечивают некоторую поддержку, но все же ...)
Тогда Фу
- читает
y
и z
из их местоположений относительно текущего значения стека
- делает с ними что угодно
- записывает возврат в
x
(снова найден по смещению от указателя стека)
branch
обратно на обратный адрес, который вызывает вызывающая подпрограмма push
ed.
Если foo
не было указано, какой тип имеют передаваемые аргументы (как в процедуре variadac, такой как printf
), он не будет знать, насколько велик каждый аргумент в стеке (на самом деле c приводит размер каждого variadac аргумент с набором правил преобразования с повышением частоты, чтобы решить эту проблему), ни как его интерпретировать.
PHP, с другой стороны, предоставляет изощренную абстракцию над «голым» компьютером и может (фактически должен делать то, что он делает) с некоторой идентифицирующей информацией при каждом значении, с которым он работает.