Я не знаю ни одного интерпретатора C, написанного на JavaScript, но здесь обсуждаются доступные интерпретаторы C:
[114 Возможно, вам лучше поискать виртуальную машину любого типа, которая работает поверх JavaScript, а затем посмотреть, сможете ли вы найти компилятор C, который выдает правильный машинный код для виртуальной машины. Скорее всего, это будет LLVM; если вы сможете найти виртуальную машину JavaScript, которая может запускать LLVM, то вы будете в отличной форме.
Я сделал несколько поисков в Google и нашел Emscripten, который напрямую переводит код C в JavaScript! Возможно, вы можете сделать что-то с этим:
https://github.com/kripken/emscripten/wiki
Возможно, вы можете изменить Emscripten для создания «точки последовательности «после каждой скомпилированной строки C, и затем вы можете сделать свое моделируемое окружение пошаговым от точки последовательности до точки последовательности.
Я полагаю, что Emscripten внедряет LLVM, поэтому у него могут быть виртуальные регистры; если так, то это может быть идеальным для ваших целей.
Допустим, вы хотите подсчитать количество экземпляров класса (не включая подклассы)
class A
@count = 0
@@count = 0
def self.inherited(subclass)
subclass.instance_eval { @count = 0 }
end
def self.num_instances
@count
end
def self.num_subclass_instances
@@count
end
def self.new
@count += 1
@@count += 1
super
end
end
class B < A
end
class C < B
end
A.new
B.new
A.new
B.new
B.new
C.new
A.num_instances #=> 2
A.num_subclass_instances #=> 6
B.num_instances #=> 3
B.num_subclass_instances #=> 6
C.num_instances #=> 1
C.num_subclass_instances #=> 6
Вы не можете использовать переменную класса, поскольку она используется всеми
классы и их подклассы. Обратите внимание на изменения, внесенные в @@ count
by B
и C
отражены в A
, но @count
не используется совместно.
В общем, однако, это может быть очень полезным для хранения любых настроек, специфичных для класса. _why использует его в Dwemthy's Array для указания начальных значений для атрибутов экземпляра, и он часто используется при выполнении метапрограммирования Ruby.
Переменные класса являются общими для всех экземпляров класса, включая все подклассы. Иногда эта переменная в иерархии - это именно то, что нужно, но иногда вы можете предпочесть разные переменные для каждого класса. В отличие от переменных класса, переменные экземпляра класса будут принимать разные значения для каждого объекта класса.
Yes, actually I have. This is only slightly modified and trimmed from what I had:
class Widget
# class instance variable pattern
class << self; attr_accessor :color; end
def show_color()
"This widget is #{self.class.color}"
end
end
class WidgetR < Widget
@color = "Russet"
end
class WidgetC < Widget
@color = "Cordovan"
end
class WidgetL < Widget
@color = "Liver"
end
WidgetR.new.show_color #=> "This widget is Russet"
But I'm not sure it is really necessary in the case I used it. I could have just overridden the method. Or provided a color method. Or stored it in a class variable as a Hash. Or even kept a copy in each instance (ok, that one is kinda yech). I'm sure there are other possibilities...
There are a variety of alternatives and the syntax is awkward. Given that I'm guessing the instances where it is the most natural thing to use are probably fairly rare.
It might help you to try to reproduce this behavior with class and instance variables and see that it is difficult to achieve (although it is easy if you define methods, etc).
C.J.