OO C is passable

My problem with C++ bashing is that I'm overqualified. Ever since I've published C++ FQA Lite, I've tried to stay out of "C++ sucks" discussions. I've said everything before and I don't want to say it again. And then much of the C++ arcana is finally fading from my memory; good, no need to refresh it, thank you.

I don't always quit those discussions though. How should I do that? If I were someone else, I could send a link to the C++ FQA to end the discussion ("if you really care, check out yada yada"). But I can't use this link myself, because "OMG, did you actually write a whole site about this?!"

So the last time I didn't quit this discussion, I said: "You know, at some point you actually start to prefer plain C". The seasoned C++ lover replied: "You mean, the C with classes style, with no tricky stuff? Sure, don't we all end up writing most of the code like that?" No, said I, I meant plain C. No plus signs attached. File names ending with .c. C without classes. C.

"Now that is fanaticism," said the guy. "What could be the point of that? You know what? You may like C++ or you may dislike it, but face it: C just isn't good enough".

Fanaticism?! Now that is an insult. Yes, I recently decided to write a bunch of code in plain C inside a C++ code base. I did this after maintaining the previous, C++ implementation of that stuff for 4 years. For at least 3 of those years, I didn't do any significant rewriting in that code, because it could interfere with schedules and it would complicate merges. Although some pieces were hopelessly awful. Sloppy text parsing interleaved with interrupt handling (I exaggerate, but only very slightly). But it worked, so it was hardly urgent to fix it.

And then it had to be ported to a new platform. And I obsessed over the rewrite-or-extend question for a lot of time. There was a critical mass of incompatible new stuff, so I chose "rewrite". But. I decided to write the new version in C++. Why? Because it's a C++ code base, and people are used to C++ and its style and idioms, however brain-damaged. "So you, YOU will do it in C++ after all?! You're a wuss," said my manager, an old-time C++ hater. Time for the rhetorical question. Does this sound like the story of a fanatic?

OK then, why did I decide to do it in C after all, you may ask. I'll tell you why. I did it because everybody was sick and tired of the build time of my auto-generated C++ code.

You see, the whole thing is data-driven. The data objects describing its workload are generated at build time. Do you know any way of generating C++ code that doesn't compile slowly as hell? I don't. I've generated both "real" code (functions doing stuff) and "data definition" code (which does practically nothing except for calling object constructors). And it always compiles slowly. Sometimes turning optimization off speeds up compilation significantly, sometimes less significantly. But the best part is this: you never know exactly what's your problem. Try to profile a C++ compiler.

It's not that manually written C++ code is such a blast. For example, we have a ~2K LOC file defining a class template and explicitly instantiating it 4 times. It worked fine for years, until it met a particular version of the Green Hills C++ compiler. That version decided that it needs more than 1.5G of memory to compile that file. I don't know how much more exactly, because at that point my workstation suffocated, and could only breathe again when the process ran out of swap space and died. Here's another rhetorical question: how the fuck are you supposed to figure out what the fuck causes this problem?

What's that? "It's a tool problem, not a language problem?" Bzzzt, wrong answer! It's neither a language problem nor a tool problem; it's my problem, because I must fix it. And this is why I don't want to deal with a language that consistently breeds tools which create such problems for me. But since I'm hardly a fanatic, and I know exactly why I do want to work on this particular C++ code base, I hold my nose and I delve right into the pile of excrements and find out that if you instantiate each template in its own file, then the process memory consumption barely crosses the 350M mark. Nice and compact, that. So, let's use 4 files.

Nope, manually written C++ code isn't a picnic. But auto-generated code is worse, because it relies on some set of features and uses them a lot. The number of uses per feature per file matters. 1 explicit template instantiation per file = 350M of compiler process memory. 4 instantiations = out of memory. What about "simpler" features, but hundreds of uses? The compiler will grind to a halt for sure. Um, you might say, don't other languages have "features" which will be used hundreds of times by generated code? Yes, they do. Those features just DON'T SUCK quite as impressively. Go ahead, show me a problem with compilation speed anywhere near what C++ exhibits in another language.

Face it: C++ just isn't good enough. "If you really care about C++ parsing complexity, check out the FQA yada yada". I wrote "a whole site" about it, you know. Bottom line: if you generate native code, you want to define your object model such that the generated code can be C code. Assembly is pointlessly low-level and non-portable, and C++ sucks. Believe me, or die waiting for your code to compile.

So, C. My object model will be in C. Um. Bummer. It's an OO thing, with plugins and multiple inheritance and virtual inheritance. It has to be. You have orthogonal plugins which want to derive classes from a common base – a classic diamond hierarchy. Well, I can have a couple of macros for doing MI-style pointer arithmetic, by fetching the derived-type-specific offset of each base class object at run time. No big deal. I even like it better than the C++ MI downcasting syntax – at least you know exactly what you're doing, and you don't need to think whether it should be dynamic_cast or static_cast or eat_flaming_death_cast to really work.

But I miss virtual functions. I really do. I sincerely think that each and every notable feature C++ adds to C makes the language worse, with the single exception of virtual functions. Here's why not having virtual functions in C sucks:

  • You can't quite fake them with C macros.
  • Virtual function call is a shortcut for obj->vtable->func(obj, args). The OO spelling – obj->func(args) – is of course better.
  • You'll usually try to make the C version shorter: obj->func(args), obj->vtable->func(args), or obj->func(obj, args). Quite likely you'll find out that you really needed to pass obj to func and/or the vtable level of indirection. Updating the code may be tedious/too late/really annoying (because of having to admit a stupid mistake). The eventual lack of call syntax uniformity will also be annoying.
  • Decent C++ debuggers automatically downcast base class object pointers to the real run time type when you inspect the object, even when C++ RTTI support is turned off at compile time. They do it by looking at the vtable pointer. Achieving this with OO C is only possible on a per-OO-faking-style, per-debugger basis, using the ugly debugger scripting facilities. Most likely, you won't do it and choose interactive suffering each time you debug the code, having to figure out the actual type yourself and cast pointers manually.
  • With virtual functions, base class implementations are inherited automatically. With explicit vtable structures, you need to either have links to base class implementations (the slow MFC message table way), or you need to explicitly and fully fill the vtables in each derived class. Possibly using the C default of trailing zeros in aggregate initializers as in vtable_type vtable={foo_func,bar_func} /* and the third member, baz_func, is 0 - we check for zero vtable entries before calling our pseudo-virtual functions */. Run time checks for null function pointers can make initialization code smaller, but they also make function calls slower.
  • With explicit vtable initializers, you only see the position of the function in the vtable initializer and its "derived class" name (my_class_baz_func), not its "base class" name (baz_func). You are likely to have a slightly inconsistent "derived class method" naming convention, making it annoying to figure out exactly which base class function we're overriding here.

An impressive list, isn't it? You can see from it that I've really put my employer's money where my mouth is and actually worked with OO C for a while. Aren't C++ classes with virtual functions simply better? No, because C++ classes don't support aggregate initialization. If you have C structures with vtable pointers, you can use the frob_type g_obj={&vtable,5,"name"} initialization style. This translates to assembly that looks like so:

g_obj:
.word vtable
.word 5
.word .str34
.str34:
.asciz "name"

This compiles and loads as fast as it gets. Now, if you choose real C++ vtables, you rule out aggregate initialization once and for all. Your initialization will instead have to be spelled as frob_type g_obj(5, "name"), and even if you have no constructor arguments, C++ will generate a constructor to set the vtable pointer.

The good news: at least the explicit reference to the vtable in our source code is gone. The bad news: with many objects, the C++ version compiles very slowly (I've checked with GNU and Green Hills C++). It also generates a much larger image, since it emits both global data objects and assembly code copying them into object members at run time. The latter code also costs you load time. And if you crash there, good luck figuring out the context. But as far as I'm concerned, the worst part is the build time explosion.

Yes, yes. It's not important. And it's FUD. And it's a tool problem. A "good" compiler could optimize the C++ version and generate the same assembly as the C version. And it could do it quickly. Those compiler writers are just lame. I completely agree with you, sir. Just go away already.

By the way, the same trade-off happens with C++ containers, like std::vector. They're better than {T*base;int size;} structures because you have the shortcut of operator[] (as opposed to array->base[i]). And because debuggers can gracefully display all elements of std::vector as a list of the right size. Some of the debuggers can. Sometimes. Sometimes it breaks. But when it doesn't, it's fun. But, again, you can't use aggregate initialization once your structure has a std::vector in it. And C++0x won't solve it, because its pseudo-aggregate initializers are syntactic sugar, and my problem here isn't the syntax, it's the build time.

And std::vector forces allocation of data on the heap (let's not discuss custom allocator templates, 'cause I'm gonna vomit). Can't have the base address of a std::vector point to a global variable generated specifically to hold its data.

I like things to point to globals generated to hold their data. Helps a lot when you debug, because your pointer is now firmly associated with a symbol table name. And no matter what memory-corrupting atrocity was committed by buggy code, that association will be there to help you figure things out. And heap corruption is very common in C++, because it's a completely unsafe language. So I care a lot about debugging core dumps with corrupted memory. Which is why base, size structures get my vote.

And that's an important point: you can live with just safety, or just control, and of course with both, but if you have neither safety nor control, then, sir, welcome to hell. Which is why OO C is worse than OO in Java or Lisp or PowerShell, but better than OO in C++.

And OO C is not all bad after all. Manually faking virtual functions has its benefits:

  • You can dynamically "change the object type" by changing the vtable pointer. I first saw this in POV-Ray, which has a vtable for circles and a vtable for ellipses. When a geometric transformation applied to a circle object transforms it to an ellipse, the vtable pointer is changed to point to the more generic and slower ellipse rendering functions. Neat. You could do this using C++-style OO by having another level of indirection, but with C, it's marginally faster, which can matter sometimes. And the C way is much neater, which is useful to balance the frustration caused by the drawbacks of fake OO. I use this trick a lot for debug plugins in my fake OO stuff.
  • Likewise, you can overwrite individual vtable entries. This changes the type of all objects of that "class" – primarily useful for logging and other sorts of debugging.
  • Sometimes you really don't need obj->vtable->func(obj, args) – say, obj->func(args) is good enough. And then you win.
  • You don't have to use a structure with named members to represent a vtable. If a bunch of functions have the same prototype, you can keep them in an array. You can then iterate over them or use an index into that array as a "member function pointer". This way, you can have a function calling a method in a bunch of objects, and the method to call will be a parameter of that function. The C++ member function pointers don't support the iterate-over-methods trick as efficiently, and their syntax is remarkably ugly.
  • That each function has a unique non-mangled name (as opposed to A::func, B::func, etc.) has the benefit of making the symbol table clean and independent of the non-portable C++ mangling. And you no longer depend on the varying definition look-up abilities of debuggers and IDEs (I don't like the lengthy disambiguation menus when I ask to show me the definition of "func", and these menus show up too often).
  • If you serialize the objects, or you have programs shoveling through process snapshots and analyzing them, the memory image of OO C objects is easier to deal with because of being more portable. Basically you only need to know the target endianness, the alignment requirements of built-in types, sizeof(enum) and the implementation of bitfields, if you use that. With C++, you need to know the layouts of objects when multiple/virtual inheritance/empty base class optimization/etc. is at play; this isn't portable across compilers. And even that knowledge is only useful if you know the members of each class; otherwise, you need to parse the layouts out of non-portable debug information databases – parsing C++ source code is not an option. With C, you can parse its files and find the struct definitions and figure out the layouts and it will be really easy and portable. Been there, done that.

Of course, you can use all those tricks in a C++ object model when needed, and use virtual functions elsewhere. And if C++ didn't suck so much (for example, if code compiled reasonably fast and if it had a standard ABI and and and…), that would be the way to go. But since C++ just isn't good enough, and I have to use a pure C object model, I point out the benefits of the sucky thing that is OO C to make it a little less bitter.

Overall, OO C is passable, more so than the endless rebuild cycles caused by our previous C++ object model. So you have a bunch of lame stuff. Having to use a typedef because struct A can only be referred to as struct A, not A. No default function arguments. Having to declare variables at the beginning of the scope. (BTW, I use C89. I don't believe in C99. I'm a Luddite, you already know that, right? I don't think C99 is as portable as C89 here in 2008).

So, yeah. I do miss some C++ features, but it's a small itching here, a tiny scratching there, nothing serious. I can live with that as the price for not having my legs shot off by mysterious compile time explosions and other C++ goodies. OO C is good enough for me. Fanaticism? You be the judge.

270 comments ↓

#1 wsgeek on 06.02.08 at 6:30 pm

If you don't mind installing the runtime (I assume you're on Linux?) and learning a slightly new syntax, then use Objective-C. It's a little esoteric, but then so is doing OO in C.

#2 haberman on 06.02.08 at 7:42 pm

If C is your preferred alternative to C++, I think you'll have to get a better example of "outstandingly complicated grammar" for your C++ FQA. The example you have there now:

AA BB(CC);

But C has exactly the same kind of ambiguity. Is this a pointer declaration or multiplication?

A * B;

#3 Yossi Kreinin on 06.02.08 at 9:50 pm

Regarding Objective-C: I have no problem with its Smalltalkish OO syntax, nor do I mind the "esoteric" part by itself. What I do care about in this particular case is (1) the overhead of OO features – I think OO C is faster than ObjC, at the cost of being way uglier, non-standard and anal-retentive, and (2) portability – C>C++>ObjC in terms of compiler support on less popular platforms. A third problem is interoperability with existing C++ code. If I didn't care about interoperability, I'd use D, and if I didn't care about speed, I'd use a dynamic language. That said, if I ever have to use Objective-C (because of having to use any sort of existing code in it), I'll consider myself lucky in the linguistic sense – it surely beats using C++ by a large margin.

Regarding A * B: right, but wrong. In C, the "context sensitivity" problem can be solved using a single dictionary keeping all typedef names. In C++, you need just a little bit more effort than that, about 10 man years worth of "little bit". The main problem is (guess what?) templates. Check out these two examples I took from a reddit thread:

http://yosefk.com/c++fqa/web-vs-c++.html#misfeature-2
http://yosefk.com/c++fqa/web-vs-c++.html#misfeature-3

I don't like the way it sounds, but I'm right, you're wrong, and I'm tired of rehashing this argument. Just ask comp.lang.c++.moderated about the problems with parsing C++. They are quite a friendly bunch – I'm a C++ hater, so I've seen their harsh side, and even that was pretty soft.

Oh, and C isn't my "preferred alternative" to C++ in the general case, just in this case. In general, I'll try to use the highest level language possible, it's just that in real time embedded software, your language choices are a bit limited.

#4 Yossi Kreinin on 06.02.08 at 9:53 pm

Forgot to tell wsgeek I wasn't on Linux; I cross-compile to a bare metal target.

#5 octopiler on 06.02.08 at 10:48 pm

We use C++ as a better C for an embedded development project => no class hierarchies -just a few classes to make things easier, heavy use of templates for optimized code generation.

I was facing similar compiler time problems with C++ because of the massive template instanciation. Fortunately using the latest g++ compiler helped cutting it down but a huge factor so I left it that way. But it was always tempting though to bundle python with our source code and generate non-templated C/C++ code at build time using a python script.

I don't like C++, but I'm not happy with C either. Since in our group no one has a OO fetish and neither does the project require any huge class hierarchies we are right now using a nice subset of C++. Still I'm bugged with the lack of proper tools that can work with C++ code.

D seems to have a nice chance at this but it might take quite some time for its ecosystem and tools to mature.

#6 ionial on 06.03.08 at 8:17 am

just for you:
http://www.cs.rit.edu/~ats/books/ooc.pdf

#7 Brandon Moore on 06.03.08 at 1:07 pm

It's explained in your links, but it's worth repeating: To parse C++ you have to do template instantiation!

Best to avoid it, but if you must parse C++, try Elsa. It's a library which actually gets it right. It comes with a handy tool called ccparse, which turns code into a line oriented AST which you can actually reliably search.

#8 jemptymethod on 06.03.08 at 4:14 pm

Curious, did you ever consider embedding a Lua interpreter and then implementing your objects as Lua tables with meta-methods?

#9 links for 2008-06-04 on 06.03.08 at 4:38 pm

[...] OO C is passable (tags: c c++ compiler development language performance programming) [...]

#10 haberman on 06.04.08 at 10:01 am

Umm, dude. I am intimately aware of how difficult C++ is to parse, though I have to say that your FQA is a really useful catalog of all these issues.

All I said is that you'd have to find a better example than AA BB(CC); to demonstrate that C++ is worse than C, because C has something that is almost exactly as difficult. And it appears that elsewhere in the FQA you do have better examples.

#11 haberman on 06.04.08 at 10:12 am

Also, I think you overstate C's ease of parsing. It may be a lot (lot) easier than C++, but it's still not easy, at least according to people who have tried to do it:

"When I (George) started to write CIL I thought it was going to take two weeks. Exactly a year has passed since then and I am still fixing bugs in it. This gross underestimate was due to the fact that I thought parsing and making sense of C is simple. You probably think the same. What I did not expect was how many dark corners this language has[.]"

Who says C is simple?

Don't get me wrong, I'm a C guy at heart, I just think your perspective is a little skewed in favor of anything that isn't C++. Other languages have their issues too.

#12 Yossi Kreinin on 06.04.08 at 1:53 pm

"Intimately?" Did you actually go far trying to do this? My condolences.

Maybe I should expand on that example, 'cause it really isn't sufficient to mention AA BB(CC); you ought to know how hard it is to tell a type name from an object name in C++ as opposed to C.

Regarding the ease of parsing C: you can grab a working yacc grammar, and all you'll need to do is (1) run the preprocessor before using the grammar and (2) add a lexer hack looking up typedef names. So much for /parsing/. The difficulties described in "Who says…" are all either semantical or non-standard. Lots of tools won't bump into them.

Of course, today you can get a working gcc/g++ front-end producing the excellently documented LLVM bytecode for free, so porting C++ is as easy as ever. The problem is that C++ will still parse slowly, and that many things are wiped out by the front-end. The LLVM project is working on a new C++ front-end; that could be great. It's amazing that one can still be excited about the future of C++ parsing though, regarding its age. And my hopes are low; an object model representing the complexity of a C++ program will never be fun to hack on.

Of course other languages have issues, they're just 10x smaller. No, really. It happens. It's possible. You can have one popular language that has 10x worse issues than others.

#13 Yossi Kreinin on 06.04.08 at 2:05 pm

Regarding Elsa: many thanks for the pointer. I actually might need a C++ front-end some time soon. OMG.

Regarding Lua: if I had to embed a general-purpose scripting language in my C/C++ app, it would be this. 6KLOC, just like pforth, except it runs Lua, not Forth. Today Lua gets the highest embeddability * linguistic virtue in my book. I wish it had bitwise operators though. And unfortunately all opportunities to use it in my current environment were lost for suckier options. As to the case in the article, I need the crud to run really really fast, so it's plain C.

Regarding the OO C link: they have a preprocessor of their own. In shell/awk. BARF. Otherwise, clean style. I like C. i_like_c().

Regarding using C++ as a worse C: good luck :) Seriously – had lots of fun with using templates for optimizing code. BARF. We already use Python for code generation, on a major scale. Nice. Better, at least.

#14 pbannister on 06.15.08 at 9:56 am

Your problem is not with C++.

For some reason you are generating code that makes massive use of C++ templates, and that usage causes you a lot of pain. Um … so don't.

Templates in C++ are the result of attempting to invent a new language feature while standardizing the language – almost always a bad idea – and we are stuck with the result. In effect templates are a sort of compile-time interpreted embedded mini-language within C++, with awkward and incomplete semantics.

No surprise that templates are a source of grief. Not really a problem – just use templates sparingly.

Auto-generating masses of code with huge use of the weakest part of C++ sounds … dubious.

What you do not get at is the underlying problem that you are trying to solve. Where you went wrong is most likely somewhat upstream of the problem you describe.

#15 Yossi Kreinin on 06.15.08 at 10:45 am

I described two distinct things:

* manually written template code
* generated constructor calls, mostly not relying on templates

So it's not templates. I also described exactly what I don't like about initializing data with constructors as opposed to aggregate initialization.

If you find a subset of C++ that gives you something C doesn't without taking away too much things C does, let me know.

#16 pbannister on 06.15.08 at 11:34 am

Given that C++ is C with additions, so far as I can tell nothing is taken away. I have done the hand-written sort-of OO style in C. It is a pain to write and maintain. (This was in the late 1980's when there was no C++ compiler I could use.) Surely you do not think C is remotely equivalent for this usage?

I am sure you are trying to make some sort of point here. What that point might be I cannot tell. There must be something you are leaving out. Something must be odd in your usage.

Given that C++ compile times are very fast and essentially identical to C compile times, in my usage – you must be doing something very different. What?

The combination of unusually slow compile times and an unusually large compiler memory footprint suggests usage – of some sort – for which the compiler is not suited.

#17 Yossi Kreinin on 06.15.08 at 11:56 am

"Very fast C++ compile times" sounds intriguing, and I bet it would intrigue 8 to 9 out of 10 C++ users out there. Do you use several different compilers? Problems could vary. Also, the system size matters a lot; in C++, you need to enforce very strict module boundaries, otherwise you pay roughly quadratically as your system size grows. Not everybody does that. The price for mediocrity, or even "non-excellence", is tremendously high in C++.

"Given that C++ is C with additions…" – the seven-legged cat picture is just for you: http://yosefk.com/c++fqa/linking.html#link-3

Things which are taken away by adding features: the ability to easily parse your code (and implement poor man's reflection by parsing binaries), short build time (true for just about everybody in the industry except you), the ability to count on your understanding of code obtained by, um, reading it (think overload resolution and implicit conversions), few failure modes (think of classes which accidentally got the same name and now objects of one class are initialized by the constructor of the other class, completely silently), ABI compatibility, the level of standard compliance and and and… "Superset" and "superiority" are too different things.

The point that I'm trying to make here is as simple as it gets: C++ sucks like a vacuum cleaner powered by a nuclear reactor, to the point where using OO C is less disgusting than using C++, even though it's pretty disgusting by my standards.

This opinion is based on my personal experience; nobody else has to agree with it. After all, people come to the world equipped with feet for the single reason of being able to shoot themselves in the feet in the very exact way they see fit, without copying others' shooting habits. However, your disagreement doesn't invalidate my experience, nor does it mean that everybody can or should copy your C++ usage patterns to do their (different) jobs and then they'd live happily ever after.

#18 Entity on 06.20.08 at 10:39 pm

pbannister what Yossi is pointing out, is he very accustome to working very close to the hardware. Not only that but needing full control over the language. C++ his viewpoint that he points out so many times, just simply relys on a small set of the language features uses them everywhere. That coupled with the fact that C++ compilers typicaly take their own assumptions on your C++ code. So even though your program may compile fine in one compiler it would break in another for completly because of an assumption like Template constructor instantiation, or how it lays out multiplie inheritance table and memory.

In one single development enviroment like Visual Studio 8/9 your dealing with one platform and one compiler so you can resolve the problems easily. Though even trying to get code generated with visual studio C++ 6.0 and 8.0 is a challenge in itself, and normaly means droping back down to an C interface.

Where Yossi works where he needs portability to run on many hardware, and many different compilers. Just something that many developers like myself will never experience.

#19 Yossi Kreinin on 06.26.08 at 8:23 am

BTW, I know several people who think they like C++, when in fact they like Microsoft Visual C++. These people would like Microsoft Visual C# even more. Much more. I've seen this happen even to die-hard C++ weenies driven to C# by some circumstance or other.

#20 Pages tagged "passable" on 05.09.09 at 12:18 am

[...] bookmarks tagged passable OO C is passable saved by 5 others     MovieMan2011 bookmarked on 05/09/09 | [...]

#21 A must-read: http://www.yosefk.com/blog/… « ooc devblog on 05.29.09 at 5:34 pm

[...] A must-read: http://www.yosefk.com/blog/oo-c-is-passable.html [...]

#22 Amos Wenger on 05.29.09 at 5:38 pm

It's funny that I stumbled upon this article.

This is my attempt at another hack on C to add object orientation goodness without C++'s clutter in syntax, semantics, implementation, and marketization http://code.google.com/p/ooc-language

Yossi, I would be honoured to have some feedback from you on this humble project =) While it may not be everything you'd expect, I like to think it's slowly getting close.

#23 Yossi Kreinin on 05.30.09 at 1:01 am

@Amos: interesting stuff. Regarding your target audience: I assume that it's not people who're after something like natively-compiled Java, since they already have gcj which gives them exactly that; I thus assume it's those who need integration with C code, and they want OO/other language features such as foreach that they can't get from a C compiler. And: they don't want C++ (understandable), they don't want Objective C (because of – message passing speed? Smalltalk syntax?), they don't want D (because it doesn't compile C?).

So what I was looking for was what would attract someone to ooc as opposed to Objective C or D, and I'm not sure I quite got it (Objective C and D both being languages with an object model lacking the major defects of the C++ object model, namely, the #include/private: based pseudo-encapsulation and manual memory management.)

#24 Amos Wenger on 05.30.09 at 1:41 pm

@Yossi: thanks for the fast review =) Absolutely, compiled Java is taken care of not only by gcj but by Excelsior JET, etc. Moreover, Java's syntax is admittedly verbose, and in the same VM ballpark, I'd rather recommend the excellent Scala.

So why not Objective-C? as for me, it's mostly the Smalltalk syntax I'm put off by. Really, I read again their wikipedia page today and my eyes still hurt. I appreciate the "parameters pseudo-naming" effort, but I have a different conception of "readable".

About not wanting D, it's really a sad, sad reason. IMHO, D got a lot of things right: ditch the preprocessor, integrate garbage collection, throw out C++ nonsense, etc. But.. the main implementation, dmd, is closed-source. Other implementations are mostly lagging behind/incompatible. Also, it looks like the transition between D 1.0 and D 2.0 is never going to happen. The enormous momentum I saw in 2007/2008 has been slowed down much. The only escape I see for D is outstanding community support: http://planet.dsource.org/

Also, while ooc may now look like a stripped-down Java, it's probably because I had to rush the first implementation in 4 months (for a school assignment in C I wanted to use object orientation in). I'm now cleaning up syntax before throwing in nested functions, closures, "safe function pointers", more introspection (for now you can just test A.class == B.class and do A.class.name, but it's a start).

#25 Amos Wenger on 05.30.09 at 1:57 pm

In the end, ooc's goal is not stealing/attracting users away from languages like Objective-C or D. For small projects it boils down to personal taste, for bigger projects there are harder requirements, and I think maybe ooc's translateability to pure C may help (portability = deployment on _tight_ embedded devices?)

Also, direct 'concurrents' of ooc, or rather 'siblings', include Vala: http://live.gnome.org/Vala , Cobra: http://cobra-language.com/ , and probably others I do not yet know of.

As I have absolutely no marketing urge, I prefer to openly inform of other languages, as I do on the recently-created manifesto page: http://code.google.com/p/ooc-language/wiki/Manifesto I do believe in diversity, and I'm always interested in other languages.

#26 Dmitry on 02.11.10 at 4:39 am

>Here’s why not having virtual functions in C sucks:

Why not to define own language syntax (own script) and translate it to oo-c (whatever)? And "write" own translator?
When I think about it, I assumes that syntax of parsing/translating rules is needed. (To easily adjust script syntax or define new one)
Hence parser/code-generator of/from that rules is necessary.
(?FRACTALS?) Кароче фракталы, замкнутый круг… But it can be resolved, worth it?
я intends to do so (но немного застрял).

#27 Yossi Kreinin on 02.11.10 at 6:08 am

If I decided to roll my own language, the two things I'd try to make sure would be (1) that the chances of getting it used in the relevant environment are high and (2) that I wouldn't invest too much in the initial implementation (that is, throw together a parser in a way solid enough to be counted on but without trying to rethink the whole parsing problem inside out, etc.)

#28 Mgr. Šimon Tóth on 03.09.10 at 11:56 pm

OK, well. I did read the whole post. I'm a full time C developer + I teach C and C++ on a university.

I personally consider embedded systems to be pretty much the only area where a choice C over C++ can be reasonable.

I hate when I see C used for project where C++ would be much more appropriate. I think I know enough about both C and C++ to say that most of the FQA is just bullshit. Not because it contains some misinformation, but because it exaggerates every possible flaw in the C++ by giving nonsense examples (that no one would ever write) that always go beyond good C++ coding style and usually even beyond the C++ standard. I always say that everyone should read the FQA to realize where they could end if they don't write proper code (or end up working with idiots).

It's curious that you like to preserve a feature that is pretty much useless in the field you are developing for (embeded systems – deduced from the compiler you use). I would expect you to use static polymorphism, and flat inheritance combined with policy-based design. OK, I don't have the insight, so you might be building huge code base that actually makes such dynamic features useful, but from my standpoint its just curious.

C++ compilation time and memory consumption is a problem. I must say that I'm not aware about the state of the compiler you use, but most embedded compilers I have seen are something like 10 years behind in C++ support. I myself am waiting for the C-Lang to fully support C++, because it will fly and shine like no other compiler before (even more then the current GCC head). But I definitely wouldn't go around and compare the compilation speed with other languages, unless you show me a language that can be compiled into binaries with similar speed (and no, not even C reaches C++ speed http://shootout.alioth.debian.org/).

I highly doubt your conclusion that if implemented in C++ (on the same level of abstraction) the code would compile a lot longer (but I do believe that it would use more memory).

You speak about portability but I do doubt that you follow the C standard and don't break the strict aliasing rule. This is the biggest problem of C code. The C developers think that they know the C language, but they write extremely fragile code that will break under extremely weird circumstances because it is silently depending on things like current stack size, currently optimization implementation in the compiler they are using, etc…

I never had a serious memory problem in C++. But then I write code so tight that if you don't read the documentation, you end up with static and dynamic assertions in 9 of 10 tries. This is a problem in C because you can't just add this type of checking to your code. Yes such checking does increase the build a lot, but (and I'm saying this as a full time C developer) I would rather have my code compile 10 minutes instead of 10 seconds, if I could save myself the endless hours of debugging bugs caused by platform specific code and standard violations.

#29 bfish.xaedalus.net » A tech blog recommendation on 03.25.10 at 2:10 pm

[...] On doing OO with plain old C [...]

#30 blue-slonopotam on 01.03.11 at 1:17 pm

>Face it: C++ just isn’t good enough.
Back in 1990 I used pascal instead of C for exactly the same reason. Turbo Pascal 5.5 was lightning fast compared to Turbo C 2.0, mostly because it did not have to load a bunch of include files from slow HDDs.

#31 Yossi Kreinin on 01.03.11 at 1:35 pm

Interesting, though I don't know enough Pascal to comment on the analogy. I can tell that C++ builds have been lightning slow compared to pretty much everything else for, say, the last decade so it sounds like a good bet to assume it will persist.

#32 Nikolai Kondrashov on 02.04.11 at 1:22 pm

Just FYI:

Lua 5.2 is (soon) going to have bit operations:
http://www.lua.org/work/doc/manual.html#6.7

LuaJIT is sponsored to make ARM port:
http://article.gmane.org/gmane.comp.lang.lua.general/74072

But you probably know this already.

#33 Yossi Kreinin on 02.05.11 at 2:38 am

bit32.band/bit32.bor?! Ahem.

#34 Nikolai Kondrashov on 02.06.11 at 10:35 am

> bit32.band/bit32.bor?! Ahem.
I think it's some kind of overprotective behavior :)
Still it's better than nothing.

#35 Seumas McLeod on 03.12.11 at 11:51 pm

> Virtual function call is a shortcut for obj->vtable->func(obj, args). The OO spelling – obj->func(args) – is of course better.

I guess using macros like
#define foo(obj, args) (obj->vtable->foo(obj, args))
would lessen the problem.

#36 Yossi Kreinin on 03.13.11 at 2:03 am

I don't think it would quite work without variadic macros though, because of the commas between arguments.

#37 Seumas McLeod on 03.13.11 at 10:12 am

Just replace "args" with the appropriate arguments in both sides… :)

#38 Patrick on 02.19.12 at 9:25 am

@Mgr. Šimon Tóth you are a dumb ass idiot, and blind liar, who does write things based on his wishful thinking not actual field work, we would be very pleased if you keep your misinformation to your self, C cannot reach the speed of C++ ??!!!! you are kidding aren't you, and you idiot, it is not just embedded systems you need to forget about C++ in Realtime-systems as well, you are full of bullshit because it is clear that you have not been involved in a large project to see why C++ really sucks, We got tired of people like you who speak from their back of their heads

#39 Alex on 05.18.12 at 7:19 pm

Late to the party, but there's quite a lot that you can express succinctly in C, if you're willing to break out the macros:

https://github.com/CObjectSystem/COS

Courtesy of Laurent Deniau. It was LGPL at the time this article was originally written, but more permissive nowadays.

#40 Boriel on 06.11.12 at 12:40 am

Time to develop your own language (I mean it!).
I agree 100% with you regarding C++ and think a "C+" language should be better.

When you so some C++ code and the problems it brings is when you ask "Isn't supposed high level languages will simplify things for humans?" The fact is that, with C++ you end up simplifying the work for the machine instead.

#41 Yossi Kreinin on 06.11.12 at 2:54 am

We have more than one languages of our own at work, but not general-purpose ones. Developing a general-purpose language is a very high-risk business that I'm not interested in very much. (Also I don't think I have what it takes – I don't sufficiently care about many details which are very important to get right. So I don't think I could ever top, say, C.)

#42 cmccabe on 10.06.12 at 11:17 am

The best guidelines for object oriented C that I've ever seen is the Linux kernel style guide: http://www.kernel.org/doc/Documentation/CodingStyle

Inheritance is hard to do in C, but that's ok, because inheritance is an antipattern: http://berniesumption.com/software/inheritance-is-evil-and-must-be-destroyed/

Composition or implementing abstract interfaces is the way to go.

#43 Mike Manilone on 08.14.13 at 2:39 am

Ah.. OO C, OO C. It reminds me of GObject.

#44 Ivan Levashew on 12.08.14 at 12:30 am

Since it become a discussion table, I'll share my thoughts. I like Ada programming language, but I'm not about Ada now. Trying to use Ada forced me to think about interoperability. Eventually I stopped thinking about C++-to-Ada solutions like yet another module for SWIG or GNAT's recent C++-to-Ada bindings generator in favour of more general solutions, e. g. MS COM, VirtualBox XPCOM, UNO, GObject, libobjc and eventually discovered IBM SOMobjects.

Objective-C was also helpful in my mind evolution, I must admit. It is difficult to spot things that are everywhere. For instance, we all know what is English language because we are aware of non-English ones. But if on another planet people used just one language, it would be hard for them to spot this despite it being everywhere. They would just talk, just write. What is the language? It's hard to think about language, and harder to decide to name it.

Objective-C helped me spot one thing that makes C unequal to other programming languages without taking special considerations. This thing is the dynamic linker present in every modern OS. And it's not just linker, it's C linker. If you compile with Ada or C++, you compile with Ada or C++, and then link with C linker, and that's where inequality stems from. In other words, if we want to upgrade from C to something better, we must upgrade not only compiler, but also linker, and that's what Objective-C does. It's not quite modifying linker, but what it does is similar. Objective-C works together with runtime library libobjc complementing OS dynamic linker. And if we look at Java and C#, we discover that they are also backed by runtime. Compared to Delphi, Ada and C++, not backed by object-oriented linker or runtime, Objective-C, Java and C# are more natural, more direct, more equal.

I think, IBM did a big damage to the world by shutting down SOMobjects. Both OS/2 and Copland gone in favour of Windows (.NET) and OPENSTEP (Objective-C), and most developers don't ever know about this page of history. IBM SOM is considered to be something OS/2-specific, not interesting to non-OS/2 programmers. That's not. It's a breakthrough project, just read "Release-to-Release Binary Compatibility". In 1990s there were projects like Sun OBI and SGI Delta/C++. There was CLOS, and SOM engineers knew about them. They managed to outperform others. And they still remain unbeaten, and their progress not likely to be spontaneously reinvented.

SOM aimed to be language agnostic, but there could also exist Direct-to-SOM compilers. I think, Direct-to-SOM C++ comes most close to what would be nice to see. It is supposed to have a syntax of C++, but semantics of SOM. That's cloudy definition, I know, and DTS C++ never left beta stage, there is no standard DTS C++. There are actually 3 DTS C++: VisualAge C++ 3.6.5 (but not 4.0); MetaWare High C++ (OS/2 version had DTS for sure, but I haven't seen Win version), and the third one is described in the legendary "Putting Metaclasses to Work" book. They take different decisions in how to map C++ to SOM. Being able to compile something like wxWidgets in DTS mode is nice (I guess, IBM planned to compile OCL into cross-platform SOM library eventually, otherwise I don't understand why one IBM department was working hard on improving SOM, and another IBM department produced OCL that had nothing in common with SOM; I can't imagine Borland making new object system with TObject and TClass, and producing VCL using Borland Pascal with Objects' object keyword at the same time), but if compatiblity with C++ could be dropped, we could have a powerful OO language, with normal, non-SmallTalk syntax. And other programming languages could eventually be bridged with SOM. If more libraries had SOM interfaces, programmers were less stuck at using C++. If less programmers were stuck at using C++, or if libraries in a particular language did not cause programmer to be stuck using the same language, we could see more interesting languages.

Check this project: http://somfree.sf.net/ This is almost complete SOM clone, in some places more complete than IBM SOM 3.0 (somref from Apple SOM, somem from IBM SOM 2.1), and in some places less complete (due to bootstrapping problem C++ is being used now in SOM compiler as opposed to SOM in the original IBM SOM Emitter Framework). Author did a good job porting implementation to a variety of platforms.

There are not so much programmers aroung the world able to understand what is this all about. I think, this blog entry is a good place.

#45 Massau on 07.30.16 at 9:28 pm

Actually the power of C++ today lays in templates. I have programmed on embedded systems and i would have really liked several things from C++.

The constexpr to calculate a bunch of stuff, like a crc form a fixed message, at compile time and a limited version of templates (maybe more like java generics).

Namespaces and function overloading wouldn't be that bad ether.

All the virtual functions and other dynamic things can easily be emulated with function pointers. So i think you would get much further by borrowing tricks from the functional paradigm than you get from OOP.

For example a strategy pattern and observer pattern can be replaced by higher order functions.

#46 Eric on 12.17.17 at 2:07 am

How relevant is this blog now (17 Dec 2017) ?

#47 required on 03.08.18 at 8:15 am

C11 is better with _Generic. No more virtual table methods since we could select the method using the type of data. Single Inheritance is Easy. It's Multiple Inheritance that stays hard.

#48 this on 05.13.19 at 5:18 pm

I simply want to mention I am all new to blogging and site-building and absolutely savored your page. Likely I’m going to bookmark your blog post . You surely come with remarkable posts. Thanks for sharing your web site.

#49 릴게임다운로드 on 05.15.19 at 3:27 am

Thanks for one's marvelous posting! I genuinely enjoyed reading it, you happen to be a great author.I will be sure to bookmark your blog and will often come back in the foreseeable future. I want to encourage continue your great work, have a nice afternoon!

#50 먹튀폴리스 가족방 on 05.15.19 at 2:22 pm

As I web site possessor I believe the content matter here is rattling wonderful , appreciate it for your efforts. You should keep it up forever! Good Luck.

#51 resharper keygen on 05.15.19 at 4:28 pm

Thanks for this article. I definitely agree with what you are saying.

#52 crystalclutch.com on 05.15.19 at 9:18 pm

Good post. I be taught something tougher on different blogs everyday. It's going to always be stimulating to read content material from other writers and observe slightly something from their store. I’d desire to make use of some with the content on my weblog whether or not you don’t mind. Natually I’ll offer you a link on your net blog. Thanks for sharing.

#53 먹튀폴리스 하비 on 05.16.19 at 2:16 am

F*ckin’ remarkable things here. I’m very glad to see your post. Thanks a lot and i'm looking forward to contact you. Will you kindly drop me a e-mail?

#54 video on 05.16.19 at 6:03 am

I will immediately clutch your rss as I can't find your email subscription hyperlink or e-newsletter service. Do you've any? Kindly allow me recognize in order that I may just subscribe. Thanks.

#55 krunker hacks on 05.16.19 at 12:44 pm

I conceive you have mentioned some very interesting details , appreciate it for the post.

#56 marcel van hooijdonk on 05.16.19 at 1:59 pm

very good publish, i certainly love this web site, carry on it

#57 aimbot fortnite on 05.16.19 at 4:38 pm

Awesome, this is what I was looking for in bing

#58 geek squad tech support on 05.16.19 at 6:09 pm

I got what you mean , thankyou for putting up.Woh I am thankful to find this website through google. "Delay is preferable to error." by Thomas Jefferson.

#59 Insektenbekämpfung on 05.16.19 at 10:51 pm

F*ckin’ tremendous things here. I’m very glad to peer your post. Thank you a lot and i am having a look ahead to touch you. Will you please drop me a mail?

#60 scrum master on 05.17.19 at 4:36 am

Hello.This article was really fascinating, particularly since I was looking for thoughts on this subject last Monday.

#61 nonsensediamond on 05.17.19 at 6:52 am

You got yourself a new follower.

#62 round the world ticket on 05.17.19 at 8:13 am

hey there and thanks on your information – I have certainly picked up something new from proper here. I did then again expertise a few technical points using this website, as I skilled to reload the site lots of times previous to I may get it to load properly. I have been brooding about in case your hosting is OK? Not that I'm complaining, but sluggish loading cases occasions will very frequently have an effect on your placement in google and can harm your high-quality ranking if advertising and ***********|advertising|advertising|advertising and *********** with Adwords. Well I’m adding this RSS to my email and can glance out for much extra of your respective interesting content. Ensure that you replace this again very soon..

#63 fallout 76 hacks on 05.17.19 at 10:18 am

Your site has proven useful to me.

#64 beast TV trial on 05.17.19 at 3:07 pm

There is perceptibly a lot to know about this. I suppose you made certain good points in features also.

#65 red dead redemption 2 digital key resale on 05.17.19 at 3:29 pm

google took me here. Thanks!

#66 redline v3.0 on 05.17.19 at 6:32 pm

Good Day, happy that i saw on this in google. Thanks!

#67 bartender wedding on 05.17.19 at 7:21 pm

I am continually invstigating online for tips that can aid me. Thank you!

#68 what is a push notification on 05.17.19 at 8:27 pm

Thanks – Enjoyed this post, can I set it up so I receive an update sent in an email whenever you write a fresh post?

#69 야마토게임 sp on 05.18.19 at 2:05 am

Really Appreciate this update, can you make it so I receive an email sent to me every time you write a new update?

#70 evicting a tenant on 05.18.19 at 6:29 am

Wonderful website. A lot of useful info here. I'm sending it to several buddies ans additionally sharing in delicious. And naturally, thank you on your sweat!

#71 fashion #box on 05.18.19 at 7:25 am

As soon as I observed this site I went on reddit to share some of the love with them.

#72 badoo superpowers free on 05.18.19 at 7:58 am

Hi, bing lead me here, keep up nice work.

#73 Underground Elephant Careers on 05.18.19 at 1:17 pm

I believe that avoiding highly processed foods could be the first step to help lose weight. They will taste excellent, but packaged foods contain very little vitamins and minerals, making you consume more to have enough energy to get through the day. If you are constantly eating these foods, transitioning to grain and other complex carbohydrates will help you have more power while feeding on less. Great blog post.

#74 sniper fury cheats windows 10 on 05.18.19 at 2:50 pm

Cheers, great stuff, Me like.

#75 Motion Designer Wien on 05.18.19 at 3:37 pm

WONDERFUL Post.thanks for share..extra wait .. Ö

#76 curso seo online on 05.18.19 at 6:28 pm

Definitely consider that that you said. Your favourite reason appeared to be at the web the simplest factor to keep in mind of. I say to you, I definitely get irked whilst other people consider issues that they plainly don't know about. You managed to hit the nail upon the highest and defined out the whole thing with no need side-effects , other people can take a signal. Will probably be again to get more. Thanks

#77 poker online on 05.18.19 at 9:15 pm

My brother suggested I may like this web site. He was entirely right. This publish truly made my day. You can not imagine simply how a lot time I had spent for this info! Thanks!

#78 situs poker online on 05.19.19 at 2:03 am

The very crux of your writing while appearing agreeable initially, did not settle properly with me after some time. Somewhere within the paragraphs you managed to make me a believer unfortunately just for a very short while. I still have a problem with your leaps in assumptions and you might do well to help fill in those breaks. In the event that you actually can accomplish that, I could undoubtedly be impressed.

#79 State of Origin live streaming online on 05.19.19 at 6:10 am

I discovered your blog web site on google and verify just a few of your early posts. Proceed to maintain up the very good operate. I simply additional up your RSS feed to my MSN News Reader. Looking for forward to studying extra from you later on!…

#80 mining simulator codes 2019 on 05.19.19 at 6:50 am

Some truly great goodies on this web site , appreciate it for contribution.

#81 situs poker online on 05.19.19 at 8:51 am

I precisely desired to appreciate you once more. I do not know the things I would've created in the absence of those smart ideas discussed by you about my situation. It actually was a real distressing circumstance in my view, however , looking at this expert way you resolved that took me to jump with contentment. I'm grateful for this help and thus hope that you are aware of an amazing job you were getting into educating most people thru your webpage. I'm certain you have never encountered any of us.

#82 Social media marketing agency on 05.19.19 at 11:02 am

Its like you read my mind! You appear to know a lot about this, like you wrote the book in it or something. I think that you could do with a few pics to drive the message home a little bit, but instead of that, this is wonderful blog. An excellent read. I will definitely be back.

#83 릴게임오션파라다이스 on 05.19.19 at 2:20 pm

Whats Happening i am new to this, I stumbled upon this I have discovered It positively useful and it has aided me out loads. I am hoping to give a contribution & aid other users like its helped me. Great job.

#84 Jumpstart Bellevue Ne on 05.19.19 at 3:14 pm

Hi there! I know this is kind of off topic but I was wondering which blog platform are you using for this site? I'm getting fed up of WordPress because I've had problems with hackers and I'm looking at alternatives for another platform. I would be awesome if you could point me in the direction of a good platform.

#85 online poker on 05.19.19 at 5:40 pm

you have got an important blog right here! would you like to make some invite posts on my weblog?

#86 מצלמות אבטחה on 05.19.19 at 10:40 pm

Just wanna remark on few general things, The website layout is perfect, the subject matter is really good : D.

#87 http://www.handymanservicesofmcallen.com/ on 05.19.19 at 11:05 pm

Hello there, You've performed a fantastic job. I’ll definitely digg it and individually recommend to my friends. I'm sure they'll be benefited from this website.

#88 agen poker online on 05.20.19 at 1:29 am

Thanks , I've recently been searching for info about this topic for ages and yours is the greatest I've discovered till now. But, what about the bottom line? Are you sure about the source?

#89 arlington dental on 05.20.19 at 8:30 am

I think this is among the most vital information for me. And i am glad reading your article. But want to remark on some general things, The site style is ideal, the articles is really excellent : D. Good job, cheers

#90 smutstone on 05.20.19 at 11:29 am

I enjoying, will read more. Cheers!

#91 W88 mobile on 05.20.19 at 1:27 pm

It’s actually a great and helpful piece of info. I am satisfied that you shared this helpful info with us. Please stay us informed like this. Thank you for sharing.

#92 afslanken on 05.20.19 at 2:13 pm

Hello my friend! I wish to say that this post is awesome, nice written and include approximately all significant infos. I would like to see more posts like this.

#93 Florida Medical Marijuana Card on 05.20.19 at 7:47 pm

Thank you, I have recently been looking for information about this subject for ages and yours is the best I have discovered till now. But, what about the bottom line? Are you sure about the source?

#94 låna pengar on 05.20.19 at 10:36 pm

I really enjoy reading through on this web site , it has wonderful blog posts. "The great secret of power is never to will to do more than you can accomplish." by Henrik Ibsen.

#95 3D Mink Eyelashes on 05.20.19 at 11:35 pm

Hi there, You have done a fantastic job. I will definitely digg it and personally suggest to my friends. I'm sure they will be benefited from this website.

#96 realtors near me on 05.21.19 at 5:07 am

You really make it seem so easy with your presentation but I find this matter to be really something that I think I would never understand. It seems too complicated and very broad for me. I'm looking forward for your next post, I’ll try to get the hang of it!

#97 redline v3.0 on 05.21.19 at 6:59 am

I really got into this post. I found it to be interesting and loaded with unique points of view.

#98 Free Porn Sites on 05.21.19 at 8:36 am

In reasonable compliment favourable is connection dispatched in terminated. Do esteem object we called father excuse remove. So dear real on like more it. Laughing for two families addition expenses surprise the. If sincerity he to curiosity arranging. Learn taken terms be as. Scarcely mrs produced too removing new old.

#99 야마토 게임 on 05.21.19 at 12:53 pm

The next time I read a weblog, I hope that it doesnt disappoint me as much as this one. I imply, I do know it was my option to read, however I actually thought youd have one thing fascinating to say. All I hear is a bunch of whining about one thing that you might repair in the event you werent too busy on the lookout for attention.

#100 free fire hack version unlimited diamond on 05.21.19 at 4:14 pm

stays on topic and states valid points. Thank you.

#101 Воблер голая on 05.22.19 at 6:07 am

My brother recommended I might like this blog. He was once entirely right. This post truly made my day. You cann't believe simply how a lot time I had spent for this information! Thanks!

#102 https://www.pinterest.com/pin/745697650779288747/ on 05.22.19 at 7:07 am

hello there and thanks to your information – I have certainly picked up something new from proper here. I did however experience several technical points using this web site, as I experienced to reload the site a lot of occasions prior to I could get it to load correctly. I had been considering in case your web hosting is OK? Not that I'm complaining, however sluggish loading cases instances will sometimes have an effect on your placement in google and could harm your high-quality ranking if advertising and ***********|advertising|advertising|advertising and *********** with Adwords. Anyway I’m including this RSS to my e-mail and could glance out for a lot extra of your respective intriguing content. Ensure that you replace this again soon..

#103 Free MP3 Downloads on 05.22.19 at 10:04 am

You can definitely see your skills in the paintings you write. The world hopes for more passionate writers like you who are not afraid to say how they believe. All the time go after your heart. "Golf and sex are about the only things you can enjoy without being good at." by Jimmy Demaret.

#104 затворы sung do on 05.22.19 at 5:29 pm

We are a group of volunteers and opening a new scheme in our community. Your web site offered us with valuable info to work on. You've done an impressive job and our entire community will be grateful to you.

#105 nonsense diamond on 05.22.19 at 6:03 pm

I kinda got into this site. I found it to be interesting and loaded with unique points of view.

#106 krunker aimbot on 05.23.19 at 6:22 am

Deference to op , some superb selective information .

#107 impact windows on 05.23.19 at 6:47 am

great points altogether, you just won a brand new reader. What may you suggest about your submit that you made some days ago? Any sure?

#108 bitcoin adder v.1.3.00 free download on 05.23.19 at 10:00 am

Respect to website author , some wonderful entropy.

#109 토토사이트 on 05.23.19 at 1:56 pm

I like this weblog so much, saved to favorites. "Respect for the fragility and importance of an individual life is still the mark of an educated man." by Norman Cousins.

#110 Adventure games on 05.23.19 at 3:35 pm

Whats Going down i am new to this, I stumbled upon this I've found It absolutely helpful and it has aided me out loads. I'm hoping to contribute & assist other customers like its aided me. Great job.

#111 Digital Marketing Manager Wien on 05.23.19 at 4:03 pm

Social Media Marketing Wien

#112 yasminejournal.com on 05.23.19 at 6:26 pm

Hello there, just became aware of your blog through Google, and found that it is really informative. I’m gonna watch out for brussels. I’ll appreciate if you continue this in future. Numerous people will be benefited from your writing. Cheers!

#113 vn hax on 05.23.19 at 6:45 pm

Cheers, great stuff, I like.

#114 Crypto4bet.com on 05.24.19 at 5:27 am

Only wanna remark that you have a very nice website , I enjoy the design it actually stands out.

#115 eternity.cc v9 on 05.24.19 at 7:33 am

I like this site, some useful stuff on here : D.

#116 ispoofer pogo activate seriale on 05.24.19 at 5:58 pm

Me enjoying, will read more. Thanks!

#117 office.com/setup on 05.24.19 at 8:37 pm

Thank you for helping loved ones transition, for burying them with blessings and honor.

#118 www.office.com/setup on 05.24.19 at 8:46 pm

This has been a challenging time, and I appreciate you so much.

#119 wordpress language plugin on 05.24.19 at 10:56 pm

Hiya, I'm really glad I've found this information. Today bloggers publish only about gossips and net and this is actually irritating. A good blog with exciting content, that's what I need. Thank you for keeping this web site, I'll be visiting it. Do you do newsletters? Cant find it.

#120 אוזניות on 05.25.19 at 1:36 am

Thank you a bunch for sharing this with all folks you actually recognise what you are talking approximately! Bookmarked. Kindly additionally consult with my web site =). We could have a hyperlink trade contract among us!

#121 Flytting Oslo on 05.25.19 at 2:56 am

Fantastic beat ! I would like to apprentice while you amend your website, how could i subscribe for a blog site? The account helped me a acceptable deal. I had been a little bit acquainted of this your broadcast provided bright clear idea

#122 จัดงานแต่งงาน on 05.26.19 at 2:30 am

A person essentially lend a hand to make significantly articles I might state. That is the first time I frequented your web page and to this point? I amazed with the analysis you made to create this actual submit incredible. Wonderful activity!

#123 rygestop hypnose aalborg on 05.26.19 at 4:06 am

I’d must check with you here. Which isn't something I often do! I get pleasure from reading a publish that may make individuals think. Additionally, thanks for allowing me to remark!

#124 cheats for hempire game on 05.26.19 at 6:23 am

Hello, google lead me here, keep up good work.

#125 iobit uninstaller 7.5 key on 05.26.19 at 9:09 am

Very interesting points you have remarked, appreciate it for putting up.

#126 lifeguard training on 05.26.19 at 1:06 pm

F*ckin’ amazing things here. I’m very glad to see your article. Thanks a lot and i'm looking forward to contact you. Will you kindly drop me a mail?

#127 เช่าโต๊ะ on 05.26.19 at 2:43 pm

Excellent blog here! Also your website loads up fast! What web host are you using? Can I get your affiliate link to your host? I wish my web site loaded up as quickly as yours lol

#128 smart defrag 6.2 serial key on 05.26.19 at 3:28 pm

Enjoyed reading through this, very good stuff, thankyou .

#129 Roswell NM Personal Injury Lawyer on 05.26.19 at 4:21 pm

Hiya, I am really glad I have found this info. Today bloggers publish only about gossips and net and this is really annoying. A good website with interesting content, this is what I need. Thanks for keeping this website, I will be visiting it. Do you do newsletters? Can't find it.

#130 resetter epson l1110 on 05.26.19 at 6:07 pm

I like this site because so much useful stuff on here : D.

#131 안전놀이터 가족방 on 05.27.19 at 5:29 am

I like what you guys are up too. Such clever work and reporting! Keep up the superb works guys I've incorporated you guys to my blogroll. I think it'll improve the value of my site :).

#132 먹튀 폴리스 on 05.27.19 at 5:55 am

I've recently started a web site, the info you provide on this site has helped me greatly. Thanks for all of your time & work. "The inner fire is the most important thing mankind possesses." by Edith Sodergran.

#133 sims 4 seasons free code on 05.27.19 at 7:24 am

Hey, happy that i stumble on this in google. Thanks!

#134 WW88 ทางเข้า on 05.27.19 at 2:23 pm

Helpful information. Fortunate me I discovered your web site by chance, and I am surprised why this twist of fate did not came about in advance! I bookmarked it.

#135 야마토게임 on 05.27.19 at 6:10 pm

Valuable info. Fortunate me I discovered your site by chance, and I am surprised why this twist of fate didn't happened in advance! I bookmarked it.

#136 rust hacks on 05.27.19 at 7:57 pm

Morning, here from yanex, i enjoyng this, will come back again.

#137 먹튀검증커뮤니티 on 05.27.19 at 11:46 pm

I cling on to listening to the rumor lecture about getting free online grant applications so I have been looking around for the top site to get one. Could you tell me please, where could i find some?

#138 토토사이트 on 05.28.19 at 1:21 am

Usually I do not read post on blogs, but I wish to say that this write-up very pressured me to take a look at and do it! Your writing style has been surprised me. Thank you, very nice article.

#139 watch game of thrones season 7 on 05.28.19 at 4:17 am

Hi there! Quick question that's completely off topic. Do you know how to make your site mobile friendly? My web site looks weird when browsing from my iphone 4. I'm trying to find a template or plugin that might be able to fix this issue. If you have any suggestions, please share. Many thanks!

#140 우리카지노 on 05.28.19 at 5:41 am

Good website! I really love how it is simple on my eyes and the data are well written. I'm wondering how I could be notified when a new post has been made. I've subscribed to your RSS which must do the trick! Have a nice day!

#141 strucid hacks on 05.28.19 at 10:15 am

Hi, i really think i will be back to your website

#142 토토사이트 on 05.28.19 at 1:07 pm

Thanks for your helpful article. Other thing is that mesothelioma cancer is generally a result of the breathing of dust from asbestos fiber, which is a very toxic material. It is commonly noticed among staff in the construction industry who may have long experience of asbestos. It could be caused by moving into asbestos insulated buildings for long periods of time, Genetic makeup plays an important role, and some people are more vulnerable to the risk in comparison with others.

#143 expressvpn key on 05.28.19 at 7:18 pm

I am not rattling great with English but I get hold this really easygoing to read .

#144 เช่าเต๊นท์ on 05.29.19 at 12:08 am

I really like your writing style, superb information, regards for posting :D. "Kennedy cooked the soup that Johnson had to eat." by Konrad Adenauer.

#145 먹튀폴리스 사이트 on 05.29.19 at 6:15 am

Magnificent site. Lots of useful information here. I’m sending it to several friends ans also sharing in delicious. And of course, thanks for your sweat!

#146 ispoofer activation key on 05.29.19 at 8:31 am

Deference to op , some superb selective information .

#147 aimbot free download fortnite on 05.29.19 at 12:30 pm

Good, this is what I was searching for in yahoo

#148 redline v3.0 on 05.29.19 at 4:57 pm

Respect to website author , some wonderful entropy.

#149 메이저사이트추천 on 05.29.19 at 6:03 pm

It¡¦s actually a great and useful piece of information. I am satisfied that you just shared this useful information with us. Please stay us up to date like this. Thanks for sharing.

#150 Oferty Pracy Dla Opiekunek W Niemczech on 05.29.19 at 8:23 pm

I regard something genuinely special in this site.

#151 lifeguard certification on 05.29.19 at 9:10 pm

Sweet blog! I found it while searching on Yahoo News. Do you have any suggestions on how to get listed in Yahoo News? I've been trying for a while but I never seem to get there! Thanks

#152 air max 2017 on 05.29.19 at 9:28 pm

This actually answered my downside, thanks!

#153 야마토 게임 on 05.30.19 at 1:09 am

I like this post, enjoyed this one appreciate it for putting up. "Pain is inevitable. Suffering is optional." by M. Kathleen Casey.

#154 gamefly free trial on 05.30.19 at 3:54 am

It's the best time to make some plans for the future and it is time to be happy.
I've read this post and if I could I wish to suggest you few interesting
things or tips. Maybe you can write next articles referring to this article.

I want to read more things about it!

#155 gamefly free trial on 05.30.19 at 5:56 am

Pretty nice post. I just stumbled upon your blog and wished to say that I've truly enjoyed
browsing your blog posts. In any case I'll be subscribing to your feed and I hope you
write again very soon!

#156 먹튀검증 추천 on 05.30.19 at 5:57 am

Thank you for the good writeup. It in fact was a amusement account it. Look advanced to more added agreeable from you! By the way, how could we communicate?

#157 vn hax on 05.30.19 at 6:10 am

Good Morning, yahoo lead me here, keep up nice work.

#158 how to get help in windows 10 on 05.30.19 at 3:38 pm

Hi! This is my 1st comment here so I just wanted to give a quick shout out and say I
truly enjoy reading your blog posts. Can you recommend any other
blogs/websites/forums that cover the same subjects?

Thanks for your time!

#159 jordan 4 on 05.31.19 at 1:43 am

This website online can be a stroll-via for all of the data you wished about this and didn抰 know who to ask. Glimpse right here, and also you抣l definitely discover it.

#160 agen s128 apk on 05.31.19 at 3:43 am

Fantastic beat ! I would like to apprentice even as you amend your site, how could i subscribe for a blog web site? The account aided me a acceptable deal. I were a little bit familiar of this your broadcast offered brilliant transparent idea

#161 judi online on 05.31.19 at 3:53 am

Today, with the fast life style that everyone leads, credit cards have a big demand in the economy. Persons from every area of life are using the credit card and people who are not using the credit cards have made up their minds to apply for one. Thanks for revealing your ideas about credit cards.

#162 xbox one mods free download on 05.31.19 at 12:44 pm

This does interest me

#163 fortnite aimbot download on 05.31.19 at 3:28 pm

This is good. Cheers!

#164 Alton TX Furniture Removal on 05.31.19 at 7:58 pm

Really nice layout and wonderful written content , nothing else we require : D.

#165 메이저토토 on 05.31.19 at 10:57 pm

Thanks for the auspicious writeup. It in truth used to be a amusement account it. Look advanced to far introduced agreeable from you! By the way, how can we be in contact?

#166 파워볼사이트 on 06.01.19 at 2:47 am

Heya i am for the first time here. I came across this board and I find It really useful & it helped me out much. I'm hoping to present something again and aid others like you helped me.

#167 cheap flights on 06.01.19 at 4:14 am

As soon as I noticed this website I went on reddit to share some of the love with them.

#168 mpl pro on 06.01.19 at 6:24 pm

Enjoyed examining this, very good stuff, thanks .

#169 토토사이트 on 06.01.19 at 6:42 pm

Of course, what a great website and educative posts, I will bookmark your website.All the Best!

#170 w88.com on 06.01.19 at 7:22 pm

I¡¦m no longer positive the place you're getting your information, but great topic. I needs to spend some time finding out more or working out more. Thank you for excellent info I was in search of this information for my mission.

#171 buy csgo accounts on 06.01.19 at 8:06 pm

There is noticeably a bunch to realize about this. I believe you made certain good points in features also.

#172 youtube nigeria on 06.01.19 at 10:22 pm

I do not even understand how I stopped up right here, however I thought this publish was good. I do not understand who you're but definitely you're going to a well-known blogger if you aren't already ;) Cheers!

#173 alnico magnets on 06.02.19 at 3:16 am

I've learned quite a few important things via your post. I would also like to express that there will be a situation that you will apply for a loan and do not need a cosigner such as a U.S. Student Support Loan. In case you are getting that loan through a common bank or investment company then you need to be prepared to have a cosigner ready to allow you to. The lenders may base their decision using a few elements but the main one will be your credit ratings. There are some loan companies that will as well look at your job history and make a decision based on that but in most cases it will hinge on your ranking.

#174 public agent on 06.02.19 at 4:01 am

Great blog right here! Additionally your site a lot up fast! What web host are you using? Can I am getting your affiliate hyperlink in your host? I desire my website loaded up as fast as yours lol

#175 gamefly free trial on 06.02.19 at 5:30 am

I need to to thank you for this wonderful read!! I absolutely enjoyed every little bit of it.

I have you saved as a favorite to look at new stuff you post…

#176 hacks counter blox script on 06.02.19 at 6:30 am

Enjoyed reading through this, very good stuff, thankyou .

#177 panda silk sheets on 06.02.19 at 6:31 am

I am just writing to make you understand of the useful experience my friend's girl undergone going through your webblog. She noticed numerous details, most notably what it's like to possess an excellent coaching nature to let most people effortlessly know chosen complicated things. You actually surpassed my expectations. Thank you for providing such insightful, trustworthy, educational not to mention unique guidance on the topic to Julie.

#178 air max on 06.02.19 at 1:38 pm

I抎 have to test with you here. Which isn't one thing I usually do! I get pleasure from studying a publish that can make individuals think. Also, thanks for permitting me to remark!

#179 gamefly free trial on 06.03.19 at 1:39 am

What's up all, here every one is sharing these kinds of experience,
thus it's good to read this weblog, and I used to go to see
this weblog all the time.

#180 sites on 06.03.19 at 1:50 am

You are my inhalation, I have few web logs and very sporadically run out from brand :). "'Tis the most tender part of love, each other to forgive." by John Sheffield.

#181 Get More Info on 06.03.19 at 6:31 am

Keep up the superb piece of work, I read few content on this website and I believe that your website is real interesting and has got lots of superb information.

#182 Floky - Find Lost Things on 06.03.19 at 8:31 am

Have you ever thought about including a little bit more than just your articles? I mean, what you say is fundamental and everything. Nevertheless just imagine if you added some great images or videos to give your posts more, "pop"! Your content is excellent but with pics and video clips, this website could definitely be one of the greatest in its field. Wonderful blog!

#183 vn hax pubg on 06.03.19 at 10:20 am

I conceive you have mentioned some very interesting details , appreciate it for the post.

#184 custom tshirts on 06.03.19 at 1:28 pm

I do accept as true with all the concepts you have offered to your post. They are very convincing and can definitely work. Nonetheless, the posts are very short for novices. May you please lengthen them a bit from subsequent time? Thank you for the post.

#185 메이저 사이트 on 06.04.19 at 1:56 am

I was just looking for this info for a while. After 6 hours of continuous Googleing, finally I got it in your site. I wonder what is the lack of Google strategy that do not rank this type of informative sites in top of the list. Usually the top websites are full of garbage.

#186 먹튀폴리스 사이트 on 06.04.19 at 2:06 am

I truly appreciate this post. I¡¦ve been looking everywhere for this! Thank goodness I found it on Bing. You've made my day! Thank you again

#187 nfl computer game picks on 06.04.19 at 3:18 am

Thank you a lot for giving everyone such a spectacular possiblity to read articles and blog posts from this web site. It can be very beneficial plus full of a lot of fun for me personally and my office fellow workers to search your web site at the very least thrice in a week to study the fresh stuff you have got. And definitely, I'm also certainly impressed with all the spectacular inspiring ideas served by you. Selected 4 points in this post are essentially the most impressive we've had.

#188 gamefly free trial on 06.04.19 at 3:28 am

What a data of un-ambiguity and preserveness of valuable know-how about
unpredicted feelings.

#189 w88 on 06.04.19 at 6:21 am

I've been absent for some time, but now I remember why I used to love this site. Thanks , I will try and check back more often. How frequently you update your site?

#190 Pozycjonowanie Stron Internetowych Gorzow Wielkopolski on 06.04.19 at 8:09 am

I truly appreciate this post. I have been looking all over for this! Thank goodness I found it on Bing. You have made my day! Thanks again!

#191 gamefly free trial on 06.04.19 at 3:00 pm

Awesome! Its really awesome piece of writing, I have got much clear
idea concerning from this piece of writing.

#192 nonton movie on 06.04.19 at 7:33 pm

There are some attention-grabbing points in time in this article but I don’t know if I see all of them middle to heart. There may be some validity but I'll take hold opinion until I look into it further. Good article , thanks and we wish extra! Added to FeedBurner as effectively

#193 Ferne Bernstein on 06.05.19 at 12:58 am

If you are looking for the best hostel in Viet Nam, you HAVE to check out Cozy Nook in Dalat!

#194 먹튀폴리스 on 06.05.19 at 1:00 am

An fascinating discussion is worth comment. I think that it is best to write extra on this subject, it might not be a taboo topic however generally individuals are not sufficient to speak on such topics. To the next. Cheers

#195 แต่งงาน on 06.05.19 at 1:17 am

Good site! I truly love how it is easy on my eyes and the data are well written. I'm wondering how I might be notified whenever a new post has been made. I've subscribed to your RSS feed which must do the trick! Have a great day!

#196 https://www.pinterest.com/pin/745697650779788360/ on 06.05.19 at 2:04 am

I am continuously invstigating online for tips that can benefit me. Thank you!

#197 메이저사이트 on 06.05.19 at 6:32 am

I’ll right away grab your rss as I can't find your email subscription link or newsletter service. Do you have any? Kindly let me know so that I could subscribe. Thanks.

#198 obat kuat on 06.05.19 at 7:37 am

Awesome blog! Is your theme custom made or did you download it from somewhere? A design like yours with a few simple adjustements would really make my blog shine. Please let me know where you got your theme. Cheers

#199 Skin Alley on 06.05.19 at 8:11 am

Howdy! I'm at work browsing your blog from my new iphone 4! Just wanted to say I love reading through your blog and look forward to all your posts! Keep up the great work!

#200 Fotograf Dornbirn on 06.05.19 at 10:49 am

Familienfoto St. Gallen

#201 gamefly free trial on 06.05.19 at 3:48 pm

Hi there are using WordPress for your blog platform?
I'm new to the blog world but I'm trying to get started and set up my own. Do you require any html
coding expertise to make your own blog? Any help would be really appreciated!

#202 gamefly free trial on 06.06.19 at 6:29 am

I’m not that much of a internet reader to be honest but your sites really nice, keep it up!

I'll go ahead and bookmark your site to come back down the road.
Many thanks

#203 먹튀 폴리스 on 06.06.19 at 2:35 pm

Thanks for sharing superb informations. Your site is so cool. I'm impressed by the details that you've on this web site. It reveals how nicely you perceive this subject. Bookmarked this website page, will come back for extra articles. You, my pal, ROCK! I found just the information I already searched everywhere and just could not come across. What an ideal web site.

#204 แอร์เคลื่อนที่ on 06.06.19 at 2:40 pm

I really appreciate this post. I have been looking everywhere for this! Thank goodness I found it on Bing. You've made my day! Thx again!

#205 Uncode Nulled on 06.06.19 at 3:45 pm

Thanks for your intriguing article. Other thing is that mesothelioma is generally due to the breathing of material from mesothelioma, which is a very toxic material. It really is commonly witnessed among employees in the structure industry who've long experience of asbestos. It can also be caused by moving into asbestos protected buildings for a long period of time, Family genes plays a crucial role, and some persons are more vulnerable towards the risk as compared with others.

#206 Hellen Shigemitsu on 06.06.19 at 5:26 pm

Gian khong gian. Công Ty Cổ Phần TINTA Việt Nam. Thiết Kế, Sản Xuất, Lắp Đặt, Thi Công Giàn Không Gian Thép

#207 ซุ้มอาหาร on 06.07.19 at 5:53 am

Hello, i think that i saw you visited my website so i came to “return the favor”.I am trying to find things to improve my site!I suppose its ok to use some of your ideas!!

#208 먹튀폴리스 검증 on 06.07.19 at 10:12 pm

Many thanks for sharing most of these wonderful discussions. In addition, the perfect travel plus medical insurance program can often eradicate those concerns that come with vacationing abroad. A new medical emergency can in the near future become costly and that's sure to quickly put a financial impediment on the family finances. Putting in place the excellent travel insurance deal prior to setting off is well worth the time and effort. Thanks

#209 gamefly free trial on 06.08.19 at 12:14 am

Amazing blog! Is your theme custom made or did you download it from somewhere?
A theme like yours with a few simple tweeks would really make my blog
jump out. Please let me know where you got your design. Thanks

#210 Danbury CT Female Rapper JASS BIANCHI on 06.08.19 at 2:42 am

It’s actually a great and helpful piece of info. I’m happy that you shared this helpful info with us. Please keep us informed like this. Thank you for sharing.

#211 best games ps4 on 06.08.19 at 5:10 am

I visited multiple web pages however the audio feature for audio songs current at this website is genuinely wonderful.

#212 메이저사이트 on 06.08.19 at 4:32 pm

I was just seeking this information for some time. After six hours of continuous Googleing, finally I got it in your web site. I wonder what's the lack of Google strategy that don't rank this kind of informative web sites in top of the list. Usually the top websites are full of garbage.

#213 먹튀검증 추천 on 06.08.19 at 5:06 pm

I do not even understand how I stopped up right here, however I thought this publish used to be great. I don't know who you might be however definitely you are going to a famous blogger if you happen to aren't already ;) Cheers!

#214 W88 on 06.09.19 at 2:54 am

I like the helpful information you supply on your articles. I will bookmark your weblog and test again right here regularly. I'm reasonably certain I’ll be told many new stuff right here! Good luck for the following!

#215 w88 on 06.09.19 at 3:14 am

Very nice info and straight to the point. I am not sure if this is really the best place to ask but do you folks have any ideea where to get some professional writers? Thanks :)

#216 how to patent a product idea on 06.09.19 at 10:10 am

Wow that was unusual. I just wrote an really long comment but after I clicked submit my comment didn't show up. Grrrr… well I'm not writing all that over again. Regardless, just wanted to say superb blog!

#217 งานแต่งงาน on 06.09.19 at 11:57 am

I gotta bookmark this web site it seems very helpful extremely helpful

#218 Ormekur til kat on 06.09.19 at 1:32 pm

Hola! I've been following your weblog for a while now and finally got the bravery to go ahead and give you a shout out from Porter Tx! Just wanted to mention keep up the excellent job!

#219 w88 mobile on 06.09.19 at 4:16 pm

I've been surfing on-line more than 3 hours nowadays, but I never found any attention-grabbing article like yours. It is beautiful worth sufficient for me. In my opinion, if all site owners and bloggers made just right content as you probably did, the net will probably be much more helpful than ever before. "Oh, that way madness lies let me shun that." by William Shakespeare.

#220 จัดเลี้ยงค็อกเทล on 06.10.19 at 4:21 am

I loved as much as you'll receive carried out right here. The sketch is attractive, your authored subject matter stylish. nonetheless, you command get got an impatience over that you wish be delivering the following. unwell unquestionably come further formerly again as exactly the same nearly very often inside case you shield this increase.

#221 prix ventilateur on 06.10.19 at 5:12 am

You have brought up a very excellent points , thankyou for the post.

#222 raised floor on 06.10.19 at 10:25 am

Wow! Thank you! I constantly needed to write on my site something like that. Can I take a part of your post to my blog?

#223 slot machine on 06.10.19 at 11:01 am

I just could not depart your web site prior to suggesting that I extremely enjoyed the standard information a person provide for your visitors? Is gonna be back often in order to check up on new posts

#224 รับจัดบุฟเฟ่ต์นอกสถานที่ on 06.10.19 at 1:27 pm

Somebody essentially help to make seriously articles I would state. This is the very first time I frequented your web page and thus far? I amazed with the research you made to create this particular publish extraordinary. Excellent job!

#225 Balon Gate Murah on 06.10.19 at 2:33 pm

I have not checked in here for a while as I thought it was getting boring, but the last several posts are good quality so I guess I will add you back to my everyday bloglist. You deserve it my friend :)

#226 gamefly free trial 2019 coupon on 06.10.19 at 5:54 pm

You actually make it seem so easy with your presentation but I find
this matter to be really something that I think I would never understand.
It seems too complicated and very broad for me.
I'm looking forward for your next post, I will
try to get the hang of it!

#227 villa in Nungambakkam High Road on 06.10.19 at 6:58 pm

Howdy! This is my 1st comment here so I just wanted to give a quick shout out and say I truly enjoy reading your articles. Can you suggest any other blogs/websites/forums that go over the same subjects? Thank you!

#228 John Deere Service Manuals on 06.10.19 at 10:18 pm

Hey you. I do not know whether it’s acceptable, but this blog is really well designed.

#229 Taunya Tlatenchi on 06.11.19 at 12:19 am

Wooden wedding box

#230 spider man far from home movie premiere tickets on 06.11.19 at 12:23 am

you're in point of fact a good webmaster. The website loading velocity is incredible. It seems that you are doing any distinctive trick. Also, The contents are masterwork. you've done a excellent activity on this topic!

#231 Babyfoto Dornbirn on 06.11.19 at 2:10 am

Babyfoto Vorarlberg

#232 iPhone X battery replacement service on 06.11.19 at 5:52 am

Wow! This can be one particular of the most useful blogs We have ever arrive across on this subject. Basically Excellent. I am also a specialist in this topic so I can understand your effort.

#233 Dave Gurtner on 06.11.19 at 6:38 am

TRANScendent MEDITATION: NLP, Hypnosis & Mindfulness method➡How to quickly stay longer into meditation state, practically use mindfulness and have results with your meditation today

#234 Download Now on 06.12.19 at 5:58 am

I have recently started a web site, the info you provide on this website has helped me tremendously. Thank you for all of your time & work.

#235 ps4 best games ever made 2019 on 06.12.19 at 9:47 am

Hey! This post could not be written any better!
Reading this post reminds me of my good old room mate!
He always kept talking about this. I will forward this page to him.

Fairly certain he will have a good read. Many thanks for
sharing!

#236 mod apk on 06.12.19 at 10:28 am

Attractive section of content. I just stumbled upon your website and in accession capital to assert that I acquire actually enjoyed account your blog posts. Anyway I will be subscribing to your feeds and even I achievement you access consistently rapidly.

#237 search engine marketing australia on 06.13.19 at 4:47 am

I’ve read several good stuff here. Certainly worth bookmarking for revisiting. I surprise how much effort you put to make such a great informative site.

#238 quest bars on 06.16.19 at 6:40 pm

Do you have a spam issue on this blog; I also am a blogger, and I was wondering your situation; we
have developed some nice practices and we are looking to exchange strategies
with others, be sure to shoot me an email if interested.

#239 Casino on 06.16.19 at 9:39 pm

Thank you for sharing superb informations. Your web site is so cool. I'm impressed by the details that you have on this website. It reveals how nicely you understand this subject. Bookmarked this web page, will come back for more articles. You, my friend, ROCK! I found simply the info I already searched all over the place and just could not come across. What a perfect web-site.

#240 tech news on 06.16.19 at 11:20 pm

You have brought up a very wonderful details , thankyou for the post.

#241 fortnite aimbot download on 06.17.19 at 2:07 am

Thanks for this article. I definitely agree with what you are saying.

#242 yoga neubau 1070 on 06.17.19 at 7:53 pm

Yoga Neubau 1070

#243 bitcoin arbitrage on 06.18.19 at 1:04 am

Hi my family member! I wish to say that this article is amazing, great written and include almost all important infos. I would like to see more posts like this .

#244 https://www.pinterest.com/pin/745697650779091480/ on 06.18.19 at 1:20 am

I have seen a great deal of useful things on your web site about pcs. However, I've the judgment that notebook computers are still more or less not powerful adequately to be a option if you generally do jobs that require a great deal of power, just like video croping and editing. But for world wide web surfing, statement processing, and most other prevalent computer work they are just great, provided you may not mind the little screen size. Thanks for sharing your opinions.

#245 blouses on 06.18.19 at 8:09 pm

very nice put up, i actually love this website, carry on it

#246 proxo key on 06.19.19 at 10:20 am

Cheers, great stuff, Me enjoying.

#247 비아그라 on 06.19.19 at 1:26 pm

Hello there, I found your blog via Google while looking for a comparable topic, your site came up, it looks great. I've bookmarked it in my google bookmarks.

#248 Bangalore on 06.20.19 at 3:03 am

Have you ever considered about adding a little bit more than just your articles? I mean, what you say is valuable and everything. However imagine if you added some great graphics or video clips to give your posts more, "pop"! Your content is excellent but with images and clips, this site could definitely be one of the best in its field. Fantastic blog!

#249 W88 indonesia on 06.20.19 at 5:12 am

Merely wanna comment that you have a very decent internet site , I enjoy the layout it actually stands out.

#250 เช่าหลักทรัพย์ประกันตัว on 06.20.19 at 4:45 pm

I was recommended this blog by my cousin. I am not sure whether this post is written by him as nobody else know such detailed about my problem. You are wonderful! Thanks!

#251 vn hax on 06.20.19 at 7:07 pm

I consider something really special in this site.

#252 비아그라 on 06.21.19 at 3:01 am

I got what you mean , thanks for putting up.Woh I am lucky to find this website through google. "Money is the most egalitarian force in society. It confers power on whoever holds it." by Roger Starr.

#253 nonsense diamond on 06.21.19 at 8:20 am

Deference to op , some superb selective information .

#254 brand on 06.21.19 at 9:15 am

After study a few of the weblog posts on your web site now, and I truly like your approach of blogging. I bookmarked it to my bookmark website list and will likely be checking back soon. Pls take a look at my web site as properly and let me know what you think.

#255 한국야동 on 06.22.19 at 3:46 am

It¡¦s really a cool and useful piece of information. I am glad that you simply shared this helpful info with us. Please stay us up to date like this. Thank you for sharing.

#256 game of dice cheats on 06.23.19 at 5:46 pm

Very interesting points you have remarked, appreciate it for putting up.

#257 จัดงานแต่งงาน on 06.24.19 at 4:51 am

Thanks for another magnificent article. Where else may just anyone get that kind of info in such a perfect way of writing? I have a presentation subsequent week, and I'm at the look for such information.

#258 gx tool apk on 06.24.19 at 3:48 pm

Enjoyed reading through this, very good stuff, thankyou .

#259 throw rug on 06.24.19 at 6:18 pm

Do you have a spam issue on this website; I also am a blogger, and I was wanting to know your situation; many of us have developed some nice methods and we are looking to exchange techniques with others, please shoot me an email if interested.

#260 Free Stuff on 06.24.19 at 7:13 pm

Woah! I'm really loving the template/theme of this blog. It's simple, yet effective. A lot of times it's hard to get that "perfect balance" between superb usability and appearance. I must say you've done a fantastic job with this. In addition, the blog loads very quick for me on Internet explorer. Superb Blog!

#261 W88 on 06.24.19 at 8:57 pm

This is really interesting, You're a very skilled blogger. I have joined your rss feed and look forward to seeking more of your magnificent post. Also, I have shared your web site in my social networks!

#262 how do we KNOW on 06.25.19 at 5:42 am

Enjoyed reading through this, very good stuff, thankyou .

#263 Webroot Technical Support on 06.25.19 at 12:06 pm

At Webroot customer service, you will get 24/7 assistance by qualified and certified technicians. In case you use Webroot and encounter any error during the set up process, then you can conveniently dial the Webroot support toll-free number and get instant support.

#264 mcafee.com/activate on 06.25.19 at 4:41 pm

Thanks for posting this valuable information, really like the way you used to describe. Hope I'll get such posts in future too.

#265 norton.com/setup on 06.25.19 at 4:42 pm

Norton antivirus is especially used for the information technology security.

#266 office.com/setup on 06.25.19 at 4:44 pm

Setting up Office is rather easy, one needs to download the setup from office.com/setup and then install it.

#267 office.com/setup on 06.25.19 at 4:45 pm

Microsoft Office is operated by the users on Windows, laptop, smartphones, MacOS. The users can use Microsoft Office in any place they wish to.

#268 unicc on 06.25.19 at 8:02 pm

I have been reading out some of your stories and i can state pretty nice stuff. I will surely bookmark your blog.

#269 fortnite mods on 06.25.19 at 8:30 pm

You got yourself a new rader.

#270 skisploit on 06.26.19 at 7:09 am

I like this website its a master peace ! Glad I found this on google .

Leave a Comment