Skip to content

Latest commit

ย 

History

1,162 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Qin - AI ้ƒๆœตๅ”ฌ้จๅ‹ซๅ้ๅ ็ฐฒ้ขใ„จ๎‡ข็‘ทโ‚ฌ

้ขใ„ค็ซดๆฟ‚?Qin ๆต ๏ฝ‡็ˆœ้Žปๅฟšๅ ชๆดๆ—‚ๆ•ค้”›ๅฒƒ๎†€ AI ้ๆฌŽๅ”ฌ้ฎไพŠ็ด็’?Qin ็’็†ป็Ÿ—ๆฉๆ„ฏ๎”‘้Іไฝน็€ฏๅฏคๅ“„ๆ‹ฐ้–ฎใ„ง่ฎฒ้І? Java Version License

้ฆƒๆ‘‰ Qin ้„๎ˆ™็ฒˆๆถ”ๅ ฌ็ดต

Qin ้จๅ‹ญๆดฐ้ๅ›ฆ็ฌ‰้„๎ˆšๅ•€้‹ๆฐซ็ซดๆถ“๎โ‚ฌๆป„ๆดฟ้œ้ขๅ”ฌ้จ?Java ้‹ๅ‹ซ็ผ“ๅฎธใƒฅๅฟ้ˆฅๆฟ“็ด้‘ฐๅฑพๆงธ้‹ๆฐซ็ซด้—‚?AI-native ้ใ„ฆ็ˆคๆดๆ—‚ๆ•ค็’‡๎…กโ–ˆ้”›?

  • ๆตฃ่ทจๆ•ค ESM ๆค‹ๅบข็‰ธ็’‡๎…Ÿ็กถ
  • ๆต ?JVM ๆตฃๆป€่ดŸๆถ“ๆ˜๎›ฆ้šๅบฃ๎ฌ/ๆฉๆ„ฏ๎”‘้ƒ่ทบๅ”ด้?- ๆต ใƒฅๅข ็ป”?JS ้ข็†ธๅžšๆถ“่™น๎ƒ‡ๆถ“โ‚ฌ็ปซ่คๆดฐ้?- ้ขใ„ง็ฒบๆถ“โ‚ฌ้จๅ‹ฎ๎‡ข็‘ทโ‚ฌๅฆฏโ€ณ็€ท็‘•ๅ—™ๆดŠๆดๆ—‚ๆ•ค้Іไพ€ใ€‰้—ˆ๎ฌโ‚ฌไฝนๅธด้™๏ฝƒโ‚ฌไฝนๆšŸ้Žน๎†ป็ฌŒ้–ฎใ„ง่ฎฒ

็€ตๅœญๆ•ค้Žด้ฃŽๆฎ‘้žๅ—˜ๅ…‚ๆตฃๆ’ป็™้„๎ˆค็ดฐ

  • ้ข?Qin ้Žปๅฟšๅ ชๆดๆ—‚ๆ•ค
  • ้ข?AI ้ข็†ธๅžš้Žดๆ ฆๆ…จ้€?Qin ๆต ๏ฝ‡็ˆœ
  • qin dev ้ˆ๎„€ๆนด้š๎ˆšๅงฉ
  • qin deploy ๆถ“โ‚ฌ้–ฟ๎‡€ๅ„ด็ผƒ? ้ขใ„ฆๅŸ›ๆถ“ๅถ‰ๆธถ็‘•ไฝธๅŽ›้ๅ†ฒ็ธพ้”›?
  • ้“ๅถ‡๎ฌๆฉๆจปๆงธ้šๅบฃ๎ฌ
  • controller / service / DTO ้Žฌๅบ็ฎž้Žท?- Spring / JS / ้–ฎใ„ง่ฎฒ็ผๅ—šๅฆญ้Žฌๅบ็ฎž้Žบ? ๆฉๆฌŽ็ฐบๆดๆ—‡๎‡š้–ซๆ„ญ๎„ž้ข?Qin ็ผ‚ๆ ฌ็˜ง้ฃใ„ฃโ‚ฌไฝฝ็น็›ๅฑพๆค‚้Іไฝธไผ้็ƒฝๆ‘ผ้œๅฑฝ้’ฉ้™็‰ˆๆฝต็ไฝฝ๎—Š้І?

่คฐๆ’ณๅข ้œๆฟ็–„ๆถ“ๅบขๆธถ็ผๅ ขๆดฐ้?

่คฐๆ’ณๅข  Qin ๆฉๆจบ๎˜ฉ้ฆใ„ขโ‚ฌๆป€็ฒ ็’‡๎…กโ–ˆ/ๆฉๆ„ฏ๎”‘้ƒ่ทบ็†€็บญโ‚ฌ็’็‚ฌๆŸฆ็’งๆฟๆ‚œๆตœัƒๆง่คฐใˆกโ‚ฌไฝฒโ‚ฌๆฟˆๆฎ‘้—ƒ่ˆต๎†Œ้”›?

  • ้œๆฟๆนชๅฎธ่Œฌ็ฒก้ˆๅคŒ็ฒบๆถ“โ‚ฌ็’‡๎…กโ–ˆๅฆฏโ€ณ็€ท้ІไธฃVM/JS backend้Іไนฃ.qin + Spring Boot` demo้Іไนผarget zoning

  • ๆตฃๅ—˜ๆธถ็ผๅ ่ˆฐ้Žฌไฝท็ฌ‰ๆดๆ—‡๎‡š็’โ•‚ๆซ˜้–ซๆฐฑๆ•ค้Žด็ƒฝๆšฑ้ˆ็†ทไป ้ฃๆฌๆนช้ˆฅๆป„ๅขœ้ๆฌๅข ้šๅบฃ๎ฌ้’ๅ——็œฐ + ็€นๅคธๅฏŒๆพนๆ–ฅโ‚ฌๆฟˆๆฎ‘ๅฎธใƒค็ถ”้‚็‘ฐ็ดก้–ฒ? ่คฐๆ’ณๅข ้Žตั†๎”‘ๆตผๆจบๅŽ›็ปพั็ดฐ

  • ้ๅ Ÿๅฆธ Qin ้‹ๆฐญๅžšๆถ“โ‚ฌ้—‚ใ„ฆๆซ˜้–ซๆฐฌๅฝฒ้ขใ„งๆฎ‘้ใ„ฆ็ˆค็’‡๎…กโ–ˆ

  • ้ๅ ็•ฌ้Žด?Stage 1 ้จๅ‹ฎ๎‡ข็‘ทโ‚ฌ้Іไฝบ็ดช็’‡ๆˆ™โ‚ฌไฝฝ็น็›ๅฑปโ‚ฌไฝธๅ้ๅ ฅๆ‘ผ็’บ๎ˆœว”็€นๆฐญโ‚ฌ?- ้‡ๆ’ฎ็ฎ็žๅ‚œๆฎ‘ Qin ๆดๆ—‚ๆ•ค้Žถๅ€Ÿ่–„้ฃๆฌๅŸŒ Stage 2 ้ๅถ‡้ƒด็ผ็†ธๅธนๆฉ? ้‡ๆ‘็•ฌ้ๅฏธๆฎ‘ๆตœัƒๆง็€นๆฐซ็ถ…็‘™ไพŠ็ดฐ

  • packages/qin-runtime-core/QIN_APP_MODEL.md

  • packages/qin-runtime-core/QIN_MISSION_AND_VALUE.md

  • packages/qin-runtime-core/QIN_PRODUCT_POSITIONING.md

  • packages/qin-runtime-core/QIN_LANGUAGE_TARGET_MODEL.md

  • packages/qin-runtime-core/QIN_JS_COMPATIBILITY_MODEL.md

  • packages/qin-runtime-core/QIN_CURRENT_SUPPORT_MATRIX.md

  • packages/qin-runtime-core/QIN_NPM_COMPATIBILITY_POLICY.md

  • packages/qin-runtime-core/QIN_HOST_CAPABILITY_MODEL.md

  • packages/qin-runtime-core/QIN_JS_ON_JVM_FEASIBILITY.md

  • packages/qin-runtime-core/QIN_CSSTS_INTEGRATION_MODEL.md

้็จฟ็ธพ้žๅ——ๅบท

้Žปๅฟšๅ ชๆดๆ—‚ๆ•ค้”›ๅฒƒโ‚ฌๅฑผ็ฌ‰้„๎ˆšๅŽ›้Žปๅฟšๅ ช้“ๅถ‡๎ฌ/้šๅบฃ๎ฌ้’ๅ——็œฐ

้Žดๆˆœๆป‘ๆถ“่ฝฐ็ฒˆๆถ”ๅ ฃ๎›ฆ้‹?Qin

Qin ้จๅ‹ฌๅ‰ฐๆถ”ๅค‰็ฌ‰้ฆใ„ค็ฐฌ้ˆฅๆป„ๅฆธ JavaScript ้ข?Java ้–ฒๅถ…ๅ•“ๆถ“โ‚ฌ้–ฌๅถโ‚ฌๆฟ„โ‚ฌ? ๆฟกๅ‚›็‰ Qin ้ˆโ‚ฌ็ผๅ ๅฝง้„๎ˆค็ดฐ

  • ้Žบใƒจ็นŽ JS ้จๅ‹ฎ๎‡ขๅจ‰?- ้ๅถ…ๅงžๆถ“ๅฉ…ๅ…˜็’‹ๅ†ชๆ•ค Spring Boot / JVM ้ข็†ธโ‚ฌ? ้–ญ๏ฝ…็• ้จๅ‹ช็Žฏ้Šๅ…ผๆงธๆถ“ๅถ…๎™„ๆพถั…ๆฎ‘้І? Qin ้ช็†ธ๎„œ็‘•ไฝฝ็˜‰้„ๅบฃๆฎ‘ๆต ๅณฐโ‚ฌๅ…ผๆงธ้”›?
  • ้ข?AI ้‡ๅฏธๅ•›้ŽฎๅคŒๆฎ‘้œ้ขๅ”ฌ็’‡๎…Ÿ็กถ้”›ๅฒ€็ฒบๆถ“โ‚ฌ้‡ๆ‘๎˜ฟ้“ๅถ…ๆ‚—็ป”๎ˆš็ด‘้™ๆˆไผๆตฃ?- ้ฉๅญ˜ๅธดๆฉๆถ˜ๅ† JVM / .class / Spring Boot / Java ้ข็†ธโ‚ฌ?- ้—„ๅถ„็ถ†ๆพถๆฐณ๎‡ข็‘ทโ‚ฌ้Іไฝธ๎˜ฟๆฉๆ„ฏ๎”‘้ƒ่บฒโ‚ฌไฝธ๎˜ฟ้‹ๅ‹ซ็ผ“้–พๆ็Ÿพๆถ”ๅฌฎๆฃฟ้จๅ‹ฎๅ…Œๅง˜ๆ‘๎˜ฒ้‰ๅ‚šๅฎณ
  • ้ˆโ‚ฌ็ผๅ Ÿๅฆธ dev/build/deploy ้€่ˆตๅžš้‡็ฟ ็ซดๆตฃๆ’ณๅฏฒ้จๅ‹ซๅ้ๅ œ็ถ‹ๆฅ ? ๆถ”็†ทๆฐจ้„๎ˆ๎‡ฉ้”›ๅญฎin ๆถ“ๅถ†ๆงธๆถ“่ฝฐ็ฐก้ˆฅๆปƒๅ„š JS้ˆฅๆฟŠโ‚ฌๅฑฝ็“จ้ฆใ„ฃโ‚ฌ?Qin ้™๎…ๆน้ฆใ„ฅ็• ้‘ณ่—‰็”ซ้‰ใƒฆๆดฟๅฏฎ่™นๆฎ‘ JVM-centered fullstack workflow ้ƒ่ฎน็ด้Žตๅถ…โ‚ฌ็…Ž็ทฑๆตฃๆป€่ดŸๆถ“โ‚ฌ้—‚ใ„งๅซญ็ป”ๅฌญ๎‡ข็‘ทโ‚ฌ็ผั…็”ป้™ๆˆ็้І?

Qin ็‘™๏ฝ…ๅ–…้จๅ‹ฏๆฃถๆฃฐ?

  1. *ๆดๆ—‚ๆ•คๅฏฎโ‚ฌ้™ๆˆœ็ฒ›้’ๆƒฐ็นƒๆด๏น€ๅžŽ็ž?

    • ้ขใ„ฆๅŸ›้ๅ ฃ๎ฆๆฉ๎‚ฃโ‚ฌๆฟŠโ‚ฌๅ†จๅข ็ป”๎ˆ˜โ‚ฌไฝธๆ‚—็ป”๎ˆ˜โ‚ฌไธTO้Іไฝฝ็Ÿพ้ขไพฟโ‚ฌไพ€ๅ„ด็ผƒ? - Qin ้จๅ‹ญๆดฐ้ๅ›จๆงธ้ๅ Ÿๅผฟๆฉๆฟ็ฐฒ้ขใ„ฆๅ‰ฐ้ฅๆ’…็ด้ๅถ‡ๆ•ฑ้ชžๅ†ฒๅฝด็žๆ›ž็ด‘ target ็ผๅ—šๅฆญ
  2. *AI ้ๆฌ็ฐฒ้ขใ„คๅ”ฌ้ฎไฝนๆค‚ๆถ“ๅฉ็ฌ…้‚ๅ›งใŠ็บฐ?

    • ๆตผ็Šต็ฒบๅฎธใƒงโ–ผ้—‡โ‚ฌ็‘•ไฝฝๆณ•ๆพถๆฐซ้‡œๅฆ—ๅ—˜็ฆ็žๅ‚›ๅขœๅฎธใƒฅ๎‡ฎๆฆป? - Qin ้—‡โ‚ฌ็‘•ไฝนๅฝๆธšๆถ™ๆดฟ็ผ็†ถ็ซด้Іไฝท็ถ†ๅงั‚็ฎŸ้Іไฝธๅฝฒ้ข็†ธๅžš้จๅ‹ซ็ฐฒ้ขใ„ฆฤ้จ?
  3. *้ใ„ฆ็ˆคๅฏฎโ‚ฌ้™ๆˆ ๆฎ‘ๆฉๆ„ฏ๎”‘ๆถ“ๅบจๅ„ด็ผƒๆŸฅๆ‘ผ็’บ๎ˆ็นƒ้–ฒ?

    • ้ˆ๎„€ๆนดๆฉๆ„ฏ๎”‘้Іไฝท็ทท็’งๆ จๅซพ็‘ๅ‘ซโ‚ฌไฝธ๎†–ๆถ“ๅฉšๆณฆ้Žดๆ„ฉโ‚ฌไฝธๅฝ‚็”ฏๅ†ง็ฌ‚็ปพๅ—ๅ…˜้’ๅ—˜ๆšŽ
    • Qin ้ฉ๎†ฝ็ˆฃ้„๎ˆœ็ฒบๆถ“โ‚ฌๆถ“?dev/build/deploy
  4. ๆดๆ›ž็œฐ้ชžๅ†ฒๅฝดๅฎธ๎†ผ็ด“้†ๆ’ฎๆนถๆฉๅ›จๆฃญ

    • JVM้ІไธฃS้Іไธผpring้Іไฝน็ฅป็‘™ๅ ๆซ’้‘ณ่—‰ๅง้ˆ๎„€็ฐฒ้„๎ˆš้’ฉ้™ๆฟ็ๅฏฎโ‚ฌ้—‚๎‡€๎•ฝ
    • Qin ้ฉ๎†ฝ็ˆฃ้„๎ˆš๎‡ฎ้…๎‡€โ‚ฌๆฐฌ็ฐฒ้ขใ„ค็ถ”้‘ฐๅ‘ญๆ•–้–ฒๅฟ›ๆฎฃ้’˜ๅฟš็น–ๆตœๆถ˜็–„้œๆ‰ฎ็ฒ้‘บ?

้‹ๅ‹ซ็ผ“ๅฎธใƒฅๅฟ็žๅ‚™็ฒ›้’ๅ •ๅ™ธ็‘•?

Qin ๆธšๆฟˆๅŠง้–ๅ‘ญๆƒˆๅฏฐๅ ๅทฑ้จๅ‹ซไผ็ป‹ๅฌชไผ้็ƒฝๆ‘ผ้‘ณ่—‰ๅง้”›?

  • JSON / TypeScript ๆค‹ๅบข็‰ธ้–ฐๅถ‡็–†
  • ้ˆ๎„€ๆนดๆธšๆฟŠ็ฆ†ๆถ“?monorepo ้€๎ˆ›ๅฏ”
  • Java 25 / JVM ๅฎธใƒฅๅฟๆตฃๆ’ถ้ƒด้—†ๅ—˜ๅžš
  • qin run / sync / build

ๆตฃๅ—š็น–ๆตœๆถ˜็˜ๆตœ?Qin ๆตœัƒๆง้จๅ‹ช็ซด้–ฎใ„ฅๅžŽ้”›ๅฑผ็ฌ‰้ๅถ†ๆงธ Qin ้จๅ‹ฌๆธถๆฅ‚ๆจบ็œฐ็€นๆฐซ็ฎŸ้І?

็€ต่ง„็˜ฎ็ป€่ฝฐ็ทฅ

Maven pom.xml (30+ ็›?:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>my-app</artifactId>
    <version>1.0.0</version>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>4.0.6</version>
        </dependency>
    </dependencies>
    
    <repositories>
        <repository>
            <id>central</id>
            <url>https://repo1.maven.org/maven2</url>
        </repository>
    </repositories>
</project>

Qin qin.config.js (10 ็›?:

{
  "name": "my-app",
  "version": "1.0.0",
  "dependencies": {
    "org.springframework.boot:spring-boot-starter-web": "4.0.6"
  }
}

Qin ้–ซๅ‚šๆ‚Ž็’‹ไพŠ็ดต

  • ้‰?*้“ๅถ‡๎ฌๆž?Java ๅฏฎโ‚ฌ้™ๆˆฃโ‚ฌ? - ้”็†ธๅ€้จ?npm ๆค‹ๅบข็‰ธ้–ฐๅถ‡็–†
  • ้‰?*้˜ๅฑฝโ‚ฌ?XML ้จ?Java ๅฏฎโ‚ฌ้™ๆˆฃโ‚ฌ? - ็ป โ‚ฌๅจฒไฝบๆฎ‘ JSON/TypeScript ้–ฐๅถ‡็–†
  • ้‰?Monorepo ้ขใ„ฆๅŸ› - ้˜็†บๆ•“ๆพถๆฐถใ€้ฉ๎†ฝๆ•ฎ้Žธ?
  • ้‰?*ๆฉ่Šฅ็œฐ้Žฌั†ๅ…˜้จๅ‹ซ็ด‘้™ๆˆฃโ‚ฌ? - Java 25 ็”ฏ๏ธฝๆฝต 2-5x ้Žฌั†ๅ…˜้Žปๆ„ฌๅดŒ
  • ้‰?*้ใ„ฆ็ˆคๅฏฎโ‚ฌ้™ๆˆฃโ‚ฌ? - ้ๅ‘ฏ็–† Qin ้˜็†บๆ•“้“ๅถ‡๎ฌๅฏฎโ‚ฌ้™ๆˆžๆน‡้”โ€ณๆซ’้”›ๅฑผ็ฌ‰ๆธšๆฟŠ็ฆ† Vite ็€›ๆ„ฏ็น˜็ป‹?

Qin ็’‡๎…กโ–ˆ็€นๆฐซ็ถ…้”›ๅ ๅ้ๅ ŸๆŸŸ้šๆˆฏ็ดš

Qin ้จๅ‹ฌ็‰ณ่น‡ๅ†จ็•พๆตฃๅถ็ดฐ

  • *Qin = JS/ESM ็’‡๎…Ÿ็กถๆค‹ๅบข็‰ธ้จๅ‹ญ็ดช็’‡ๆˆ็€ท็’‡๎…กโ–ˆ้”›ๅœVM ้ๅ‘ฎ็‰ณ้”›?
  • ๆถ“ๅถ†ๆงธ็€นๅฑพๆšฃ JS ๅฏฎๆ›Ÿๆธ้”›ๅฑผ็ฌ‰้็…Ž๎† Node ๆถ“ๆ’ดๆน API
  • ้ฉ๎†ฝ็ˆฃ้„๎ˆ—โ‚ฌๆป€็ซดๆฟ‚ๆฅ„๎‡ข็‘ทโ‚ฌ้ๆฌๅข ้šๅบฃ๎ฌ้ˆฅๆฟ“็ด้‘ฐๅฑผ็ฌ‰้„๎ˆ—โ‚ฌๆปƒ๎˜ฒ้’?Node ้ข็†ธโ‚ฌไฝฒโ‚ฌ?

ๆถ“่ฝฐ็ฒˆๆถ”ๅ ฃ๎›ฆ้ฆ?Java ๆธšัƒ็–„้œ?JS-SDK้”›ๅ ๎›ง console / Math / JSON้”›ๅค›็ดฐ

  • Qin ้šๅบฃ๎ฌ้ฉ๎†ฝ็ˆฃ้„?.class้”›ๅฒƒ็น็›ๅฑฝๆนช JVM้”›ๅฑผ็ฌ‰้„๎ˆœๆดฟ้Žบใƒจ็ช‡้ฆใ„ฆ็ฅป็‘™ๅ ๆซ’้–ฒ?
  • ๆตฃๅ—š๎‡ข็‘ทโ‚ฌ็žๅ‚žๅ™ฐ้ข?JS/ESM ็’‡๎…Ÿ็กถ้”›ๅฑฝ็ด‘้™ๆˆฃโ‚ฌๅ‘ญใ‰้’ๆœต็ดฐๆตฃ่ทจๆ•ค JS ้ๅ‘ญ็ผ“้‘ณ่—‰ๅง
  • ๆฟกๅ‚›็‰ๅจŒโ„ƒๆน JS-SDK้”›ๅฒƒ๎‡ขๅจ‰ๆ›กๆซง้’่ทบๅ„š JS้”›ๅฒƒ็น็›ๅฑพๆค‚็›ๅฑผ่ดŸ็ๅ˜็ดฐ้‚๎…ž็œฐ
  • ้ฅ็Šณ๎„้—‡โ‚ฌ็‘•ไฝฒโ‚ฌๆป…็ดช็’‡ๆˆžๆนก้„็Šฒ็š  + ๆฉๆ„ฏ๎”‘้ƒ่ทบ็–„้œๆ‰ณโ‚ฌๆฟˆๆฎ‘ JS-SDK ๆตฃๆป€่ดŸ็’‡๎…กโ–ˆ้ฉ่™น๎”…็’็‚ฌๆŸฆ

Qin ้จๅ‹ซๅžŽ็žๅ‚๎†•็’โ˜…็ดฐ

  1. ็’‡๎…กโ–ˆ็žๅ‚ฆ็ดฐJS/ESM ็’‡๎…Ÿ็กถ็€›ๆ„ฐๆณฆ้”›ๅงarser/AST/็’‡๎…็ฎŸๅฆซโ‚ฌ้Œใƒฏ็ดš
  2. ๆฉๆ„ฏ๎”‘้ƒ่ทบ็œฐ้”›ๆฐฌ้’ฉ้™็‰ˆๆฃค้?JS-SDK้”›ๅ ๎›ง console / Math / JSON / Object้”›?
  3. ้ชžๅ†ฒๅฝด็žๅ‚ฆ็ด™้šๅบฃ๎ฌ้”›ๅค›็ดฐJVM ๆฉๆ„ฏ๎”‘้”›ๅ ๅฝฒ็’‹ๅ†ชๆ•ค Java/JDK ้‘ณ่—‰ๅง้”›?
  4. ้ชžๅ†ฒๅฝด็žๅ‚ฆ็ด™้“ๅถ‡๎ฌ้”›ๅค›็ดฐๅจดๅฟš๎้ฃใ„จ็น็›ๅฒ‹็ด™Web ้ชžๅ†ฒๅฝด้‘ณ่—‰ๅง้”›?

็’ๆ๎…ธ้˜็†ทๅžฏ้”›?

  • ็’‡๎…Ÿ็กถ็ไป‹ๅ™บ JS ๆถ“โ‚ฌ้‘ท่พพ็ด็’‡๎…็ฎŸๆท‡ๆฟ‡ๅฏ”้™๎ˆ›ๅธถ็€›ๆ„ฐๆณฆ
  • ้ชžๅ†ฒๅฝด้‘ณ่—‰ๅง้’ๅ——็œฐ้—…ๆ—‚๎ž‡้”›ๅฑผ็ฌ‰้Žถ?Node ็‘™ๅ‹ซๅžฏๅฏฎ้ธฟ๎”‘็”ฏ๏น€ๅ† Qin
  • ้ๅ œ็นš็’‡ไฝธๅข ้šๅบฃ๎ฌๆถ“โ‚ฌ้‘ทๅฏธๆฎ‘ๅฏฎโ‚ฌ้™ๆˆœ็ถ‹ๆฅ ๅฒ‹็ด้ๅถ‰โ‚ฌๆ„ญ๎„ž้Žตโ•็้ๅ›งๅ™ฏๆดๆ’น๎›ซ้ฉๆ ญๆฝฐ

้ฆƒๅธ€ What's New in Java 25 Version

้‰?้็จฟ็ธพ้—ๅ›ฉ้ช‡

  • Java 25 LTS - ้ˆโ‚ฌ้‚ไผดๆšฑ้ˆ็†ธๆ•ฎ้Žธไฝบๅข—้ˆ๎„Š็ด™้€๎ˆ›ๅฏ”้’?2033 ้ชž่พพ็ดš
  • Flexible Constructor Bodies (JEP 513) - ้–ฐๅถ‡็–†ๆฅ ๅฒƒ็˜‰้‡ๆ‘็•จ้?
  • Module Import Declarations (JEP 511) - ๆต ๏ฝ‡็ˆœ้‡ๅฏธ็•ๅจฒ?
  • Primitive Patterns (JEP 507) - ็ปซ่ฏฒ็€ท็€นๅคŠๅ้Žฌัƒ๎–ƒๅฏฎ?
  • Structured Concurrency (JEP 505) - ้ชž่ทบๅฝ‚้Žฌั†ๅ…˜้Žปๆ„ฌๅดŒ 3-5x
  • AOT Method Profiling (JEP 515) - ้š๎ˆšๅงฉ้–ซ็†ทๅฎณ้Žปๆ„ฌๅดŒ 2-3x
  • Compact Object Headers (JEP 519) - ้ๅ‘ญ็“จ้—็Šตๆ•ค้‘ๅฟ“็šฏ 20-30%

้ฆƒๆณ ้Žฌั†ๅ…˜้Žปๆ„ฌๅดŒ

้Žธๅ›จ็ˆฃ Java 17 Java 25 ้Žปๆ„ฌๅดŒ
CLI ้š๎ˆšๅงฉ้ƒๅ •ๆฃฟ 800ms 300ms 2.7x ้ˆฟ?
้ชžๆƒฐ๎”‘็ผ‚ๆ ฌ็˜ง (10 ้‚ๅ›ฆๆฌข) 5.2s 1.8s 2.9x ้ฆƒๆฎŒ
้ๅ‘ญ็“จ้—็Šตๆ•ค 180MB 135MB -25% ้ฆƒๆ‘
ๆต ๏ฝ‡็ˆœ้–ฒ? 3500 ็›? 2100 ็›? -40% ้ฆƒๆ‘‘

้ฆƒๆฎŒ ่น‡๎‚ฆโ‚ฌ็†ท็ด‘ๆฟฎ?

้“ๅถ‡็–†็‘•ไฝน็œฐ

  • Java 25 or higher (Download)
  • Maven 3.8+ (้™๎ˆžโ‚ฌๅค›็ด้ขใ„ค็ฐฌๆธšๆฟŠ็ฆ†ๆถ“ๅฌญๆต‡)

็ผ‚ๆ ฌ็˜ง Qin

# Windows
.\build-java.bat

# Linux/macOS
./build-java.sh

ๆฉๆ„ฏ๎”‘ Qin

# ้Œใƒงๆน…็”ฏ๎†ผๅงช
java -cp ".qin\classes;lib\gson-2.10.1.jar" com.qin.cli.QinCli help

# ็ผ‚ๆ ฌ็˜งๆคคๅœญๆดฐ
java -cp ".qin\classes;lib\gson-2.10.1.jar" com.qin.cli.QinCli compile

# ๆฉๆ„ฏ๎”‘ๆคคๅœญๆดฐ
java -cp ".qin\classes;lib\gson-2.10.1.jar" com.qin.cli.QinCli run

้’ๆถ˜็ผ“่น‡๎‚ฃๅตŽ้›ๆˆ’ๆŠค้”›ๅ Ÿๅธน้‘ฝๆ„ถ็ดš

Windows (PowerShell):

# ๅจฃ่ฏฒๅงž้’?PowerShell Profile
function qin { java -cp "D:\path\to\qin\.qin\classes;D:\path\to\qin\lib\gson-2.10.1.jar" com.qin.cli.QinCli $args }

Linux/macOS (Bash):

# ๅจฃ่ฏฒๅงž้’?~/.bashrc or ~/.zshrc
alias qin='java -cp "/path/to/qin/build/classes:/path/to/qin/lib/gson-2.10.1.jar" com.qin.cli.QinCli'

้’่ทบๆ‚—็ๅžๅฝฒๆต ใƒงๆดฟ้Žบใƒคๅจ‡้ข๎Ÿ’็ดฐ

qin compile
qin run
qin build

Jite Default Dev Runtime

  • New package: packages/qin-plugin-jite
  • Dev entry class: com.qin.jite.JiteDevMain
  • qin dev now prefers Jite runtime for .js projects
  • If qin-plugin-jite is not on classpath, CLI falls back to com.qin.runtime.core.QinFullstackMain --dev

Demo Project

  • Path: packages/exmaples/jitedemo
  • Dependency: com.qin:qin-plugin-jite
  • Run inside demo folder:
qin dev

Open http://localhost:18080.

้ฆƒๆ‘‘ ้–ฐๅถ‡็–†้‚ๅ›ฆๆฌข

qin.config.js

qin.config.js ้„?Qin ้จๅ‹ฏใ€้ฉ?manifest้І? ็€นๅ†จ็ถ‹้“ๅถ…ๆ‚“้ƒ่ˆตๅฃ™้Žทๅ‘ญๆด“็ปซๆ˜ไบด็’๏ฝ็ดฐ

  • ้–ๅ‘ฎ็ซป้—?- ๆธšๆฟŠ็ฆ†ๆพน็‰ˆๆง‘้ใƒฅๅฝ›
  • workspace / module root ้Žปๅฟšๅ ช
  • runtime / build / entry ้–ฐๅถ‡็–†้—ˆ? entry ่คฐๆ’ณๅข ้€๎ˆ›ๅฏ”้”›?
  • Qin source entry: .qin้Іไนฃ.js้Іไนฃ.mjs้Іไนฃ.ts`
  • Java host entry: .java

qin run ้ƒ็Šฒๅผฌ้็‰ˆๆค‚ๆตผๆจบๅŽ›็’‡่ฏฒๅฝ‡ๆฉๆฌ“ๅ™ท้จ?entry้І?

{
  "name": "my-app",
  "version": "1.0.0",
  "description": "My awesome Java 25 app",
  "entry": "main/main.qin",
  
  "dependencies": {
    "org.springframework.boot:spring-boot-starter-web": "4.0.6",
    "com.github.ben-manes.caffeine:caffeine": "3.1.8"
  },
  
  "devDependencies": {
    "org.junit.jupiter:junit-jupiter": "5.10.1"
  },
  
  "repositories": [
    {
      "id": "aliyun",
      "url": "https://maven.aliyun.com/repository/public"
    },
    {
      "id": "central",
      "url": "https://repo1.maven.org/maven2"
    }
  ],
  
  "java": {
    "version": "25",
    "sourceDir": "src/main/java",
    "testDir": "src/test/java",
    "outputDir": "target/classes",
    "encoding": "UTF-8"
  },
  
  "output": {
    "dir": "dist",
    "jarName": "my-app.jar",
    "fatJar": true
  }
}

้ฆƒๆดœ้””?CLI ้›ๆˆ’ๆŠค

้›ๆˆ’ๆŠค ็’‡ๅญ˜ๆง‘ ็ป€่ฝฐ็ทฅ
compile ็ผ‚ๆ ฌ็˜ง Java ๆคคๅœญๆดฐ qin compile
run ็ผ‚ๆ ฌ็˜ง้ชžๆƒฐ็น็›? qin run / qin run Test.java / qin run main/main.qin
dev ๅฏฎโ‚ฌ้™ๆˆžฤๅฏฎๅฟฅ็ด™Qin ้—ๆ› ๎ฌ้™?+ ้‘ท๎„ๅงฉ้’้”‹ๆŸŠ้”›? qin dev / qin dev main/main.qin
build ้‹ๅ‹ซ็ผ“ๆตœั…ๅขฟ้”›ๅœava: JAR / Qin: fullstack ๆตœั…ๅขฟ้”›? qin build / qin build main/main.qin
test ๆฉๆ„ฏ๎”‘ๅจดๅฌญ็˜ฏ qin test
sync ้šๅฑพ๎„žๆธšๆฟŠ็ฆ† qin sync
clean ๅจ“ๅ‘ฏๆ‚Š้‹ๅ‹ซ็ผ“ๆตœั…ๅขฟ qin clean
init ้’ๆฟ†๎้–ๆ ญใ€้ฉ? qin init
env ้œ๎ˆš๎•จๅฆซโ‚ฌ้Œ? qin env

ๆฉๆ„ฏ๎”‘้Žธๅ›ง็•พ้‚ๅ›ฆๆฌข

# ๆฉๆ„ฏ๎”‘ๆคคๅœญๆดฐ้ใƒฅๅฝ›้”›ๅฌin.config.json ๆถ“๎… ๆฎ‘ entry้”›?
qin run

# ๆฉๆ„ฏ๎”‘้Žธๅ›ง็•พ้จ?Java ้‚ๅ›ฆๆฌข
qin run src/main/java/com/example/Test.java

# ๆฉๆ„ฏ๎”‘้Žธๅ›ง็•พ้จ?Qin ้‚ๅ›ฆๆฌข
qin run main/main.qin

# ๆฉๆ„ฏ๎”‘้Žธๅ›ง็•พ้‚ๅ›ฆๆฌข้ชžๆœต็ดถ้–ซๆŽ‘ๅผฌ้?
qin run MyTest.java arg1 arg2

ๆฉๆ„ฏ๎”‘้’ๅ——ๅฝ‚็‘™ๅ‹ซๅžฏ้”›ๅ ข็ฒบๆถ“โ‚ฌ้”›ๅค›็ดฐ

  • ๆตผ็Šฒๅ†้ฉ๎†ฝ็ˆฃ้™ๅ‚›ๆšŸ้ƒ่ฎน็ดฐๆตผๆจบๅŽ›้ŽปๆŽๆฌข็‘™๏ฝ†็€ฝ้”›ๅฑฝๅพๅจ†?.js้”›ๅฑพๆธถ้šๅบขๅฏœ Java ้ใƒฅๅฝ›ๆพถๅ‹ญๆ‚Š้І?

  • ๆถ“ๅถ„็ดถ้™ๅ‚›ๆšŸ้ƒ่ฎน็ดฐๆตผๆจบๅŽ›็’‡่ฏฒๅฝ‡ qin.config.js ้จ?entry้”›ๆถœๅซขๆถ“?.qin/.js/.mjs/.ts ็’ง?Qin ๆฉๆ„ฏ๎”‘้ƒ่ฎน็ด้š๏น€ๅžฏ้Žธ?Java host ้ใƒฅๅฝ›ๆพถๅ‹ญๆ‚Š้І? run / dev ้–ๅ“„ๅŸ†้”›?

  • qin run้”›ๆฐซ็ซดๅจ†โ„ƒ็€ฏๅฏคๅ“„ๆ‚—้š๎ˆšๅงฉ้”›ๅฑผ็ฌ‰้ฉๆˆๆƒ‰้‚ๅ›ฆๆฌข้™ๆจบๅฏฒ้І?

  • qin dev้”›ๆฐฌๅดŸ็ป”๎ˆšๅฝ›ๅฏฎโ‚ฌ้™ๆˆžๆน‡้”โ˜…็ด™ๆฆ›ๆจฟ๎…ป้šๅฒ€๎ฌ้™๏ฝ†ๅฝๆธš?API + ้—ˆๆฌโ‚ฌไพ€ใ€‰้—ˆ๎ฎ็ดš้”›ๅฒ€ๆดƒ้š?.js/.html/.css ้™ๆจปๆดฟ้ชžๆƒฐๅšœ้”ใ„ฉๅ™ธ็ผ‚ๆ ฌ็˜งๆถ“ๅบข็ฅป็‘™ๅ ๆซ’้’้”‹ๆŸŠ้І?

  • ็’‡?MVP ้จๅ‹ฌ็‰ณ่น‡ๅ†ฎๆ‘ผ็’บ๎ˆ™ไบ’ Qin + Java ๆฉๆ„ฏ๎”‘้ƒๆœต่ดŸๆถ“ไผ™็ด้“ๅถ‡๎ฌ้ข?Qin ้˜็†บๆ•“ dev server ้œ?Qin frontend pipeline ้Žต่ƒฏๆต‡้”›ๅฑผ็ฌ‰้–ซๆฐณ็นƒ Node/Vite ็€›ๆ„ฏ็น˜็ป‹ๅฌซห‰้Žบใƒฃโ‚ฌ? ้‹ๅ‹ซ็ผ“้’ๅ——ๅฝ‚็‘™ๅ‹ซๅžฏ้”›ๅ ข็ฒบๆถ“โ‚ฌ้”›ๅค›็ดฐ

  • qin build ้ฆใ„ฆ๎—…ๅจดๅฌชๅŸŒ .js ้ใƒฅๅฝ›้ƒ่ฎน็ดๆตผๆฐณ่›‹ Qin fullstack build-only ๅจดไฝบโ–ผ้І?

  • ๆฆ›ๆจฟ๎…ปๆˆๆ’ณๅšญ้ฉ๎†ผ็ถ้”›ๆญšdist/fullstack้”›ๅฑฝๅพๆถ“?server-classes/็€›ๆจปๆ–้šๅบฃ๎ฌ.class้”›ๅฎweb/ ็€›ๆจปๆ–้“ๅถ‡๎ฌ้‹ๅ‹ซ็ผ“ๆตœั…ๅขฟ้”›ๅ ๆƒˆ app.js้”›ๅคˆโ‚ฌ?

  • ้™๎ˆœๆ•ค -o/--output ็‘•ๅ—™ๆดŠๆˆๆ’ณๅšญ้ๅœญๆดฐ่คฐๆ›˜โ‚ฌ?

้ฆƒๆฎŒ ๆฅ‚ๆจผ้ช‡้—่ง„โ‚ฌ?

1. ๆพง็‚บๅ™บ็ผ‚ๆ ฌ็˜ง

Qin ๆตฃ่ทจๆ•ค *javax.tools API + ้ƒๅ •ๆฃฟ้Žด่™ซ็˜ฎๆˆ? ็€น็‚ตๅน‡้…้ธฟๅ…˜ๆพง็‚บๅ™บ็ผ‚ๆ ฌ็˜ง้”›?

  • ้‰?*้…้ธฟๅ…˜ๅฆซโ‚ฌๅจด? - ้™๎†็ดช็’‡ๆˆœๆ…จ้€็ก…็นƒ้จๅ‹ฌๆžƒๆต ่ฎน็ด™ๅงฃๆ—‡็ท .java ้œ?.class ้จๅ‹ชๆ…จ้€่ง„ๆค‚้—‚่พพ็ดš
  • ้‰?้‘ท๎„ๅงฉๆธšๆฟŠ็ฆ† - javac ้‘ท๎„ๅงฉๆพถๅ‹ญๆ‚ŠๆธšๆฟŠ็ฆ†้‚ๅ›ฆๆฌข้จๅ‹ญ็ดช็’‡?
  • ้‰?*้—†ๅ •ๅŽค็ผƒ? - ้ƒ็Šปๆธถๆฃฐๆฟ†๎˜ป้–ฐๅถ‡็–†้”›ๅฑฝ็ด‘็ป ๅžๅต†้ข?
  • ้‰?*่น‡๎‚ฆโ‚ฌ็†ทๆทๆด? - ้ƒ็Šฑๆ…จ้€่ง„ๆค‚็’บๅฎ ็นƒ็ผ‚ๆ ฌ็˜ง้”›ๅฒ€็›้—ๅฎ ็น็›?

*็€น็‚ตๅน‡้˜็†บๆ‚Š้”›?

// ๅงฃๆ—‡็ทๅงฃๅฟŽ้‡œ .java ้‚ๅ›ฆๆฌข้œๅฑฝ๎‡ฎๆด?.class ้‚ๅ›ฆๆฌข้จๅ‹ฌๆค‚้—‚ๅญ˜ๅŸ‘
private boolean isModified(String javaFilePath) {
    Path classFile = getClassFilePath(javaFilePath);
    if (!Files.exists(classFile)) return true;
    return Files.getLastModifiedTime(javaFile) > Files.getLastModifiedTime(classFile);
}

// ๆตฃ่ทจๆ•ค javax.tools API ็ผ‚ๆ ฌ็˜ง
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.getTask(...).call();

*้Žฌั†ๅ…˜้Žปๆ„ฌๅดŒ้”›?

้ฆ็ƒ˜ๆซ™ ้ใ„ฉๅ™บ็ผ‚ๆ ฌ็˜ง ๆพง็‚บๅ™บ็ผ‚ๆ ฌ็˜ง ้Žปๆ„ฌๅดŒ
้ƒ็Šฑๆ…จ้€? 3.2s 0.1s 32x ้ˆฟ?
ๆท‡๎†ฝๆ•ผ 1 ๆถ“๎…ๆžƒๆต ? 3.2s 0.5s 6.4x ้ฆƒๆฎŒ
ๆท‡๎†ฝๆ•ผ 10 ๆถ“๎…ๆžƒๆต ? 3.2s 1.8s 1.8x ้ˆฟ?

2. ๆธšๆฟŠ็ฆ†็ผ‚ๆ’ณ็“จ้ˆๅ“„ๅŸ—

Qin ้ฆใ„ฆ็˜กๆถ“๎ˆใ€้ฉ๎†พๆฎ‘ .qin/classpath.json ๆถ“๎… ็ดฆ็€›ๆจน็ทท็’งๆ ฌะ’้‹ๆ„ฎ็ฒจ้‹ๆป็ดฐ

{
  "classpath": [
    "D:/project/subhuti-java/build/classes",
    "C:/Users/qinky/.qin/libs/com.google.code.gson/gson-2.10.1/gson-2.10.1.jar"
  ],
  "lastUpdated": "2025-12-30T07:10:32Z"
}

*ๅฎธใƒค็ถ”ๅจดไฝบโ–ผ้”›?

qin run/sync
  ้ˆซ?
ๅฆซโ‚ฌ้Œ?.qin/classpath.json ้„๎ˆšๆƒ็€›ๆจบๆนช
  ้ˆซ?
ๅงฃๆ—‡็ท็ผ‚ๆ’ณ็“จ้ƒๅ •ๆฃฟ vs qin.config.js ๆท‡๎†ฝๆ•ผ้ƒๅ •ๆฃฟ
  ้ˆซ?
็ผ‚ๆ’ณ็“จ้ˆๅค‹ๆ™ฅ ้ˆซ?้ฉๅญ˜ๅธดๆตฃ่ทจๆ•ค้”›ๅ ๆฉ้–ซ็†ทๆƒŽ้”๎Ÿ’็ดš
็ผ‚ๆ’ณ็“จ้ƒ็Šณๆ™ฅ ้ˆซ?้–ฒๅถ†ๆŸŠ็‘™๏ฝ†็€ฝๆธšๆฟŠ็ฆ†้ชž่ˆตๆดฟ้‚ๆ‰ฎ็ดฆ็€›?

*ๆตผๆจบๅจ้”›?

  • ้ˆฟ?ๆฃฃๆ จ๎‚ผๆฉๆ„ฏ๎”‘ - ็‘™๏ฝ†็€ฝๆธšๆฟŠ็ฆ† + ้ข็†ธๅžš็ผ‚ๆ’ณ็“จ
  • ้ฆƒๆฎŒ ้šๅบฃ็”ปๆฉๆ„ฏ๎”‘ - ้ฉๅญ˜ๅธด็’‡่ค็ดฆ็€›ๆฉˆ็ด็ป‰ๆŽ”้ช‡้š๎ˆšๅงฉ
  • ้ฆƒๆ”ง ้‘ท๎„ๅงฉ้’้”‹ๆŸŠ - ๆท‡๎†ฝๆ•ผ qin.config.js ้šๅบคๅšœ้”ใ„ฉๅ™ธ้‚ๆ‹Œะ’้‹?

3. ้ˆ๎„€ๆนดๆธšๆฟŠ็ฆ†ๆตผๆจบๅŽ›็‘™๏ฝ†็€ฝ

Qin ้‘ท๎„ๅงฉ้™ๆˆ ๅน‡้ชžๆœต็ดญ้ๅ œๅจ‡้ขใ„ฆๆนฐ้ฆไผดใ€้ฉ๎†ป็ทท็’งๆ ต็ด้–ฌๅžฎๅŽคๆต ?Maven ๆถ“ๅฌญๆต‡้”›?

*้‘ท๎„ๅงฉ้™ๆˆ ๅน‡็ป›ๆ ซๆš้”›?

  1. ๆต ๅบก็ถ‹้“ๅถ‡ๆดฐ่คฐๆ›žๆ‚œๆถ“ๅฉƒ็…ก้Žต็‚ฌๅข้ˆๅคŠๅฏ˜้š?qin.config.js ้จๅ‹ญๆดฐ่คฐ?
  2. ้Žต๎‚ฃๅผฟๅงฃๅฟŽ้‡œ้ฉ๎†ผ็ถ้จๅ‹ซๆ‚“็ปพั‡ใ€้ฉ?
  3. ้–ๅฝ’ๅŽคๆธšๆฟŠ็ฆ†้จ?groupId:artifactId
  4. ็่พซ็นŽๆตผๆจบๅŽ›้”›ๅ ฃ็นŽ้จๅ‹ฏใ€้ฉ๎†ฟ๎›ซ้ฉๆ ฌ็น™้จๅ‹ซๆ‚“้šๅถ‰ใ€้ฉ๎‡†็ดš

*็ป€่ฝฐ็ทฅ้”›?

d:/project/
้ˆนๆบพๆ”ข้ˆนโ‚ฌ slime-java/
้ˆน?  ้ˆนๆบพๆ”ข้ˆนโ‚ฌ subhuti-java/         # com.subhuti:subhuti-java
้ˆน?  ้ˆน?  ้ˆนๆบพๆ”ข้ˆนโ‚ฌ qin.config.js
้ˆน?  ้ˆน?  ้ˆนๆ–บๆ”ข้ˆนโ‚ฌ build/classes/    ้ˆซ?้ˆ๎„€ๆนดๆธšๆฟŠ็ฆ†็’บ๎ˆš็ทž
้ˆน?  ้ˆนๆบพๆ”ข้ˆนโ‚ฌ slime-token/          # com.slime:slime-token
้ˆน?  ้ˆน?  ้ˆนๆ–บๆ”ข้ˆนโ‚ฌ build/classes/
้ˆน?  ้ˆนๆ–บๆ”ข้ˆนโ‚ฌ slime-parser/         # ๆธšๆฟŠ็ฆ†ๆถ“ๅฉ‡ๆฝฐๆถ“ใ‚„้‡œๆคคๅœญๆดฐ
้ˆน?      ้ˆนๆ–บๆ”ข้ˆนโ‚ฌ qin.config.js

้ฆ?slime-parser ๆถ“๎…จ็ดฐ

{
  "dependencies": {
    "com.subhuti:subhuti-java": "1.0.0-SNAPSHOT",
    "com.slime:slime-token": "1.0.0"
  }
}

้Žตั†๎”‘ qin sync ๆˆๆ’ณๅšญ้”›?

้ˆซ?Syncing dependencies...
  ้ˆซ?Found 2 local dependencies
้‰?Dependencies synced (2 local, 0 remote)
  Cache: .qin/classpath.json

*ๆตผๆจบๅจ้”›?

  • ้ฆƒๆฎŒ ้ƒ็Šปๆธถ้™ๆˆ็ซท - ้ˆ๎„€ๆนดๅฏฎโ‚ฌ้™ๆˆžๆฃค้—‡โ‚ฌ้™ๆˆ็ซท้’?Maven
  • ้ฆƒๆ”ง ็€น็‚ดๆค‚้‡ๅญ˜ๆŸŠ - ๆท‡๎†ฝๆ•ผๆธšๆฟŠ็ฆ†ๆคคๅœญๆดฐ็ป”ๅฌชๅต†้ข็†ธๆ™ฅ
  • ้ฆƒๆ‘ ้‘บๅ‚œๆธท็”ฏ๏น€๎†” - ๆถ“ๅถ„็ฌ…ๆž่Šฅๆนฐ้ฆๆฟๅ‡ก้ˆๅคŒๆฎ‘ๆคคๅœญๆดฐ
  • ้ฆƒๅน† Monorepo ้™ๅฌชใ‚ฝ - ๆพถโ•ƒๅŠง้€๎ˆ›ๅฏ”ๆพถๆฐถใ€้ฉ๎†ผไผๆตฃๆปƒๅฐฏ

4. ๆธšๆฟŠ็ฆ†็‘™๏ฝ†็€ฝๅจดไฝบโ–ผ

qin run / qin sync
  ้ˆซ?
ๅฆซโ‚ฌ้Œใƒค็ทท็’งๆ ซ็ดฆ็€›?(.qin/classpath.json)
  ้ˆซ?
[็ผ‚ๆ’ณ็“จ้ˆๅค‹ๆ™ฅ]้ˆนโ‚ฌ้ˆนโ‚ฌ้ˆนโ‚ฌ้ˆนโ‚ฌ้ˆนโ‚ฌ้ˆนโ‚ฌ้ˆนโ‚ฌ้ˆนโ‚ฌ้ˆนโ‚ฌ้ˆนโ‚ฌ้ˆนโ‚ฌ้ˆนโ‚ฌ้ˆนโ‚ฌ้ˆนโ‚ฌ้ˆนโ‚ฌ้ˆน?
  ้ˆซ?                    ้ˆซ?
[็ผ‚ๆ’ณ็“จ้ƒ็Šณๆ™ฅ]          ๆตฃ่ทจๆ•ค็ผ‚ๆ’ณ็“จ
  ้ˆซ?                    ้ˆซ?
้ˆ๎„€ๆนดๆธšๆฟŠ็ฆ†็‘™๏ฝ†็€ฝ          ้ฉๅญ˜ๅธดๆฉๆ„ฏ๎”‘
(LocalProjectResolver)
  ้ˆซ?
้ŽตๆƒงๅŸŒ ้ˆซ?ๆตฃ่ทจๆ•ค build/classes ็’บ๎ˆš็ทž
้ˆ๎…ๅฃ˜้’?้ˆซ?้ๅ›ช๎†‡ๆถ“้ธฟ็น™็ป‹ๅฌฉ็ทท็’ง?
  ้ˆซ?
ๆฉๆป…โ–ผๆธšๆฟŠ็ฆ†็‘™๏ฝ†็€ฝ
(DependencyResolver + Coursier)
  ้ˆซ?
้šๅ ่‹Ÿ้ˆ๎„€ๆนด+ๆฉๆป…โ–ผ classpath
  ้ˆซ?
้ๆฌๅ† .qin/classpath.json
  ้ˆซ?
ๆฉๆ„ฏ๎”‘็ป‹ๅฌช็ฐญ

5. ๆต ๏ฝ‡็ˆœๆพถๅถ‡ๆ•ค็’ๆ๎…ธ

run ้›ๆˆ’ๆŠค้œ?sync ้›ๆˆ’ๆŠค้ๅ˜้Ÿฉ้็จฟ็ธพๆธšๆฟŠ็ฆ†็‘™๏ฝ†็€ฝ้–ซๆ˜็ทซ้”›?

// run ้›ๆˆ’ๆŠค
private static void runProject(String[] args) {
    String classpath = ensureDependenciesSynced(config);  // ๆพถๅถ‡ๆ•ค
    runner.compileAndRun(classpath);
}

// sync ้›ๆˆ’ๆŠค  
private static void syncDependencies() {
    syncDependenciesCore(config);  // ้็จฟ็ธพ้–ซๆ˜็ทซ
}

// ้ๅ˜้Ÿฉ้จๅ‹ฌ็‰ณ่น‡ๅ†ฎโ‚ฌๆ˜็ทซ
private static String syncDependenciesCore(QinConfig config) {
    // 1. ้ˆ๎„€ๆนดๆธšๆฟŠ็ฆ†็‘™๏ฝ†็€ฝ
    LocalProjectResolver.ResolutionResult localResult = ...;
    
    // 2. ๆฉๆป…โ–ผๆธšๆฟŠ็ฆ†็‘™๏ฝ†็€ฝ้”›ๅ œ็ฒŽ้ˆ๎„ๆนช้ˆ๎„€ๆนด้ŽตๆƒงๅŸŒ้จๅ‹ถ็ดš
    if (!localResult.remoteDependencies.isEmpty()) {
        DependencyResolver resolver = ...;
    }
    
    // 3. ้ข็†ธๅžš้ชžๅ‰็ดฆ็€›?classpath
    return classpath;
}

6. IDEA ้—†ๅ—˜ๅžš

Qin ้Žปๆ„ช็ทต IntelliJ IDEA ้ŽปๆŽๆฌข้”›ๅฑฝ็–„้œ?IDE ้ƒ็Šต็ดณ้—†ๅ—˜ๅžš้”›?

*้‘ท๎„ๅงฉ้”็†ปๅ…˜้”›?

  • ้‰?้‘ท๎„ๅงฉ้šๅฑพ๎„ž - ้Žตๆ’ณ็ด‘ๆคคๅœญๆดฐ้ƒๆƒฐๅšœ้”ใ„ฆๅขฝ็›?qin sync
  • ้‰?*ๆดๆ’ปๅŽค็ผƒ๎†พๆ•“้Žด? - ้‘ท๎„ๅงฉ้ข็†ธๅžš .idea/libraries/*.xml
  • ้‰?็ผ‚ๆ ฌ็˜งๆˆๆ’ณๅšญ้–ฐๅถ‡็–† - ้‘ท๎„ๅงฉๆตฃ่ทจๆ•ค build/classes้”›ๅ œ็ฌŒ qin ๆถ“โ‚ฌ้‘ท่พพ็ดš
  • ้‰?Monorepo ้€๎ˆ›ๅฏ” - ้‘ท๎„ๅงฉ้Žต๎‚ฃๅผฟ้Žตโ‚ฌ้ˆๅคŠ็“™ๆคคๅœญๆดฐ

*็€นๅคŽ๎—Š้”›?

# ้‹ๅ‹ซ็ผ“้ŽปๆŽๆฌข
cd packages/qin-idea-plugin-debug
./gradlew buildPlugin

# ็€นๅคŽ๎—Š้”›ๆฌผDEA ้ˆซ?Settings ้ˆซ?Plugins ้ˆซ?้ˆฟๆฌ™็ฌ ้ˆซ?Install from Disk
# ้–ซๅค‹ๅซจ build/distributions/qin-idea-plugin-debug-x.x.x.zip

*ๅฎธใƒค็ถ”้˜็†บๆ‚Š้”›?

IDEA ้Žตๆ’ณ็ด‘ๆคคๅœญๆดฐ
     ้ˆซ?
้šๆˆœ็ฌ‚้Œใƒฆๅฃ˜ workspace root้”›?idea/.vscode/.git้”›?
     ้ˆซ?
้šๆˆœ็ฌ…้–ซๆŽ‘็ถŠ้Žต๎‚ฃๅผฟ้Žตโ‚ฌ้ˆ?qin.config.js้”›ๅ Ÿๆธถๆพถ?5 ็žๅ‚ฆ็ดš
     ้ˆซ?
ๆถ“็ƒ˜็˜กๆถ“๎ˆใ€้ฉ๎†ฝๅขฝ็›?qin sync
     ้ˆซ?
้ข็†ธๅžš .idea/libraries/*.xml
     ้ˆซ?
้‡ๅญ˜ๆŸŠ .iml ้‚ๅ›ฆๆฌข้”›ๅ ŸๅŠ้”็Šฒ็ฐฑๅฏฎๆ› ๆ•ค + ้–ฐๅถ‡็–†ๆˆๆ’ณๅšญ็’บ๎ˆš็ทž้”›?
     ้ˆซ?
้’้”‹ๆŸŠ IDEA ๆคคๅœญๆดฐๅฆฏโ€ณ็€ท

7. Monorepo ้€๎ˆ›ๅฏ”

Qin ้˜็†บๆ•“้€๎ˆ›ๅฏ” Monorepo้”›ๅ ๅดŸๆต ๆ’ณ็ฐฑๆพถๆฐถใ€้ฉ๎‡†็ดšๅฆฏโ€ณ็ดก้”›?

*้ฉ๎†ผ็ถ็ผๆ’ด็€ฏ้”›?

workspace/
้ˆนๆบพๆ”ข้ˆนโ‚ฌ .git/
้ˆนๆบพๆ”ข้ˆนโ‚ฌ .idea/             # IDEA ๆคคๅœญๆดฐ้ๅ›ง็น”
้ˆนๆบพๆ”ข้ˆนโ‚ฌ project-a/
้ˆน?  ้ˆนๆ–บๆ”ข้ˆนโ‚ฌ qin.config.js
้ˆนๆบพๆ”ข้ˆนโ‚ฌ project-b/
้ˆน?  ้ˆนๆ–บๆ”ข้ˆนโ‚ฌ qin.config.js
้ˆนๆบพๆ”ข้ˆนโ‚ฌ packages/
้ˆน?  ้ˆนๆบพๆ”ข้ˆนโ‚ฌ lib-1/
้ˆน?  ้ˆน?  ้ˆนๆ–บๆ”ข้ˆนโ‚ฌ qin.config.js
้ˆน?  ้ˆนๆ–บๆ”ข้ˆนโ‚ฌ lib-2/
้ˆน?      ้ˆนๆ–บๆ”ข้ˆนโ‚ฌ qin.config.js
้ˆนๆ–บๆ”ข้ˆนโ‚ฌ apps/
    ้ˆนๆ–บๆ”ข้ˆนโ‚ฌ app-1/
        ้ˆนๆ–บๆ”ข้ˆนโ‚ฌ qin.config.js

*้ˆ๎„€ๆนดๆธšๆฟŠ็ฆ†็‘™๏ฝ†็€ฝ็ป›ๆ ซๆš้”›?

  1. ๆต ๅบก็ถ‹้“ๅถ‡ๆดฐ่คฐๆ›žๆ‚œๆถ“ๅฉƒ็…ก้Žต็‚ฌๅข้ˆ?qin.config.js
  2. ้Žต๎‚ฃๅผฟ้šๅฒ€้ช‡้ฉ๎†ผ็ถ้จๅ‹ซๅพๆต ๆ ญใ€้ฉ?
  3. ็่พซ็นŽๆตผๆจบๅŽ›้”›ๆฐณ็นŽ้จๅ‹ฏใ€้ฉ๎†ฟ๎›ซ้ฉๆ ฌ็น™้จๅ‹ซๆ‚“้šๅถ‰ใ€้ฉ?

*IDEA ้ŽปๆŽๆฌข้Žต๎‚ฃๅผฟ็ป›ๆ ซๆš้”›?

  1. ้šๆˆœ็ฌ‚้ŽตๆƒงๅŸŒ workspace root้”›ๅ Ÿๆธถๆคค่ทบ็œฐ้จ?.idea/.vscode/.git ้ฉ๎†ผ็ถ้”›?
  2. ๆต ?workspace root ้šๆˆœ็ฌ…้–ซๆŽ‘็ถŠ้Žต๎‚ฃๅผฟ้Žตโ‚ฌ้ˆ?qin.config.js
  3. ๆถ“็ƒ˜็˜กๆถ“๎„ๅฝ‚้œๆ‰ฎๆฎ‘ๆคคๅœญๆดฐ้‘ท๎„ๅงฉ้Žตั†๎”‘ sync

*้–ฐๅถ‡็–†็ป€่ฝฐ็ทฅ้”›?

// project-a/qin.config.js
{
  "name": "com.example:project-a",
  "version": "1.0.0",
  "dependencies": {
    "com.example:lib-1": "1.0.0",  // ้‘ท๎„ๅงฉๆตฃ่ทจๆ•ค้ˆ๎„€ๆนด ../packages/lib-1
    "com.example:lib-2": "1.0.0"   // ้‘ท๎„ๅงฉๆตฃ่ทจๆ•ค้ˆ๎„€ๆนด ../packages/lib-2
  }
}

้ฆƒๅน† Java 25 ้—่ง„โ‚ฌัƒ็็ป€?

1. Flexible Constructor Bodies

// ้‰?Java 25 ้‚ๆ‰ฎๅฃ’้Žฌ?
public record QinConfig(String name, String version, Map<String, String> dependencies) {
    public QinConfig {
        // ้™๎ˆ™ไบ’้ฆ?super() ้“ๅถ‰็™็’‡ไฝธๅผฌ้ๅธฎ็ด’
        if (name == null || name.isBlank()) {
            throw new IllegalArgumentException("name cannot be blank");
        }
        
        // ้Žปๆ„ช็ทตๆฆ›ๆจฟ๎…ป้Š?
        dependencies = dependencies != null ? Map.copyOf(dependencies) : Map.of();
    }
}

2. Primitive Patterns in Switch

// ้‰?Java 25 - ้ฉ็ƒ˜ๆนฐ็ปซ่ฏฒ็€ทๅฆฏโ€ณ็ดก้–ๅฝ’ๅŽค
String result = switch (value) {
    case int i when i > 0 -> "positive: " + i;
    case long l -> "long value: " + l;
    case double d -> "double value: " + d;
    default -> "other";
};

3. Structured Concurrency

// ้‰?Java 25 - ็ผๆ’ด็€ฏ้–ๆ ง่‹Ÿ้™?
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
    var task1 = scope.fork(() -> downloadDependency("lib1"));
    var task2 = scope.fork(() -> downloadDependency("lib2"));
    
    scope.join().throwIfFailed();  // ็ผ็†ถ็ซดๅฏฎๅ‚š็ˆถๆพถๅ‹ญๆ‚Š
    
    return List.of(task1.get(), task2.get());
}

้ฆƒๆ‘ ๆคคๅœญๆดฐ็ผๆ’ด็€ฏ

้ขใ„ฆๅŸ›ๆคคๅœญๆดฐ็ผๆ’ด็€ฏ

my-project/
้ˆนๆบพๆ”ข้ˆนโ‚ฌ qin.config.js          # Qin ้–ฐๅถ‡็–†
้ˆนๆบพๆ”ข้ˆนโ‚ฌ src/
้ˆน?  ้ˆนๆบพๆ”ข้ˆนโ‚ฌ main/java/           # ๅฉงๆ„ฎ็ˆœ
้ˆน?  ้ˆน?  ้ˆนๆ–บๆ”ข้ˆนโ‚ฌ com/myapp/
้ˆน?  ้ˆน?      ้ˆนๆ–บๆ”ข้ˆนโ‚ฌ Main.java
้ˆน?  ้ˆนๆ–บๆ”ข้ˆนโ‚ฌ test/java/           # ๅจดๅฌญ็˜ฏ
้ˆนๆบพๆ”ข้ˆนโ‚ฌ build/
้ˆน?  ้ˆนๆ–บๆ”ข้ˆนโ‚ฌ classes/             # ็ผ‚ๆ ฌ็˜งๆˆๆ’ณๅšญ (OUTPUT_DIR)
้ˆนๆบพๆ”ข้ˆนโ‚ฌ .qin/                    # Qin ้–ฐๅถ‡็–†้ฉ๎†ผ็ถ
้ˆน?  ้ˆนๆบพๆ”ข้ˆนโ‚ฌ classpath.json       # ๆธšๆฟŠ็ฆ†็ผ‚ๆ’ณ็“จ (CLASSPATH_CACHE)
้ˆน?  ้ˆนๆ–บๆ”ข้ˆนโ‚ฌ libs/                # ้ˆ๎„€ๆนดๆธšๆฟŠ็ฆ†้–พ็‚ฌๅธด (LIBS_DIR)
้ˆน?      ้ˆนๆ–บๆ”ข้ˆนโ‚ฌ com.google.code.gson/
้ˆน?          ้ˆนๆ–บๆ”ข้ˆนโ‚ฌ gson-2.10.1/ -> ~/.qin/libs/.../
้ˆนๆ–บๆ”ข้ˆนโ‚ฌ dist/
    ้ˆนๆ–บๆ”ข้ˆนโ‚ฌ my-app.jar           # Fat JAR

้ใ„ฅ็œฌ้ฉ๎†ผ็ถ็ผๆ’ด็€ฏ

~/.qin/
้ˆนๆ–บๆ”ข้ˆนโ‚ฌ libs/                    # ้ใ„ฅ็œฌๆธšๆฟŠ็ฆ†็ผ‚ๆ’ณ็“จ (GLOBAL_LIBS_DIR)
    ้ˆนๆ–บๆ”ข้ˆนโ‚ฌ com.google.code.gson/
        ้ˆนๆ–บๆ”ข้ˆนโ‚ฌ gson-2.10.1/
            ้ˆนๆ–บๆ”ข้ˆนโ‚ฌ gson-2.10.1.jar

็’บ๎ˆš็ทž็”ฏๆๅ™บ้–ฐๅถ‡็–† (QinPaths.java)

็”ฏๆๅ™บ ้Š? ็’‡ๅญ˜ๆง‘
OUTPUT_DIR build/classes ็ผ‚ๆ ฌ็˜งๆˆๆ’ณๅšญ้ฉ๎†ผ็ถ
QIN_DIR .qin Qin้–ฐๅถ‡็–†้ฉ๎†ผ็ถ
CLASSPATH_CACHE .qin/classpath.json ๆธšๆฟŠ็ฆ†็ผ‚ๆ’ณ็“จ้‚ๅ›ฆๆฌข
LIBS_DIR .qin/libs ๆธšๆฟŠ็ฆ†ๆดๆ’ถๆดฐ่คฐ?

้ฆƒๆ•ก ๅฏฎโ‚ฌ้™?

ๆคคๅœญๆดฐ็ผๆ’ด็€ฏ

qin/
้ˆนๆบพๆ”ข้ˆนโ‚ฌ src/java-rewrite/        # Java 25 ๅฉงๆ„ฎ็ˆœ
้ˆน?  ้ˆนๆ–บๆ”ข้ˆนโ‚ฌ com/qin/
้ˆน?      ้ˆนๆบพๆ”ข้ˆนโ‚ฌ types/           # ้–ฐๅถ‡็–†็ปซ่ฏฒ็€ท้”›ๅœงecords้”›?
้ˆน?      ้ˆนๆบพๆ”ข้ˆนโ‚ฌ core/            # ้็จฟ็ธพๅฆฏโ€ณๆฝก
้ˆน?      ้ˆนๆบพๆ”ข้ˆนโ‚ฌ commands/        # ้›ๆˆ’ๆŠค็€น็‚ตๅน‡
้ˆน?      ้ˆนๆบพๆ”ข้ˆนโ‚ฌ cli/             # CLI ้ใƒฅๅฝ›
้ˆน?      ้ˆนๆ–บๆ”ข้ˆนโ‚ฌ java/            # Java ๅฎธใƒฅๅฟ
้ˆนๆบพๆ”ข้ˆนโ‚ฌ .qin/
้ˆน?  ้ˆนๆ–บๆ”ข้ˆนโ‚ฌ classes/             # ็ผ‚ๆ ฌ็˜งๆˆๆ’ณๅšญ
้ˆนๆบพๆ”ข้ˆนโ‚ฌ lib/
้ˆน?  ้ˆนๆ–บๆ”ข้ˆนโ‚ฌ gson-2.10.1.jar      # ้ž๎ˆ™็ซดๆธšๆฟŠ็ฆ†
้ˆนๆ–บๆ”ข้ˆนโ‚ฌ build-java.bat           # ้‹ๅ‹ซ็ผ“้‘ดๆฐญๆนฐ

้็จฟ็ธพๅฆฏโ€ณๆฝก้‹่ˆต็€ฏ

1. ็’บ๎ˆš็ทž็ป ๏ผ„ๆ‚Š - QinPaths.java

้”็†ปๅ…˜: ็ผ็†ถ็ซด็ป ๏ผ„ๆ‚Š้Žตโ‚ฌ้ˆๅคŽ็Ÿพๅฏฐๅ‹ซ็ˆถ้–ฒ?

public static final String OUTPUT_DIR = "build/classes";
public static final String LIBS_DIR = ".qin/libs";

**ๆถ“่ฝฐ็ฒˆๆถ”ๅ ฅๆธถ็‘•?*: ้–ฌๅžฎๅŽค็บญ๎„‚็ดช้ฎไพŠ็ด็ผ็†ถ็ซด็’บ๎ˆš็ทž้–ฐๅถ‡็–†้”›ๅฑพๆŸŸๆธš่ทจๆทฎ้Žถใ‚…ๆ‹ฐๆท‡๎†ฝๆ•ผ

2. ็ผ‚ๆ ฌ็˜ง็ปฏ่ค็ฒบ - ้‘ฑๅฒƒ็Ÿ—้’ๅ—™๎ž‡็’ๆ๎…ธ

ClasspathBuilder - classpath้‹ๅ‹ซ็ผ“

้”็†ปๅ…˜: ้‹ๅ‹ซ็ผ“็ผ‚ๆ ฌ็˜ง้œๅฒƒ็น็›ๅฑพๆค‚้จๅˆขlasspath

  • buildCompileClasspath() - ็ผ‚ๆ ฌ็˜ง้ƒ็ฆผlasspath้”›ๅ ๅฏ˜้š๎‚ฃๆนฐ้ฆไผดใ€้ฉ?ๆฉๆป…โ–ผๆธšๆฟŠ็ฆ†้”›?
  • buildRuntimeClasspath() - ๆฉๆ„ฏ๎”‘้ƒ็ฆผlasspath

**ๆถ“่ฝฐ็ฒˆๆถ”ๅ ฅๆธถ็‘•?*: classpath้‹ๅ‹ซ็ผ“้–ซๆ˜็ทซๆพถๅถ†ๆฝ…้”›ๅ Ÿๆนฐ้ฆไผดใ€้ฉ๎†ผๅฝ‚้œ่ˆฌโ‚ฌไฝท็ทท็’งๆ ฌะ’้‹ๆ„ถ็ดš้”›ๅฒ€ๅซญ็ป”ๅฌชๅšญ้‰ใƒฆๅฝๆฅ‚ๆจบๅฝฒ็ผๅญ˜ๅงข้Žฌ?

Compiler - ็ผ‚ๆ ฌ็˜ง้–ซๆ˜็ทซ

้”็†ปๅ…˜: Javaๅฉงๆ„ญๆžƒๆต ๅ‰็ดช็’‡?

  • compile() - ๆตฃ่ทจๆ•คjavax.tools API็ผ‚ๆ ฌ็˜ง
  • filterModifiedFiles() - ๆพง็‚บๅ™บ็ผ‚ๆ ฌ็˜ง้”›ๅ ๅฝง็ผ‚ๆ ฌ็˜งๆท‡๎†ฝๆ•ผ้จๅ‹ฌๆžƒๆต ่ฎน็ดš
  • findJavaFiles() - ้Œใƒฆๅฃ˜Java้‚ๅ›ฆๆฌข

**ๆถ“่ฝฐ็ฒˆๆถ”ๅ ฅๆธถ็‘•?*: ็ไฝฝ๎—Šๆพถๅถ†ๆฝ…้จๅ‹ญ็ดช็’‡ๆˆฆโ‚ฌๆ˜็ทซ้”›ๅฑพๆ•ฎ้Žธไฝธ๎–ƒ้–ฒๅฟ•็ดช็’‡ๆˆžๅฝ้—ๅ›จโ‚ฌั†ๅ…˜

ResourceCopier - ็’งๅ‹ฌ็ฐฎๆพถๅถ…ๅŸ—

้”็†ปๅ…˜: ๆพถๅถ…ๅŸ—็’งๅ‹ฌ็ฐฎ้‚ๅ›ฆๆฌข้’ๆ‹Œ็ทญ้‘่™นๆดฐ่คฐ?

  • ้Œใƒฆๅฃ˜ๆพถๆฐซ้‡œ้™๎ˆๅ…˜้จๅ‹ฎ็ฅซๅฉงๆ„ฎๆดฐ่คฐๆ›ช็ด™src/resources, src/main/resources้”›?
  • ้–ซๆŽ‘็ถŠๆพถๅถ…ๅŸ—้ฉ๎†ผ็ถ

**ๆถ“่ฝฐ็ฒˆๆถ”ๅ ฅๆธถ็‘•?*: ็’งๅ‹ฌ็ฐฎ้‚ๅ›ฆๆฌขๆพถๅ‹ญๆ‚Š้„๎ˆœๅซญ็ป”ๅฌฌๆฎ‘้”็†ปๅ…˜้”›ๅฑผ็ฌŒ็ผ‚ๆ ฌ็˜ง้–ซๆ˜็ทซ้’ๅ—™๎ž‡

Runner - ็ป‹ๅฌช็ฐญๆฉๆ„ฏ๎”‘

้”็†ปๅ…˜: ๆฉๆ„ฏ๎”‘็ผ‚ๆ ฌ็˜ง้šๅบฃๆฎ‘Java็ป‹ๅฌช็ฐญ

  • run() - ๆฉๆ„ฏ๎”‘้Žธๅ›ง็•พ็ปซ?
  • runFile() - ๆฉๆ„ฏ๎”‘้Žธๅ›ง็•พJava้‚ๅ›ฆๆฌข
  • javaFilePathToClassName() - ็’บ๎ˆš็ทžๆž๎„‚่ขซ้š?

**ๆถ“่ฝฐ็ฒˆๆถ”ๅ ฅๆธถ็‘•?*: ๆฉๆ„ฏ๎”‘้–ซๆ˜็ทซ้™๎„‚็›้”›ๅฑพๆ•ฎ้Žธไฝธ๎˜ฟ็ป‰ๅถˆ็น็›ๅฑพๆŸŸๅฏฎ?

JavaRunner - ้—‚ใ„ฉๆฝฐ้—ๅฟš็šŸ้ฃ?

้”็†ปๅ…˜: ้—ๅฟš็šŸๆถ“ๅฉ…ๅ ช4ๆถ“๎†่ขซ้”›ๅฑพๅฝๆธšๆถš็ฒบๆถ“โ‚ฌ้Žบใƒฅๅฝ›

public CompileResult compile() {
    // 1. ็ผ‚ๆ ฌ็˜งๆธšๆฟŠ็ฆ†
    // 2. ้Œใƒฆๅฃ˜Java้‚ๅ›ฆๆฌข
    // 3. ๆพถๅถ…ๅŸ—็’งๅ‹ฌ็ฐฎ
    // 4. ๆพง็‚บๅ™บ็ผ‚ๆ ฌ็˜ง
}

**ๆถ“่ฝฐ็ฒˆๆถ”ๅ ฅๆธถ็‘•?*: ๆท‡ๆฟ‡ๅฏ”็ป โ‚ฌ้—ๆ› ๆฎ‘็’‹ๅ†ชๆ•ค้Žบใƒฅๅฝ›้”›ๅฒ„ๆฎฃ้’˜ๅฟ“ๅ”ด้–ฎใ„ฅ๎˜ฒ้‰ๅ‚›โ‚ฌ?

3. ๆธšๆฟŠ็ฆ†็ป ๏ผ„ๆ‚Š

LocalProjectResolver - ้ˆ๎„€ๆนดๆคคๅœญๆดฐ้™ๆˆ ๅน‡

้”็†ปๅ…˜: ้‘ท๎„ๅงฉ้™ๆˆ ๅน‡้ˆ๎„€ๆนดๆคคๅœญๆดฐๆธšๆฟŠ็ฆ†

  • ้šๆˆœ็ฌ‚้Œใƒฆๅฃ˜้Žตโ‚ฌ้ˆๅกนin.config.json
  • ้–ๅฝ’ๅŽคgroupId:artifactId
  • ็่พซ็นŽๆตผๆจบๅŽ›

**ๆถ“่ฝฐ็ฒˆๆถ”ๅ ฅๆธถ็‘•?*: Monorepo้€๎ˆ›ๅฏ”้”›ๅฒ„ไผฉ้ๅถ…ๅฝ‚็”ฏๅ†จๅŸŒMavenๆต ๆ’ณ็ฐฑ

DependencyResolver - ๆฉๆป…โ–ผๆธšๆฟŠ็ฆ†็‘™๏ฝ†็€ฝ

้”็†ปๅ…˜: ๆตฃ่ทจๆ•คCoursier็‘™๏ฝ†็€ฝMavenๆธšๆฟŠ็ฆ†

  • ๆถ“ๅฌญๆต‡jar้’็š›/.qin/libs
  • ็ผ‚ๆ’ณ็“จๆธšๆฟŠ็ฆ†็‘™๏ฝ†็€ฝ็ผๆ’ด็‰

**ๆถ“่ฝฐ็ฒˆๆถ”ๅ ฅๆธถ็‘•?*: ้‘ท๎„ๅงฉๆถ“ๅฌญๆต‡้œๅฒ€๎…ธ้žๅ—š็น™็ป‹ๅฌฉ็ทท็’ง?

4. ้–ฐๅถ‡็–†็ปฏ่ค็ฒบ - types/

ๆตฃ่ทจๆ•คJava 25 Records็€นๆฐซ็ฎŸ้–ฐๅถ‡็–†็ปซ่ฏฒ็€ท้”›?

public record QinConfig(
    String name,
    String version,
    Map<String, String> dependencies
) {}

**ๆถ“่ฝฐ็ฒˆๆถ”ๅ ฅๆธถ็‘•?*: ๆถ“ๅถ…ๅฝฒ้™ๆฉ€ๅŽค็ผƒ๎‡†็ด็ปซ่ฏฒ็€ท็€นๅคŠๅ้”›ๅฑผๅ”ฌ้ฎไฝบ็•ๅจฒ?

5. CLI็ปฏ่ค็ฒบ - QinCli.java

้”็†ปๅ…˜: ้›ๆˆ’ๆŠค็›ๅฑฝๅ†้™๏ฝ็ด็‘™๏ฝ†็€ฝ้›ๆˆ’ๆŠค้œๅฑฝๅผฌ้?

qin compile ้ˆซ?CompileCommand
qin run     ้ˆซ?RunCommand
qin build   ้ˆซ?BuildCommand

**ๆถ“่ฝฐ็ฒˆๆถ”ๅ ฅๆธถ็‘•?*: ็ผ็†ถ็ซด้จๅ‹ซๆ‡กๆต ใ‚ˆ๎”‘้Žบใƒฅๅฝ›้”›ๅฒ€ๆ•ค้Žดๅณฐๅผธๆฟ‚?


็’ๆ๎…ธ้˜็†ทๅžฏ

  1. ้‘ฑๅฒƒ็Ÿ—้—ๆ›š็ซด: ๅงฃๅฟŽ้‡œ็ปซ่ฏฒๅฝง็’็†ป็Ÿ—ๆถ“โ‚ฌๆต ๆœต็ฐจ
  2. ๆธšๆฟŠ็ฆ†ๅจ‰ใ„ฅๅ†: ้–ซๆฐณ็นƒ้‹ๅ‹ฏโ‚ฌ็Šฒๅšฑ้้ข็ดถ้–ซๆŽ็ทท็’ง?
  3. ้—ˆใˆ ๆ‚œ้Žบใƒฅๅฝ›: ๆตฃ่ทจๆ•ค้Žถๅ€Ÿ่–„็ปซ่ฏฒ็€ท้”›ๅฑผ็ฉถๆตœๅบข็ฅด็’‡ๆ›žๆ‹ฐ้Žตโ•็
  4. ็”ฏๆๅ™บ็ป ๏ผ„ๆ‚Š: ้Žตโ‚ฌ้ˆๅคŽ็Ÿพๅฏฐๅ‹ฏโ‚ฌๆฐณ็นƒQinPaths็ผ็†ถ็ซด็ป ๏ผ„ๆ‚Š

### ็ผ‚ๆ ฌ็˜ง

```bash
# ็ผ‚ๆ ฌ็˜ง Qin ้ˆ๎„ƒ้Ÿฉ
.\build-java.bat

# ๆˆๆ’ณๅšญ้”›ๆญœuild/classes/

ๅจดๅฌญ็˜ฏ

# ๆตฃ่ทจๆ•ค Qin ็ผ‚ๆ ฌ็˜งๅจดๅฌญ็˜ฏๆคคๅœญๆดฐ
cd examples/hello-java
..\..\qin.bat compile
..\..\qin.bat run

้ฆƒๅฐ‚ ้—่ง„โ‚ฌ?

้‰?้็จฟ็ธพ้”็†ปๅ…˜

  • JSON ้–ฐๅถ‡็–† - ้›ๅฉ‚ๅŸ† XML้”›ๅฑพๅซข้Žถ?JSON
  • ๆธšๆฟŠ็ฆ†็ป ๏ผ„ๆ‚Š - npm ๆค‹ๅบข็‰ธ้จๅ‹ช็ทท็’งๆ ฌ๎‡ขๅจ‰?
  • ๆพง็‚บๅ™บ็ผ‚ๆ ฌ็˜ง - javax.tools API + ้ƒๅ •ๆฃฟ้Žด็ญน็ด32x ้Žฌั†ๅ…˜้Žปๆ„ฌๅดŒ
  • ๆธšๆฟŠ็ฆ†็ผ‚ๆ’ณ็“จ - .qin/classpath.json ้‘ท๎„ๅงฉ็ผ‚ๆ’ณ็“จ้”›ๅฒ€๎—็ปพัƒๆƒŽ้”?
  • ้ˆ๎„€ๆนดๆธšๆฟŠ็ฆ†ๆตผๆจบๅŽ› - ้‘ท๎„ๅงฉ้™ๆˆ ๅน‡้ˆ๎„€ๆนดๆคคๅœญๆดฐ้”›ๅฑพๆฃค้—‡โ‚ฌ้™ๆˆ็ซท้’?Maven
  • Fat JAR ้‹ๅ‹ซ็ผ“ - ๆถ“โ‚ฌ้–ฟ๎†พๆ•“้Žดๆ„ฌๅฝฒ้Žตั†๎”‘ JAR
  • ๆฉๆ„ฏ๎”‘้Žธๅ›ง็•พ้‚ๅ›ฆๆฌข - qin run Test.java / qin run main/main.qin
  • ้ชžๆƒฐ๎”‘็ผ‚ๆ ฌ็˜ง - Virtual Threads ้”็Šปโ‚ฌ?
  • *้‘๎…ขๅ™ธๆž? - ๅฏฎโ‚ฌ้™ๆˆžฤๅฏฎๅฟšๅšœ้”ใ„ฉๅ™ธ้‚ๆ‰ฎ็ดช็’‡?
  • Monorepo ้€๎ˆ›ๅฏ” - ๆพถๆฐถใ€้ฉ๎†พ๎…ธ้ž?

้‰?Java 25 ๆตผๆจบๅฏฒ

  • Records ๆต ๏ฝ†ๆต› POJO - ๆต ๏ฝ‡็ˆœ้‘ๅฟ“็šฏ 60%
  • Flexible Constructors - ้‡ๆ‘็•จ้ใ„งๆฎ‘ๆฅ ๅฒƒ็˜‰
  • Pattern Matching - ้‡็ฟ ็ดญ้—†ๅ‘ฏๆฎ‘็ปซ่ฏฒ็€ทๆพถๅ‹ญๆ‚Š
  • Virtual Threads - 3-5x ้ชž่ทบๅฝ‚้Žฌั†ๅ…˜
  • Structured Concurrency - ้‡ๆ‘ๅฝฒ้—ˆ็Šตๆฎ‘ๅฏฎๅ‚›๎„ž
  • AOT Profiling - 2-3x ้š๎ˆšๅงฉ้–ซ็†ทๅฎณ
  • Compact Headers - 20-30% ้ๅ‘ญ็“จ้‘บๅ‚œๆธท

้ฆƒๆ‘Ž ้‚ๅ›จใ€‚

  • Java 25 ้–ฒๅถ…ๅ•“็’โ€ณๅž
  • [Java 25 ้—่ง„โ‚ฌั†๎‡›็‘™๎–ฃ(./docs/JAVA25_FEATURES.md)
  • [้–ฐๅถ‡็–†้™ๅ‚โ‚ฌๅƒ(./docs/CONFIG_REFERENCE.md)
  • [้ŽปๆŽๆฌขๅฏฎโ‚ฌ้™ๆ…ฎ(./docs/PLUGIN_DEVELOPMENT.md)

้ฆƒ๎™‚ ็’๏ผ„ๅฐž

ๅจ†ใˆฃ็น‹็’๏ผ„ๅฐžๆต ๏ฝ‡็ˆœ้Іไฝนๅงค้›?Bug ้Žดๆ จๅฝ้‘ๅ“„็ผ“็’๎‡†็ด’

้ฆƒๆซ License

MIT License - ้Œใƒงๆน… LICENSE ้‚ๅ›ฆๆฌข


Built with ้‰‚ใ‚็ฌ using Java 25
Powered by Flexible Constructors, Virtual Threads, and Structured Concurrency

Qin Language Positioning (v0.2)

Qin is an ESM-first language/runtime implemented on Java/JVM. It is designed as a new language platform, not a Node.js compatibility layer.

More precisely:

  • Qin borrows ESM as a source-language and module-design inspiration.
  • Qin does not treat Node.js as its platform standard.
  • Qin defines its own runtime boundary on top of Java/JVM.

Official Project Positioning

Qin should be understood as:

  • a Qin-owned programming language
  • whose source experience is based on ESM / modern JavaScript-style syntax
  • with Qin-specific syntax and semantic extensions
  • with JVM as the primary backend/runtime kernel
  • with fullstack targets across frontend and backend

In practical terms:

  • backend Qin code compiles to JVM .class
  • frontend Qin code can compile to JS for web targets
  • Java is the host platform and ecosystem carrier
  • Qin is the business language, not "Java source with different syntax"

So the most accurate short definition is:

  • Qin is a fullstack, ESM-style, JVM language.

Design Direction (Current)

  • ESM-first: Qin source uses ES-style syntax and ESM import/export as the primary module model.
  • Java/JVM kernel: backend compiles to JVM .class (and can also emit JS for web targets).
  • Mixed-source Qin input: Qin accepts .ts, .js, and .qin in the same workspace graph.
  • .java remains host/interoperability code for backend projects, not a Qin source suffix.
  • Node compatibility is optional and incremental: it is a compatibility layer for third-party packages, not the platform definition.
  • Java-backed stdlib: runtime capabilities are implemented on top of Java standard library.
  • Fullstack orientation: one language across shared/, frontend, and backend, with target-specific backends.
  • Qin-owned standard: language/runtime semantics are defined by Qin itself, while Node-adjacent behavior can be added when needed.

Backend architecture note:

Scope and Non-Goals

  • Phase 1: selected ES syntax + stable ESM core semantics + Java-backed runtime APIs.
  • Phase 1 non-goal: full ECMAScript and full ESM edge-case compatibility.
  • Phase 1 non-goal: pretending Node compatibility is the platform standard.
  • Reason: this is an engineering phasing strategy, not a JVM limitation. We prioritize a stable core first, then expand compatibility incrementally where real packages require it.

Qin vs JS Runtime / Bun / Kotlin

Dimension Browser/Node JS Bun Kotlin/JVM Qin
Source language JavaScript / TypeScript JavaScript / TypeScript Kotlin ESM-style Qin
Primary goal Run JS Run JS faster and provide toolchain Modern JVM language Modern ESM-style JVM language
Runtime foundation JS engine + host runtime JavaScriptCore + Zig host runtime JVM JVM
Backend ecosystem Node/npm Node/npm .class / Java ecosystem .class / Java ecosystem
Node compatibility pressure High High None None by default
Output artifact interpreted / bundled JS interpreted / bundled JS .class .class
Spring integration model indirect bridges indirect bridges native native target
Language semantics owner ECMAScript + host ECMAScript + Bun host Kotlin Qin

Operationally:

  • Bun is best understood as a JS runtime/toolchain implemented largely in Zig.
  • Qin is best understood as an ESM-style source language compiled onto the JVM.
  • So Qin is not "Java-written Bun" and not "JVM-hosted Node".
  • Qin is closer to "ESM-syntax Kotlin-like language for the JVM" than to a JS engine.

Similar Projects In The Industry

There is no mainstream language today that is exactly the same as Qin.

The closest comparisons are split across different dimensions:

  • Kotlin: closest on backend platform strategy
  • Scala / Groovy: similar on "new language on JVM" category
  • TypeScript: closest on source authoring familiarity
  • ClojureScript / ReScript / Elm: similar in "source language compiles to JS" direction
  • Bun / Deno / Node: useful comparison targets, but not the same category

Kotlin is closest on backend platform strategy: independent language, compiles to JVM .class, integrates naturally with Spring / Java ecosystem, but it is not ESM-style at the source language level.

Scala / Groovy are close in the "new language on JVM" category: JVM-native backend language position, strong .class ecosystem integration, but not designed around ESM-style fullstack authoring.

TypeScript is closest on source authoring familiarity: modern JS/ESM-style code organization and decorator-oriented developer expectations, but it normally targets JS runtimes rather than JVM .class.

ClojureScript / ReScript / Elm are similar in the "source language compiles to JS" direction, but they are not trying to make JVM .class the primary backend artifact.

Bun / Deno / Node are useful comparison targets mainly for what Qin is not: they are JS runtimes/toolchains, while Qin is a new language platform with its own runtime boundary.

So the best mental model is:

  • backend category: closer to Kotlin than to Node
  • source-language feel: closer to ESM/TypeScript than to Kotlin syntax
  • product shape: a fullstack language with target-specific backends, not a JS runtime clone

What Qin Keeps From ESM, And What It Does Not

Qin intentionally keeps:

  • ES-style module authoring with import / export
  • modern JS-like expression syntax
  • decorators as the source-level annotation model
  • familiar builtin names such as console, JSON, Math, Array, Object
  • frontend/backend authoring style convergence

Qin intentionally does not promise, at least in the current architecture phase:

  • full ECMAScript engine parity
  • full Node runtime compatibility
  • full prototype-chain edge-case fidelity
  • CommonJS behavior
  • "any npm package should just run" without adaptation
  • browser or Node loader behavior as the definition of correctness
  • Promise-first / async-viral programming model for backend code

The design intent is:

  • keep the productive parts of ESM authoring experience
  • keep Qin semantics stable and documentable
  • map backend execution cleanly to JVM + .class
  • avoid being trapped by Node compatibility as the platform definition
  • preserve Java/Kotlin-like synchronous backend ergonomics by default
  • add Node-adjacent compatibility only as an incremental layer when ecosystem pressure makes it worthwhile

Convention Folders (Current Project Rule)

These folders are current normative technical architecture. They are not the final preferred primary end-user mental model for Qin application authoring. See packages/qin-runtime-core/QIN_APP_MODEL.md.

  • shared/: shared code and shared contracts
  • app/: frontend static assets root (/index resolves to app/index or app/index.html)
  • backend entry: Java defaults to src/Main.java (with compatibility candidates), Qin defaults use main/main.qin and other built-in candidates

Import Policy by Zone (Current Rule)

  • app/ (frontend): can import JS modules, cannot import java: modules
  • main/ (backend): can import java: and JS modules
  • shared/ (shared): cannot import java: or JS modules
  • Violations fail at compile time with policy error codes

Runtime Package Plan

  • Location: qin/packages/qin-runtime-core
  • Name: qin-runtime-core
  • Purpose: Qin runtime orchestration layer (Java runtime semantics, ES-style syntax)

Why this package

  • Keep slime-java parser frontend as shared infrastructure.
  • Keep compiler backends (qin-lang-backend-jvm and qin-lang-backend-js) as independent modules.
  • Put project-level orchestration (layout conventions, bootstrap CLI) in a dedicated runtime package.

Stage 0 Entry

Use com.qin.runtime.core.QinRuntimeMain to parse .ts, .js, and .qin Qin source inputs through the Qin pipeline and emit .class/.js outputs.

Qin Language Design (Normative)

Qin is a JS/ESM-syntax, JVM-kernel compiled language.

  • Qin is not a full JavaScript engine.
  • Qin does not aim for Node compatibility.
  • Qin does not treat Node semantics as normative for language or runtime behavior.
  • Qin uses Class-File API to emit JVM .class artifacts.
  • Qin defines its own backend/runtime standard on the JVM.

Module Semantics (Strict Rule)

  • ESM-only module model in this phase.
  • Supported module syntax baseline: import / export (ESM).
  • Not supported as language spec: CommonJS (require, module.exports, exports.*).
  • Any accidental CJS behavior seen during experiments is non-normative and not a compatibility promise.
  • If source depends on CJS semantics, Qin may fail at parse/semantic/lowering/runtime stages.

Runtime Boundary (Strict Rule)

  • Node runtime APIs are out of scope in this phase (process, Buffer, __dirname, fs, path, node:*, etc.).
  • qin install can fetch npm packages, but "can install" != "can run".
  • Runtime compatibility depends on whether package code stays inside Qin-supported ESM + syntax/runtime subset.
  • npm ecosystem behavior is never the normative definition of Qin semantics.

npm Packages As Qin Compile Inputs

Qin should treat npm as a package source, not as the definition of the runtime.

That means:

  • compatible npm packages may enter the Qin compile graph
  • .ts/.js/.qin package sources may be compiled by Qin
  • backend-compatible packages may be lowered into the JVM target and participate in .class outputs
  • frontend-compatible packages may be lowered into JS outputs

Important boundary:

  • this does not mean every npm package is supported
  • support is source-compatibility-based, not registry-based
  • packages that depend on CJS, Node-only APIs, native addons, or unsupported JS runtime behavior may still fail by design

So the correct rule is:

  • Qin aims to compile compatible npm packages, not to promise blind npm ecosystem parity

Runtime Function Model (No Shim Path)

  • Qin runtime uses a single function-construction entrypoint: Global.__qin_make_function__.
  • Frontend lowers supported JS function AST into a runtime function definition object, then routes through that entrypoint.
  • Runtime decides whether to instantiate:
    • interpreted JS function (AST-driven, generic semantics path), or
    • fallback callable (for unsupported/over-budget shapes).
  • This is a structural design, not package-specific behavior:
    • no npm package hardcode,
    • no library shim mapping,
    • no package-name condition branches in parser/lowering/runtime.

Safety guard for large modules:

  • Qin applies a lowering budget for runtime function definitions.
  • For very large source units, function-model lowering is automatically disabled to prevent JVM bytecode method-size overflow.
  • This keeps pipeline stability while preserving the same architecture and entrypoint.

Project zoning rules (compile-time hard rules):

  • app/ (frontend): JS/ESM imports allowed, java: imports denied.
  • main/ (backend): java: and JS imports allowed.
  • shared/: platform-specific imports denied (java: and JS package imports).

Run model:

  • qin run without args follows qin.config.js and convention candidates.
  • .js entries run through Qin runtime (qin-runtime-core).
  • .java entries run through Java compile/run flow.

ESM diagnostics:

  • Link and semantic diagnostics: ESM2xxx
  • Runtime feature gates: ESM3xxx

Reference implementation details live in:

  • packages/qin-lang-module-policy/README.md
  • packages/qin-lang-sema-esm/README.md
  • packages/qin-runtime-core/README.md

Dependency Install Design (qin install)

qin install now supports mixed dependency sources in one workflow:

  1. npm-first resolution (Node-free installer implemented in Java)
  2. Maven fallback when npm package cannot be resolved
  3. Automatic write-back to qin.config.js

qin.config.js as manifest and module root

qin.config.js should be treated as the canonical Qin project manifest, not only as a loose config file.

In the current architecture it defines:

  • project/package identity: name, version, description
  • source/runtime entry selection: entry
  • dependency surface: dependencies, devDependencies, repositories
  • workspace shape: packages
  • target/runtime/build knobs: java, graalvm, frontend, output, port

So Qin is converging on one manifest for:

  • package identity
  • mixed npm + Maven dependency declaration
  • workspace package discovery
  • module-root and runtime/build coordination

Command behavior (no options)

  • qin install <pkg...>

    • For bare package names (for example mitt, lodash-es), Qin tries npm first.
    • If npm cannot resolve that package, Qin falls back to Maven Central lookup.
    • Installed dependencies are recorded into qin.config.js.
  • qin install org.example:artifact[:version]

    • Explicit Maven coordinates go directly to Maven resolution.
    • Added to qin.config.js, then resolved by qin sync logic.
  • qin install (no package names)

    • Executes install using dependencies already declared in qin.config.js.
    • npm-style entries are installed to node_modules by Qin's Java npm installer.
    • Maven-style entries are resolved using the existing sync pipeline.
    • This is the unified update path for main/ backend JS + Java dependency environment.

qin.config.js dependency shape

  • npm dependencies: key is npm package name, value is npm version
    • Example: "mitt": "3.0.1"
  • Maven dependencies: key is Maven coordinate (groupId:artifactId), value is Maven version
    • Example: "org.jsoup:jsoup": "1.18.1"

This allows Qin projects to manage npm + Maven dependencies together while keeping runtime constraints explicit (Node APIs are still out of scope unless Qin runtime explicitly supports them).

Dependency vs Runtime Clarification (Normative)

  • qin install is a dependency acquisition and lock/write-back workflow.
  • Runtime execution still follows Qin language/runtime constraints above (ESM-first, no CJS guarantee, no Node API guarantee).
  • If an npm package requires CJS or Node-only APIs, install may succeed but compile/run can still fail by design.
  • Package-manager convenience must not be confused with platform compatibility goals.

Notes:

  • app/ frontend package behavior is intentionally not changed in this phase.
  • main/ backend JS and Java now follow one dependency update entrypoint: qin install.

About

The next-generation cross-language build tool based on Bun replaces XML with TypeScript configuration, aiming to lead Java into the full-stack era.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages