This is an automated email from the ASF dual-hosted git repository.

chaokunyang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fory-site.git


The following commit(s) were added to refs/heads/main by this push:
     new f1562474a delete docs/compiler/proto-vs-fdl.md (#394)
f1562474a is described below

commit f1562474aa108f559e09a1727ca4b205328f44c4
Author: Shawn Yang <[email protected]>
AuthorDate: Wed Jan 21 17:12:55 2026 +0800

    delete docs/compiler/proto-vs-fdl.md (#394)
---
 docs/compiler/proto-vs-fdl.md | 507 ------------------------------------------
 1 file changed, 507 deletions(-)

diff --git a/docs/compiler/proto-vs-fdl.md b/docs/compiler/proto-vs-fdl.md
deleted file mode 100644
index 8489e77fa..000000000
--- a/docs/compiler/proto-vs-fdl.md
+++ /dev/null
@@ -1,507 +0,0 @@
----
-title: Protocol Buffers IDL
-sidebar_position: 10
-id: protobuf_idl_support
-license: |
-  Licensed to the Apache Software Foundation (ASF) under one or more
-  contributor license agreements.  See the NOTICE file distributed with
-  this work for additional information regarding copyright ownership.
-  The ASF licenses this file to You under the Apache License, Version 2.0
-  (the "License"); you may not use this file except in compliance with
-  the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
----
-
-This document compares Google's Protocol Buffers (protobuf) with Fory 
Definition Language (FDL), helping you understand when to use each and how to 
migrate between them.
-
-## Overview
-
-| Aspect                 | Protocol Buffers                  | FDL             
                    |
-| ---------------------- | --------------------------------- | 
----------------------------------- |
-| **Primary Purpose**    | RPC and message interchange       | Cross-language 
object serialization |
-| **Design Philosophy**  | Schema evolution, backward compat | Performance, 
native integration     |
-| **Reference Tracking** | Not supported                     | First-class 
support (`ref`)         |
-| **Generated Code**     | Custom message types              | Native language 
constructs          |
-| **Serialization**      | Tag-length-value encoding         | Fory binary 
protocol                |
-| **Performance**        | Good                              | Excellent (up 
to 170x faster)       |
-
-## Syntax Comparison
-
-### Package Declaration
-
-**Protocol Buffers:**
-
-```protobuf
-syntax = "proto3";
-package example.models;
-option java_package = "com.example.models";
-option go_package = "example.com/models";
-```
-
-**FDL:**
-
-```protobuf
-package example.models;
-```
-
-FDL uses a single package declaration that maps to all languages automatically.
-
-### Enum Definition
-
-**Protocol Buffers:**
-
-```protobuf
-enum Status {
-  STATUS_UNSPECIFIED = 0;
-  STATUS_PENDING = 1;
-  STATUS_ACTIVE = 2;
-  STATUS_COMPLETED = 3;
-}
-```
-
-**FDL:**
-
-```protobuf
-enum Status [id=100] {
-    PENDING = 0;
-    ACTIVE = 1;
-    COMPLETED = 2;
-}
-```
-
-Key differences:
-
-- FDL supports optional type IDs (`[id=100]`) for efficient serialization
-- Protobuf requires `_UNSPECIFIED = 0` by convention; FDL uses explicit values
-- FDL enum values don't require prefixes
-
-### Message Definition
-
-**Protocol Buffers:**
-
-```protobuf
-message User {
-  string id = 1;
-  string name = 2;
-  optional string email = 3;
-  int32 age = 4;
-  repeated string tags = 5;
-  map<string, string> metadata = 6;
-}
-```
-
-**FDL:**
-
-```protobuf
-message User [id=101] {
-    string id = 1;
-    string name = 2;
-    optional string email = 3;
-    int32 age = 4;
-    repeated string tags = 5;
-    map<string, string> metadata = 6;
-}
-```
-
-Syntax is nearly identical, but FDL adds:
-
-- Type IDs (`[id=101]`) for cross-language registration
-- `ref` modifier for reference tracking
-
-### Nested Types
-
-**Protocol Buffers:**
-
-```protobuf
-message Order {
-  message Item {
-    string product_id = 1;
-    int32 quantity = 2;
-  }
-  repeated Item items = 1;
-}
-```
-
-**FDL:**
-
-```protobuf
-message OrderItem [id=200] {
-    string product_id = 1;
-    int32 quantity = 2;
-}
-
-message Order [id=201] {
-    repeated OrderItem items = 1;
-}
-```
-
-FDL supports nested types, but generators may flatten them for languages where 
nested types are not idiomatic.
-
-### Imports
-
-**Protocol Buffers:**
-
-```protobuf
-import "other.proto";
-import "google/protobuf/timestamp.proto";
-```
-
-**FDL:**
-
-FDL currently requires all types in a single file or uses forward references 
within the same file.
-
-## Feature Comparison
-
-### Reference Tracking
-
-FDL's killer feature is first-class reference tracking:
-
-**FDL:**
-
-```protobuf
-message TreeNode [id=300] {
-    string value = 1;
-    ref TreeNode parent = 2;
-    repeated ref TreeNode children = 3; // Element refs
-    ref repeated TreeNode path = 4;     // Collection ref
-}
-
-message Graph [id=301] {
-    repeated ref Node nodes = 1;  // Shared references preserved (elements)
-}
-```
-
-**Protocol Buffers:**
-
-Protobuf cannot represent circular or shared references. You must use 
workarounds:
-
-```protobuf
-// Workaround: Use IDs instead of references
-message TreeNode {
-  string id = 1;
-  string value = 2;
-  string parent_id = 3;        // Manual ID reference
-  repeated string child_ids = 4;
-}
-```
-
-### Type System
-
-| Type       | Protocol Buffers                                                
                                       | FDL                               |
-| ---------- | 
------------------------------------------------------------------------------------------------------
 | --------------------------------- |
-| Boolean    | `bool`                                                          
                                       | `bool`                            |
-| Integers   | `int32`, `int64`, `sint32`, `sint64`, `uint32`, `uint64`, 
`fixed32`, `fixed64`, `sfixed32`, `sfixed64` | `int8`, `int16`, `int32`, 
`int64` |
-| Floats     | `float`, `double`                                               
                                       | `float32`, `float64`              |
-| String     | `string`                                                        
                                       | `string`                          |
-| Binary     | `bytes`                                                         
                                       | `bytes`                           |
-| Timestamp  | `google.protobuf.Timestamp`                                     
                                       | `timestamp`                       |
-| Date       | Not built-in                                                    
                                       | `date`                            |
-| Duration   | `google.protobuf.Duration`                                      
                                       | Not built-in                      |
-| List       | `repeated T`                                                    
                                       | `repeated T`                      |
-| Map        | `map<K, V>`                                                     
                                       | `map<K, V>`                       |
-| Nullable   | `optional T` (proto3)                                           
                                       | `optional T`                      |
-| Oneof      | `oneof`                                                         
                                       | Not supported                     |
-| Any        | `google.protobuf.Any`                                           
                                       | Not supported                     |
-| Extensions | `extend`                                                        
                                       | Not supported                     |
-
-### Wire Format
-
-**Protocol Buffers:**
-
-- Tag-length-value encoding
-- Variable-length integers (varints)
-- Field numbers encoded in wire format
-- Unknown fields preserved
-
-**FDL/Fory:**
-
-- Optimized binary format
-- Schema-aware encoding
-- Type IDs for fast lookup
-- Reference tracking support
-- Zero-copy deserialization where possible
-
-### Generated Code Style
-
-**Protocol Buffers** generates custom types with builders and accessors:
-
-```java
-// Protobuf generated Java
-User user = User.newBuilder()
-    .setId("u123")
-    .setName("Alice")
-    .setAge(30)
-    .build();
-```
-
-**FDL** generates native POJOs:
-
-```java
-// FDL generated Java
-User user = new User();
-user.setId("u123");
-user.setName("Alice");
-user.setAge(30);
-```
-
-### Comparison Table
-
-| Feature                    | Protocol Buffers  | FDL       |
-| -------------------------- | ----------------- | --------- |
-| Schema evolution           | Excellent         | Good      |
-| Backward compatibility     | Excellent         | Good      |
-| Reference tracking         | No                | Yes       |
-| Circular references        | No                | Yes       |
-| Native code generation     | No (custom types) | Yes       |
-| Unknown field preservation | Yes               | No        |
-| Schema-less mode           | No                | Yes\*     |
-| RPC integration (gRPC)     | Yes               | No        |
-| Zero-copy deserialization  | Limited           | Yes       |
-| Human-readable format      | JSON, TextFormat  | No        |
-| Performance                | Good              | Excellent |
-
-\*Fory supports schema-less serialization without FDL
-
-## When to Use Each
-
-### Use Protocol Buffers When:
-
-1. **Building gRPC services**: Protobuf is the native format for gRPC
-2. **Maximum backward compatibility**: Protobuf's unknown field handling is 
robust
-3. **Schema evolution is critical**: Adding/removing fields across versions
-4. **You need oneof/Any types**: Complex polymorphism requirements
-5. **Human-readable debugging**: TextFormat and JSON transcoding available
-6. **Ecosystem integration**: Wide tooling support (linting, documentation)
-
-### Use FDL/Fory When:
-
-1. **Performance is critical**: Up to 170x faster than protobuf
-2. **Cross-language object graphs**: Serialize Java objects, deserialize in 
Python
-3. **Circular/shared references**: Object graphs with cycles
-4. **Native code preferred**: Standard POJOs, dataclasses, structs
-5. **Memory efficiency**: Zero-copy deserialization
-6. **Existing object models**: Minimal changes to existing code
-
-## Performance Comparison
-
-Benchmarks show Fory significantly outperforms Protocol Buffers:
-
-| Benchmark                 | Protocol Buffers | Fory     | Improvement |
-| ------------------------- | ---------------- | -------- | ----------- |
-| Serialization (simple)    | 1x               | 10-20x   | 10-20x      |
-| Deserialization (simple)  | 1x               | 10-20x   | 10-20x      |
-| Serialization (complex)   | 1x               | 50-100x  | 50-100x     |
-| Deserialization (complex) | 1x               | 50-100x  | 50-100x     |
-| Memory allocation         | 1x               | 0.1-0.5x | 2-10x less  |
-
-_Benchmarks vary based on data structure and language. See [Fory 
benchmarks](../benchmarks/) for details._
-
-## Migration Guide
-
-### From Protocol Buffers to FDL
-
-#### Step 1: Convert Syntax
-
-**Before (proto):**
-
-```protobuf
-syntax = "proto3";
-package myapp;
-
-message Person {
-  string name = 1;
-  int32 age = 2;
-  repeated string emails = 3;
-  Address address = 4;
-}
-
-message Address {
-  string street = 1;
-  string city = 2;
-}
-```
-
-**After (FDL):**
-
-```protobuf
-package myapp;
-
-message Address [id=100] {
-    string street = 1;
-    string city = 2;
-}
-
-message Person [id=101] {
-    string name = 1;
-    int32 age = 2;
-    repeated string emails = 3;
-    Address address = 4;
-}
-```
-
-#### Step 2: Handle Special Cases
-
-**oneof fields:**
-
-```protobuf
-// Proto
-message Result {
-  oneof result {
-    Success success = 1;
-    Error error = 2;
-  }
-}
-```
-
-```protobuf
-// FDL - Use separate optional fields
-message Result [id=102] {
-    optional Success success = 1;
-    optional Error error = 2;
-}
-// Or model as sealed class hierarchy in generated code
-```
-
-**Well-known types:**
-
-```protobuf
-// Proto
-import "google/protobuf/timestamp.proto";
-message Event {
-  google.protobuf.Timestamp created_at = 1;
-}
-```
-
-```protobuf
-// FDL
-message Event [id=103] {
-    timestamp created_at = 1;
-}
-```
-
-#### Step 3: Add Type IDs
-
-Assign unique type IDs for cross-language compatibility:
-
-```protobuf
-// Reserve ranges for different domains
-// 100-199: Common types
-// 200-299: User domain
-// 300-399: Order domain
-
-message Address [id=100] { ... }
-message Person [id=200] { ... }
-message Order [id=300] { ... }
-```
-
-#### Step 4: Update Build Configuration
-
-**Before (Maven with protobuf):**
-
-```xml
-<plugin>
-  <groupId>org.xolstice.maven.plugins</groupId>
-  <artifactId>protobuf-maven-plugin</artifactId>
-  <!-- ... -->
-</plugin>
-```
-
-**After (Maven with FDL):**
-
-```xml
-<plugin>
-  <groupId>org.codehaus.mojo</groupId>
-  <artifactId>exec-maven-plugin</artifactId>
-  <executions>
-    <execution>
-      <id>generate-fory-types</id>
-      <phase>generate-sources</phase>
-      <goals><goal>exec</goal></goals>
-      <configuration>
-        <executable>fory</executable>
-        <arguments>
-          <argument>compile</argument>
-          <argument>${project.basedir}/src/main/fdl/schema.fdl</argument>
-          <argument>--lang</argument>
-          <argument>java</argument>
-          <argument>--output</argument>
-          <argument>${project.build.directory}/generated-sources/fdl</argument>
-        </arguments>
-      </configuration>
-    </execution>
-  </executions>
-</plugin>
-```
-
-#### Step 5: Update Application Code
-
-**Before (Protobuf Java):**
-
-```java
-// Protobuf style
-Person.Builder builder = Person.newBuilder();
-builder.setName("Alice");
-builder.setAge(30);
-Person person = builder.build();
-
-byte[] data = person.toByteArray();
-Person restored = Person.parseFrom(data);
-```
-
-**After (Fory Java):**
-
-```java
-// Fory style
-Person person = new Person();
-person.setName("Alice");
-person.setAge(30);
-
-Fory fory = Fory.builder().withLanguage(Language.XLANG).build();
-MyappForyRegistration.register(fory);
-
-byte[] data = fory.serialize(person);
-Person restored = (Person) fory.deserialize(data);
-```
-
-### Coexistence Strategy
-
-For gradual migration, you can run both systems in parallel:
-
-```java
-// Dual serialization during migration
-public byte[] serialize(Object obj, Format format) {
-    if (format == Format.PROTOBUF) {
-        return ((MessageLite) obj).toByteArray();
-    } else {
-        return fory.serialize(obj);
-    }
-}
-
-// Convert between formats
-public ForyPerson fromProto(ProtoPerson proto) {
-    ForyPerson person = new ForyPerson();
-    person.setName(proto.getName());
-    person.setAge(proto.getAge());
-    return person;
-}
-```
-
-## Summary
-
-| Aspect           | Choose Protocol Buffers | Choose FDL/Fory        |
-| ---------------- | ----------------------- | ---------------------- |
-| Use case         | RPC, API contracts      | Object serialization   |
-| Performance      | Acceptable              | Critical               |
-| References       | Not needed              | Circular/shared needed |
-| Code style       | Builder pattern OK      | Native POJOs preferred |
-| Schema evolution | Complex requirements    | Simpler requirements   |
-| Ecosystem        | Need gRPC, tooling      | Need raw performance   |
-
-Both tools excel in their domains. Protocol Buffers shines for RPC and API 
contracts with strong schema evolution guarantees. FDL/Fory excels at 
high-performance object serialization with native language integration and 
reference tracking support.


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to